现有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过来