7.2 Transformer:具有里程碑意义的新模型
在第7.1章节中我们学习了经典的循环神经网络RNN和其变体长短期记忆网络LSTM。循环神经网络是处理时序数据的主要模型,可以实现很多不同类型的深度学习任务,如:
1)序列到类别任务:输入是时序数据,输出是类别,如文本分类、情感分析任务等。
2)同步的序列到序列任务:输入是时序数据,输出是等长度的序列数据,如图1所示的序列标注任务。
图1 序列标注任务
3)异步的序列到序列任务:输入是序列数据,输出是不等长度的序列数据,如机器翻译、问答系统等。
然而循环神经网络是一个串行建模方式,即下一个时刻t的单元状态依赖于前t−1时刻的单元状态的输入,这种设计在实际应用时存在两个瓶颈问题:
1)计算过程难以并行,使得训练较大模型常用的并行计算技术无用武之地,无法充分发挥硬件的能力。
2)当序列较长时,存在长程依赖的问题(梯度爆炸或梯度消失)。理论上循环神经网络可以建立长时间间隔的状态之间的依赖关系,但由于存在长程依赖问题,对于序列前边重要的信息,在序列后续的计算过程中可能会丢失。如在阅读理解任务中,一篇文章最后段落的理解,可能依赖对于该文章开篇的典故的理解,这种与全局信息的关联,显然不是循环神经网络能够捕捉的。循环神经网络会随着扫描序列的进行,更关注当距离较近的环境信息,距离更远的信息会逐渐变弱。
2017年,Transformer模型在论文《Attention is all you need》中被提出,字面理解“您只需要一个Attention就可以解决所有问题”。Transformer最开始被应用于机器翻译任务上,取得了SOTA的效果,并推动机器翻译任务达到新的高度,这一切很大程度上要归功于一个非常核心的组件:自注意力模型(Self-Attention Model)。
由于自注意力模型的引入,Transformer不仅摆脱了循环神经网络中串行计算的问题,同时能够在任意时刻,只关注输入序列中对当前计算最重要的信息(更全局化,而不是关注序列中临近的输入),从而缓解了循环神经网络在建模长时间间隔时时面临的长程依赖问题。
Transformer模型是一个具有里程碑意义的模型,它的提出催生了众多基于Transformer网络结构的模型,特别是在2018年预训练模型BERT的提出,其在多项NLP任务上均取得了突破性的进展。自此,不管是学术界,还是工业界均掀起了基于Transformer的预训练模型研究和应用的热潮,并且逐渐从NLP领域延伸到CV、语音等多项领域。例如ViT, DETR, TimeSformer分别在图像分类、检测和视频领域全面超过之前SOTA。
各种基于Transformer结构的变体模型在模型结构、运行效率和不同领域模型应用等方面纷纷被提出,同时各个领域的多项任务指标更是不断被刷新,深度学习领域进入了一个新的时代。
本章内容主要分如下两个部分:
- 理论解读:介绍Transformer两个核心组件自注意力模型和序列到序列模型(Sequence-to-Sequence,Seq2Seq)以及Transformer的完整结构。
- 动手实践:使用Transformer的Encoder模块完成新闻分类的任务。
7.2.1 自注意力模型
7.2.1.1 自注意力模型的实现原理
自注意力模型(Self-Attention Model)的设计思想来源于解决循环神经网络在解决长序列数据时遇到的问题:
1)如何计算更全局的信息依赖,而不局限于距离的远近?
2)如何使得计算可以并行化,而不是只能串行进行?
为了解决如上两个问题,自注意力模型采用查询-键-值(Query-Key-Value,QKV)的模式。对于输入序列X=[x1,...,xL]∈RL×D,每一个输入xi都有三个向量表示:查询向量qi∈RDk、键向量i∈RDk和值向量vi∈RDv。
其中qi和ki用来计算序列中其它输入对本输入的影响力,vi是本输入的向量表示,输入xj对输入xi的影响力使用 qj⋅ki 表示。影响力越大,说明处理输入xi的时候需要重点考虑输入xj的信息。
这样模型在处理当前输入时,它的注意力可以在整个输入序列上不受约束的扫描,从而得到对处理当前内容最有帮助的信息。
基于上面朴素的想法,自注意力模型的网络结构如图2所示。
图2 自注意力模型结构图
模型在处理输入xi时,先计算其它输入对xi的影响(qj⋅ki),用αij表示;然后将αij经过Softmax后得到的值α^ij与值向量vi相乘,就得到xi经过整个序列信息影响后的向量表示zi,即
7.2.1.2 自注意力模型严谨的数学表达
假设输入序列为X=[x1,...,xL]∈RL×D
,经过线性变换得到xi对应的查询向量q``i``∈R``Dk
、键向量ki∈RDk
和值向量vi∈RDv
。对于整个输入序列X,线性变换的过程可以简写为
其中WQ∈RDk×D,WK∈RDk×D,WV∈RDv×D是可学习的映射矩阵。默认情况下,可以设置映射后的Q、K、V的特征向量维度相同,都为D。
图3展示了输入为两个向量序列x1和x2的自注意力的计算过程,需要执行如下步骤:
图3 自注意力计算示意
1)两个输入向量x1和x2经过线性变换,分别获得它们在查询向量Q、键向量K和值向量V。
2)使用点积计算,先得出q1在k1和k2的分数α11和α12;再将分数缩放并使用Softmax进行归一化,获得x1的自注意力分布分数 α^11和α^12;最后根据该位置的自注意力分布对v1和v2进行加权平均,获得最终x1位置的输出向量z1 。
3)同理,可以获得x2的自注意力向量z2,即每个输入向量的位置均对应一个自注意力输出的编码向量zi∈R1×Dv。
为了加快计算效率,在实际应用时,可以使用矩阵计算的方式一次性计算出所有位置的自注意力输出向量,即
其中Z∈RL×Dv。
在自注意力计算过程中,为了防止注意力分布具有较大的方差,导致Softmax的梯度比较小,不利于模型的收敛,在计算过程中除以了一个D,可以有效降低方差,加速模型收敛。