- NMT(nerual machine translation)任务经常被描述为一个encode-decode过程,输入序列利用RNN进行encode产生一个编码(包含句子的语义信息),将这个编码送进decode的RNN产生target的语言序列,这就完成了端到端的MT。decode的RNN的输入,有的人设计为只需要该RNN前一个预测的单词,即编码只在第一个时序的RNN单元输入,后面就作为隐状态传播;有的人设计为既需要前一个预测的单词,又需要前述encoder产生的编码,即编码送进每一个时序的RNN unit。
- 谷歌使用的多语种翻译系统是只需要一个encoder 一个decoder完成从多语种到多语种的翻译。机密在于,当你想要将某个句子翻译为某种语言时,在句子的开头加一个特殊标记,表示target的语言即可。这种单一模型进行多语种的翻译十分有益,能够利用多种语言对的训练集相互促进,比如,如果中文翻译成法语的语料库比较小,单独拿这个语料库训练一个中到法的MT,效果不好。但是如果你同时又有一些中到英的语料库,或者英到法的语料库,在训练多语种的模型时,中到法的翻译能够受益而仍能有较好的效果
- 注意力机制:上上点提到的decoder的输入仍然不完善,因为无论encoder的最终输出Y是作为隐状态在decoder中传播还是作为每一时刻的输入,只依赖于Y无疑是有限的,句子开头的部分信息可能由于序列过长而在encoder的传播中消失,这样以来Y中包含的句子开头的信息就不完整了。举一个拟人的例子,人类翻译员翻译的时候也不是看一遍句子然后不看了开始写翻译,而是在翻译的过程中会回过头去看。为了使得decoder能够回过头去看句子开头的内容,注意力机制是这样做的。decoder在每个时序增加一个注意力模型,利用上一时序decoder的隐状态,来计算encoder每个时序隐状态的分数,利用这些分数(再利用softmax变成概率值)对encoder的每个时序的隐状态进行加权平均得到一个参考向量c。也就是说这时decoder的输入就包括了c,上一时刻decoder的隐状态
h
t
−
1
h_{t-1}
ht−1,上一时刻的输出
o
t
−
1
o_{t-1}
ot−1。
- 这个scoring function可以有不同的形式,有的用两次神经网络构成,有的只是简单的 h t − 1 T W a h ‾ s h_{t-1}^T W_a\overline{h}_s ht−1TWahs但仍然十分有效
- decode在预测阶段预测序列的策略有以下几种
- 第一种是遍历搜索,在第t步利用t-1产生第t步应该输出的单词的概率分布时,每个单词都尝试一遍作为第t步的输出单词然后 继续第t+1步,遍历搜索所有可能的总长度T,然后将不同t的概率乘积作为每个决策的概率,从中挑选概率最高的,也就是说,如果语料库有N个单词,这个策略会产生N为底T为指数的数量级的决策,其实是非常低效而不可能实施的
- 第二种是采样策略,即当你在t步利用t-1产生第t步应该输出的单词的概率分布时,根据这个概率分布进行采样生成第t步的输出,理论上是行得通而且能够收敛的但是实际操作的时候会导致模型非常不稳定,所以也不会采用
- 第三种是贪婪搜索,即在概率分布中选择概率最高的单词作为第t步的输出,这个并没有什么问题,可以这样做,但是实际中更多采用的是第四种
- 第四种是beam search,是不完全的贪婪策略。在概率分布中选择概率最高的b个单词做完第t步的输出,然后接着产生第t+1步的输出,所以现在我们有b的平方个分支,然后在这b的平方里面挑选概率乘积最高的b个,继续下去。通常b不会太大,5和10都可以。当b趋于无穷时这就是第一种方法,会得到理论上最优的无偏搜索,当b为1时这就是完全的贪婪搜索,但是容易导致一步错步步错。所以这是一种权衡,牺牲一点点效率,提高一点点质量,beam search是广泛应用的策略