自注意力与 Transformer

自注意力与Transformer

简介

近年来,注意力(Attention)机制被广泛应用于计算机视觉和自然语言处理领域,仅 CVPR2020 接收的论文中,使用到 Attention 的文章达到 60 篇。随着 Attention 的广泛研究,很多不同的 Attention 方法被提出,谷歌机器翻译团队于 NIPS2017 发表的《Attention is all you need》引起了广泛的关注,其中,大量使用自注意力机制(self-attention)构建 Transformer 结构,自此自注意力成为了研究热点并在各种任务取得了相当优秀的结果。

背景

Attention 机制最早出现于计算机视觉领域,《Neural Machine Translation by Jointly Learning to Align and Translate》首次利用 Attention 机制在机器翻译上将翻译与对齐同时进行,这也是首次 Attention 机制被用在 NLP 任务中,随后以 Attention 机制为基础的神经网络模型被广泛使用在 NLP 领域。2017 年,谷歌机器翻译团队提出 Transformer,大量使用自注意力机制而放弃 RNN 和 CNN 学习文本表示。到 2020 年,已经有不少研究将自注意力机制带回到计算机视觉任务中,并取得了不错的成果,如 2020 年的《End-to-End Object Detection with Transformers》将自注意力引入目标检测中。

注意力机制(Attention Mechanism)

Attention 机制本质上来自于人类的注意力感知机制,当人们用肉眼感知事物的时候并不会从头到尾每次都看全视野中的内容,而是根据需求注意特定的一部分,当习惯于场景中某个部分出现自己感兴趣的东西时,人类会学会下次出现类似场景时将注意力移到该部分(由于这个学习过程几乎就是本能,我们很少注意这个过程)。例如,看到如下这个图像,我们第一眼关注的就是图像中的猫而不是周围的绿叶和露水,这就是我们的大脑长期“训练”的结果。

自注意力与Transformer
视觉注意力分好几种,其核心思路是基于原有的数据找到其之间的关联性然后突出某些重要的特征(即将有限的注意力放到更重要的信息上从而防止“遗忘”),一般有通道注意力、像素注意力、自注意力等,其应用领域如用于捕捉图像上的感受野等。在实现上,attention 算法其实有很多种,但其本质都可以概括为加权求和。

Transformer 解读

Transformer 是一个典型的基于自注意力的 seq2seq 模型,就如论文题目《Attention is all you need》所说,在该模型中不会出现 RNN 和 CNN 结构,有的只是一个自注意力模块以及前馈网络。

自注意力模块

此前,对于针对序列数据的建模多采用 RNN 及其变种(包括 LSTM、GRU 等)或采用复杂堆叠的 CNN,RNN 的思路如下图左侧,其中aia^i表示输入序列的第 i 个位置的特征,bib^i表示对应的输出,RNN 的原理这里不多提及,它的后一个输出是依赖前面输出的信息的,所以 RNN 的推理只能串行,self-attention 能得到同样的输出,但可以并行计算。

自注意力与Transformer

上图右侧就是自注意力模块的黑盒模型,显然,各个输入之间的关系通过自注意力模块捕捉到了,那么具体是如何实现的呢?

首先,基于原始的 Attention,定义三个向量,分别为qq(query,与其他的进行匹配),kk(key,被其他的匹配)以及vv(value,提取到的特征信息),它们的计算式如下。

qi=Wqaiq^{i}=W^{q} a^{i}
ki=Wkaik^{i}=W^{k} a^{i}
vi=Wvaiv^{i}=W^{v} a^{i}

其示意图如下图,注意,对每个不同的输入提取q,k,vq,k,v的权重WW是相同的,这就是为什么后面使用multi-head结构的一个原因。

自注意力与Transformer

通过权重学习到了每个输入的q,k,vq,k,v向量后,接着就是计算当前输入的aia^i得到的qiq^i与所有kj(j(1,4))k^j(j\in{(1,4)})之间的Attention α1,j\alpha_{1,j},计算方式采用Scaled Dot-Product Attention,计算式如下,其中dot-product表示点积,scaled表示通过除以d\sqrt{d}进行尺度调整,原因是如果query和key的每一个元素是mean=0,std=1,那么dot product的mean=0,std=d0.5,所以除以d0.5可以normalize dot product。

α1,i=q1ki/d\alpha_{1, i}=q^{1} \cdot k^{i} / \sqrt{d}

这样,每个输入的aia^i都会输出nn(n是输入a的数目或者维度)个输出α1,j\alpha_{1, j},将它们softmax后得到的α1,j^\hat{\alpha_{1, j}}与对应的kjk_j点乘后求和,即得到对应的输出bib^i,示意如下图。

自注意力与Transformer

所有的bib^i组合到一起,就是类似上面RNN的输出,可以看到,每个bb都与其他的输入产生运算后得到输出,也就是说每个位置的输出都包含了与其他位置的相关性信息,这就是自注意力。

多头注意力

显然,上述这个过程是可以矩阵化的,也就是可以GPU并行加速。上面这个这么复杂的操作其实引入的权重只有提取q,k,vq,k,v的三个WW矩阵,这显然只能学到一种任务有关的信息,要想学到更丰富的信息,就是使用更多的q,k,vq,k,v提取方法,这就是multi-head self-attention,它的思路就是反复进行自注意力,得到多种bb输出。因此,就像李宏毅老师PPT中下图所示的,不同的head只有输入aa是共享的,每个head的qq只能与当前head的kkvv进行运算得到不同的bjb^{j}(j最大为head数),最后concat到一起再通过一个权重矩阵进行降维得到bib^i

自注意力与Transformer

位置编码

使用multi-head有助于捕获不同类型的特征,但是纵观上面的attention过程,可以发现,每个输入都会去与所有的输入得到的信息进行运算,所以这个过程可以矩阵化并行,但是,这就带来一个很严重的问题:**顺序信息的丢失,也就是位置信息的丢失。**举个例子,对某个单词而言,只使用词嵌入作为输入的话,它与某个单词计算attention,那无论这个单词在它前面还是后面,得到的信息都是一样的,这显然不合理,对NLP而言,语序是一个非常重要的信息。

那么Transformer如何解决这个问题的呢?它通过引入一个与词嵌入同维的位置编码向量来补充位置信息,这个位置编码并非从数据中获得,而是人为指定的eie^i与原来的词嵌入aia^i相加得到的结果输入网络,至于eie^i的计算方法实际上是通过一个固定的WpW^p与onthot编码运算得到的,这个WpW^p在原论文里是通过一个很复杂的式子求得的,具体可以查看原论文。

自注意力与Transformer

Transformer

通过上述的自注意力模块堆叠而成的Transformer模型如下图,左侧表示编码器,右侧表示解码器。首先看编码器部分,词嵌入和位置编码相加后输入多头注意力模块,该模块上文已经分析了,随后的Add和Norm分别表示残差连接和layer norm,该结构重复N次后输入一个feed forward网络得到encoder 的输出。再看右侧的解码器部分,输入的outputs是前一个time得到的output,输入的masked multi-head attention模块表示只会与产生的序列进行attention,下一个attention模块则可以attend到encoder的输出,然后类似encoder重复N次,得到输出结果。

自注意力与Transformer

DETR

Facebook提出的《End-to-End Object Detection with Transformers》,简称DETR,将目标检测直接作为一个集合预测问题来处理,它由一个Transformer encoder-decoder作为核心结构,通过基于集合的全局损失进行训练,该全局损失通过二分匹配强制进行唯一预测。给定固定的学习对象查询集,则DETR会依据对象与全局图像上下文之间的关系,并行输出最终的预测集,因而效率很高。

其pipeline如下图,官方开源代码链接给出。

自注意力与Transformer

总结

虽然 Transformer 的本质结构就是 Attention 和全连接的堆叠,但是其设计思路因彻底放弃 RNN 和 CNN 已经足够超前了,值得深度学习研究者品味;在速度方面,并行化的推理速度远超了 RNN 这种模型,同时也使得以超长序列为输入的任务成为可能,并行结构也是最适合 GPU 加速运算的结构。

虽然粗暴地放弃 RNN 和 CNN 是挺“狂妄”的,但是 local 信息的获取能力就丢失了,因此现在,组合 Transformer 和 RNN 及 CNN 是更好的选择;而且,Transformer 通过位置编码补充了顺序信息,该位置编码是固定得出的,对其他任务未必合适,这也是该结构优化需要考虑的。

补充说明

本文简单介绍了近几年在 CV 中有着不错潜力的 Transformer 结构,文章部分的示例图片参考了李宏毅老师关于 Transformer 的解读视频这是一节非常不错的课,相对 Transformer 深入理解的可以去看看,相关 PPT 可以评论或者私信我获取。

相关文章: