在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)
本小节介绍基于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相类似,就不一一推导了。
由上面两节可知,采样的好坏则直接决定了最后模型的性能,那么对于一个词语
w
,如何快速有效的生成
NEG(w)
呢?
词典
D
中的词在语料
C
中,出现的次数有高有低,对于采样有个通用的准则:高频的词语,被选择为负样本的概率应该较高,低频词语被选择为负样本的概率较低。这其实就是一个带权重采样问题,相关的算法比较多。下面借助一篇博客中的介绍解释一种带权重采样的问题。
![word2vec之Negative Sampling理解 word2vec之Negative Sampling理解](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzUvNy8zLzAvNTUvYWMyNjk0YzIyZTNjYTA1YTNiZGU4MGVmZjg3MjllYTUuanBl.jpe?w=700&webp=1)
那么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
![word2vec之Negative Sampling理解 word2vec之Negative Sampling理解](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvNy82LzAvMzgvNjhkODAxMDJmNmI5NzE1OGExNDU2OTMwMzRmYWVlNGUuanBl.jpe?w=700&webp=1)
有了这个刻度表后,我们可以进行一个建立一个映射关系:
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