word2vec之Negative Sampling理解
本文章将介绍基于Negative Sampling的CBOW和Skip-Gram模型。与Hierarchical Softmax相比,Negative Sampling不需要构建复杂的Huffman树,以及进行多次二分类,而是利用简单的随机负采样,能大幅度提高性能。因而可以说Negative Sampling是Hierarchical Softmax的一种改进。
1 CBOW模型
在cbow模型中,已知的是上下文context(w),需要去预测词语w。所以可以换种说法,对于特定的context(w),词语w是其正样本,其他词语就是其负样本。但是负样本那么多,我们如何高效的去选择负样本,这就牵涉到Negative Sampling算法。首先,我们假设已经采样到一个负样本集合NEG(w)≠ϕ。对于一个w˜,定义一个标签:
ι(w˜)=1 当w˜=w
ι(w˜)=0 当w˜≠w
所以类似逻辑回归,我们定义了一个如下的公式:
p(u|context(w)))=δ(xTwθu) 当ι(w˜)=1
p(u|context(w)))=1−δ(xTwθu) 当ι(w˜)=0
将其写成一个正式为:
p(u|context(w)))=δ(xTwθu)ιw(u)(1−δ(xTwθu))1−ιw(u)
假设词语之间相互独立,我们希望最大化的是:
g(w)=∏uϵw⋃NEGwp(u|context(w))=∏uϵw⋃NEGwδ(xTwθu)ιw(u)(1−δ(xTwθu))1−ιw(u)
对于一个给定的语料库C,假设其中各词语相互独立,所以整体函数为:
G=∏wϵCg(w)
为了求得g(w)的最大值,我们对上式进行最大似然估计:
ι=log(G)=log(∏wϵCg(w))
=∑wϵClog(g(w))
=∑wϵClog(∏uϵw⋃NEGwp(u|context(w)))
=∑wϵC∑uϵw⋃NEGwlog(p(u|context(w)))
=∑wϵC∑uϵw⋃NEGwlog(δ(xTwθu)ιw(u)(1−δ(xTwθu))1−ιw(u)))
=∑wϵC∑uϵw⋃NEGwιw(u)log(δ(xTwθu))+(1−ιw(u))log(1−δ(xTwθu))
=∑wϵClog(δ(xTwθu))+∑uϵNEG(w)log(1−δ(xTwθu))
=∑wϵClog(δ(xTwθw))+∑uϵNEG(w)log(−δ(xTwθu)
为了求导方便,我们将后面的部分记为:
L(w,u)=ιw(u)log(δ(xTwθu))+(1−ιw(u))log(1−δ(xTwθu))
接下来利用梯度下降算法对其进行优化:
αL(w,u)αθu=αιw(u)log(δ(xTwθu))+(1−ιw(u))log(1−δ(xTwθu))αθu
=[L(w,u)−δ(xTwθu)]xTw
所以θu的更新方程为:
θu+=η[L(w,u)−δ(xTwθu)]xTw
由于θu和xTw相对称,所以对xTw求导得
αL(w,u)αxTw=[L(w,u)−δ(xTwθu)]θu
所以xTw的更新增量为:
e=η∑uϵw⋃NEGw[L(w,u)−δ(xTwθu)]θu
由于xTw为context(w)中各词的词向量之和,所以可以将该增量平均到context(w)各词中,即:
v(u)+=e,其中uϵcontext(w)
2、Skip-Gram模型
本小节介绍基于Negative Sampling的Skip-Gram模型。和基于Hierarchical Softmax模型的Skip-Gram模型相类似,我们可以将目标方程定义为:
G=∏wϵC∏uϵcontext(w)g(u)
,其中g(u)和CBOW模型中定义相似
g(w)=∏uϵw⋃NEGwp(u|w)=∏uϵw⋃NEGwδ(xTwθu)ιw(u)(1−δ(xTwθu))1−ιw(u)
于是我们对G,去对数似然函数:
ι=log(G)=log(∏wϵC∏uϵcontext(w)∏uϵw⋃NEGwp(u|w))
=∑wϵC∑uϵcontext(w)∑uϵw⋃NEGwlog(p(u|w))
=∑wϵC∑uϵcontext(w)∑uϵw⋃NEGwlog(δ(xTwθu)ιw(u)(1−δ(xTwθu))1−ιw(u))
=∑wϵC∑uϵcontext(w)∑uϵw⋃NEGwιw(u)log(δ(xTwθu)+(1−ιw(u))log(1−δ(xTwθu))
具体的推导过程和CBOW相类似,就不一一推导了。
3、Negative Sampling
由上面两节可知,采样的好坏则直接决定了最后模型的性能,那么对于一个词语w,如何快速有效的生成NEG(w)呢?
词典D中的词在语料C中,出现的次数有高有低,对于采样有个通用的准则:高频的词语,被选择为负样本的概率应该较高,低频词语被选择为负样本的概率较低。这其实就是一个带权重采样问题,相关的算法比较多。下面借助一篇博客中的介绍解释一种带权重采样的问题。

那么word2vec怎么去实现这个带权采样问题了?
记l0=0,lk=∑kj=1len(wj), k=1,2,3...,N。这里wj表示词典D中第j个词。则以(lj)Nj=0会在长度[0,1]中划分N个非等分区间。记:Ii=(li−1,li],i=1,2,3...N为其N个非等分区间。进一步引入区间[0,1]上的一个等分区间,部分节点记为(mj)Mj=0,其中M≫N

有了这个刻度表后,我们可以进行一个建立一个映射关系:
Table(i)=wj
有了这个映射后,采用就非常简单了。首先我们在[1,M-1]中随机选取一个整数r,然后通过映射Table(r),就可以获取一个样本w。那么,如果碰巧选到自己怎么办?直接跳过就行了。
需要注意的是,word2vec中len(w)的计算,有稍许不同,其对频率count(w)作了α次幂。在算法中α选择为3/4,所以len(w)的计算公式变为了:
len(w)=count(w)34∑uεDcount(u)34
M则选择为108