word2vec原理
- Word2vec是词的一种表示方法,它将词以固定维数的向量表示出来。Word2vec能利用上下文信息对文本进行训练,一共有两种实现方式:1、用上下文预测中心词cbow(continue bag of word);2、利用中心词预测上下文skip-gram。Word2vec是一种无监督学习。
Skip-Gram模型(跳字模型)
- Skip-Gram
- 在Skip-Gram模型中,我们用一个词来预测它在文本序列周围的词。假设文本序列是“我”、“喜欢”、“在”、“安静”、“的”、“夜晚”和“读书”。以“安静”作为中心词,设时间窗口大小为 2。跳字模型所关心的是, 给定中心词“安静”生成与它距离不超过2个词的背景词“喜欢”、“在”、“的”和“夜晚”的条件概率。
- 数学描述
- 假设词典索引集 V 的大小为 |V|,且 V={0,1,…,|V|−1}。给定一个长度为 T 的文本序列中,时间步 t 的词为 w(t)。当时间窗口大小为 m 时,跳字 模型需要最大化给定任一中心词生成所有背景词的概率;
-
- 上式的最大似然估计与最小化以下损失函数等价:
- 我们可以用V和U分别表示中心词和背景词的向量。换言之,对于词典中索引 为i的词,它在作为中心词和背景词时的向量表示分别是vi和ui。而词典中所有词的这两种向量正是跳字模型所要学习的模型参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的给定中心词生成背景词的条件概率。
- 给定中心词,假设生成各个背景词是相互独立的。设中心词wc在词典中索引为c,背景词wo在词典中索引为o,损失函数中的给定中心词生成背景词的条件概率可以通过 softmax 函数定义为:
- 当序列长度 T 较大时,我们通常在每次迭代时随机采样一个较短的子序列来计算有关该子序列的损失。然后,根据该损失计算词向量的梯度并迭代词向量。
- 下面我们看看如何计算随机采样的子序列的损失有关中心词向量的梯度。和上面提到的长度为T的文本序列的损失函数类似,随机采样的子序列的损失实际上是对子序列中给定中心词生成背景词的条件概率的对数求平均。通过微分,我们可以得到上式中条件概率的对数有关中心词向量Vc 的梯度.
- 该式子也可以写成这样:
- Skip-Gram模型总结
- 随机采样的子序列有关其他词向量的梯度同理可得;
- 训练模型时,每一次迭代实际上是用这些梯度来迭代子序列中出现过的中心 词和背景词的向量;
- 训练结束后,对于词典中的任一索引为i的词,我们均得到该词作为中心词和背景词的两组词向量vi和ui;
- 在自然语言处理应用中,我们会使用跳字模型的中心词向量。
CBOW模型(连续词袋模型)
-
CBOW模型
- CBOW模型与Skip-Gram模型类似。与Skip-Gram模型最大的不同是, CBOW模 型用一个中心词在文本序列前后的背景词来预测该中心词。
- 假设文本序列是“我”、“爱”、“中国”、“这片”和“土 地”。以“中国”作为中心词,设时间窗口大小为 2。连续词袋模型所关⼼ 的是,给定与中心词距离不超过 2 个词的背景词“我”、“爱”、“这片” 和“土地”生成中心词“中国”的条件概率。
-
数学描述
- 假设词典索引集 V 的大小为 |V|,且 V={0,1,…,|V|−1}。给定一个长度为 T 的文本序列中,时间步 t 的词为 w(t)。当时间窗口大小为 m 时,CBOW 模型需要最大化给定背景词生成任一中心词的概率;
- 上式的最大似然估计与最小化以下损失函数等价:
- 我们可以用V和U分别表示背景词和中心词的向量。换言之,对于词典中索引为i的词,它在作为背景词和中心词时的向量表示分别是vi和ui。而词典中所有词的这两种向量正是连续词袋模型所要学习的模型参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的给定背景词生成中心词的概率。设中心词wc在词典中索引为c,背景词 wo1,…,wo2m 在词典中索引为 o1,…,o2m,损失函数中的给定背景词生成中心词的概率可以通过 softmax 函数定义为:
- 和跳字模型一样,当序列长度T较大时,我们通常在每次迭代时随机采样一个较短的子序列来计算有关该子序列的损失。然后,根据该损失计算词向量的梯度并迭代词向量。通过微分,我们可以计算出上式中条件概率的对数有关任一背景词向量 voi(i=1,…,2m)的梯度为:
- 该式也可写作
- 随机采样的子序列有关其他词向量的梯度同理可得。和跳字模型一样,训练结束后,对于词典中的任一索引为i的词,我们均得到该词作为背景词和中心词的两组词向量vi和ui。在自然语言处理应用中,我们会使用连续词袋模型的背景词向量。
Word2Vec训练方式
- 无论是跳字模型还是连续词袋模型,每一步梯度计算的开销与词典V的大小相关。当词典较大时,例如几十万到上百万,这种训练方法的计算开销会较大。因此,我们将使用近似的方法来计算这些梯度,从而减小计算开销。
- 常用的近似训练法包括:负采样和层序sotfmax
- 负采样
- 以跳字模型为例讨论负采样,实际上,词典V的大小之所以会在损失中出现,是因为给定中心词wc生成背景词wo的条件概率P(wo∣wc)使用了softmax运算,而softmax运算正是考虑了背景词可能是词典中的任一词,并体现在分母上。
- 不妨换个角度考虑给定中心词生成背景词的条件概率。我们先定义噪声词分布P(w),接着假设给定中心词wc生成背景词wo由以下相互独立事件联合组成来近似:
- 中心词wc和背景词wo同时出现时间窗口。
- 中心词wc和第1个噪声词w1不同时出现在该时间窗口(噪声词w1按噪声词 分布P(w)随机生成,且假设不为背景词wo)。 …
- 中心词wc和第K个噪声词wK不同时出现在该时间窗口(噪声词 wK 按噪声 词分布P(w)随机生成,且假设不为背景词wo)。
- 下面,我们可以使用
函数来表达中心词WC和背景词WO 同时出现在该训练窗口的概率:
- 那么,给定中心词wc生成背景词wo的条件概率的对数可以近似为:
- 假设噪声词wk在词典中的索引为ik,上式可改写为:
- 因此,有关给定中心词wc生成背景词wo的损失是:
- 假设词典V很大,每次迭代的计算开销由O(|V|)变为O(K)。当我们把K取较小 值时,负采样每次迭代的计算开销将较小。当然,我们也可以对连续词袋模型进行负采样。有关给定背景词生成中心词wc的损失:
- 在负采样中可以近似为:
- 同样,当我们把 K 取较小值时,负采样每次迭代的计算开销将较小。
Gensim中word2vec的使用
- 在gensim中,word2vec相关的API都在包gensim.models.word2vec中。和算 法有关的参数都在类gensim.models.word2vec.Word2Vec中。
- 算法需要注意的参数有:
-
- sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。
-
- size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
-
- window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为T,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。
-
- sg: 即我们的word2vec两个模型的选择了。如果是0,则是CBOW模型,是1则是Skip-Gram 模型,默认是0即CBOW模型。
-
- hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。
-
- negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。
-
- cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的为上下文的词向量之和, 为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述 的。个人比较喜欢用平均值来表示,默认值也是1,不推荐修改默认值。
-
- min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
-
- iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
-
- alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为,默认是 0.025。
-
- min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。
-