使用Negative Sampling的目的
摒弃Hierarchical Softmax结构, 原因:
我们的训练样本里的中心词w是一个很生僻的词, 就要在树结构中探索较深
为了简化模型, 使用Negative Sampling来代替Hierarchical Softmax模型结构
Negative Sampling原理
对于中心词w, 总计2c个上下文词, 即为Context(w). 由于是语料中存在的上下文关系, 令w与Context(w)为一个正样本. 然后在字典中采样, 得到neg个和w不同的词作为中心词, 这在语料中是不存在的(或者说极大概率是不存在的), 因此将采样到的每个中心词wi, i=1,2,⋯,neg和Context(w)作为一个负样本.
最后的输出层就演变成了若干个并行的二元逻辑回归层, 其数量与字典中词的数量相同. 每个词对应一个二元逻辑回归层, 有着自己独立的参数.
通过对这一个正样本和neg个负样本的二元逻辑回归, 更新这neg+1个词的逻辑回归参数和每个词的词向量.
Negative Sampling负采样方法
Negative Sampling需要采样neg个负样本. 如果词汇表为V, 其大小为∣V∣, 将长度为1的线段分成∣V∣份, 每份对应词汇表里的一个词, 每个词对应的线段长度是不一样的, 高频词对应的线段长, 低频词对应线段短. 最简单的计算每个词对应的线段的长度的方法为:
len(w)=u∈vocab∑count(u)count(w)
在word2vec论文中使用的函数为:
len(w)=u∈vocab∑count(u)3/4count(w)3/4
论文中采用的采样方法具体为: 将长度为1的线段等分成M份, M远大于∣V∣, 这样每个词对应的线段都被划分成若干个更小的线段, 而M份中的每一份都会落在某个词对应的线段上. 采样时, 只需要采样出这M个位置中的neg个位置, 对应的线段所属的词就是我们要采样出的负样本单词. 论文中M=108.
示例图如下:
Negative Sampling的梯度计算
将正例的中心词定义为w0, 因此就有样本(Context(w0),wi), i=0,1,2,⋯,neg. 最大似然法, 最大化下式:
∏i=0negP(context(w0),wi)=σ(xw0Tθw0)∏i=1neg(1−σ(xw0Tθwi))
对应的对数似然函数为:
L=i=0∑negyilog(σ(xw0Tθwi))+(1−yi)log(1−σ(xw0Tθwi))
采用梯度上升法, 每次使用一个样本进行参数更新. 这里我们需要更新的参数为正样本对应的词向量xw0, 以及输出层中对应的二元逻辑回归神经元θwi,i=0,1,..neg.
首先是θwi的梯度:
\begin{align} \frac{\partial L}{\partial \theta^{w_i} } &= y_i(1- \sigma(x_{w_0}^T\theta^{w_i}))x_{w_0}-(1-y_i)\sigma(x_{w_0}^T\theta^{w_i})x_{w_0} \\ & = (y_i -\sigma(x_{w_0}^T\theta^{w_i})) x_{w_0} \end{align}
同样求出xw0的梯度:
∂xw0∂L=i=0∑neg(yi−σ(xw0Tθwi))θwi
基于Negative Sampling的CBOW模型
输入: 训练语料样本, 单侧窗口长度c, 负采样的个数neg
输出: 每个词的词向量xw, 每个词对应的逻辑回归参数θ
过程
随机初始化所有的模型参数θ, 所有词向量x
对于每个训练正样本(context(w0),w0), 负采样出neg个负样本中心词wi,i=1,2,...neg
对于训练集中的每一个样本(context(w0),w0,w1,...wneg), 进行梯度上升:
xw0=i=1∑2cxi
for i=0 to neg, 计算:
f=σ(xw0Tθwi)
g=(yi−f)η
e=e+gθwi
θwi=θwi+gxw0
对于Context(w0)中包含的每一个词对应的词向量xk, k=1,2,⋯,2c进行相同的更新:
xk=xk+e
基于Negative Sampling的Skip-Gram模型
输入: 训练语料样本, 单侧窗口长度c, 负采样的个数neg
输出: 每个词的词向量xw, 每个词对应的逻辑回归参数θ
过程
随机初始化所有的模型参数θ, 所有词向量x
对于每个训练正样本(context(w0),w0), 负采样出neg个负样本中心词wi,i=1,2,...neg
对于训练集中的每一个样本(context(w0),w0,w1,...wneg), 进行梯度上升:
for i=1 to 2c, 即对上下文中的每个词:
for j=0 to neg, 计算:
f=σ(xw0iTθwj)
g=(yj−f)η
e=e+gθwj
θwj=θwj+gxw0i
对于Context(w0)中包含的每一个词对应的词向量xk, k=1,2,⋯,2c进行相同的更新:
xk=xk+e