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~)=1w~=w
ι(w~)=0w~w
所以类似逻辑回归,我们定义了一个如下的公式:
p(u|context(w)))=δ(xwTθu)ι(w~)=1
p(u|context(w)))=1δ(xwTθu)ι(w~)=0
将其写成一个正式为:

p(u|context(w)))=δ(xwTθu)ιw(u)(1δ(xwTθu))1ιw(u)

假设词语之间相互独立,我们希望最大化的是:
g(w)=uϵwNEGwp(u|context(w))=uϵwNEGwδ(xwTθu)ιw(u)(1δ(xwTθu))1ιw(u)

对于一个给定的语料库C,假设其中各词语相互独立,所以整体函数为:
G=wϵCg(w)

为了求得g(w)的最大值,我们对上式进行最大似然估计:
ι=log(G)=log(wϵCg(w))

=wϵClog(g(w))

=wϵClog(uϵwNEGwp(u|context(w)))

=wϵCuϵwNEGwlog(p(u|context(w)))

=wϵCuϵwNEGwlog(δ(xwTθu)ιw(u)(1δ(xwTθu))1ιw(u)))

=wϵCuϵwNEGwιw(u)log(δ(xwTθu))+(1ιw(u))log(1δ(xwTθu))

=wϵClog(δ(xwTθu))+uϵNEG(w)log(1δ(xwTθu))

=wϵClog(δ(xwTθw))+uϵNEG(w)log(δ(xwTθu)

为了求导方便,我们将后面的部分记为:

L(w,u)=ιw(u)log(δ(xwTθu))+(1ιw(u))log(1δ(xwTθu))

接下来利用梯度下降算法对其进行优化:
αL(w,u)αθu=αιw(u)log(δ(xwTθu))+(1ιw(u))log(1δ(xwTθu))αθu

=[L(w,u)δ(xwTθu)]xwT

所以θu的更新方程为:
θu+=η[L(w,u)δ(xwTθu)]xwT

由于θuxwT相对称,所以对xwT求导得
αL(w,u)αxwT=[L(w,u)δ(xwTθu)]θu

所以xwT的更新增量为:
e=ηuϵwNEGw[L(w,u)δ(xwTθu)]θu

由于xwTcontext(w)中各词的词向量之和,所以可以将该增量平均到context(w)各词中,即:
v(u)+=e,其中uϵcontext(w)

2、Skip-Gram模型

本小节介绍基于Negative Sampling的Skip-Gram模型。和基于Hierarchical Softmax模型的Skip-Gram模型相类似,我们可以将目标方程定义为:

G=wϵCuϵcontext(w)g(u)
,其中g(u)和CBOW模型中定义相似
g(w)=uϵwNEGwp(u|w)=uϵwNEGwδ(xwTθu)ιw(u)(1δ(xwTθu))1ιw(u)

于是我们对G,去对数似然函数:
ι=log(G)=log(wϵCuϵcontext(w)uϵwNEGwp(u|w))

=wϵCuϵcontext(w)uϵwNEGwlog(p(u|w))

=wϵCuϵcontext(w)uϵwNEGwlog(δ(xwTθu)ιw(u)(1δ(xwTθu))1ιw(u))

=wϵCuϵcontext(w)uϵwNEGwιw(u)log(δ(xwTθu)+(1ιw(u))log(1δ(xwTθu))

具体的推导过程和CBOW相类似,就不一一推导了。

3、Negative Sampling

由上面两节可知,采样的好坏则直接决定了最后模型的性能,那么对于一个词语w,如何快速有效的生成NEG(w)呢?
词典D中的词在语料C中,出现的次数有高有低,对于采样有个通用的准则:高频的词语,被选择为负样本的概率应该较高,低频词语被选择为负样本的概率较低。这其实就是一个带权重采样问题,相关的算法比较多。下面借助一篇博客中的介绍解释一种带权重采样的问题。
word2vec之Negative Sampling理解
那么word2vec怎么去实现这个带权采样问题了?
l0=0lk=j=1klen(wj), k=1,2,3...,N。这里wj表示词典D中第j个词。则以(lj)j=0N会在长度[0,1]中划分N个非等分区间。记:Ii=(li1,li]i=1,2,3...N为其N个非等分区间。进一步引入区间[0,1]上的一个等分区间,部分节点记为(mj)j=0M,其中MN
word2vec之Negative Sampling理解
有了这个刻度表后,我们可以进行一个建立一个映射关系:

Table(i)=wj

有了这个映射后,采用就非常简单了。首先我们在[1,M-1]中随机选取一个整数r,然后通过映射Table(r),就可以获取一个样本w。那么,如果碰巧选到自己怎么办?直接跳过就行了。

需要注意的是,word2vec中len(w)的计算,有稍许不同,其对频率count(w)作了α次幂。在算法中α选择为3/4,所以len(w)的计算公式变为了:

len(w)=count(w)34uεDcount(u)34

M则选择为108

相关文章: