【NLP论⽂笔记】AttentionIsAllYouNeed(Transformer模型
结构理解)
本⽂主要⽤于记录⾕歌发表于2017年的⼀篇论⽂(引⽤量接近上千)。该论⽂提出的Transformer模型也是近年来被⼴泛应⽤的。本笔记主要为⽅便初学者快速⼊门,以及⾃我回顾。。。
基本⽬录如下:
1. 摘要
2. 核⼼思想
3. 总结
------------------第⼀菇 - 摘要------------------
1.1 论⽂摘要
现今⼏乎所有主流的翻译模型都是建⽴在复杂循环或卷积seq2seq框架基础上的,⽽其中表现最好的模型是基于注意⼒机制实现的。本论⽂提出了⼀种新的神经⽹络结构,Transformer,仅仅依赖于注意⼒机
制,摈弃了传统循环或卷积⽹络。这个新的⽹络结构,刷爆了各⼤翻译任务,同时创造了多项新的记录(英-德的翻译任务,相⽐之前的最好记录提⾼了2个BLEU值)。⽽且,该模型的训练耗时短,并且对⼤数据或者有限数据集均有良好表现。
------------------第⼆菇 - 核⼼思想------------------
2.1 论⽂模型结构
作者在开头还是吐槽了很多传统模型的弊端,之后⼜吹说⾃⼰的Transformer模型有多⽜x,完美避开了那些复杂的神经⽹络模型,只⽤了注意⼒机制,不仅⼤⼤加快了模型的训练速度,还保证了质量哈哈~(补:现今2019年下半年来看,还真的是这样,主流的NLP预训练模型底层基本都⽤Transformer作为特征提取层了)
在继续往下看之前,还请⼤家思考⼀个问题:
现有的RNN体系(包括后⾯衍⽣的Attention机制)为什么⽆法满⾜现阶段语⾔模型的需求
我个⼈的理解主要有两点:
1)现有体系⽆法解决Long-term Dependency 问题(该问题即可以简单理解为⽆法捕获相距较远的词
之间的关联关系)。其本质原因还是RNN体系的梯度消失/爆炸问题,尽管LSTM在⼀定程度上能缓解该问题,然⽽并未能完全避免。
2)计算量的问题。该问题其实也是所有时序模型的通病,因为时序模型必须是串⾏的,可能在预测阶段还能接受这个时效性,但是在训练阶段,与能并⾏计算的CNN相⽐,时效性表现的就不尽如⼈意了。
因此,也是基于以上两点的考虑,论⽂在背景介绍⾥抛出了⼀个貌似是新的概念self-attention(我还专门去搜了⼀下相关⽂献,搜到⼀篇IBM 的,我也写了论⽂笔记,⼤家可以参考)。话不多说,我就带着⼤家⼀起来看看这个Transformer到底是个什么东西。(多图预警!)
⾸先直接看原论⽂的模型架构图肯定是⼀脸懵逼,这都啥玩意?反正我第⼀眼看过去都是个新概念。。。想必很多初学者也是跟我⼀样,所以我们还是先从更⾼的视⾓来解析Transformer模型(在读模型结构的时候,⼤家也要细⼼去思考,这个模型到底是如何解决掉上⾯我提到的RNN体系的缺陷的)。我从⽹上盗了⼏张模型架构图【1】,⽅便⼤家理解。
2.1.1 Transformer架构在哪⾥?(图⽚来源)
Figure 1.png
这张图的结构就⾮常清晰,就说明了⼀件事情!⾕歌团队真的就只⽤了Transformer来做整个特征提取的orz!⼤家没有看错,这不是简化图,这就是整个模型的全部,只有⼀个Transformer !
2.1.2 Transformer⾥⾯是什么?(图⽚来源)
decoder
Figure 2.png
⼜是⼀张结构⾮常清晰的图,说明了2个事情。第⼀件事,Transformer结构的基本组成仍旧是seq2seq那⼀套(参考我另⼀篇笔记)。第⼆件事,每⼀个ENCODERS和DECODERS部分都由6(原论⽂的N=6)个⼩的并且相同的ENCODER和DECODER组成。这⼏个部分的叠加其实很有意思,⼤家可以想⼀想,之前的RNN体系虽说是深度学习模型,但其“深度”我们都是从时间的纬度来考量的,但这⾥,是真的多个特征提取层的叠加,是真正的纵向意义上的深度模型 ~
2.1.3 ENCODER和DECODER内部结构是什么?(图⽚来源)
Figure 3.png
每⼀个ENCODER内部⼜分为两层,第⼀层为self-attention(主要是⽤来捕获时序类的特征),第⼆层为feed-forward层(常规的特征转换层,通过⾮线性的变化来转换特征吧)。DECODER层与ENCODER层相似,但是中间多了⼀层Attention,其功能原理与普通的RNN体系的注意⼒机制相似(参考我另⼀篇笔记)
Figure 4.png
对于每⼀个单词向量(Embedding后的),我们都会计算出3个不同的向量,名为query, keys, values。这些向量都是我们通过模型参数计算得出来的。相⽐于词向量的纬度(论⽂中为512),这些向量的纬度会⼩⼀点(为64),当然这些向量的纬度肯定都是超参数,是可以调整的。⾄于这三个向量的具体含义,只能让⼤家从后续的计算过程中⾃⾏体会来,我也会穿插讲⼀下⾃⼰的理解。
self-attention的第⼆步是对每⼀个词进⾏打分(dot products of the query with all keys)其实就是把当前位置q的向量与所有位置的k向量
Figure 5.png
⾄此,每⼀个词向量的计算过程已经描述清楚了,矩阵的运算想必也是很好理解了。⾸先,我们计算Q,K,V三个矩阵,再根据上述的运算过程,简化为矩阵的运算就如下图,
Figure 6.png
⾄此,对原论⽂中的公式就剖析完毕了(当然也是整个self-attention)的核⼼。当然⼤家可以思考⼀下,这种self-attention的结构设计是如何解决RNN体系的Long-term Dependency问题的?
我个⼈的理解主要有两点:
1)参考计算公式,我们会发现考量当前词与其他词关系的时候,不论距离远近,我们都会赋予相同的权重进⾏计算(Q*K),以此来考量当前词,与其他所有词的关联关系~⽽RNN体系随着梯度消失的问题,距离越近,相互关系捕获的越好,但是距离越远反⽽难以捕获了!因此,这就是self-attention的神奇之处~(但真的那么神奇吗?其实是需要打⼀个问号的,因为超过⼀段距离的单词之间其实是真的没有什么关系了,但这边还是会与近距离的单词同等对待~)
2)但是随之⽽来的就是计算量和存储的问题,因为我们要计算所有词的关联关系,⼤家可以想象⼀下那个矩阵得有多⼤了~所有后⾯有⼈提出了transformer-xl的升级版(有兴趣的可以去了解)
2.1.5 Multi-Head attention是如何运⾏的?(图⽚来源)
这⾥Multi-Head其实没有那么神秘,简单说就是把上述的过程,重复进⾏⼏次(原论⽂中取值为8)最后再把结果连接起来。⽽重复进⾏的运算中,唯⼀不同的就是初始Q,K,V矩阵的⽣成,他们分别由不同的参数矩阵计算得出,⽰意图如下,
Figure 7.png
我个⼈对这样处理的理解主要有两点:
1)扩⼤了模型的视野,让模型在计算当前位置信息时,能关注到更多其他不同位置的信息。(若是单⼀模型,很可能永远被当前词所决定)。2)增加了模型的语意表达能⼒,因为所有的Q,K,V三个矩阵
的⽣成都是互不⼲扰的,可能会有更多语意层⾯的表达(每⼀组都能捕获到不⼀样对信息哈,且可以并⾏化处理~)。
当⽣成完多个输出矩阵以后,我们会拼接所有的结果,然后与⼀个权重矩阵相乘(随模型训练的),得到⼀个最终的self-attention层的输出,因此,总结⼀下,self-attention的整个计算过程如下⽰意图,
Figure 8.png
看到这⾥,想必各位对整套attention的从理论层⾯上已经有所了解了,我们再来看⼀下官⽅给的源码教程及说明是怎么写的,看完之后可能会有不同的理解~
Multi-head attention

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。