当前位置: 首页 > 科技观察

GNMT-Google'sNeuralNetworkTranslationSystem_0

时间:2023-03-16 10:12:01 科技观察

1.前言2016年9月,Google发布了基于神经网络的翻译系统(GNMT),并声称GNMT在多种主要语言对的翻译中减少了55%的翻译错误。%-85%或者更多,这个翻译系统的技术细节在论文(Google'sNeuralMachineTranslationSystem:BridgingtheGapbetweenHumanandMachineTranslation)中有展示,看完后受益匪浅。2.总结一般而言,NMT[NeuralNetworkTranslationSystem]通常使用两个RNN[RecursiveNeuralNetwork],一个用于接受输入文本,另一个用于生成目标句子。同时,还会引入当前流行的注意力机制【attentionmechanism】,让系统在处理长句时更加准确高效。然而,根据谷歌的说法,这种神经网络系统通常存在三个弱点:训练速度非常慢,需要巨大的计算资源,并且由于参数量大,其翻译速度也远低于传统的基于短语的翻译速度。翻译系统[PBMT]。对稀有词的处理很弱,直接复制原词在很多情况下肯定不是好的解决方案。在处理长句时,会出现漏译的现象。而GNMT致力于解决以上三个问题。在GNMT中,RNN使用了8层(实际上Encoder是9层,输入层是一个双向LSTM。)一个带有残差连接的神经网络,可以帮助一些信息,比如梯度的传递,位置信息等。同时attentionlayer连接在decoder的底层和encoder的顶层,如图:GNMT结构图为了解决翻译速度的问题,Google使用了一个低精度的翻译过程中的算法(将模型中的某些参数限制为8位)和TPU。为了更好地处理低频词,谷歌在输入和输出中使用了子词单元,也称为wordpieces(例如,将'higher'拆分为'high'和'er',分别处理)*中beamsearch中,谷歌加入了长度归一化和覆盖惩罚,使翻译过程中产生的不同长度句子的处理更加高效,减少模型的漏译。经过如此多的改进,谷歌声称在英法、英中、英西等多种语言对中,与之前的PBMT系统相比,错误率降低了60%,接近人工翻译的平均水平等级。接下来,让我们仔细看看神奇的GNMT模型的细节。3.模型结构如上图所示,GNMT与通常的模型一样,具有三个组成部分——编码器、解码器和注意力网络。编码器将输入句子变成一系列向量,每个向量代表原始句子的一个词,解码器使用这些向量和它已经生成的词来生成下一个词。编码器和解码器通过注意力网络连接,这使得解码器在生成目标词时可以关注原始句子的不同部分。另外,正如我们所想,要让翻译系统有好的准确率,encoder和decoder的RNN网络必须足够深,才能获得原句和目标句中不容易被注意到的细节。在Google的实验中,不添加层会使PPL降低约10%。关于模型中的attention机制,是用下面的公式来计算的:其实我对attention的公式有个疑问。这里最重要的ai是向量吗?也是一个标量(数值)。从公式上看好像是一个标量,但是我之前理解的是,attention是一个向量,长度和输入句子的词数一样。3.1残差连接如上所述,多层堆叠的LSTM网络通常比层数较少的网络具有更好的性能。然而,交错层的简单堆叠会导致训练缓慢,并且容易出现剃须爆炸或梯度消失。实验中,简单堆叠在4层时表现良好,6层简单堆叠表现不多见,8层更是少见。为了解决这个问题,在模型中引入了残差连接。如图所示,残差连接示意图将第i层的输入连同第i层LSTM的隐藏状态作为第i+1层LSTM的输入。不引入残差连接的LSTM示意图引入残差连接的LSTM示意图3.2Encoder第一层双向LSTM中句子翻译所需要的关键词可能出现在原文的任何地方,并且原文中的信息可能是从右到左的,也可能是分散分离在原文的不同位置,因为为了获取原文更多更全面的信息,双向RNN可能是一个不错的选择。在本文的模型结构中,Encoder的第一层只使用了双向RNN,其余各层仍然是单向RNN。Bi-directionsRNN示意图可以看出,粉色LSTM从左到右处理句子,绿色LSTM从右到左处理句子。两者的输出先连接,再传给下一层LSTM。3.3模型的并行训练这部分主要介绍在训练过程中对模型进行加速的一些方法。谷歌同时使用数据并行和模型并行来加速训练。数据并行很简单,就是复制并部署模型的n个副本。每个副本的参数是共享的,每个副本以Batch的形式进行训练,即Simultaneouslytrainbatch-sizesentences。在谷歌实验中,n通常为10,batch-size通常为128,然后使用Adam和SGD方法更新参数。除了数据并行之外,实验中还使用了模型并行,即网络的每一层都部署在一个GPU上,如上图所示,这样在Encoder的第一层双向RNN计算完成后,下一次A步可以不用等到当前时间步完全运行完就可以开始,并行计算加快了训练速度。之所以在每一层都没有使用双向RNN,是因为如果这样会大大降低训练速度,因为它只能使用两块GPU,一个用于前向信息处理,一个用于后向信息处理,降低了并行度。计算效率。在attention部分,将encoder的输出层和decoder的底层对齐(我的理解应该是输出张量的纬度相同),最大化并行计算的效率。(我不太明白具体原理是什么)。4.数据预处理神??经网络翻译系统在运行时通常有一个字典,单词数量有限,但可能遇到的单词数不胜数,这可能会导致OOV(out-of-vocabulary)问题,因为这些未知单词通常就是日期,人名,地名等等,所以一个简单的方法就是直接复制这些词。显然,在处理非人名等词时,这不是最好的解决方案。在谷歌的模型中,也使用了更好的wordpiece模型。它们被称为子词单元。比如在“图灵的专业是NLP”这句话之后。经过WPM模型处理,应该是“图灵的专业是NLP”。此外,为了直接复制姓名等词,源语言和目标语言共享wordpiece模型,WPM在词的灵活性和准确度上取得了很好的平衡,同时也有更好的准确度(BLEU)和更快的翻译速度在翻译中。五、训练标准一般来说,在N对句子中,训练的目标是优化下式:logprobabilitiesofthegroud-truthoutputsgiventhecorrespondinginputs但这里有个问题,翻译中的BLEU值无法体现单个句子的翻译质量的奖励和惩罚。此外,由于模型在训练过程中从未见过错误的翻译,当模型具有更高的BLEU值时,那些错误的句子仍然会获得更高的概率,因此上述公式无法明确惩罚翻译中的错误句子。(原论文这个地方我没有完全理解,所以有疑惑。)因此,还需要进一步细化模型,但是BLEU值是对两个语料的评价标准,对单个句子的评价效果不太理想,所以Google提出了GLEU值,GLEU值的一般含义是计算目标句子和翻译句子的n-gram数,(n=1,2,3,4),然后计算两个集合的交集大小与原始集合大小的比值,取较小的值。我使用python来计算GLEU值。代码如下:defget_ngrams(s,maxn):ngrams={}size=0forninrange(1,maxn+1):foriinrange(0,len(s)):forjinrange(i+1,min(i+n+1,len(s)+1)):ngram=''forwordins[i:j]:ngram+=wordngram+=''ngram=ngram.strip()ifngramnotingrams:ngrams[ngram]=1size+=1returnssize,ngramsdefget_gleu(orig,pred,n=4):orig_=orig.split('')pred_=pred.split('')n_orig,ngrams_orig=get_ngrams(orig_,n)n_pred,ngrams_pred=get_ngrams(pred_,n)count_match=0forvinngrams_orig:ifvinngrams_pred:count_match+=1returnmin(count_match/n_orig,count_match/n_pred)因此,refinement后模型的评价标准变为如下公式:refinementmaximum-likelihoodr(Y,Y(i))为计算的GLEU值部分。GLEU克服了BLEU在单句评价上的不足。在这个实验中,它可以很好地使用BLEU值。为了进一步稳定训练,谷歌对训练标准进行了线性组合,即如下公式:Mixedmaximum-likelihoodα在训练过程中降低为0.017。在实际训练过程中,首先使用Oml标准训练使模型收敛,然后使用Omixd的标准进一步提升模型性能。6.Quantizablemodelandquantificationduringtranslation(坦白说,我不知道原文中的QuantizableModel和QuantizedInference怎么翻译比较好。)大,翻译过程中会出现一些问题,所以Google采用了一系列在不影响模型收敛和平移效果的情况下采取优化措施。在有残差连接的LSTM网络中,有两个值会被连续传递计算,cit在时间方向传递,xit在深度方向传递。在实验过程中,我们发现这些值都非常小。为了减少误差的累积,在翻译过程中,这些值被明确限制在[-δ,δ],所以原LSTM公式调整如下:6.1修改方程6.2完整的LSTM计算逻辑为在翻译过程中,谷歌将公式6.1和6.2中的所有浮点运算替换为8位或16位定点整数运算,权重W由8位整数表示,如下式:权重W将所有cit和xit限制在[-δ,δ]之间,并改用16位整数表示。6.2中矩阵乘法(如W1xt)采用8位定点整数乘法,其他所有运算,如sigmoid、tanh、点乘、加法等,均采用16位整数运算。假设decoderRNN的输出为yt,那么在softmax层,概率向量pt计算如下:修改后的概率向量计算公式将logitvt'限制在[-γ,γ]与权值Ws之间,权值在公式6.2W也是用8位整数表示,运算时使用8位矩阵乘法。但是在softmax层和attention层没有采取量化措施。值得一提的是,除了将cit和xit限制为[-δ,δ]和logitvt'为[-γ,γ]外,训练时还使用了全精度浮点数。其中,γ取25.0,δ在训练开始时取8.0,然后逐渐变为1.0。(翻译时取δ为1.0)Logperplexityvs.steps的红线代表使用量化措施的训练过程,蓝线代表普通训练。可见,将一些值限制在一定范围内,可以作为一种额外的规划措施。提高模型的质量。7.Decoder在翻译过程中使用了常规的beamsearch算法,但是引入了两个重要的优化方案,即GNMT中的α和β值。α值的作用是归一化翻译句子的长度,因为选择句子的可能性是通过将剧中每个单词的log概率相加得到的。这些对数概率都是负值,所以从某种程度上来说,长句子其实对数概率会更小,这显然是不合理的,所以需要对翻译句子的长度进行规划。β值的作用是促进模型更好的翻译整个句子,不遗漏。α和β值的适用公式其中s(Y,X)表示翻译的最终得分,pij表示翻译第j个词时对应第i个词的注意力值。谷歌在文章中还提到了两种优化方法:首先,在每一步,我们只考虑局部分数不超过beamsize低于该步骤最佳令牌的令牌。其次,在根据等式14找到归一化最佳分数后,我们将所有大于beamsize的假设修剪为低于最佳分数。其实我不明白这个和常规的beamsearch算法有什么区别。希望师傅多多指教。..在En-Fr语料库上,不同的α和β值对BLEU值的影响。当α和β值设置为0时,相当于不做长度规划和覆盖惩罚,算法回归到最原始的beamsearch算法。值得一提的是,有趣的是,得到上述BLEU的模型并没有使用ML进行训练,更没有使用RL优化。因为RLrefinement已经让模型不漏,转。在En-Fr语料中,将ML优化在En-Fr语料上得到的BLEU值与上图对比。在谷歌实验中,α=0.2,β=0.2,但在我们的实验中,在汉英翻译中,或者α=0.6~1,β=0.2~0.4会取得更好的效果。实验过程和实验结果。实验结果对比模型部分基本完成。剩下的第八部分是关于实验和实验结果的。发个图继续。不时补充,下一篇应该介绍下Facebook和开源发布的号称比GNMT更好更快的FairSeq模型。。。论文中提到但没有用到的另一种处理OOV问题的方法是将生僻词标记出来,比如假设miki这个词没有出现在字典中,标记后变成Miki,这样在翻译的时候过程中,稀有词被替换为特殊符号。