文章目录
Transformer
一、思想和框图
Transformer是由谷歌于2017年提出的具有里程碑意义的模型,同时也是语言AI革命的关键技术。在此之前的SOTA模型都是以循环神经网络为基础(RNN, LSTM等)。从本质上来讲,RNN是以串行的方式来处理数据,对应到NLP任务上,即按照句中词语的先后顺序,每一个时间步处理一个词语。
相较于这种串行模式,Transformer的巨大创新便在于并行化的语言处理:文本中的所有词语都可以在同一时间进行分析,而不是按照序列先后顺序。为了支持这种并行化的处理方式,Transformer依赖于注意力机制。注意力机制可以让模型考虑任意两个词语之间的相互关系,且不受它们在文本序列中位置的影响。通过分析词语之间的两两相互关系,来决定应该对哪些词或短语赋予更多的注意力。
Transformer采用Encoder-Decoder架构,下图就是Transformer的结构。其中左半部分是encoder,右半部分是decoder [1]:
现有的各种基于Transformer的模型基本只是与NLP任务有关。然而,最近一些文章开创性地将Transformer模型跨领域地引用到了计算机视觉任务中,并取得了不错地成果。这也被许多AI学者认为是开创了CV领域的新时代,甚至可能完全取代传统的卷积操作。
最近CV界也有很多文章将transformer迁移到CV领域,这些文章总的来说可以分为两个大类:
- 将self-attention机制与常见的CNN架构结合
- 用self-attention机制完全替代CNN
其中,ICLR 2021 under review 的**《An Image Is Worth 16X16 Words: Transformers for Image Recognition at Scale》**[2] 采用的是第二种思路。
二、实现细节
2.1 Encoder
Encoder层中有6个一模一样的层结构,每个层结构包含了两个子层,第一个子层是多头注意力层(Multi-Head Attention,橙色部分),第二个子层是前馈连接层(Feed Forward,浅蓝色部分)。除此之外,还有一个残差连接,直接将input embedding传给第一个Add & Norm层(黄色部分)以及第一个Add & Norm层传给第二个Add & Norm层(即图中的粉色-黄色1,黄色1-黄色2部分运用了残差连接)。
2.2 Decoder
Decoder层中也有6个一模一样的层结构,但是比Endoer层稍微复杂一点,它有三个子层结构,第一个子层结构是遮掩多头注意力层(Masked Multi-Head Attention,橙色部分),第二个子层是多头注意力结构(Multi-Head Attenion,橙色部分),第三个子层是前馈连接层(Feed Forward,浅蓝色部分)。
说明:
- 这一部分的残差连接是粉色-黄色1,黄色1-黄色2,黄色2-黄色3三个部分
- 该层的重点是第二个子层,即多头注意力层,它的输入包括两个部分,第一个部分是第一个子层的输出,第二个部分是Encoder层的输出(这是与encoder层的区别之一),这样则将encoder层和decoder层串联起来,以进行词与词之间的信息交换,这里信息交换是通过共享权重WQ,WV,WK得到的。
- 第一个子层中的mask,它的作用就是防止在训练的时候使用未来的输出的单词。比如训练时,第一个单词是不能参考第二个单词的生成结果的,此时就会将第二个单词及其之后的单词都mask掉。总体来讲,mask的作用就是用来保证预测位置i的信息只能基于比i小的输出。因此,encoder层可以并行计算,一次全部encoding出来,但是decoder层却一定要像RNN一样一个一个解出来,因为要用上一个位置的输入当做attention的query.
- 残差结构是为了解决梯度消失问题,可以增加模型的复杂性。
- LayerNorm层是为了对attention层的输出进行分布归一化,转换成均值为0方差为1的正态分布。cv中经常会用的是batchNorm,是对一个batchsize中的样本进行一次归一化,而layernorm则是对一层进行一次归一化,二者的作用是一样的,只是针对的维度不同,一般来说输入维度是(batch_size,seq_len,embedding),batchnorm针对的是batch_size层进行处理,而layernorm则是对seq_len进行处理(即batchnorm是对一批样本中进行归一化,而layernorm是对每一个样本进行一次归一化)。
- 使用ln而不是bn的原因是因为输入序列的长度问题