0. 预备知识
Softmax函数:
哈夫曼树(Huffman Tree)
1.Skip-gram
从图1可以看出Skip-gram就是用当前中心词(banking)预测附近的词,图1中将窗口大小设为2,即需要预测左边的2个词和右边的2个词。
对于每个位置,预测窗口大小为的上下文,设当前中心词为,那么目标为最大化:
(1)
其中为模型的参数。
为了将最大化转为最小化,可对取负数,为了简化计算,可取对数:
(2)
现在问题的关键是如何计算,我们使用两个向量表示:为中心词的表示,为上下文词的表示。那么,计算中心词c和上下文词o的出现概率为:
(3)
其中,V为整个词表大小,为中心词向量表示。其实式3就是softmax函数。
图2展示了Skip-gram的计算过程,从图中可以看出Skip-gram预测的是,,,由于只预测前后两个单词,因此窗口大小为2。
输入层到隐藏层:输入层的中心词用one-hot向量表示(维度为V*1,V为整个词表大小),输入层到隐藏层的权重矩阵为中心词矩阵W(维度为V*d,d为词向量维度),设隐含向量为(维度为d*1),那么:
(4)
隐藏层到输出层:隐藏层到输出层的上下文权重矩阵为U(维度为d*V),输出层为y(维度为V*1),那么:
(5)
注意,输出层的向量y与输出层的向量虽然维度一样,但是y并不是one-hot向量,并且向量y的每一个元素都是有意义的。如,假设训练样本只有一句话”I like to eat apple”,此时我们正在使用eat去预测to,输出层结果如图3所示。
向量y中的每个元素表示用 I、like、eat、apple 四个词预测出来的词是对应的词的概率,比如是like的概率为0.05,是to的概率是0.80。由于我们想让模型预测出来的词是to,那么我们就要尽量让to的概率尽可能的大,所以我们将式子(1)作为最大化函数。
CBOW
Continuous Bag-of-Words(CBOW),的计算示意图如图4所示。从图中可以看出,CBOW模型预测的是,由于目标词只取前后的两个词,因此窗口大小为2。假设目标词前后各取个词,即窗口大小为,那么CBOW模型为:
(6)
输入层到隐藏层:如图4所示,输入层为4个词的one-hot向量表示,分别为,,,(维度都为V*1,V为整个词表大小),记输入层到隐藏层的上下文词的权重矩阵为W(维度为V*d,d是词向量维度),隐藏层的向量h(维度为d*1),那么:
(7)
这里就是把各个上下文词的向量查找出来,再进行简单的加和平均。
隐藏层到输出层:记隐藏层到输出层的中心词权重矩阵为U(维度d*V),输出层的向量y(维度V*1),那么:
(8)
注意,输出层的向量与输入层的虽然维度一样,但是并不是one-hot向量,并且向量的每个元素都是有意义的。CBOW的目标是最大化函数:
(9)
层次softmax和负采样
由于softmax的分母部分计算代价很大,在实际应用时,一般采用层次softmax或者负采样替换掉输出层,降低计算复杂度。
层次softmax
层次softmax(Hierarchical Softmax)是一棵哈夫曼树,树的叶子节点是训练文本中所有的词,非叶子节点是一个逻辑回归二分类器,每个逻辑回归分类器的参数都不同,分别用表示,假定分类器的输入为向量h,记逻辑回归分类器输出的结果为将向量h传递给节点的左孩子概率为,否则传递给节点的右孩子概率为。重复这个传递流程直到叶子节点。
从图5和图6可以看出,我们就是将隐藏层的向量h直接传递到了层次softmax,层次softmax的复杂度为O(log(V)),层次softmax采样到每个词的概率如下:
对于CBOW或者skip-gram模型,如果要预测的词是to,那么我们就让尽量大,所以我们将任务转换成训练V-1个逻辑分类器。CBOW模型和skip-gram模型训练目标函数和之前形式一样,为:
(10)
(11)
3.2 负采样
负采样实际上是采样负例来帮助训练的手段,其目的与层次softmax一样,是用来提升模型的训练速度。我们知道,模型对正例的预测概率是越大越好,模型对负例的预测概率是越小越好。负采样的思路就是根据某种负采样的策略随机挑选一些负例,然后保证挑选的这部分负例的预测概率尽可能小。所以,负采样策略是对模型的效果影响很大,word2vec常用的负采样策略有均匀负采样、按词频率采样等等。
A.CBOW
以“I like to eat apple”为例子,假设窗口的大小是2,当中心词为like时,即我们会用 I to 来预测like,所以在这里我们就认为(I,like)和(to,like)都是正例,而(I,apple)、(to,apple)就是负例,因为(I,apple)、(to,apple)不出现在当前正例中。用NEG(w)表示负样本,有:
(12)
(13)
这里的是词*的中心词向量表示,h为隐藏层的输出向量。我们只需要最大化目标函数:
(14)
这个损失函数的含义就是让正例概率更大,负例的概率更小。
B.Skip-gram
以“I like to eat apple”为例子,假设窗口的大小是1,即我们会用 like 来预测 I to,所以在这里我们就认为(like,I)和(like,to)都是正例,而(like,apple)就是负例,因为(like,apple)不会出现在正例中。那么,对于给定的正样本(w,context(w))和采样出的负样本(w,NEG(w)),有:
(15)
(16)
这里的是词*的中心词向量表示,h为隐藏层的输出向量。我们只需要最大化目标函数:
(17)
C.采样方法
word2vec常用的负采样策略有均匀负采样、按词频率采样等等。比较常用的采样方法是一元分布模型的3/4次幂。该方法中,一个词被采样的概率,取决于这个词在语料中的词频 ,其满足一元分布模型(Unigram Model).
(18)
其中V为整个词表大小, 为词的词频。
至于为什么选择3/4呢?其实是由论文作者的经验所决定的。
假设由三个词,,”我“,”和平“,”觊觎“ 权重分别为 0.9 ,0.01,0.003;经过3/4幂后:
我: 0.9^3/4 = 0.92
和平:0.01^3/4 = 0.03
觊觎:0.003^3/4 = 0.012
对于”觊觎“而言,权重增加了4倍;”和平“增加3倍;”我“只有轻微增加。
可以认为:在保证高频词容易被抽到的大方向下,通过权重3/4次幂的方式,适当提升低频词、罕见词被抽到的概率。如果不这么做,低频词,罕见词很难被抽到,以至于不被更新到对应的Embedding。
Question&Answer
Question1: 如图7中,skip-gram模型中,从隐藏层到输出层,因为使用权值共享,所以会导致输出的几个上下文词向量总是完全一样,但网络的目的是要去预测上下文会出现的词,而实际中给定中心词的情况下上下文的词会五花八门。怎么解释skip gram的这种输出形式?
Answer1: 网络的目的不是要预测上下文会出现啥词,这只是一个fake task。实际上这个loss就是降不下来的,所以本来就不能用于真正预测上下文,而初衷也不是用于预测上下文,只是利用上下文信息去实现嵌入。
如果你的100W个句子都是”I really love machine learning and deep learning“,加上权值共享,结果就是给定machine以后,它输出really,love,learning,and这四个词的概率完全相同,这就意味着这四个词的词向量也是差不多的。正因为这样,语义相近的词,他们在空间上的映射才会接近。
Question2: Word2Vec哪个矩阵是词向量?
Answer2:如图7所示,中心词矩阵W,上下文矩阵W' 可以任意选一个作为词向量矩阵。但是,如果采用优化后(层次softmax)的模型,那么将不存在W',这种情况下只能选矩阵W。
三千多字,码字不易,如果大家发现我有地方写得不对或者有疑问的,麻烦评论,我会回复并改正。对于重要问题,我会持续更新至Question&Answer。
参考:
[3]CS224n:深度学习的自然语言处理(2017年冬季)1080p
[4]Stanford CS224N: NLP with Deep Learning | Winter 2019 | Lecture 2 – Word Vectors and
Word Senses
[6] Le, Quoc V , and T. Mikolov . "Distributed Representationsof Sentences and Documents." (2014).
[7] Mikolov, T. . "Distributed Representations of Words andPhrases and their Compositionality." Advances in Neural InformationProcessing Systems 26(2013):3111-3119.
[8] Mikolov, Tomas , et al."Efficient Estimation of Word Representations in Vector Space." Computerence (2013).
[9] Goldberg, Yoav , and O. Levy . "word2vec Explained:deriving Mikolov et al.'s negative-sampling word-embedding method." arXiv(2014).