本篇是学习斯坦福公开课”Natural Language Processing with Deep Learning”时的笔记。
包含leture2的内容。
1. Word2Vec的含义
一个单词,神经网络理解不了,需要人转换成数字再喂给它。最naive的方式就是one-hot,但是太过于稀疏,不好。所以在改进一下,把one-hot进一步压缩成一个dense vector。
word2vec算法就是根据上下文预测单词,从而获得词向量矩阵。
预测单词的任务只是一个幌子,我们需要的结果并不是预测出来的单词,而是通过预测单词这个任务,不断更新着的参数矩阵weights。
预测任务由一个简单的三层神经网络来完成,其中有两个参数矩阵V和U,V∈ℝDh×∣W∣,U∈ℝ∣W∣×Dh。
V是输入层到隐藏层的矩阵,又被称为look-up table(因为,输入的是one-hot向量,一个one-hot向量乘以一个矩阵相当于取了这个矩阵的其中一列。将其中的每一列看成是词向量)。
U是隐藏层到输出层的矩阵,又被称为word representation matrix(将其中的每一行看成是词向量)。
最后需要的词向量矩阵是将两个词向量矩阵相加 = V+UT,然后每一列就是词向量。
2 两种实现方法
2.1 Skip-Gram
训练任务:根据中心词,预测出上下文词
输入:一个中心词(center word,x∈ℝ∣W∣×1)
参数:一个look up table V∈ℝDh×∣W∣,一个word representation matrix U∈ℝ∣W∣×Dh
输出:T个上下文词(context word,ŷ ∈ℝ∣W∣×1)
损失函数:cross-entropy - Jt(θ)=ylogŷ
详细步骤:
vc=Vx∈ℝDh×1
z=Uvc∈ℝ∣W∣×1
ŷ =softmax(z)∈ℝ∣W∣×1
Jt(θ)=ylogŷ
J(θ)=1T∑t=1TJt(θ)
Skip-Gram步骤图:

2.2 CBOW
与Skip-Gram相反,是通过完成上下文词预测中心词的任务来训练词向量的。
训练任务:根据上下文词,预测出中心词
输入:T个上下文词(context word,x∈ℝ∣W∣×1)
参数:一个look up table V∈ℝDh×∣W∣,一个word representation matrix U∈ℝ∣W∣×Dh
输出:一个中心词(center word,ŷ ∈ℝ∣W∣×1)
损失函数:cross-entropy - Jt(θ)=ylogŷ
详细步骤:
vot=V⋅xt∈ℝDh×1
vo=∑t=1Tvot
z=Uvo∈ℝ∣W∣×1
ŷ =softmax(z)∈ℝ∣W∣×1
J(θ)=Jt(θ)=ylogŷ
CBOW步骤图:

3. 两种优化方法
3.1 Negative Sampling
以下内容基于Skip-Gram模型。CBOW同理。
原始的方法中使用softmax()将z转化成ŷ 。很明显地,softmax()公式的分母将整个corpus都遍历了一遍,这个计算量并不小:
softmax(z)=zi∑∣W∣j=1zj
代替的方法是“负采样”。即从一个特定分布中,随机取出k个words来代表整个corpus。k个words和中心词(center word)组成成为noise pairs,上下文词(context words)和中心词(center word)组合成为true pairs。
这样一来,需要改变loss function为:
Jt(θ)=−logσ(uTovc)−∑k=1Klogσ(−uTkvc)
注:ui=U[i],即U中第i行。
如果true pair出现的概率越大,noise pairs出现的概率越小,则这个loss会减小,满足loss的定义,所以可以把loss表示成如上公式。
3.2 Hierarchical Softmaxg
待续……
4. 两种求导
以下内容基于Skip-Gram模型。CBOW同理。
模型要学习的是两个参数矩阵V和U。
4.1 Naive Softmax bp
首先,对V求梯度其实就是对vc求梯度,因为在forward过程中,参与loss计算的只有V中第c列。所以,只对vc求导即可。
其次,对U求梯度,对U中每一个元素进行求导,因为在forward过程中,U中每一个元素参与loss计算(softmax中)。
Forward如下,只考虑一对pair:
vc=Vx
z=Uvc
ŷ =softmax(z)
Jt(θ)=−ylogŷ
Back Propagate如下:
定义几个reused项:
δ1=∂Jt∂z=ŷ −y
这一项很好求,softmax(z)=zi∑∣W∣j=1zj,先求∂Jt∂zi,再求∂Jt∂zj(j≠i),然后组合成∂Jt∂z。
然后对U进行求导:
∂Jt∂U=∂Jt∂z⋅∂z∂U=δ1⋅vTc
提示:可以先大概的写出链式求导的几个项,然后根据维度进行组合。
接着对V进行求导:
∂Jt∂V=∂Jt∂vc=∂Jt∂z⋅∂z∂vc=UT⋅δ1
4.2. Negative Sampling bp
首先,对V求梯度其实就是对vc求梯度,因为在forward过程中,参与loss计算的只有V中第c列。所以,只对vc求导即可。
其次,对U求梯度,对uo和uk求梯度,因为在forward过程中,参与loss计算的只有uo和uk。
Forward如下,只考虑一对true pair:
vc=Vx
z=Uvc
Jt(θ)=−logσ(uTovc)−∑k=1Klogσ(−uTkvc)
Back Propagate如下:
对vc求导:
∂Jt(θ)∂vc=∂Jt(θ)∂uTovc⋅∂uTovc∂vc+∑k=1K∂Jt(θ)∂−uTkvc⋅∂−uTkvC∂vc=(σ(uTovc)−1)⋅uo−∑k=1K(σ(−uTkvc)−1)uk
同理,对uo求导:
∂Jt(θ)∂uo=(σ(uTovc)−1)⋅vc
同理,对uk求导:
∂Jt(θ)∂uk=−(σ(−uTkvc)−1)⋅vc
然后其余urest:
∂Jt(θ)∂urest=0
最后整理得:
∂Jt(θ)∂V=∂Jt(θ)∂vc
∂Jt(θ)∂U=[∂Jt(θ)∂uo;∂Jt(θ)∂uk;∂Jt(θ)∂urest]