神经翻译笔记5扩展b. 常用的机器翻译技巧
本节介绍提升机器翻译系统效果的常见手段。这些手段有些实际上是深度学习的通用技巧,有些在神经翻译出现后不久就被人提出,经过若干发展沿用至今,有些甚至在统计翻译时代就已出现。无论如何,这些手段独立于模型架构存在,都不仅能够增强模型效果,还展现了顽强的生命力以及良好的通用性
本节参考了Koehn的NMT综述13.6.1、13.6.3、13.6.7三小节的内容,并根据个人喜好作了裁剪和偏重。一些近几年出现,尚未广泛应用但可能有良好前景的方法(例如与预训练模型的融合)在此先不介绍,后面可能再用单独文章总结
组合解码
组合解码的核心思想是先训练多个模型,然后将它们按照不同方式组合。大部分情况下,模型都是在正确的事情上取得一致,而很少一起犯同样的错误,因此模型组合可以起到匡正纠偏的效果
为了实现组合解码,首先要解决的问题是如何获得多个模型。方法通常有两种:
- 在单次训练过程中,每若干个batch或经过若干个epoch就保存一个中间检查点。在训练结束后,根据某一项评估指标(BLEU、损失值loss或者困惑度ppl),选取在该指标上效果最好的若干模型组合。这种方法称为检查点组合
- 使用不同的超参数(例如不同学习率、warmup step)甚至不同的随机数种子训练多个模型,将训练好的模型组合。这种方法称为多轮训练组合。注意这里随机数种子一般会影响两项随机性,其一是网络参数初始化的结果,其二是数据集被打乱重排的结果
笔者习惯于训练多个模型,将单次训练中得到的若干个检查点权重求平均(这种方法也能够带来提升,详见神经翻译笔记3扩展d. 神经网络的泛化参数平均部分的解释),然后将这些平均后得到的模型再做组合。训练多个模型时,观察到的现象是每次使用不同的随机数种子带来的训练结果波动更大。有同事反馈使用不同数据源训练模型然后组合效果更佳,可以参考
在获得了多个模型以后,接下来要解决的是如何将它们的结果组合起来。常见的方法是在每一步解码过程时,获得各个模型在这一步的softmax结果(也就是目标语言词表大小的概率向量),然后将得到的这些向量求平均,选出平均后概率最大的单词,用这个单词指导所有模型的下一步解码,示意图如下所示
在此之上一个显然的改进是对不同的模型赋予不同权重,从而让效果更好的模型在组合时话语权更大一些。笔者实验表明合适的权重分配可以额外带来0.1~0.3BLEU的提升,有时可能会更大一些(但是基本不会超过0.5)
标签平滑
机器翻译本质上是一个多时间步分类问题,因此每一步都可以使用交叉熵做损失函数。假设目标词表大小为 V V V,某一步的真实标签为 y y y,则对各个标签 k k k,求交叉熵时的目标概率 q ( k ) = δ k , y q(k) = \delta_{k,y} q(k)=δk,y,其中 δ \delta δ是狄拉克delta函数,即 k = y k=y k=y时为1否则为0。然而[lsr]却提出了这种方法面临两个问题:其一,模型对每个训练样本都试着给真实标签一个接近为1的概率,但是这种做法不利于泛化,有过拟合的风险。其次,由于模型给出的概率分布是根据分对数logit做softmax计算得出,理论上这个通过计算得到的概率分布不可能等于真实目标对应的0-1向量,因此实际上训练过程是鼓励模型拉开最大标签对应分对数和其它分对数之间的差距,即是鼓励模型对自己的预测结果太过自信,也不利于模型的适应性
该文章提出了一种称作标签平滑(label smoothing)的方法,引入一个在标签空间上的另一个概率分布 u ( k ) u(k) u(k)( u ( k ) u(k) u(k)独立于训练样本)和超参数 ϵ \epsilon ϵ。对给定的训练样本的,新的 q ( k ) q(k) q(k)为
q ′ ( k ∣ x ) = ( 1 − ϵ ) δ k , y + ϵ u ( k ) q'(k|x) = (1-\epsilon)\delta_{k,y} + \epsilon u(k) q′(k∣x)=(1−ϵ)δk,y+ϵu(k)
可以理解为先将真实标签设为 y y y,然后以 ϵ \epsilon ϵ的概率将真实标签以 u ( k )