导读
Transformer在许多的人工智能领域,如自然语言处理(Natural Language Processing, NLP)、计算机视觉(Computer Vision, CV)和语音处理(Speech Processing, SP)取得了巨大的成功。因此,自然而然的也吸引了许多工业界和学术界的研究人员的兴趣。到目前为止,已经提出了大量基于Transformer的相关工作和综述。本文基于邱锡鹏[1]老师近日所发表的一篇综述[2]为基础,详细的解读Transformer的来龙去脉,同时为大家介绍近期一些相关工作,中间也会穿插一些笔者的见解。最后,本文也将列出一些可探索的未来研究方向,希望能给予读者一些启发。
背景
Transformer[3]最早提出是被作为一种序列到序列(sequence-to-sequence)模型并应用于机器翻译的。之后的一些工作表明基于Transformer的预训练模型可以在不同的任务上实现SOTA(Satte-Of-The-Art)性能。
基于Transformer的巨大成功,在过去的几年里也相继提出了一系列的Transformer变体,简称X-formers。这些变体主要从不同的角度对Transformer进行了相应的改进。(有点当年ResNet和UNet的味道啊,哈哈哈)
- 模型效率。为了捕获长距离依赖关系,Transformer应用了自注意力机制来建模全局的上下文信息,然而这种基于像素点(pixel-to-pixel)对的建模方式计算量无疑是巨大的,通常为输入特征尺寸的二次方。改进的方法包括两种思路,即轻量化的注意力(譬如稀疏注意力变体)和分治法(譬如循环和分层机制)。
- 模型泛化性。由于Transormer是一种十分灵活的架构,而且其对输入数据的结构性偏差几乎是没有假设的,因此也很难应用在小规模数据集上进行训练,也就是说缺乏泛化性能。改进方案包括引入结构性偏差或正则化技术,以及对大规模未标记数据进行预训练等。
- 模型自适应。这一类型的工作旨在将Transformer应用到特定的下游任务和应用。
Vanilla Transformer
原生的Transformer模型是一个由编码器和解码器组成的序列到序列模型,其中编解码器均堆叠了L个相同的块。每一个编码器主要由多头注意力(Multi-head Self-Attention, MSA)模块和position-wise的前向传播网络(Feed-Forward Network, FFN)组成。为了构建一个更深的模型,每一个模块都应用了残差连接,后面紧跟一个层归一化[4](Layer Normalization, LN)模块。相比于编码器来说,解码器在MSA模块和FFN模块之间额外插入了一个交叉注意力(Cross-Attention, CA)模块。此外,解码器端的自注意力模块作用是用于避免当前位置关注到后续位置的信息。网络的整体结构
注意力模块
Transformer采用了带有Query-Key-Value(QKV)的自注意力模块。其中,Q指的是查询向量,K指的是关键字向量,而V指的是内容向量。以图像为例,通过计算Q和K的点积进行关联,可以获取到图像中各像素点之间的关联矩阵;然后,通过Softmax激活函数输出每个位置对应的权重图;最后,再将该权重图叠加到V,便可以实现对不同区域加权的目的。公式如下所示:
Attention (Q,K,V)=softmax(QK⊤𝐷𝑘)V=AV
这里𝐷𝑘为缩放因子(scaled dot-product attention),主要是用于缓解由于softmax函数引入的梯度消失问题。
由于Q与K点乘结果过大,使得经过softmax之后的梯度变得很小,不利于反向传播,因此需要对结果进行缩放。
Transformer并没有简单地应用单个注意力函数,而是使用了多头注意力。通过单独计算每一个注意力头,最终再将多个注意力头的结果拼接起来作为MSA模块最终的输出,具体公式如下所示:
MultiHeadAttn (𝑄,𝐾,𝑉)= Concat ( head 1,⋯, head 𝐻)𝑊𝑂 where head 𝑖= Attention (𝑄𝑊𝑖𝑄,𝐾𝑊𝑖𝐾,𝑉𝑊𝑖𝑉)
在Transformer中,主要涉及到三种不同的注意力类型:
- Self-attention. 在Transformer的编码器中,我们设置𝑄=𝐾=𝑉=𝑋,这里𝑋为上一层的输出。
- Masked Self-attention. 在Transformer的解码器中,自注意力受到限制,使得每个位置的查询只能关注到包括该位置及之前位置的所有键值对。常规做法是将掩码矩阵(mask matrix)添加到注意力分数上,其中非法位置采用 𝐴𝑖𝑗=−∞ if 𝑖<𝑗2进行遮挡。这一类注意力方法也经常被称为自回归(autogressive)或者因果(causal)注意力。
- Cross-attetnion. 查询是从前一个(解码器)层的输出投影所获得的,而键和值是使用编码器的输出投影得到的。
前向传播网络
前向传播网络实际上就是一个两层的多层感知机(Multi-Layer Perceptron, MLP),也就是由全连接层加非线性激活函数所组成的,可以分别作用到每一个位置,具体公式如下所示:
FFN(𝐻′)=ReLU(𝐻′𝑊1+𝑏1)𝑊2+𝑏2
这里𝐻′为 上一层的输出,𝑊1∈𝑅𝐷𝑚×𝐷𝑓,𝑊2∈𝑅𝐷𝑓×𝐷𝑚,𝑏1∈𝑅𝐷𝑓,𝑏2∈𝑅𝐷𝑚均为可训练参数。根据经验,通常𝐷𝑓的值要比𝐷𝑚大。
残差连接和归一化
为了构建深度模型,Transformer在每个模块周围采用了残差连接,然后是层归一化。例如,每个Transformer编码器可以写为:
H′= LayerNorm ( SelfAttention (X)+X)H= LayerNorm (FFN(H′)+H′)
其中SelfAttention(·)表示自注意力模块,LayerNorm(·)表示层归一化操作。
位置编码
由于Tranformer完全摒弃了RNN和CNN结构,导致它对位置信息是一无所知的(尤其是编码器)。因此,需要额外的位置表示来对Token的排序进行建模。
模型用法
一般来说,Transformer架构可以使用以下三种不同的方式:
Encoder-Deocder
正如我们在上面所介绍的完整Transformer架构,这种编解码形式通常用于序列到序列的建模,例如神经机器翻译。
Encoder only
仅使用编码器,编码器的输出用作输入序列的表示,这种结构通常用于分类或序列标记问题,例如图像分类。
Decoder only
使用了解码器,其中也删除了编码器-解码器交叉注意模块,这种结构通常用于序列生成,例如语言建模。
模型分析
影响Transformer模型复杂度的两个主要因素为隐藏层𝐷的维度为𝐷𝑚以及输入序列长度为𝑇。假