·阅读摘要:
本文于2017年6月发布,属于Transformer模型的开山之作,地位不言而喻。Transformer是继于MLP、RNN、CNN模型的又一大模型,且解决了RNN应用于长输入乏力的情况,随后提出的BERT、GPT都是基于Transformer。本文主要基于机器翻译任务来讲述Transformer,近年的论文证明其在图像、文本、音频、视频都可广泛应用。
·参考文献:
[1] Attention Is All You Need
论文链接:https://arxiv.org/abs/1706.03762
在文本分类领域中,主要使用Transformer模型的Encoder模型。Decoder属于生成模型,我们不用,但是也要认真拜读。
编码器-解码器(encoder-decoder) ⭐对于理解这篇文章非常重要
注意力机制(Attention) ⭐深入理解,会为神经网络任务提供一个思路
多层感知机(MLP)
残差连接(residual connection) ⭐为神经网络任务提供一个优化方法
LN与BN ⭐不同的正则化策略
位置编码(positional encoding) ⭐为文本编码提供新思路
由于本篇文章为论文阅读笔记,前置知识的介绍写在另外一篇博客:神经网络】MLP 编码器-解码器 注意力机制 残差连接。
比较好的序列转换模型都是基于CNN或RNN,然后使用注意力机制连接编码器和解码器。此论文提出了一种只使用注意力机制的简单模型,取名叫做Transformer,实验表明此模型的实验效果与泛化能力都很好。
【注一】:序列转换叫做Sequence-to-Sequence,机器翻译就是典型的S2S任务。
1、RNN是前一个状态的输出放到下一个状态的输入中,序列性妨碍训练中的 并行 ,尤其是当序列越长的时候。
2、之后注意力机制开始被使用,在不考虑输入或输出序列距离的情况下对相关性进行建模,但都是结合RNN来做的。
3、Transformer,避免递归,完全依赖注意力机制来绘制输入和输出之间的相关性,支持并行训练。
【注二】:叙述逻辑环环相扣。主要说Transformer的并行能力。
使用CNN想要关联起来较远位置的输入需要“卷”很多步,需要线性复杂度或者对数复杂度,Transformer可以在 O ( 1 ) O(1) O(1)内关联两个任意位置的输入之间的相关性。
代价是降低了分辨率,Transformer使用了多头注意力(Multi-Head Attention)抵消了这一影响。
【注三】分辨率可理解为CNN的卷积核,Transformer类比到卷积层上就是卷积核的宽度为序列长度,这样丢失了精度,Transformer使用Multi-Head Attention(类比到CNN的多通道)弥补。
论文提出的Transformer模型组合使用了:编码器-解码器结构、注意力机制(点积注意力机制、多头注意力机制、自注意力机制)、前馈神经网络、嵌入层、softmax、位置编码。
上图中,左边由N个层堆叠起来构成编码器。每个层有2个子层。
第一个子层是多头自注意力(Multi-Head Attention)层。随后使用了残差连接(residual connection)和层正则化(Layer Normalization)。
第二个子层是MLP层。随后使用了残差连接(residual connection)和层正则化(Layer Normalization)。
【注四】Layer Normalization与Batch Normalization不一样,下图源自李沐大神的视频。对于embedding层的三维输出(batch、seq、feature),Layer Normalization是黄色笔画的横着切,这样会把一个句子作为一个单位进行均值为0、方差为1的操作;比Batch Normalization蓝色笔画的效果要好。
解码器比编码器多了一个mask multi-head attention层。这是因为解码器需要有自回归性,解码器的输出是一个一个输出的,每次的输出要作为输入再进入解码器。这一层就是为了实现这一功能,让第t个时刻的输出只看前t-1个时刻的输入。
【注五】这里不理解。输出既然是一个一个产生,那么在t时刻输出再作为输入,直接拿过来用就好了,即使想用t+1时刻后的数据,应当还未生成啊?
按比例点积注意力(Scaled Dot-Product Attention)
这是Transformer模型中,实现注意力机制的基础模型,模型图如下:
q q q、 k k k、 v v v都是个一维向量,但是由于我们可以批量计算,多个 q q q、 k k k、 v v v合并构成二维向量 Q Q Q、 K K K、 V V V。此模型公式为:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
自注意力(self-Attention)
非常好理解,就是自己算和自己的相关性,表现为 q q q、 k k k、 v v v都等于文本的embedding向量。
多头注意力(Multi-Head Attention)
把输入映射成h个低维的向量,然后经过按比例点积注意力(Scaled Dot-Product Attention) 层后,再聚合成高维的向量。其中“映射”的操作,靠Linear神经网络完成,这样就拥有了可学习的参数。模型如下:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) MultiHead(Q, K, V) = Concat(head_1, ...,head_h)W^O\\ where head_i= Attention(QW^Q_i, KW^K_i, VW^V_i) MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)
多头注意力可以类比到卷积神经网络的多通道。
与RNN模型作对比,如下:
在RNN中,MLP是用来抽取句子的特征的,RNN需要前面时刻的输出,作为现在时刻的输入,具有序列性。
在Transformer中,MLP是对每个词(token / word)进行分别提取。因为词向量经过多头注意力层之后,每个词的向量已经对全局信息进行了抓取。
到目前为止,模型对文本的序列性还没有提取。文章提出了一种简单的方法:
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE(pos,2i)=sin(pos/10000^{2i/d_{model}})\\ PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中,pos为单词的Index,也就是seq_len中的索引,i为embedding_dim词向量的索引,d是embedding_dim值。
P E ( p o s ) PE(pos) PE(pos)的图像类似于:
算出对应的位置编码后,我们直接加上原来的embedding层向量即可:
文中提到使用了学习过的位置嵌入,发现与使用正弦余弦函数效果几乎相同。