首先列出参考资料:
- word2vec Parameter Learning Explained
- Quick Training of Probabilistic Neural Nets by Importance Sampling
- On Using Very Large Target Vocabulary for Neural Machine Translation
- Adaptive importance sampling to accelerate training of a neural probabilistic language model. IEEE Transactions on Neural Networks
- Sebastian Ruder’s blog(博客很不错)
主要是对重要性采样softmax的学习过程做一些笔记。
在词向量训练、神经网络语言模型、神经网络机器翻译等任务中,softmax函数有如下形式:
p(w|c)=exp(h⊤v′w)∑wi∈Vexp(h⊤v′wi)=exp(h⊤v′w)Z(h)
其中,h是导数层的输出,
v′wi 是w对应的输出词向量(即softmax的权重矩阵,具体可参考 (1)),V是词典,c是上下文。
在神经网络语言模型中,一般会把c压缩为h。
sampling softmax解决了softmax分母部分计算量大的问题。
如果损失函数采用交叉熵损失函数:
H(q,p)=−∑xq(x)logp(x)
这里q是真是期望分布,例如
q=[0,…1,…,0] ,p是模型输出分布,对应上面的softmax公式。
对于一个样本,可得交叉熵损失函数(这里把模型的参数统称为
θ )
Jθ=−logexp(h⊤v′w)∑wi∈Vexp(h⊤v′wi)
根据简单的
logxy=logx−logy
得到:
Jθ=−h⊤v′w+log∑wi∈Vexp(h⊤v′wi)
令:
E(w)=−h⊤v′w
得到:
Jθ=E(w)+log∑wi∈Vexp(−E(wi))
对 θ 求梯度得:
∇θJθ=∇θE(w)+∇θlog∑wi∈Vexp(−E(wi))
根据:
∇xlogx=1x
得:
∇θJθ=∇θE(w)+1∑wi∈Vexp(−E(wi))∇θ∑wi∈Vexp(−E(wi)
∇θJθ=∇θE(w)+1∑wi∈Vexp(−E(wi))∑wi∈V∇θexp(−E(wi))
根据
∇xexp(x)=exp(x) ,继续利用求导链式法则:
∇θJθ=∇θE(w)+1∑wi∈Vexp(−E(wi))∑wi∈Vexp(−E(wi))∇θ(−E(wi))
∇θJθ=∇θE(w)+∑wi∈Vexp(−E(wi))∑wi∈Vexp(−E(wi))∇θ(−E(wi))
可以看到
exp(−E(wi))∑wi∈Vexp(−E(wi)) 就是softmax的输出,即
wi 的概率
P(wi) 。
于是得到如下:
∇θJθ=∇θE(w)+∑wi∈VP(wi)∇θ(−E(wi))
最终得到:
∇θJθ=∇θE(w)−∑wi∈VP(wi)∇θE(wi)
对于梯度公式的第二部分,可以认为是
∇θE(wi) 对于softmax输出
P(wi) 的期望,即:
∑wi∈VP(wi)∇θE(wi)=Ewi∼P[∇θE(wi)]
这就是采样要优化的部分。
根据传统的重要性采样方法,按照如下公式计算期望:
Ewi∼P[∇θE(wi)]≈1N∑wi∼Q(w)P(wi)Q(wi)∇θE(wi)
其中N是从分布Q(我们自己定义的一个容易采样的分布)中采样的样本数,但是这种方法仍然需要计算
P(wi) ,而
P(wi) 的计算又需要softmax做归一化,这是我们不想看到的,所以要使用一种有偏估计的方法。
现在,让我们来观察Softmax公式( exp(−E(wi))∑wi∈Vexp(−E(wi)) )的分母部分:
Z(h)=∑wi∈Vexp(−E(wi))=M∑wi∈V(1M)⋅exp(−E(wi))
这样,我们可以把
∑wi∈V(1M)⋅exp(−E(wi)) 看出是一种期望的形式,进而可以采用采样的方法得到
Z(h) 。现在我们还是取候选分布为Q。
则:
Z(h)=Z^(h)=MN∑wi∼Q(w)R^(wi)exp(−E(wi))Q(wi)=MN∑wi∼Q(w)exp(−E(wi))M⋅Q(wi)
上式中的
R^(wi) 代表概率
1M ,约去M可得:
Z^(h)=1N∑wi∼Q(w)exp(−E(wi))Q(wi)
到这里,我们就可以用
Z^(h) 去近似
Z(h) 了。
现在理一下思路:
给定候选分布Q,传统采样方法需要计算P,也就是说需要计算分母Z,这是我们不想看到的。幸运的是分母Z仍然可以通过采样得到,采样Z的时候,仍然采用候选分布Q。
现在继续计算 ∇θJθ 中系数为负的部分,即期望部分。
Ewi∼P[∇θE(wi)]≈1N∑wi∼Q(w)P(wi)Q(wi)∇θE(wi)=1N∑wi∼Q(w)P^(wi)Q(wi)∇θE(wi)
其中
P^(wi) 代表采样方式获得的概率:
P^(wi)=exp(−E(wi))Z^(h)
可得:
Ewi∼P[∇θE(wi)]≈1N∑wi∼Q(w)exp(−E(wi))Q(wi)Z^(h)∇θE(wi)
现在我们就从Q分布中采样N个样本,组成集合J,最终得到:
Ewi∼P[∇θE(wi)]≈∑wj∈Jexp(−E(wj))∇θE(wj)/Q(wj)∑wj∈Jexp(−E(wj))/Q(wj)
整体梯度为:
∇θJθ=∇θE(w)−∑wj∈Jexp(−E(wj))∇θE(wj)/Q(wj)∑wj∈Jexp(−E(wj))/Q(wj)
下面给出算法步骤(来自 Quick Training of Probabilistic Neural Nets by Importance Sampling):
OK,如果你正在使用tensorflow的Seq2Seq模型,并且正在阅读On Using Very Large Target Vocabulary for Neural Machine Translation,对于论文中的公式(10)和公式(11),本篇笔记可以给出大致思路的解释,有不完善或错误的地方,欢迎批评指正!