中文词向量生成

本文做了一件有意思的事,用 Bert 生成《红楼梦》人名的词嵌入,再用 t-SNE 将高维的词向量降为二维后做可视化。结果发现,主角团三人的名字在向量空间中是紧紧挨在一起的。

GitHub 项目地址:luochang212/chinese-embedding

本文探索的内容包括:

  • 如何生成词向量
  • 如何生成句子向量
  • 如何找到语义相近的词
  • 如何对 embedding 做降维及可视化

一、用 Word2Vec 生成词向量

用 Word2Vec 生成中英文词向量。

  1. 英文词向量
  2. 中文词向量


二、用 Bert 生成句子向量

用 Bert 生成中英文句子向量。

  1. 英文句子向量
  2. 中文句子向量


三、寻找最近邻 embedding

我的构想是:拿到红楼梦里所有词汇的 embedding,然后看我们感兴趣的词(比如林黛玉)离哪个词最近。

  1. 分词
  2. 批量计算 embedding
  3. 计算每个词的 embedding
  4. 计算我们关心词汇的近邻 embedding
  5. 整合成一个类


四、Embedding 可视化

用 t-SNE 和 PCA 对 embedding 降维,做 2D & 3D 可视化

  1. 红楼梦中的人物关系
  2. 中英美城市群
    • t-SNE
    • PCA


五、头脑风暴

  1. Embedding 的稳定性
  2. Embedding 差值的意义
  3. 输出 embedding 的数量


附录:和 Qwen-2.5 的聊天记录

Q: nn.Embedding 是一种预训练的embedding模型吗

A: nn.Embedding本身并不是一个预训练模型,而是深度学习框架(如PyTorch)中提供的一个层(Layer),用于将离散的类别(如词汇ID)转换为连续的向量空间中的向量,即词嵌入(word embeddings)。这个层的权重是可学习的,意味着在模型训练过程中,这些嵌入向量会根据任务目标进行优化。

当你创建一个nn.Embedding层时,你可以指定词汇表的大小(vocab_size)和嵌入向量的维度(embedding_dim)。初始时,这些嵌入向量通常是随机初始化的。然而,你可以选择用预训练好的词向量(如Word2Vec、GloVe)来初始化这个层的权重,从而利用预训练模型学到的语义信息作为模型训练的起点,这可以加速收敛过程并可能提高最终模型的表现。

总结来说,nn.Embedding是一个工具,它允许你在神经网络中使用并且学习词嵌入,但它本身不包含预训练的过程。预训练的词向量可以被用来初始化nn.Embedding层,但它们是分开的概念。

Q: nn.Embedding 中每个词的对应的向量在训练过程中会发生变化吗

A: 是的,在使用nn.Embedding的训练过程中,每个词对应的向量会发生变化。这是因为在PyTorch中,nn.Embedding层的权重是模型参数的一部分,它们会随着反向传播和优化算法(如梯度下降)的进行而更新。这意味着在训练迭代中,根据网络的损失函数以及优化目标,词嵌入向量会被调整以更好地捕获输入数据中的模式和语义关系。

简而言之,nn.Embedding层中的词嵌入向量不是静态不变的,而是可以根据训练数据动态学习和优化的,这一特性使得它们能够为特定任务提供更合适的词表示。

参考资料