Google’s Neural Machine Translation System 论文笔记
首先这里推荐一篇非常深入浅出的文章,对读懂了解谷歌神经机器翻译有很好的帮助,且对该论文的来龙去脉有一个了解,比如最直接的借鉴–Bengio团队双向编码器的seq2seq+注意力模型,这会在了解GNMT为什么encode层第一层要设计成双向LSTM有一个很好的了解,以及为什么要设置8层LSTM有个通俗的了解–“8个递进厉害的翻译员”,文章见:https://www.linkresearcher.com/theses/e9d88b0d-ed71-4f66-ba1d-fbf8375393d3
接着来详细讨论下GNMT
首先介绍下本文主要的改进点:
这就先要交代NMT的三个缺点:
- 1 参数多、训练慢
- 2 鲁棒性不好,对生僻词处理效果不好
- 3 覆盖率不好,长句子存在漏翻的情况
本文对应改进如下:
-
1 低精度+数据、模型并行
-
2 词切分,比如把 feud 切分成 __fe 和 ud(下划线代表一个词的开头)

-
3 在beam serach中加入长度归一化(length normalization)和覆盖率惩罚(coverage penalty)
-
此外在训练标准上,加入GLEU来提高BLEU值(关注到了单句翻译质量好坏的惩罚)
接着介绍本文模型的基本结构:

左边是encoder,右边是decoder,中间是attention。
Encoder:由8层LSTM组成,第一层是双向的,获取双向input的方向,剩下的七个是单方向的(之所以不在每一层都是用双向RNN是因为如果这样会大幅度降低训练速度)。这8层分别放在8个GPU上,在第一个双向并行处理完后,剩下七个并行,从第三层开始每层具有残差链接避免梯度爆炸或消失。
Decoder:也是8层LSTM、8个GPU,为了提高并行效率,只用decoder中最底层的output作为注意力机制ai的计算,其他层复用。
attention
设xi为encoder的输出向量:

yi-1是decoder底层第i个词的输出,则ai计算如下:

残差网路
普通LSTM:

使用残差网络的LSTM:

双向LSTM

粉色是从左向右,绿色是从右向左处理信息,双向LSTM则是两者产生的output x的连接起来输入到下一层LSTM。
并行
为了加速训练,谷歌使用了数据并行和模型并行两种方法。
数据并行:复制n份模型,模型参数共享,同时训练大小为batch_size的句子,将梯度汇总到统一的优化器Adam和SGD上进行参数更新,和A3C的异步更新一样,谷歌使用的n为10,batch_size为128。
模型并行:加速每一份模型的梯度计算,将每一层网络部署在一个GPU上。
Wordpiece Model

在上面的例子中,单词“Jet”被分成两个单词“_J”和“et”,单词“feud”被分成两个单词“ fe”和“ud”。其他的单词仍然是单一的字片。“ ”是 标记单词开头的特殊字符。谷歌指出,使用8k-32k大小的字典能带来较好的BLEU成绩和编码效率。
训练目标
通常来说,在N对语句对中,训练的目标是使下式最大化:

首先该式子无法反应单句翻译的好坏;此外,仅使用最大似然训练,该模型将无法对解码过程中出现的错误具有很好的鲁棒性,因为这些错误在训练集中从未被观察到。
因此google提出了GLEU分数,

这里,r表示每个句子的得分,简单来说,就是在翻译出的句子中取n-gram,和目标句子计算n-gram的准确率和召回率,并取两者的最小值,GLEU分数的取值范围从0到1,0表示完全没匹配,1表示完全匹配。
最终google将上述两者的目标进行加权,作为最终的目标:

可量化 Quantizable Model and Quantized Inference
1.将LSTM中在时间方向上传递的cit和在深度方向上传递的xit明确规定到[-th, th]

因此原LSTM的公式调整如下:

在翻译的过程中,谷歌上面两个式子中所有浮点数运算替代为8位或16位定点整数运算。

在上图中,是WMT’14英译法最大似然训练过程中的 Log perplexity对比,红线代表采用量化,蓝线代表没有采用量化,可以看到采用一定的量化和正则可以提高模型质量(稳定性)。
decoder
如果没有句子长度归一化,那么模型普遍会更倾向给更短的句子打高分(概率相乘,小于一,越乘越小),最直观的做法是处以句子长度进行归一化,这里google经过实验给出了以下得分公式,同时涵盖了覆盖率惩罚,来使得翻译覆盖的足够完整。

pij代表第j个目标词yj对第i个source wordxi的注意力,alpha越大,对长度归一化的约束越大;beta越大,对覆盖率的约束越大。下面是在不同alpha、beta值下bleu分数的变化:

