如果你还不知道transformer是什么,那你在NLP领域就已经非常的out了,别看我的博客了,赶紧去看这位大神介绍transformer:https://jalammar.github.io/illustrated-transformer/
1. 介绍
由于机器翻译任务中,transformer的表现非常好,目前有两种继续研究的方向。一种是加宽,比如transformer BIG模型(这个模型是啥),这是目前机器翻译的SOA。还有一种是加深,本文作者就是站这一边的,他们认为加深模型才是王道,能够取得比transformer BIG更好的效果(这个主张是符合深度学习的直觉的,因为同等参数数量的情况下,多层神经网络结构在拟合函数时比单层更强)。
本文主要内容就是两个transformer的结构设计以便解决深度网络训练的问题(梯度爆炸和梯度消失)和一堆参数的实验分析。transformer的结构设计包括:
1. pre-norm的结构设计:就是在transformer的残差加和层,用公式推导+实验的方式证明了先正则再加和的方式比先加和后正则的方式要好
2. 把多层transformer的输入输出改变,每一层的transformer的输入变成前n层的线性组合(类似attention的思想)。这种设计作者称之为DLCL(Dynamic Linear Combination of Layers)
作者的源代码已经开源,链接为:https://github.com/wangqiangneu/dlcl
2. 设计思想
一般来说这部分内容对大佬没什么用,但是对小白来说是拓宽视野的好机会,所以还是看一下。用神经网络完成机器翻译的任务是目前(2019年)的SOA,最早是用RNN来完成,后面逐渐有人把每个时间序列的隐层加深到4-8层。最近,基于self-attention的transformer在几个大的数据集上取得了更优异的表现。特别是那些加宽之后的transformer,拥有更多的隐层(也被称之为Transformer-Big),而单纯的加深网络并没比浅层(相对浅)表示表现更好。模型真的是越深越好吗?这个问题还是没有结论的。
对于经典的transformer结构来说,加深网络训练并不容易,因为经典transformer本身就已经非常深了(有6层,每层又包含两个隐层,更何况后面还有个多层的decoder)。如下图所示:
image.png
众所周知,由于梯度爆炸/消失的问题,这么深层的网络是不容易训练的。我们也注意到,单纯的加深网络并不能提升模型效果,反而会给训练带来极大的困难。
有一项加深transformer的研究成功训练了一个16层的模型[1],我们就顺着这项研究的思路继续,以期得到更深度的模型。因为encoder对模型的效果影响力更大,并且需要的计算量更小,所以作者主要研究的是如何把encoder加深。
3. 模型改造
OK,有了背景分析,有了研究思路,作者是如何改进的呢?
3.1 pre-norm VS post-norm
大家都知道,transformer中使用了多层网络,这种结构本身就难以训练(误差的难以通过这么深层的模型传导),为了解决这一问题,transformer使用了ResNet中类似的residual单元。residual单元的结构(虚线就是residual)如下:
image.png
计算公式如下:
image.png
其中xl是该sub-layer的输入,xl+1是该sub-layer的输出,yl是后处理函数之前的中间结果。f是后处理函数,F是sub-layer。θl是sub-layer的参数。这种处理方式yl 和 xl+1是直接连在一起的。除了这些,还有一个normalization层(记为LN:layer normalization)。norm层有两种结构:
post-norm:所谓post-norm就是先加和,后正则,公式如下:
pre-norm:所谓pre-norm就是先正则,后加和,公式如下:
image.png而式4其实就是不进行任何后处理,具体到式1/2上就是:
image.png那么到底哪一种更好呢?作者进行了一个简单的分析:假设ε是误差,那么post-norm的梯度传导公式(求导)如下:
image.png可以看到,式5中有两个连乘项,第二个连乘项是带1的,其实也就是最后乘出来带有一个常数项1(也就是梯度等于0的可能性比较小,不过还是有梯度爆炸的可能)。而第一个连乘项是不带任何常数的,很容易造成梯度爆炸或者梯度消失的问题。也就是说post-norm每一层都要对误差进行一次求梯度
而pre-norm的梯度计算如下:
image.pngCV的同学肯定很眼熟吧,这就是resnet的梯度递推公式嘛,这种结构因为把连乘变成了连加,因此降低了梯度爆炸/消失的风险。这就相当于在误差和每一层之间建立了一个直连通道,使误差的传递尽可能少的受到层级堆叠的影响。
其实自己推一下pre-norm公式,换一种表示方法(不就是相当于F和LN两个函数合并成一个函数嘛),再跟式5比较一下,还可以发现pre-norm就是仅包含式5的第二个连乘项而已。带来梯度爆炸/消失风险的主要是式5的第一个连乘项。
作者用pre-norm结构成功训练了20层的transformer,而post-norm就不行。说明这种结构还是比较合理的。
3.2 DLCL(Dynamic Linear Combination of Layers)
在transformer中使用residual结构是常见操作,作者认为可以把residual结构看做带有欧拉离散值的常微分方程的特例(这个到底是啥意思我看不懂,请参考这个文献[2])。欧拉方法是常微分方程最常用的一阶解法,只是不够精确。文献[3]分析说可能是因为仅仅使用了一个预处理步。在神经网络模型中,residual结构的这种“单步”的特性让模型“遗忘”了远距离的层。如果模型很深的话,就不容易从底层抽取到特征。
因此作者引入了让低层直连高层的结构,希望用这种结构可以获取到低层的信息。这种结构作者称之为Dynamic Linear Combination of Layers(DLCL)。经典的transformer结构是层层堆叠的,每一层的输入是上一层的输出,之前有研究[4]把前面所有层线性组合起来:级0~L层的输出为{ y0,,,,,,yL},那么第L+1层的输入为:
image.png其中,g函数是一个线性层,可以把y0~yL线性组合得到一个输出值。对于pre-norm来说,可以定义为:
image.png其中Wkl+1是一个可以学习的线性参数矩阵。相应的,post-norm可以定义为:
image.png类似的结构之前有人提出来过,不过他们要么是每一层是之前层的均值(dense residual connection),要么是跟elmo的思想一样只对最后一层进行学习(所谓的transparent attention)。
image.png所以作者认为自己的思路还是一种总结与创新。
4. 实验与分析
4.1 数据集
作者使用的机器翻译的数据集是德译英 中译英数据集,包括:WMT’16 English-German (En-De) 、NIST’12 Chinese English (Zh-En-Small)、WMT’18 Chinese-English (Zh-En-Large)。
对于En-De任务,作者使用了4.5M的预处理数据,这些数据已经tokenize了,并且经过了byte pair encoded(BPE)处理(所谓的BPE就是字节压缩算法的一种,把常用的连续字节用一个字符替换,以达到加快计算速度的目的。类似的算法还有wordpiece),并且用一个共享词库做了32K的merge操作(词库中出现频次低于5的单词都被去掉了)。使用newstest2013作为验证集,newstest2014作为测试集。
对于Zh-En-Small任务,作者使用NIST’12 OpenMT中一部分bitext,NIST MT06做验证集,MT04, MT05, MT08做测试集。分词工具是NiuTrans。去除超过100单词的长句之后,最终得到1.9M的句子对。同样用那个32k operations的共享词库,最终得到44K的中文单词和33K的英文单词。
对Zh-En-Large任务,用了跟[5]同样的16.5M数据集,包括7.2M句子的CWMT数据集和4.2M的UN 和News-Commentary数据集。还有5M句子的回译单语言NewsCraw2017数据集。具体可以参考文献[5]。
4.2 评估方法
使用结束之前的最后5个模型参数的均值作为最终模型(据说这种方法可以提升模型表现)。使用beam search的时候,对德译英使用的beam size为4,length penalty为0.6。中译英使用的beam size为6,length penalty为1.0。
4.3 模型与超参数
这一部分实在是太繁琐了,不翻译了,直接贴图吧。
image.png image.png需要说明的是,DLCL的方法仅应用在每个隐层,不用于隐层的sub-layer。不过有个问题,那就是由于单个GPU的内存不足以支撑4096的batch size。
image.png
所以作者想了办法,用两次2048的batch做一次更新来代替一次4096的batch(为什么你的模型不收敛?因为你不够有钱---GPU内存不足,又不够聪明---想不到用两次batch叠加来达到增大单次batch的目的,绝望)。作者发现,更深的模型和更大的batch有利于模型的训练。最终的结果都是batch =8192, lr = 2×10-3 ,warm up = 16,000。
4.4 实验结果
image.png表1中是WMT En-De任务中作者的模型跟基于self-attention的现有模型的对比。可以看到,transformer big 比 基础版的transformer的BLEU更高(这个指标是专门用于评价机器翻译效果的,分别计算candidate句和reference句的N-grams模型, 然后统计其匹配的个数。这种比较方法是与语序无关的)。
image.png
如上图所示,作者的模型如果采用post-norm,效果会好于base 和big 的版本。经典版本的transformer能达到的模型层数不超过20层,在这个层数上,底层的梯度已经接近0了。而post-norm可以在25层获得最佳效果。
用pre-norm的话,L=20的时候效果比baseline高1.8。这说明pre-norm比post-norm更容易训练。当达到30层的时候,pre-norm的效果又有了0.4个BLEU的提升。尽管这个最好效果跟[6]相同,但是作者的模型比[6]的模型所花的训练时间要少3.5倍。
跟transparent transformer相比,作者的模型也更好。在不同任务上模型的表现如下:
image.png可以看到,作者的模型在不同的任务上都有更佳的表现(虽然这个提升比较小)。
5. 分析
5.1 encoder层数分析
image.png可以看到作者的模型随着encoder层数的增加计算速度线性下降。不过就算是30L的模型,计算速度依然比baseline 的transformer big快,因为编码过程独立于beam search,并且只进行一次。
5.2 decoder
image.png关于decoder的层数,作者也做了分析,上图可以看到层数的增加对指标的影响有限,而且会极大的降低计算速度。
5.3 销蚀分析
image.png可以看到,把作者设计的结构挨个去掉的话,模型表现会下降。这说明作者的设计是必要的。
5.4 DLCL权重可视化
image.png可以看到….看不出什么规律。差不多就是越后面的层越稀疏吧,后面的层不会利用前面的所有层。
6. 结论
1. 更深的模型确实会有更佳的表现,比加宽模型的transformer big更好(起码说明加深模型这个思路不会比加宽更差)。而且模型小,计算起来更快。准确的说:模型小1.6倍,训练速度快3倍,预测速度快10%。
2. 如何得到更深的模型?正确使用norm层,用pre而不是post。并且作者解释了其中的原理。
3. 作者加入了DLCL的结构,并用对比试验证明了这个结构的有效性。
参考文献
[1] Ankur Bapna, Mia Chen, Orhan Firat, Yuan Cao, and Yonghui Wu. 2018. Training deeper neural machine translation models with transparent attention. In Proceedings of the 2018 Conference on Empirical Methods in Natural Language Processing, pages 3028–3033.
[2] Tian Qi Chen, Yulia Rubanova, Jesse Bettencourt, and David K Duvenaud. 2018b. Neural ordinary differential equations. In S. Bengio, H. Wallach, H. Larochelle, K. Grauman, N. Cesa-Bianchi, and R. Garnett, editors, Advances in Neural Information Processing Systems 31, pages 6572–6583. Curran Associates, Inc.
[3] J C Butcher. 2003. Numerical Methods for Ordinary Differential Equations. John Wiley & Sons, New York, NY
[4] Uri M Ascher and Linda R Petzold. 1998. Computer methods for ordinary differential equationsand differential-algebraic equations, volume 61. Siam.
[5] Qiang Wang, Bei Li, Jiqiang Liu, Bojian Jiang, Zheyang Zhang, Yinqiao Li, Ye Lin, Tong Xiao, and Jingbo Zhu. 2018a. The niutrans machine translation system for wmt18. In Proceedings of the Third Conference on Machine Translation: Shared Task Papers, pages 528–534.
[6] Myle Ott, Sergey Edunov, David Grangier, and Michael Auli. 2018. Scaling neural machine translation. In WMT, pages 1–9. Association for Computational Linguistics.
网友评论