486 Chapter 14. 神经机器翻译模型推断 肖桐 朱靖波
14.4 非自回归翻译
目前大多数神经机器翻译模型都使用自左向右逐词生成译文的策略,即第 j
目标语言单词的生成依赖于先前生成的 j 1 个词。这种翻译方式也被称作自回归解
Autoregressive Decoding虽然以 Transformer 为代表的模型使得训练过程高度
并行化,加快了训练速度。但由于推断过程自回归的特性,模型无法同时生成译文
中的所有单词,导致模型的推断过程非常缓慢,这对于神经机器翻译的实际应用是
个很大的挑战。因此,如何设计一个在训练和推断阶段都能够并行化进行的模型是
目前研究的热点之一。
14.4.1 自回归 vs 非自回归
前主经机的推Autoregressive Translation
过程。所谓自回归是一种描述时间序列生成的方式:对于目标序列 y = {y
1
,...,y
n
}
如果 j 时刻状态 y
j
的生成依赖于之前的状态 {y
1
,...,y
j1
}而且 y
j
{y
1
,...,y
j1
}
构成线性关系,那么称目标序列
y
的生成过程是自回归的。神经机器翻译借用了这
个概念,但是并不要 y
j
{y
1
,...,y
j1
} 构成线性关系,14.2.1节提到的自左向
翻译模型和自右向左翻译模型都属于自回归翻译模型。自回归翻译模型在机器翻译
任务上也有很好的表现,特别是配合束搜索往往能够有效地寻找近似最优译文。但
是,由于解码器的每个步骤必须顺序地而不是并行地运行,自回归翻译模型会阻碍
不同译文单词生成的并行化。特别是在 GPU 上,翻译的自回归性会大大降低计算的
并行度和设备利用率。
对于这个问题,研究人员也考虑移除翻译的自回归性,进行非自回归翻译Non-
Autoregressive TranslationNAT
[273]
一个简单的非自回归翻译模型将问题建模为公
(14.9)
P (y|x) =
n
Y
j=1
P (y
j
|x) (14.9)
对比公式(14.1)可以看出,公式(14.9)中位 j 上的输出 y
j
只依赖于输入句子 x
与其它位置上的输出无关。于是,可以并行生成所有位置上的 y
j
。理想情况下,这
种方式一般可以带来几倍甚至十几倍的速度提升。
14.4.2 非自回归翻译模型的结构
在介绍非自回归翻译模型的具体结构之前,先来看看如何实现一个简单的非自
回归译模型。这用标准的 Transformer 例。首先为一次性生所有的词,
需要丢弃解码器对未来信息屏蔽的矩阵,从而去掉模型的自回归性。此外,还要考
虑生成译文的长度。在自回归翻译模型中,每步的输入是上一步解码出的结果,当
预测到终止 <eos> 时,序列的生成就自动停止了,然而非自回归翻译模型却没
14.4 非自回归翻译 487
这样的特性,因此还需要一个长度预测器来预测出其长度,之后再用这个长度得到
每个位置的表示,将其作为解码器的输入,进而完成整个序列的生成。
编码器
长度预测器
译文长度:4
解码器
e(x
2
)e(x
1
) e(x
3
)
PE(1) PE(2) PE(3)
(b) 非自回归翻译模型
PE(1) PE(2) PE(3) PE(4)
y
1
y
2
y
3
y
4
编码器
e(x
2
)e(x
1
) e(x
3
)
PE(1) PE(2) PE(3)
e(y
2
)
PE(3)
e(y
1
)
PE(2)
e(sos)
PE(1)
e(y
3
)
PE(4)
e(y
4
)
PE(5)
(a) 自回归翻译模型
y
1
y
2
y
3
y
4
<eos>
解码器
14.7 自回归翻译模型 vs 非自回归翻译模型
14.7对比自回翻译型和单的自回翻译型。可看到种自
归翻译模型可以一次性生成完整的译文。不过,高并行性也带来了翻译品质的下降。
例如,对于 IWSLT 英德等数据,非自回归翻译模型的 BLEU 值只有个位数,而现在
最好的自回归模型的 BLEU 值已经能够达到 30 左右。这是因为每个位置词的预测只
依赖于源语言句子 x,使得预测不准确。需要注意的是,图14.7(b) 中将位置编码作
为非自回归翻译模型解码器的输入只是一个最简单的例子,在真实的系统中,非自
回归解码器的输入一般是复制编码器端的输入,即源语言句子词嵌入与位置编码的
融合。
模,呢?子,
“干///文,Good job !Well done !”。
生成这两种翻译的概率是相等的,即一半的概率是“Good job !,另一半的概率是
488 Chapter 14. 神经机器翻译模型推断 肖桐 朱靖波
Well done !。由于非自回归翻译模型的条件独立性假设,推断时第一个词Good
Well的概率是差不多大的,如果第二个词jobdone的概率也差不多大,
会使得模型生成出Good done !或者Well job !这样错误的翻译,如图14.8所示。
这便是影响句子质量的关键问题,称之为多峰问题Multimodality Problem
[273]
。如
何有效处理非自回归翻译模型中的多峰问题是提升非自回归翻译模型质量的关键。
编码器
长度预测器
译文长度:3
解码器
e()
e()
e()
e(!)
PE(1) PE(2) PE(3) PE(4)
PE(1) PE(2) PE(3
Good Well
job
done
!
Good job !
Well done !
Good done !
Well job !
3
3
7
7
14.8 非自回归翻译模型中的多峰问题
因此,非自回归翻译的研究大多集中在针对以上问题的求解。有三个角度:使
用繁衍率预测译文长度、使用句子级知识蒸馏来降低学习难度、使用自回归翻译模
型进行翻译候选打分。下面将依次对这些方法进行介绍。
1. 基于繁衍率的非自回归翻译模型
14.9给出了基于繁衍率的 Transformer 非自回归翻译模型的结构
[273]
由三个模
块组成: 编码器,解码器,繁衍率预测器。类似于标准的 Transformer 模型,这里编码
器和解码器都完全由前馈神经网络和多头注意力模块组成。唯一的不同是解码器中
新增了位置注意力模块(图14.9中被红色虚线框住的模块),用于更好的捕捉目标语
言端的位置信息。
繁衍率预测器的一个作用是预测整个译文句子的长度,以便并行地生成所有译
文单词。可以通过对每个源语言单词计算繁衍率来估计最终译文的长度。具体来说,
繁衍率指的是:根据每个源语言单词预测出其对应的目标语言单词的个数(见第六
章)如图14.9所示,翻译过程中英语单词We对应一个汉语单词“我们”其繁衍
率为 1。于是,可以得到源语言句子对应的繁衍率序列(图14.9中的数 1 1 2 0 1
最终译文长度则由源语言单词的繁衍率之和决定。之后将源语言单词按该繁衍率序
列进行拷贝,在图中的例子中,Wetotally.拷贝一次,”accept”it
分别拷贝两次和零次,就得到了最终解码器的输入We totally accept accept .在模
型训练阶段,繁衍率序列可以通过外部词对齐工具得到,用于之后训练繁衍率预测
器。但由于外部词对齐系统会出现错误,因此在模型收敛之后,可以对繁衍率预测
14.4 非自回归翻译 489
Embedding
Self-attention
Feed Forward
Softmax
Embedding
Self-attention
Positional Attention
Encoder-Decoder
Attention
Feed Forward
Linear
Softmax
211
0
1
我们/完全/接受/ /
We totally accept it .
We totally accept accept .
译文长度:5
繁衍率
预测器
编码器
M×
解码器
×N
14.9 基于繁衍率的非自回归翻译模型
器进行额外的微调。
实际上,使用繁衍率的另一个好处在于可以缓解多峰问题。因为,繁衍率本身
可以看作是模型的一个隐变量。使用这个隐变量本质上是在对可能的译文空间进行
剪枝,因为只有一部分译文满足给定的繁衍率序列。从这个角度说,在翻译率的作
用下,不同单词译文组合的情况变少了,因此多峰问题也就被缓解了。
另外,在每个解码器层中还新增了额外的位置注意力模块,该模块与其它部分
中使用的多头注意力机制相同。其仍然基于 QKV 之间的计算(见第十二章)
是把位置编码作为 Q K, 解码器端前一层的输出作为 V这种方法提供了更强的位
置信息。
2. 句子级知识蒸馏
知识蒸馏的基本思路是把教师模型的知识传递给学生模型,让学生模型可以更
好地学习(见第十三章)通过这种方法,可以降低非自回归翻译模型的学习难度。
体来说,可以让自回归翻译模型作为“教师”非自回归翻译模型作为“学生”把自回
归翻译模型生成的句子作为新的训练样本,送给非自回归翻译模型进行学习
[682, 735, 736]
有研究发现自回归翻译模型生成的结果的“确定性”更高,也就是不同句子中相同
490 Chapter 14. 神经机器翻译模型推断 肖桐 朱靖波
源语言片段翻译的多样性相对低一些
[273]
。虽然从人工翻译的角度看,这可能并不是
理想的译文,但是使用这样的译文可以在一定程度上缓解多峰问题。因为,经过训
练的自回归翻译模型会始终将相同的源语言句子翻译成相同的译文。这样得到的数
据集噪声更少,能够降低非自回归翻译模型学习的难度。此外,相比人工标注的译
文,自回归翻译模型输出的译文更容易让模型进行学习,这也是句子级知识蒸馏有
效的原因之一。
3. 自回归翻译模型打分
通过采样不同的繁衍率序列,可以得到多个不同的翻译候选。之后,把这些不
同的译文再交给自回归翻译模型来评分,选择一个最好的结果作为最终的翻译结果。
通常,这种方法能够很有效地提升非自回归翻译模型的译文质量,并且保证较高的
推断速度
[273, 737, 738, 739, 740]
但是,缺点是需要同时部署自回归翻译和非自回归翻译两套
系统。
14.4.3 更好的训练目标
虽然非自回归翻译可以显著提升翻译速度,但是很多情况下其翻译质量还是低
于传统的自回归翻译
[273, 736, 741]
因此,很多工作致力于缩小自回归翻译模型和非自回
归翻译模型的性能差距
[742, 743, 744]
一种直接的方法是层级知识蒸馏
[745]
。由于自回归翻译模型和非自回归翻译模
的结相差不大,此可将翻译质更高的自归翻模型作为“教师”通过
给非自回归翻译模型提供监督信号,使其逐块地学习前者的分布。研究人员发现了
两点非常有意思的现象:1)非自回归翻译模型容易出现“重复翻译”的现象,这些
相邻的重复单词所对应的位置的隐藏状态非常相似。2非自回归翻译模型的注意力
分布比自回归翻译模型的分布更加尖锐。这两点发现启发了研究人员使用自回归翻
译模型中的隐层状态和注意力矩阵等中间表示来指导非自回归翻译模型的学习过程。
可以计算两个模型隐层状态的距离以及注意力矩阵的 KL 散度
6
,将它们作为额外的
损失指导非自回归翻译模型的训练。类似的做法也出现在基于模仿学习的方法中
[737]
它也可以被看作是对自回归翻译模型不同层行为的模拟。不过,基于模仿学习的方
法会使用更复杂的模块来完成自回归翻译模型对非自回归翻译模型的指导,比如,
自回归翻译模型和非自回归翻译模型中都使用一个额外的神经网络,用于传递自回
归翻译模型提供给非自回归翻译模型的层级监督信号。
此外,也可以使用基于正则化因子的方法
[739]
。非自回归翻译模型的翻译结果中
存在着两种非常严重的错误:重复翻译和不完整的翻译。重复翻译问题是因为解码
器隐层状态中相邻的两个位置过于相似,因此翻译出来的单词也一样。对于不完整
翻译,即欠翻译问题,通常是由于非自回归翻译模型在翻译的过程中丢失了一些源
语言句子的信息。针对这两个问题,可以通过在相邻隐层状态间添加相似度约束来
6
KL 散度即相对熵。
14.4 非自回归翻译 491
计算一个重构损失。具体实践时,对于翻译 x y通过一个反向的自回归翻译模型
再将 y 翻译成 x
,最后计算 x x
的差异性作为损失。
14.4.4 引入自回归模块
非自回归翻译消除了序列生成过程中不同位置预测结果间的依赖,在每个位置
都进行独立的预测,但这反而会导致翻译质量显著下降,因为缺乏不同单词间依赖
关系的建模。因此,也有研究聚焦于在非自回归翻译模型中添加一些自回归组件。
一种做法是将句法信息作为目标语言句子的框架
[746]
。具体来说,先自回归地预
测出一个目标语言的句法块序列,将句法块作为序列信息的抽象,然后根据句法块
序列自回归地成所有目语言单词。如图14.10, 该模由一个编器和
个解码器组成。其中编码器和第一个解码器与标准的 Transformer 模型相同,用来自
回归地预测句法树信息;第二个解码器将第一个解码器的句法信息作为输入,之后
再非自回归地生成整个译文。在训练过程中,通过使用外部句法分析器获得对句法
预测任务的监督信号。虽然可以简单地让模型预测整个句法树,但是这种方法会显
著增加自回归步骤的数量,从而增大时间开销。因此,为了维持句法信息与解码时
间的平衡,这里预测一些由句法标记和子树大小组成的块标识符(如 VP3)而不是
整个句法树。关于基于句法的神经机器翻译模型在第十五章还会有进一步讨论。
编码器
//熟睡/
自回归解码器
NP1 VP3 PU1 <eos>
<sos> NP1 VP3 PU1
非自回归解码器
NP1 Cats VP3 sleep a lot PU1 .
NP1 <Mask> VP3 <Mask> <Mask> <Mask> PU1 <Mask>
14.10 基于句法结构的非自回归翻译模型
另一种做法是半自回归地生成译文
[747]
如图14.11所示,自回归翻译模型从左到
右依次生成译文,具有“最强”的自回归性;而非自回归翻译模型完全独立的生成
每个译文单词,具有“最弱”的自回归性;半自回归翻译模型则是将整个译文分成 k
个块,在块内执行非自回归解码,在块间则执行自回归的解码,能够在每个时间步
并行产生多个连续的单词。通过调整块的大小,半自回归翻译模型可以灵活的调整
为自回归翻译(当 k 等于 1)和非自回归翻译(当 k 大于等于最大的译文长度)
还有一种做法引入了轻量级的自回归调序模块
[748]
。为了解决非自回归翻译模型
解码搜索空间过大的问题,可以使用调序技术在相对较少的翻译候选上进行自回归
翻译模型的计算。如图14.12所示,该方法对源语言句子进行重新排列转换成由源语
言单词组成但位于目标语言结构中的伪译文,然后将伪译文进一步转换成目标语言
以获得最终的翻译。其中,这个调序模块可以是一个轻量自回归翻译模型,例如,
层的循环神经网络。
492 Chapter 14. 神经机器翻译模型推断 肖桐 朱靖波
来自编码器的信息
y
2
(a) 自回归解码
y
1
<sos>
y
3
y
4
y
3
y
2
y
1
y
4
<eos>
自回归解码器
来自编码器的信息
y
1
y
2
(b) 半自回归解码
<sos>
y
3
y
4
y
3
y
4
y
1
y
2
<eos>
半自回归解码器
来自编码器的信息
非自回归解码器
(c) 非自回归解码
y
2
y
1
y
3
y
4
14.11 自回归、半自回归和非自回归解码对比
[747]
编码器组件 解码器组件 解码器组件
解码器输入
编码器模块 调序模块 解码器模块
There exist dierent
opinions on this question .
There exist dierent
opinions on this question .
(复制源语言句子)
on this question
There exist dierent opinions .
/这个/问题/存在/不同//看法/
N×
1×
N 1×
14.12 引入调序模块的非自回归翻译模型
14.4 非自回归翻译 493
14.4.5 基于迭代精化的非自回归翻译模型
如果一次性并行地生成整个译文序列,往往很难捕捉单词之间的关系,而且即
便生成了错误的译文单词,这类方法也无法修改。针对这些问题,也可以使用迭代
式的生成方式
[682, 749, 750]
这种方法放弃了一次生成最终的译文句子,而是将解码出的
译文再重新送给解码器,在每次迭代中来改进之前生成的译文单词,可以理解为句
子级的自回归翻译模型。这样做的好处在于,每次迭代的过程中可以利用已经生成
的部分翻译结果,来指导其它部分的生成。
14.13展示了这种方法的简单示例。它拥有一个编码器和 N 个解码器。编码器
首先预测出译文的长度,然后将输入 x 按照长度复制出 x
作为第一个解码器的输入,
之后生成 y
[1]
作为第一轮迭代的输出。接下来再把 y
[1]
输入给第二个解码器,然后输
y
[2]
以此类推。那么迭代到什么时候结束呢?一种简单的做法是提前制定好迭代
次数,这种方法能够自主地对生成句子的质量和效率进行平衡。另一种称之为“自
适应”的方法,具体是通过计算当前生成的句子与上一次生成句子之间的变化量来
判断是否停止,例如,使用杰卡德相似系数作为变化量函数
7
另外,需要说明的是,
14.13中是使用多个解码器的一种逻辑示意。真实的系统仅需要一个解码器,并运
行多次,就达到了迭代精化的目的。
编码器
长度预测器
解码器 解码器
...
解码器
x
x
y
[1]
y
[1]
y
[2]
y
[N1]
y
[N]
14.13 基于迭代精化的非自回归翻译模型运行示例
除了使用上一个步骤的输出,当前解码器的输入还可以使用了添加噪声的正确
目标语言句子
[682]
。另外,对于译文长度的预测,也可以使用编码器的输出单独训练
一个独立的长度预测模块,这种方法也推广到了目前大多数非自回归翻译模型上。
另一种方法借鉴了 BERT 的思想
[125]
,称为 Mask-Predict
[749]
。类似于 BERT
<CLS> 记,该方法在源语言句子的最前面加上了一个特殊符号 <LEN> 为输入,
用来预测目标句的长度 n。之后,将特殊符 <Mask>(与 BERT 中的 <Mask> 有相似
的含义)复制 n 次作为解码器的输入,然后用非自回归的方式生成所有的译文单词。
这样生成的翻译可能是比较差的,因此可以将第一次生成的这些词中不确定(即生
成概率比较低)的一些词“擦”掉,依据剩余的译文单词以及源语言句子重新进行
预测,不断迭代,直到满足停止条件为止。图14.14给出了一个示例。
7
杰卡德相似系数是衡量有限样本集之间的相似性与差异性的一种指标,杰卡德相似系数值越大,
494 Chapter 14. 神经机器翻译模型推断 肖桐 朱靖波
编码器
解码器 解码器
<LEN>
Hello
,
world
!
<Mask> <Mask> <Mask> <Mask>
你好
你好
你好
世界
你好
<Mask>
译文长度:4
14.14 Mask-Predict 方法的运行示例
本相似度越高。