Skip to content

预训练word2vec

一、概述

这个章节是在我们之前学的 word2vec 理论和 PTB 数据集的基础上,实际动手实现并预训练 word2vec 模型。我们用的是跳元模型(Skip-Gram)加上负采样的近似训练方法,在 PTB 数据集上训练,训练完成后,我们可以用训练好的词向量找到语义相似的词,比如输入 “chip”,就能找到和它意思相近的 “microprocessor”“computers” 这些词。

二、跳元模型的实现

1. 嵌入层:把词转换成向量

我们知道,计算机没法直接处理文字,所以我们需要把词转换成数字向量。嵌入层就是干这个的:它把词的索引(比如 “chip” 的索引是 100)转换成对应的词向量,这个词向量是一个固定长度的数组(比如长度 100)。

嵌入层的权重是一个矩阵,行数等于词表的大小(PTB 数据集的词表大概有 1 万多个词),列数就是词向量的维度(我们这里设为 100)。每个词对应的词向量就是这个权重矩阵的一行,训练完成后,这个权重矩阵就是我们想要的词向量表。

2. 跳元模型的前向传播

跳元模型的思路是 “用中心词预测周围的词”,我们这里用负采样的方法,把问题变成了二分类:中心词和上下文词是正样本,中心词和噪声词是负样本。

模型的前向传播很简单:

  1. 把中心词的索引通过嵌入层转换成中心词向量
  2. 把上下文词和噪声词的索引通过另一个嵌入层转换成它们的向量
  3. 计算中心词向量和每个上下文 / 噪声词向量的点积,点积越大,说明这两个词越可能是真正的上下文对

三、损失函数和模型初始化

1. 二元交叉熵损失

因为我们用了负采样,把多分类问题变成了二分类问题,所以我们用二元交叉熵损失来训练模型。这个损失会让正样本的点积尽可能大(概率接近 1),负样本的点积尽可能小(概率接近 0)。

2. 模型初始化

我们需要定义两个嵌入层:

  • 一个是中心词的嵌入层,用来把中心词转换成向量
  • 一个是上下文 / 噪声词的嵌入层,用来把上下文词和噪声词转换成向量

我们把词向量的维度设为 100,这样每个词都对应一个 100 维的向量,这个向量的数值就是我们要训练的语义信息。

四、训练模型

我们用 Adam 优化器来训练模型,训练的步骤是:

  1. 每次迭代处理一个小批量的数据,每个小批量里包含中心词、上下文词、噪声词、掩码和标签
  2. 把这些数据传到模型里,计算预测的点积
  3. 用二元交叉熵损失计算损失值,注意用掩码来过滤掉无效的样本(因为每个中心词的上下文词数量不一样)
  4. 反向传播,更新两个嵌入层的权重
  5. 重复这个过程,直到训练完成

五、应用训练好的词向量

训练完成后,我们就可以用训练好的词向量来做事情了,比如找语义相似的词。

我们用余弦相似度来衡量两个词向量的相似性,余弦相似度越接近 1,说明两个词的语义越相似。比如我们输入 “chip”,模型会找到和它最相似的词:

  • cosine sim=0.773 : microprocessor
  • cosine sim=0.589 : hitachi
  • cosine sim=0.582 : computers

这些词和 “chip” 都是和计算机、芯片相关的,说明模型学到了词的语义信息。

六、小结

  1. 我们用嵌入层把词转换成向量,实现了跳元模型,用二元交叉熵损失来训练带负采样的 word2vec。

  2. 训练完成后,我们可以用余弦相似度来找到和输入词语义相似的词,这说明模型学到了词的语义信息。

  3. 预训练好的词向量可以用到其他自然语言处理任务里,比如文本分类、情感分析,帮助模型更好地理解语义。

(注:文档部分内容可能由 AI 生成) 源地址

京ICP备2024093538号-1