NLP我爱编程

word2vec、负采样、层序softmax

2018-04-16  本文已影响913人  errorrrr

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

CBOW

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


CBOW最大似然估计概率.png

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


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

负采样(skip-gram举例)

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


负采样01.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] 动手学深度学习
上一篇 下一篇

猜你喜欢

热点阅读