计算机系统应用教程网站

网站首页 > 技术文章 正文

两篇软文带领新手小白了解Transformer的前世今生(一)

btikc 2024-10-12 10:08:54 技术文章 12 ℃ 0 评论

作者 | 丘比特,出品 | 焉知汽车

现如今在图像处理领域,Transformer的应用已经逐渐呈现十分流行的趋势,也有相当一部分文章在引用一些国内外优秀的论文想要讲清楚Transformer如何应用于计算机视觉领域。但实际上,纵观上下数篇相关的文章不难看出,很少有人能为一些入门级别的人讲清楚到底transformer是什么,为什么它很优质,如何应用到图像处理中。毕竟对于这一先进的算法而言,也是从2017年才真正的进入到高端AI领域,应用的兴起也是由特斯拉带动起来。而国内真正能用的起来,并用的好的自动驾驶算法公司或者主机厂也是寥寥无几。

前序

那么,为了帮助读者更好的理解和应用Transformer,本文从常规的几十个问题回复中解答Transformer的要义所在。

先前已有一些序列问题算法的领导者,如循环神经网络,门控循环单元GRU、长短期记忆网络LSTM。大家可能听说过著名的Transformer模型,如BERT(Bidirectional Encoder Representation from Transformers)、GPT(Generated Pre-Traning)。

实际上,终极Transformer是通过注意力机制Attention、残差连接、层归一化layer normalization、反向传播网络FFN等一系列关键节点所构成。

Transformer提出了深度学习领域既MLP、CNN、RNN后的第4大特征提取器。一开始用在机器翻译,随着GPT和Bert彻底出圈,之后多模态、大模型、视觉Transformer等开始兴起,随后,由特斯拉首创应用在自动驾驶领域。这一创举给人们信心,原来CNN和RNN之后,还可以通过更加有效的特征提取器Transformer加强自动驾驶人工领域的前瞻技术突破。

位置编码

这里以RNN处理图像的做法做一个详细说明。我们知道RNN是按照时间序列关系将各个处理端进行连续运算得到,也就是后面的计算要以前面的计算结果作为依赖,同时,RNN整体上的处理参数都是同一套(U,W,V),这里可以看成对某一个关键帧的参考关系。这样的计算效率相对较低。Transformer的好处是在如上的计算关系上完全并行化,也就是后面输入的编码不会以前面的编码结果作为基础,这样就可以很大提升计算效率。但是有个点也必须考虑到,由于中央处理单元是无法直接处理一幅图像或者一个汉字,因此需要把一个token转化成中央处理单元可以识别的向量,这也就是embedding过程。一个好的特征提取器需要自带输入处理模块的前后顺序信息,而Attention机制并没有考虑先后顺序信息,但前后顺序信息对语义影响很大(比如可能在解码端会造成解码混乱),因此需要通过位置嵌入这种方式把前后位置信息加在输入的Embedding上。

如上图所示。假设输入为由12帧图像组成的视频序列,在embedding过程中需要按子图进行切分,且对每个子图定义一个512维的向量进行表示。这里我们假设需要对512个位置进行编码,那么使用正余弦函数进行编码就可以体现绝对位置信息且具有线性特性。这样,模型可以很容易的学会如何进行关注。奇数时间步长位置使用余弦表示创建向量,对于偶数时间步长使用正弦表示方式创建向量。然后将这些向量添加到相应的嵌入向量中,这样就成功的为网络提供了正确的位置信息。随后,将对应图像的位置编码(512)和图像向量的维度做+运算则可以得到最终的512维度就可以作为整个Transformer的输入。

注意力机制

要理解Transformer,我们首先需要讲清楚其中的重点要素:注意力机制。为了直观的理解注意力机制,我们考虑采用实例性的图像序列处理过程进行阐述。

对于图像而言,attention就是人们看到图像中的核心关注的区域,是图像中的重点。对于序列而言,Attention机制本质上是为了找到输入中不同token之间的相互关系,通过权重矩阵来自发地找到子图与子图之间的关系。

对于模型处理的应变过程,我们需要使用任意输入对其进行有效的引导。当模型生成文本或图像信息时,他有能力关注与该文本或图像相关的其他文本或图像。模型需要知道参考哪个文本或图像的能力,是在训练过程中通过反向传播学习到的。其重点是生成图嵌入层,用来获取向量表示。神经网络是通过数字进行学习的,每幅图像都映射到一个连续值向量中,从而可以有效的表示该图像。

模型需要有能力参考与当前视频图像或其中感兴趣区域ROI相关的部分,这种参考过程实际是一种记忆机制。这种记忆机制分为短时记忆和长时记忆。

对于CNN而言,实际是在图像中划片,并寻找各片之间的关联关系,从而生成空间参考依赖。因为对于自动驾驶而言,需要的是从时间线层面做进一步的查询参考,而R-CNN则是在CNN基础上加入时间线:即在神经网络中我们依靠RNN机制可以弥补CNN只关注空间相关参考机制,并加入了时间参逻辑。但是,传统RNN有个缺陷,就是通常是短时记忆,也就是他在时间线上参考的视频帧是与当前帧时间上较为接近的参考窗口,如果是很久之前生成的视频帧或ROI则不会被作为参考窗口。这样随着视频帧的不断累计,后续帧与参考帧窗口也会不断累计误差。而在transfomer的模型中,提出了注意力机制,这种方式可以有无限种参考窗口,并且可不受短时记忆的影响。

Transformer的核心实际上就是在编码和解码。为什么要这么做呢?是因为Transformer的实质是要生成当前帧和参考帧之间的对应关系,这种对应的表示关系实际上是连续的向量输出。

举个例子,如果当前帧某一处图像位置(x,y)处存在一辆小轿车,而实际上该轿车在之前的视频帧中已经被识别出来,那么该轿车就可以直接通过Transformer编码所对应的位置向量直接到当前图像帧中对应的位置处搜索即可得到该小轿车的基础信息。当然为了更加准确地表示出当前小轿车的具体位置甚至运动状态,还需要针对该小轿车在之前一系列视频帧中的位置做相应的运动估计(Motion Estimation, MV)。

编码器所生成的向量连续表示可以很好的将整个图像序列中各个被关注部分进行向量映射。总结起来整个编码器可以参照如下公式进行向量连续表示:

编码器=两个子模块+多头注意力+全链接网络

1、自注意力

由于自注意力允许将待测模块与模型中的其他所有模块进行关联。这种查询关系是通过查询Query、键Key、值Value三者组成的向量分组来进行的。为了更好理解以上三者到底是如何进行检索的,可以将以上三个维度看成一个数据库检索系统的。比如,你在百度上输入一个查询query关键词后,该关键词会映射到一组键值Key,键值最终会查找到对应需要展示的信息,即值向量。由于不同的Q/K/V可以保证在不同的空间进行投影,增强了表达能力,提高了泛化能力。

如上图所示,查询x键—>分数矩阵,该矩阵可以确定一幅图像如何关注到其他图像,或者一个图像中的其中一部分区域如何关注其他区域。因此,每幅图像都有一个与时间步长指向的其他图像关联的分数矩阵;分数越高,关注度越高,这就是查询映射到键的。接下来通过将查询到键的维度进行平方根运算的形式进行归一化缩放,这样可以让梯度计算更加稳定,从而很好的规避如上乘法运算产生的爆炸效果。然后对缩放后的得分进行softmax计算,这种计算方式可以得到注意力权重,从而生成0-1之间的概率分布关系值。Softmax计算后,实际上之前较高的得分会被增强,而较低的得分则会被抑制或淹没。也就是说,较高的Softmax会保留模型中认为更加重要的图层,降低的得分则会淹没不相关的图层,将输出向量输出到线性层进行处理。

这样就可以增强模型对关注某些具体的查询输出更加有信心。最后,将注意力权重与值相乘后,可以得到对应的输出。

通过Attention eighths * value = output点乘的方式计算可以保留模型中更为重要的查询图。其中,点乘表示一个向量在另一个向量上的投影长度,可以较准确的表示两个向量之间的相似度。也就是说两个向量越相似,他的点乘结果就越大,这也就应证了当前帧对参考帧的相似度。

那这里有人可能也会问,为什么Transformer在计算attention的时候会选择点乘而不是加法呢?两者在计算复杂度和效果上有什么区别呢?

实际上,这是为了计算的更快的原因,矩阵加法在这一块的计算上确实简单,但是作为一个整体计算Attention的时候相当于一个隐层,整体计算量和点积相似。但在效果上来说,却与dk相关性较大,dk越大,加法效果越显著。

2、多头注意力

简单地讲,多头保证了Transformer可以注意到不同子空间的信息,捕捉到更加丰富的特征信息。多头注意力是一个模块,用于计算输入的注意力权重,并生成一个带有编码信息的输出向量,指示序列中的每个词如何关注其他所有词。顾名思义,多头注意力用于指示视频序列中的每帧图与其他图之间的关系,实际上就是一种将自注意力机制展开化的表示方式。我自己单独给他取了个名字叫Multi-Self Attention。

以2个head的为例,将输入的Q、K、V分成两份,每一小份的Q与对应的K、V分别操作,最后计算得到的向量再进行Concat操作,由此可以看出,Multi head attention与分组卷积有着相似的实现方式。实际相乘过程中,用了两套矩阵乘参数(w0Q , w0K,w0V )和(w1Q , w1K,w1V )相当于把原始信息打到了不同的空间,保证了transformer可以关注到不同的子空间的信息。

其中投影为输入参数矩阵WiQ,WiK,WiV和输出参数矩阵Wo。这里,如果采用层高为8的并行注意力层或头。对于每层我们都使用模型维度/层高,由于每个头减少的维度,整体的计算代价与全维度下的单头注意力机制是相似。

最后多个头进行计算融合后可以得到多个头的输出。

为了使如上计算过程契合多头注意力计算过程,在应用自注意力之前需要将输入分割为多个查询、键、值向量。分割后的向量分别输入到相同的自注意力过程。每个自注意力都会产生一个头,每个头都会输出对应的“查询、键、值”。最后,综合各个自注意力头向量并输入到线性层中可以拼接为一个大向量。每个头都会学习到不同层次的指示映射,这样就可以更好的表示出不同自注意力之间的映射逻辑。

由于Attention已经有了想要的序列信息特征,通过前馈网络操作FFN的两层MLP就可以把信息投影到特定的空间里,再做一次非线性映射,和Self attention交替使用。

总结

Transformer的编码层实际是为了将输出编码为连续表示,并带有注意力信息。这种编码方式可以帮助解码器在解码过程中关注输入中的适当词汇或图层。如果将编码器堆叠N层后,可以进一步完善编码信息,其中,每一层都有机会学习不同的注意力表示,从而有可能提高Transformer的网络预测能力。

后面的文章,将从解码角度继续讲解Transformer的应用实例和实现原理。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表