Transformer论文讲解
论文:Attention Is All You Need
作者:Ashish Vaswani, Noam Shazeer, Niki Parmar et al.
期刊/会议:NIPS 2017
Github:Transformer包含在tensorflow
前言
Transformer摒弃了CNN和RNN,使用纯注意力机制构建的模型。Transformer的出现对NLP和CV领域产生深远影响,打破了NLP和CV之间的边界,大量基于该模型的变体层出不穷,如:BERT、ViT和CLIP等模型。可见,Transformer的重要性。图1展示的是整个Transformer模型的核心内容,本文将从模型结构、缩放点积注意力、多头注意力、位置编码和总结五部分来讲解。
1. 模型结构
图2展示了Transformer模型的结构,主要由编码器、解码器和输出层组成。文章中作者将N设置为6层,为了便于残差连接,作者设定所有子层以及嵌入层都是512维度的输出,即dmodel=512d_{model}=512。
编码器 由6个相同层组成,每一层由相同的两部分组成:一个多头注意力层和一个Feed Forward层。这两个部分后面都进行残差连接和LayerNorm归一化。Feed Forward层其实就是简单的MLP层,由两个线性层组成,中间用LeRU函数进行激活。多头注意力层在后续第3节会讲解。
编码器 也是由6个相同层组成,每一层由相同的三部分组成:一个带掩码的多头注意力层、一个多头注意力层和一个MLP层。与编码器一样都在各部分后添加残差和LayerNorm归一化,不同的是在多头注意力层中输入的是由编码器输出的key、value和经过带掩码的多头注意力层输出的query
输出层 在Transformer中输出层由softmax和线性层组成。输出层可以针对不同下游任务进行更换和调整,以适应不同的任务需要。
在代码实现中,Transformer的输入的queries、keys和values实际都是同一个源文本或者目标文本的词编码。Input Embedding输入的是(X)词向量,而Output Embedding的右移一位(Y)词向量(第T时刻的输出作为预测第T+1时刻的输入,这样不断生成词右移)
我相信很多新人第一次看到这个模型结构后,会想由6层的编码器和解码器组成的模样是长啥样的?特别是编码器的输出怎么传递到解码器中,是编码器中每一层的输出对应解码器中的每一层,还是经过6层的编码器后再输入到解码器中的每一层。一开始我的想法是如图3(a)所示的图,但其实正确的是图3中的(b)所示。
2. 缩放点积注意力
缩放点积注意力(Scaled Dot-Product Attention)的结构如图4中(a)所示,输入维度为dkd_k的queries和keys和维度为dvd_v的values,计算queries和keys的点积(自主性提示与非自主性提示配对),将每个键除以dksqrt{d_k},并应用 softmax 函数来获得values的权重,与values点积,引导得出最配的values。其公式为:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(frac{QK^T}{sqrt{d_k}})V
与之前的点积注意力机制不同的是,除以一个dksqrt{d_k}。作者在论文中解释dksqrt{d_k}的作用:在维度dkd_k较小的时候,加性注意力机制和点击注意力机制的表现相同,但在较大的dkd_k下,加性注意力优于点积注意力,作者怀疑是由于较大的dkd_k值,点积数量级增长,除以dksqrt{d_k}来缩放抵消这种影响。
3. 多头注意力
作者发现将queries、keys和values分别线性投影到 dkd_k、dkd_k 和 dvd_v 维,而不是使用dmodeld_{model}维的queries、keys和values,执行单个注意力函数是有益。多头注意力允许模型共同关注不同位置的不同表示子空间的信息。使用单个注意力头,平均抑制这一点。多头注意力公式为:
MultiHead(Q,K,V)=Concat(head1,…,headh)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)MultiHead(Q,K,V)=Concat(head_1,…,head_h)W^O \where quad head_i = Attention(QW_i^Q,KW_i^K,VW_i^V)
其中投影的参数矩阵WiQ∈Rdmodel⋅dk,WiK∈Rdmodel⋅dk,WiV∈Rdmodel⋅dv和WO∈Rhdv⋅dmodelW_i^Q in R^{d_{model}cdot d_k},W_i^K in R^{d_{model}cdot d_k},W_i^V in R^{d_{model}cdot d_v} 和 W^O in R^{hd_v cdot d_{model}}。在论文中,作者使用h=8个并行注意力头,设置dkd_k=dvd_v=dmodel/hd_{model}/h=64
4. 位置编码
注意力机制没有像RNN那样记录序列中词元的顺序,因此,需要注入与序列中词元的相对位置和绝对位置。在输入中添加位置编码(Positional Encoding),位置编码维度为dmodeld_{model},与序列维度一致,便于求和。作者选择的位置编码函数为带频率的正弦和余弦函数。其公式为:
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)PE(pos,2i)=sin(pos/10000^{2i/d_model})\
PE(pos,2i+1)=cos(pos/10000^{2i/d_model})
其中 pospos 是位置,ii是维度。作者选择这个函数是因为他们假设它将能使模型轻松学习关注相对位置,波长形成从2π到10000·2π的几何级数。因为对于任何固定的偏移 KK,可以将PEpos+kPE_{pos+k} 表示为 PEposPE_{pos} 的线性函数。对于位置编码的理解,个人推荐看Transformer Architecture: The Positional Encoding的英文文章。
5. 总结
作者提出了 Transformer模型,这是第一个完全基于注意力的序列转导模型,用多头自注意力替换了编码器-解码器架构中最常用的RNN层。对于翻译任务,Transformer 可以比基于RNN或CNN的架构快得多(2017年之前)。在 WMT 2014 英德和 WMT 2014 英法翻译任务上达到了新的技术水平。作者展望了模型可以运用到其他NLP或CV的任务,开启了Transformer时代。
以上是我个人论文解读,可能存在很多不足。
若有问题,可以在评论区指出,大家一起交流讨论学习!
- 希望这篇文章能够帮到你
- 如有遇到问题,可以在评论区留言交流
- 若有侵权,联系必删!
参考文章
Transformer Architecture: The Positional Encoding