word2vec、负采样、层序softmax

word2vec

word2vec也叫word embeddings,中文名“词向量”、"词嵌入"。是Google 的 Tomas Mikolov 在《Efficient Estimation of Word Representation in Vector Space》提出的。word2vec分两个模型,分别为skip-gram(Continuous Skip-gram Model 跳字模型)和CBOW(Continuous Bag-of-Words Model 连续词袋模型)。

如果使用one-hot的方式来表示词语,例如有三个词:“I”,“speak”,“Chinese”,用one-hot形式来表示的话分别为“I”【1,0,0】,”speak“【0,1,0】,”Chinese“【0,0,1】。但是这并不是一个很好的表示方式,因为如果假设我们计算一对词相似度的话,假设我们三个词分别为a,b,c,用余弦相似度:


余弦相似度.png

我们会发现,所有的余弦相似度的值都为0,因为他们都是俩俩正交的,所以one-hot看似是一个比较直观的向量表达方式,但是并不是很好的方法,没办法去捕捉词和词之间的相似度。
word2vec可以很好的表示不同之间的相似和类比关系,有个很好的例子就是:man-woman=king-queen。

skip-gram

跳字模型就是用一个词去预测它文本序列周围的词,例如:”the“,”man“,”hit“,”his“,”son“。比如时间窗口大小为2,则可以用”hit“中心词来预测”the“,”man“,”his“,”son“这些窗口小于2的背景词的最大概率。


图片2.png
  • wt为t时刻的中心词,我们要预测t+j时刻的背景词。这个公式就是说给定每时刻的中心词,生成该时刻背景词的最大联合概率。


    损失函数.png
  • 这个最小损失函数公式等价于上面最大联合概率公式。


    图片3.png
  • 上面公式为用softmax表达给定任意一个中心词wc生成背景词wo的概率。vc代表中心词在索引中第c个坐标,uo代表背景词在索引中第o个坐标。


    skip-gram梯度.png
  • 该公式是计算梯度,就是对损失函数求导。


    skip-gram简化梯度.png
  • 简化梯度后


CBOW

连续词袋模型就是用文本序列周围的词来预测中心词,例如,给定文本序列”the“,”man“,”hit“,”his“,”son“,连续词袋模型关心的是给定”the“,”man“,”his“,”son“一起生成中心词”hit“的概率。


CBOW最大似然估计概率.png
  • 这个公式就是连续词袋模型最大似然估计概率。


    CBOW损失函数.png
  • 同skip-gram类似,这个最小损失函数等价于上面最大似然估计概率。


    CBOW.png
  • 假设窗口大小为m,我们就有2m个背景词,中心词索引为c,该公式就对2m个背景词求平均,用这个平均值来做CBOW的向量,依然用softmax。


    CBOW梯度.png
  • 该公式同样是计算CBOW的梯度。


    CBOW梯度更新.png
  • 简化梯度后的公式。

注:每个词都可有两个向量表达,既可以是背景词,也可以是中心词。


通过上面两个模型,我们发现梯度计算中计算开销都特别大,因为计算梯度时都需要最小字典大小的复杂度O(|v|)。word2vec解决这个问题采用了两个近似训练法,一个叫做负采样,一个叫做层序softmax。

负采样(skip-gram举例)

词典V大小之所以会在目标函数中出现,是因为中心词wc生成背景词wo的概率P(wo|wc)使用了softmax,而softmax是考虑了背景词可能是词典中的任意一词,并体现在softmax的分母上。


负采样01.png
  • 中心词wc与任意一个背景词wo同时出现在训练数据时间窗口概率为D=1。


    负采样02.png
  • 中心词wc和第K个噪声词wk不同时出现在该训练数据窗口(噪声词wk按噪声词分布P(w)随机生成)。就是假设我有一个噪声词是词典中任何一个词,但是该窗口中,没有同时与中心词被观察到。则该公式就是上一个公式与噪声词没有在这个窗口观察到的概率的联合概率。


    负采样03.png
  • 把上一个公式用第一个公式替换,因为P(D=1|wo,wc)和P(D=0|wk,wc)的和为1,所以P(D=0|wk,wc)=1-P(D=1|wo,wc)。


    负采样04损失函数.png
  • 定义出负采样的损失函数。

实际上CBOW与skip-gram的负采样方式类似,只不过把一部分替换成背景词的平均向量。
看得出来负采样方式已经把复杂度O(|V|)字典大小下降成复杂度O(|K|),从而减小训练时候的计算开销。


层序softmax

层序softmax利用了二叉树,树中的每个叶子节点代表着词典V中的每个词,每个词wi相应的词向量vi。如图所示:


层序softmax二叉树.png

因为上面的公式采用了softmax函数所以引入了|V|字典的大小,现在替换softmax函数,利用其他函数。


层序softmax替换函数.png

这个公式是给定任何wi词生成w词的概率。其中L(w)为由这个二叉树的根到这个w词的路径上的节点数,例如L(w3)=4。例如n(w3,1)为这个二叉树根到w3词的路径上的第一个节点,则n(w,j+1)代表这个二叉树根到w词的路径上的下一步是不是左边的子树。
以w3举例:


层序softmax举例.png

第一个节点到第二个节点为左边,所以公式中第一个中括号中为真为1,第二个节点到第三个节点为右边,所以第二个中括号中为假-1,第三个节点到第四个节点为左边,所以第三个中括号中为真1。则算出来的复杂度是3。
图片4.png

我们可以看出来层序softmax将复杂度降低为O(log(|V|))。


 参考:[MXNet/Gluon] 动手学深度学习

推荐阅读更多精彩内容