一文弄懂Transformer中的自注意力机制

文摘   2023-05-13 20:19   江苏  

原文:https://zhuanlan.zhihu.com/p/568082495

学术交流使用,侵权删





01


 引言



Transformer以及其中采用的自注意力机制首先在自然语言处理领域(NLP)取得了成功的应用,替代了处理序列数据常用的循环神经网络(RNN)。之后,自注意力机制很快也被推广到了视觉领域,并同样展示出巨大的潜力。图像虽然本身不是时间序列数据,但其实可以看作空间上的序列,而视频本身就是时序数据。因此,理论上说,自注意力也可以用来处理图像和视频数据

闲话少说,我们直接开始吧!




02


来自NLP领域的Transformer

Transformer和自注意力机制最早是在NLP领域被用来处理序列数据。在Transfomer之前,处理自然语言序列数据的任务主要是由循环神经网络(RNN)及其变种来完成的。如下图所示,RNN的结构非常简单,其核心思想就是将前一时刻的状态 和当前时刻的输入合并到一起, 以此生成当前时刻的状态并按照这种模式顺序处理序列中所有的数据。由于网络的参数都是在训练阶段就固定下来,RNN的这种结构不可避免会导致历史信息的作用越来越弱,也就是无法保持“长时记忆”。此外,RNN的训练过程也会受到梯度消失和梯度爆炸问题的影响,这并不是本文的重点,所以这里就不展开讨论了。


RNN和LSTM结构示意图


相比于RNN,LSTM可以更好地处理长时依赖关系,也就是说可以提取长时间的相关性。但是不管是RNN还是LSTM,都采用顺序处理的方式,这种方式一方面限制了系统的并行处理能力,另一方面顺序处理还是会丢失信息,对于特别长时的相关性尤其是全局相关性(这里的全局是指整个时间序列)还是无能为力。

在这个背景下,Google的研究人员2017年在“Attention is all you need”论文中提出了基于自注意力机制的Transfomer模型,打破了顺序处理的限制,把相关性提取的范围扩展到了全局维度,在很多NLP任务上都取得了非常显著的性能提升,也因此开启了业界研究注意力机制的热潮。




03


自注意力的计算方式

Transfomer的核心是自注意力,而自注意力的的精髓则在于“自”上面,因为它描述的是数据各元素(对应论文中的Token)之间的相关性,也就是数据本身的内在关联。理论上说,自注意力本身并没有限制如何提取数据元素之间的相关性,但是目前大家所说的自注意力一般都是指Transformer中采用的点积(Dot-Product)注意力。这其实也是统计学中非常常见的一种相关性计算方式。

Transfomer中的自注意力和多头注意力


如上图所示,自注意力中的计算用到了Query,Key和Value,分别对应公式中的Q,K和V,它们都是通过对输入数据进行变换得到的。比如说输入数据是包含多个单词的句子,每个单词用一个向量来表示其特征。通过学习得到三个不同的变换矩阵对其进行处理,每个单词都可以转换为相应的Query,Key和Value,多个单词合到一起就变成了矩阵的形式。在上面的注意力计算公式中,Q和K相乘,对应Query和Key进行点积运算,得到的是Query和Key之间的相似性,再用Key向量的维度 进行scaling。之后,softmax操作将一个query对应的多个key的相似度进行归一,使其和为1。这些相似度作为权重对相应的value值进行加权平均,最终得到这个query对应的输出。这整个过程其实就是对输入数据编码或者说特征提取的过程,而编码的依据则是数据内部各元素之间的相关性


为了增强信息提取的能力,上述编码过程可以并行重复多次,多次编码的结果叠加到一起得到最终的输出。这种结构称之为多头注意力,其本质其实就是多个单头注意力的组合。




04


 自注意力的设计动机

以上是自注意力计算的核心部分,这个过程并不复杂,不论是从原始的论文还是各种解读文章中都可以很容易理解和复现。但是,这个过程背后的设计动机又是什么呢?

前面讲了,自注意力的任务就是要对输入数据编码,也就是提取特征。那么,让我们来回想一下计算机视觉中经典的特征提取方法。在深度学习流行之前,我们通常会手工设计一些特征提取模板,比如SIFT,Gabor,HOG等。这些特征描述了图像局部区域内的特性,并对一些变化,比如尺度,光照等具有很好的不变性。当然也有一些全局的特征,比如采用傅里叶变换提取图像低频信号,但并不是特别常用。在深度学习统治视觉领域以后,我们一般都采用卷积操作来提取局部的图像特征,而卷积核则是通过训练得到的。

无论是全局特征,还是局部特征,无论是手工设计,还是深度学习,特征提取的本质都在于刻画数据自身的关联。比如说一个3x3的卷积核,其描述的就是中心像素和周围3x3邻域之间的关系。但是,这些特征提取方法的作用域是固定的,提取的模板也是固定的。局部特征就是在一个固定大小的区域内提取信息,更大范围的作用域通常是靠图像缩放或者堆叠特征提取层来获得。全局特征可以描述整幅图像,但通常都是一些概括式的描述,丢失了局部细节的信息。

从自注意力的计算我们可以看到,每一个元素的特征提取都用到了数据中所有的元素,所以理论上说这是一种全局的特征提取。但是,这种全局特征提取采用的是加权求和方法,权重则是元素之间相关性,是动态计算得到的。也就是说,相关性较低的元素在特征提取的过程中产生的作用是比较小的。这就使得特征提取过程有一定的聚焦性,不会丢失掉重要的局部信息。所以,自注意力机制可以同时兼顾特征提取的全局和局部性,通过数据和任务驱动的方式来自主确定特征提取应该关注的焦点。



05


 Transformer的网络结构


如下图所示,Transformer是一个编码-解码的结构,分别包含6个编码器和6个解码器(N=6)。下面我们就来简单介绍一下它的工作流程。

Transformer的网络结构


首先,输入数据中的每个元素都要经过一个特征提取的过程。这一步主要是和具体的任务相关的,比如说单词转换成词向量,图像块转换为像素向量。假设输入数据包含M个元素,每个元素的特征向量维度为d,那么输入数据的维度就是M*d。

自注意力的计算没有考虑元素的位置信息,而这个信息通常对于后续任务来说又是很重要的,因此Transformer在输入特征上附加了位置编码特征。位置编码的计算公式如下,以此生成的位置特征和输入特征具有相同的维度d,与输入特征相加后就得可以作为编码器的输入了,其维度也是Mxd。

位置编码计算公式


编码器主要由两部分构成,一个是多头注意力,另一个是全连接层(Feed Forward)。两个部分都包括了残差连接(Add)和归一化(Norm)。这两个操作都是深度学习中常用的技巧,所以就不展开讲了。多头注意力上一节中已经详细介绍了,而全连接层是为了对编码后的元素做进一步的特征提取,但是这里并不涉及元素之间的联系,每个元素是独立操作的。经过以上这些操作以后,输出的维度还是Mxd,但此时每个元素的特征都已经包含了所有其它元素的相关信息。多头注意力和全连接层作为一个模块在编码器中重复6次,用来提取具有更多语义信息的高层次特征。

解码器的工作流程


在NLP的任务中,解码器也是非常重要的一个步骤。比如在句子翻译任务中,输入的句子通过编码器生成了特征以后,还需要输入给解码器才能得到翻译之后的句子。解码器的结构与编码器非常类似,都是多头注意力加上全连接层,并且重复6次。解码和编码过程区别主要在于以下两点。

首先,解码器有两个输入,一个是编码器的输出,经过处理以后作为key和value,另一个是当前要解码的词经过多头注意力模块处理后的特征,作为query。因此,这是一个编码-解码的交叉注意力,其中query来自解码器,而key和value来自编码器。在解码的过程中,key和value是不变的。此外,在训练过程中,为了防止网络使用还未解码的元素,需要一个mask来遮挡这些元素,而在预测的过程中,初始的解码结果会设置为空。




06


 总结


本文重点介绍了Transformer网络中的自注意力机制的相关原理以及在NLP领域中的应用,从最初的设计动机到相应的计算方式都给出了相应的解释和图例,希望可以帮助大家更好地理解这一开创性概念。



嗯嗯,您学废了嘛?







点击上方小卡片关注我






寄语:

我们所听到的一切,都是一个观点,不是事实。

我们所看到的一切,都是一个视角,不是真相。

AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
 最新文章