Google神经机器翻译系统_要点备忘

来源:互联网 发布:phpcms sql注入漏洞 编辑:程序博客网 时间:2024/05/16 08:54

现有NMT系统缺点:计算量大,难应对低频词


[2](2015经典NMT)里的模型,是(上一时刻隐藏层输出s,上一时刻输出层预测词的词向量e(y),和当前上下文向量c)这三者输入到当前时刻LRU单元中,得到当前时刻隐藏层输出s;“当前上下文向量c”是由encoder的所有时刻隐藏层输出h的加权得到;各时刻权重a是由上一时刻隐藏层输出s和encoder在各个时刻隐藏层输出h计算“相似度”后再经过softmax得到;“相似度”是由s和h经过一个全连接网络得到;


GNMT: 

1. 8层encoder, 8层decoder;(越深效果越好)

2. 使用residual连接(极大减轻层数加深后带来的梯度消散问题);attention

3. 为提高并行度,attention将decoder的底层输出接到encoder的顶层输出

4. 为加速预测阶段,在预测阶段使用整型量化(8位*8位=16位)

5. 为解决低频词问题,使用介于字母和词之间的子词单元(wordpiece),效果好速度快

6. beam search, 使用了length-normalization(不用的话,目标函数会倾向短句子),使用了coverage penalty(使得目标句子尽量覆盖源句子所有词)

7. 先Adam,再SGD;最后再用Reinforce Learning来Refine


网络结构:

attention使用decoder最底层的上一时刻隐层输出,和encoder最上层每一时刻输出计算“相似度”并通过softmax,得到encoder每一时刻的权值,再用权值对encoder最上层每一时刻输出进行加权,得到attention向量(即[2]中的上下文向量)

之所以使用“最底层”输出,而不是[2]中的“最上层“输出,是为了并行加速的目的


softmax层节点几十K个,计算量大,因此分到多个GPU上去并行;


Dapa Parallellism: 使用Downpour SGD(即Google经典的ASGD)

Model Parallellism: 按层划分GPU;softmax层分给几个GPU并行;


之所以encoder只有最底下一层是双向的,是为了并行度考虑,双向的话,必须全算完了才能开始上层的计算;

之所以attention使用decoder的最底层输出,而不是最上层输出,也是为了并行度考虑;


8K~32K个wordpiece效果最好;


浮点量化:[41]在CNN上取得好效果;[26]3状态编码;

只在inference阶段(即test阶段)使用浮点量化;在训练阶段使用正常的float

量化的关键,是要保证数组数值在一定区间内;这里对某些向量采用了范围限制clip了;

clip区间随着训练进行而逐渐减小!只在test阶段使用量化,训练阶段只使用区间clip不使用量化


inference阶段的并行加速:将相近长度的句子们(比如35个句子),打包到同一个batch中,并行算(速度受最长的句子拖累)


Google内部的数据集,比WMT数据集大100~1000倍


LSTM-node大小:1024

gradient clipping

先跑60K个minibatch的Adam(收敛较快),后面全跑SGD(最终效果好);最后再用RL增强学习来Refine

WMT En->Fr上,用96块K80跑了6整天;

用了dropout

<首字母>_UNK_<尾字母> ,很多这个来表示</s>未登录词

测试阶段,翻译出来</s>,则用attention来找到源句子中的最相似词,直接copy过来

0 0