13. 神经机器翻译模型训练
模型训练是机器翻译领域的重要研究方向,其中的很多发现对其它自然语言处
理任务也有很好的借鉴意义。特别是,训练神经机器翻译仍然面临一些挑战,包括:
• 如何对大容量模型进行有效的训练?例如,避免过拟合问题,并让模型更加健
壮,同时有效地处理更大的词汇表。
• 如何设计更好的模型训练策略?例如,在训练中更好地利用机器翻译评价指标,
同时选择对翻译更有价值的样本进行模型训练。
• 如何让模型学习到的“知识”在模型之间迁移?例如,把一个“强”模型的能
力迁移到一个“弱”模型上,而这种能力可能是无法通过直接训练“弱”模型
得到的。
本章将就这些问题展开讨论,内容会覆盖开放词表、正则化、对抗样本训练、最
小风险训练、知识蒸馏等多个主题。需要注意的是,神经机器翻译模型训练涉及的
内容十分广泛。很多情况下,模型训练问题会和建模问题强相关。因此,本章的内容
主要集中在相对独立的基础模型训练问题上。在后续章节中,仍然会有模型训练方
面的介绍,其主要针对机器翻译的特定主题,如深层神经网络训练、无指导训练等。
13.1 开放词表
对于神经机器翻译而言,研究人员通常希望使用更大的词表完成模型训练。因为
大词表可以覆盖更多的语言现象,使模型对不同的语言现象有更强的区分能力。但
434 Chapter 13. 神经机器翻译模型训练 肖桐 朱靖波
是,人类的语言表达方式是十分多样的,这也体现在单词的构成上,甚至人们都无
法想象数据中存在的不同单词的数量。比如,在 WMT、CCMT 等评测数据上,英语
词表大小都会在 100 万以上。如果不加限制,机器翻译的词表将会很“大”。这也会
导致模型参数量变大,模型训练变得极为困难。更严重的问题是,测试数据中的一
些单词根本就没有在训练数据中出现过,这时会出现未登录词翻译问题(即 OOV 问
题),即系统无法对未见单词进行翻译。在神经机器翻译中,通常会考虑使用更小的
翻译单元来缓解数据稀疏问题。
13.1.1 大词表和未登录词问题
首先来具体看一看神经机器翻译的大词表问题。神经机器翻译模型训练和推断
都依赖于源语言和目标语言的词表(见第十章)。在建模中,词表中的每一个单词都
会被转换为分布式(向量)表示,即词嵌入。如果每个单词都对应一个向量,那么单
词的各种变形(时态、语态等)都会导致词表增大,同时增加词嵌入表示的难度。如
果要覆盖更多的翻译现象,词表会不断膨胀,并带来两个问题:
• 数据稀疏。很多不常见的低频词包含在词表中,而这些低频词的词嵌入表示很
难得到充分学习。
• 参数及计算量的增大。大词表会增加词嵌入矩阵的大小,同时也会显著增加输出
层中线性变换和 Softmax 的计算量。
理想情况下,机器翻译应该是一个开放词表(Open Vocabulary)的翻译任务。也
就是,无论测试数据中包含什么样的词,机器翻译系统都应该能够正常翻译。但是,
现实的情况是即使不断扩充词表,也不可能覆盖所有可能的单词。这个问题在使用
受限词表时会更加严重,因为低频词和未见过的词都会被看作未登录词。这时会将
这些单词用符号 <UNK> 代替。通常,数据中 <UNK> 的数量会直接影响翻译性能,
过多的 <UNK> 会造成欠翻译、结构混乱等问题。因此神经机器翻译需要额外的机制
解决大词表和未登录词问题。
13.1.2 子词
一种解决开放词表翻译问题的思路是改造输出层结构
[468, 562]
,比如,替换原始的
Softmax 层,用更加高效的神经网络结构进行超大规模词表上的预测。不过,模型结
构和训练方法的调整使得系统开发与调试的工作量增加,并且这类方法仍然无法解
决未登录词问题,因此在实用系统中并不常用。
另一种思路是不改变机器翻译系统,而是从数据处理的角度来缓解未登录词问
题。既然使用单词会带来数据稀疏问题,那么自然会想到使用更小的单元,通过更
小的单元的多种排列组合来表示更多的单词。比如,把字符作为最小的翻译单元
1
——
也就是基于字符的翻译模型
[563]
。以英语为例,只需要构造一个包含 26 个英语
1
汉语里的字符可以被看作是汉字。
13.1 开放词表 435
字母、数字和一些特殊符号的字符表,便可以表示所有的单词。
但是字符级翻译也面临着新的问题
——
使用字符增加了系统捕捉不同语言单
元之间搭配的难度。假设平均一个单词由 5 个字符组成,系统所处理的序列长度便
增大 5 倍。这使得具有独立意义的不同语言单元需要跨越更远的距离才能产生联系。
此外,基于字符的方法也破坏了单词中天然存在的构词规律,或者说破坏了单词内
字符的局部依赖。比如,英语单词“telephone”中的“tele”和“phone”都是有具体
意义的词缀,但是如果把它们打散为字符就失去了这些含义。
那么有没有一种方式能够兼顾基于单词和基于字符方法的优点呢?常用的手段
包括两种,一种是采用字词融合的方式构建词表,将未知单词转换为字符的序列并
通过特殊的标记将其与普通的单词区分开来
[564]
。而另一种方式是将单词切分为子词
(Sub-word),它是介于单词和字符中间的一种语言单元表示形式。比如,将英语单
词“doing”切分为“do”+“ing”。对于形态学丰富的语言来说,子词体现了一种具
有独立意义的构词基本单元。如图??,子词“do”和“new”可以用于组成其他不同
形态的单词。
do does
doing
do
new newer
newest
new
图 13.1 不同单词共享相同的子词(前缀)
在一些极端的情况下,子词仍然可以包含所有的字母和数字。这样,理论上,所
有的单词都可以用子词进行组装。当然,理想的状况是:在子词词表不太大的前提
下,使用尽可能少的子词单元拼装出每个单词。在神经机器翻译中,基于子词的切
分是很常用的数据处理方法,称为子词切分。主要包括三个步骤:
• 对原始数据进行分词操作;
• 构建符号合并表;
• 根据合并表,将字符合并为子词。
这里面的核心是如何构建符号合并表,下面对一些常用方法进行介绍。
13.1.3 双字节编码
字节对编码或双字节编码(BPE)是一种常用的子词词表构建方法。BPE 方法最
早用于数据压缩,该方法将数据中常见的连续字符串替换为一个不存在的字符,之
后通过构建一个替换关系的对应表,对压缩后的数据进行还原
[565]
。机器翻译借用了
这种思想,把子词切分看作是学习对自然语言句子进行压缩编码表示的问题
[89]
。其
目的是,保证编码(即子词切分)后的结果占用的字节尽可能少。这样,子词单元会
尽可能被不同单词复用,同时又不会因为使用过小的单元造成子词切分后的序列过
长。
436 Chapter 13. 神经机器翻译模型训练 肖桐 朱靖波
预处理
文本
词表
low
lower
newest
widest
...
频次
6
2
6
3
...
词表
l/o/w
l/o/w/e/r
n/e/w/e/s/t
w/i/d/e/s/t
...
频次
6
2
6
3
...
统计词表和
词频
按字符切分
BPE 学习
词表
l/o/w
l/o/w/e/r
n/e/w/e/s/t
w/i/d/e/s/t
...
频次
6
2
6
3
...
二元组
(e,s)
(s,t)
(l,o)
(o,w)
...
频次
9
9
8
8
...
符号合并表
(e,s)
统计二元组
出现的频次
频次最高的
(e,s) 加入表
中
词表
l/o/w
l/o/w/e/r
n/e/w/es/t
w/i/d/es/t
...
频次
6
2
6
3
...
在词表中
合并 (e,s)
二元组
(es,t)
(l,o)
(o,w)
(n,e)
...
频次
9
8
8
6
...
符号合并表
(e,s)
(es,t)
统计二元组
出现的频次
频次最高的
(es,t) 加入表
中
···
在词表中
合并 (es,t)
直至达到预设的符号合并表
大小,或没有二元组可以被
合并
符号合并表:
(e,s),
(ne,w),
(wid,est),
(es,t),
(new,est),
(low,e),
(l,o),
(w,i),
(lowe,r),
(lo,w),
(wi,d),
...
(n,e),
...
...
输出符号合并表
图 13.2 BPE 算法中符号合并表的生成过程
13.1 开放词表 437
使用 BPE 算法进行子词切分包含两个步骤。首先,通过统计的方法构造符号合
并表(见图??),具体的方式为:先对分过词的文本进行统计,得到词表和词频,同
时将词表中的单词分割为字符表示;其次统计词表中所有出现的二元组的频次,选
择当前频次最高的二元组加入符号合并表,并将所有词表中出现的该二元组合并为
一个单元;不断地重复上述过程,直到合并表的大小达到预先设定的大小,或没有二
元组可以被合并。图??给出了一个使用字符合并表对单词进行子词切分的实例。红
色单元为每次合并后得到的新符号,直至无法合并,或遍历结束,得到最终的合并
结果。其中每一个单元为一个子词。
符号合并表
(r,<e>), (e,s), (l,o), (es,t), (lo,w), (est,<e>), (e,r<e>)
(a) 符号合并表
l o w e r <e> l o w e r<e> lo w e r<e> low e r<e> low er<e>
l o w e s t <e> l o w es t <e> lo w es t <e> lo w est <e> low est <e> low est<e>
样例 1:
样例 2:
(b) 合并样例
图 13.3 BPE 中的子词切分过程
使用 BPE 方法后,翻译模型的输出也是子词序列,因此需要对最终得到的翻译
结果进行子词还原,即将子词形式表达的单元重新组合为原本的单词。这一步操作
也十分简单,只需要不断的将每个子词向后合并,直至遇到表示单词边界的终结符,
便得到了一个完整的单词。
使用 BPE 方法的策略有很多。不仅可以单独对源语言和目标语言句子进行子词
的切分,也可以联合两种语言,共同进行子词切分,被称作双字节联合编码(Joint-BPE)
[89]
。相比于单语 BPE,Joint-BPE 可以增加两种语言子词切分的一致性。对于相似语
系中的语言,如英语和德语,常使用 Joint-BPE 的方法联合构建词表。而对于汉语和
英语这些差异比较大的语种,则需要独立地进行子词切分。
BPE 还有很多变种方法。比如,可以设计更合理的符号合并优先级。这种方法
的出发点在于,在不考虑优先级的情况下,在对一个单词用同一个合并表切分子词
时,可能存在多种结果。如 hello,可以被切分为“hell”和“o”,也可以被切分为“h”
和“ello”。这种切分方式的多样性可以用来提高神经机器翻译系统的健壮性
[566]
。此
外,尽管 BPE 也被命名为双字节编码,但是在实践中该方法一般处理的是 Unicode
编码,而不是字节。相应的,在预训练模型 GPT2 中也探索了字节级别的 BPE,这种
方法在机器翻译、自动问答等任务中取得了很好的效果
[411]
。
438 Chapter 13. 神经机器翻译模型训练 肖桐 朱靖波
13.1.4 其他方法
与基于统计的 BPE 算法不同,基于 Word Piece 的子词切分方法利用语言模型进
行子词词表的构造
[567]
。本质上,基于语言模型的方法和基于 BPE 的方法的思路相同,
即通过合并字符和子词不断生成新的子词。它们的区别在于合并子词的方式,基于
BPE 的方法选择出现频次最高的连续字符进行合并,而基于语言模型的方法则是根
据语言模型输出的概率选择要合并哪些子词。具体来说,基于 Word Piece 的方法首
先将句子切割为字符表示的形式
[567]
,并利用该数据训练一个 1-gram 语言模型,记为
logP (·)。假设两个相邻的子词单元 a 和 b 被合并为新的子词 c,则整个句子的语言模
型得分的变化为 △= logP (c) −logP(a)−logP (b)。这样,可以不断的选择使 △ 最大
的两个子词单元进行合并,直到达到预设的词表大小或者句子概率的增量低于某个
阈值。
目前比较主流的子词切分方法都是作用于分词后的序列,对一些没有明显词边
界且资源稀缺的语种并不友好。相比之下,Sentence Piece 方法可以作用于未经过分
词处理的输入序列
[568]
,同时囊括了双字节编码和语言模型的子词切分方法,更加灵
活易用。
不过在以 BPE 为代表的子词切分方法中,每个单词都对应一种唯一的子词切分
方式,因此输入的数据经过子词切分后的序列表示也是唯一的。一旦切分出现错误,
整句话的翻译效果可能会变得很差。为此,研究人员提出一些规范化方法
[566, 569]
。
• 子词规范化方法
[566]
。其做法是根据 1-gram 语言模型采样出多种子词切分候选。
之后,以最大化整个句子的概率为目标来构建词表。
• BPE-Dropout
[569]
。在训练时,按照一定概率 p 随机丢弃一些可行的合并操作,
从而产生不同的子词切分结果。而在推断阶段,将 p 设置为 0,等同于标准的
BPE。总的来说,上述方法相当于在子词的粒度上对输入的序列进行扰动,进
而达到增加训练健壮性的目的。
• 动态规划编码(Dynamic Programming Encoding,DPE)
[570]
。引入了混合字符-子
词的切分方式,将句子的子词切分看作一种隐含变量。机器翻译解码端的输入
是基于字符表示的目标语言序列,推断时将每个时间步的输出映射到预先设定
好的子词词表之上,得到当前最可能的子词结果。