首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

作者 |丘比特

出品 |焉知汽车

如前文所述,Transformer的核心实际上就是在编码和解码。为什么要这么做呢?是因为Transformer的实质是要生成当前位置和参考位置之间的对应关系(如果按照视频序列的表示方式,这种关系可以是帧内的,也可以是帧间的),这种对应的表示关系实际上是连续的向量输出。

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

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

本文将接续前面的文章,继续讲解关于Transformer的一些关键要素信息以及普遍为人所疑惑的部分。

残差连接带来了什么?

接下来,就是将多头注意力输出向量加到原始输入上,就完成了残差链接。几乎每一个深度学习模型都会用到这个技术,可以防止网络退化,常用于解决多层网络难训练的问题。由于输入的图像或识别内容有大有小,很容易造成因样本长短不一造成“训练不稳定”,残差链接输出经过层归一化残差网络允许梯度直接流入网络,这样可以通过批量归一化Batch Normalization(BN)或者层归一化Layer Normalization(LN)来稳定网络。

如下图所示,残差连接经过层归一化,然后被送入点对点前馈网络进行进一步处理注意力的输出,从而可以使其具有更加丰富的表达。其中Linear—ReLu—Linear中ReLu为激活函数,点对点网络实际是几个线性层,中间有ReLu激活函数,可以很好的处理点对点前馈网络中的参数。

如上左图所示,对于输入的图像来说,首先需要进行位置编码(x1,x2)后输入到自注意力网络中。这样可以通过位置及位置相关的数组编码信息得到对应的自注意力输出编码(z1,z2)输出。后续曾归一化需要将位置编码信息和自注意力编码信息做对位相加处理。

从如上计算中不难看出,后向传播实际是一种链式法则,即通过单纯的连乘来实现。如果考虑对层归一化的输出进行求导,则会进一步扩展连乘方程式中乘数。然而,从如上计算中不难看出连乘可能导致分子分母约分后抵消掉某些重要的计算因子,此时容易引起梯度消失,梯度的消失也就是会损失很重要的图像信息(比如纹理信息、色变信息等)。

总结起来,残差网络有助于网络训练,因为它允许梯度直接流过网络。使用层归一化来稳定网络,从而显著减少训练时间。点对点前馈曾用于进一步处理注意力输出,可以使其具有更加丰富的表达形式。

网络优化之“归一化”操作

基于如上对残差链接的分析可知,这里需要使用不同的归一化方法来稳定训练网络,加快训练速度。这里需要注意的是应用于不同的识别场景,可以采用的BN和LN方式是完全不一样的。

1)批量归一化BN

BN的理解重点在于它是针对整个Batch中的样本在同一个维度特征进行统一处理。比如在CNN中扩展,我们的数据是N.C.H.W。其中N为样本数量也就是Batch Size,C为通道数,H为高,W为宽,BN保留C通道数,在N,H,W上做操作。比如说把第一个样本的第一个通道的数据,第二个样本第一个通道的数据......第N个样本第一个通道的数据作为原始数据,处理得到相应的均值和方差。BN有两个优点。第一个是可以解决内部协变量偏移,也就是说在训练过程中,BN可以解决各层分布不同带来的学习难度的增加,因为BN可以是损失平面更加平滑,从而加快收敛速度。另外,BN可以有效解决在使用Sigmoid激活函数时所带来的梯度饱和问题,加快收敛。

首先,由于BN是按照批量化的处理方式,因此,如果一批量数据在较小的时候,如果使用BN处理时,使用整个Batch中样本的均值和方差来模拟全部数据的均值和方差,其效果肯定不会特别好,也就是BN的优势就基本无法体现出来。

其次,就是BN在RNN中的效果比较差,因为RNN的输入长度是动态的,就是说每个样本的长度是不一样的。这里举个例子说明一下,假设有一个视频序列batch size为10个样本,假设其中9个样本长度为5个视频帧,第10个样本长度为20帧视频。很明显前5个视频帧的均值和方差都可以在这个batch中求出来从而推导处模型真实的均值和方差。但是,第6个视频帧至20个视频帧该如何处理呢(实际是因为Batch中的长度不一致,会导致有的靠后面的特征均值和方差不能估算)?如果只用这一个样本进行模型推导的话,也就应证了之前所说的状态,batch太小无法完全涵盖住,导致效果很差。

基于以上分析,对于使用场景来说,BN在MLP和CNN这类静态场景分析使用上效果比较好,而在RNN这类动态文本模型上使用效果则相对较差。因此,在考虑Transformer这样并行时序处理场景时,BN也就不会很适用了。

2)层归一化LN

通过如上分析我们知道是对每个特征(这里强调一下是每个特征)在Batch Size上求均值和方差的方式,也就是说比如图像中感兴趣区域的物体形状、颜色、位置等,这些都有明确的含义。

而层归一化的方式则明显更加适用于基于时序融合的Transformer并行运算,首先,LN是在保留了N维度的基础上对每一个样本进行缩放操作,期间保留了维度N。在C/H/W维度上做了有效缩放。也就是针对性的实现每个样本单独的学习训练和处理,这种方式不同于Batch Normalization,是对同一个batch内的所有数据按照同一个特征数据进行操作,很明显适配性是大大降低的。通过如上层归一化LN的方式有效的确保了输入的样本均值为零,方差为1,从而显著减少训练时间。比如一个视频序列来说,将不同的视频图像分组到同一个特征下,基于此进行归一化。这样每帧视频中都有可以归一化到同一个特征中的语义信息(比如这几帧视频中都有锥桶这种感兴趣的标记物),层归一化在对该“锥桶”特征的元素做归一化,这里实际的层归一化的“batchsize”大小是针对整个需要处理的视频帧,而不是先前已经划分好的N维Batchsize。显然,这样的方式可以在跟踪时序上更加有针对性的对感兴趣区域进行缩放和匹配,且不易遗漏之前BN中不在同一个Batch中的匹配视频帧关键信息。

解码器如何工作?

如前所述,编码器是对所要处理的输入模块与周边位置感兴趣区域或模块的参照关系,也就是具体的位置关系进行编码。模型需要有能力参考与当前视频图像或其中感兴趣区域ROI相关的部分,这种参考过程实际是一种记忆机制。这种记忆机制分为短时记忆和长时记忆。对于transformer来说,这种记忆机制实际是一种长时记忆。那么解码端如何处理并解码出对应编码器的矩阵数据呢?下面将详细解答。

如上图所示,解码器的作用是通过位置索引还原生成图像数据帧序列,其与编码器有相似的子层,包括前馈层,多头注意力层,以及在每个子层之外的残差连接层。同时,通过分类器的线性层(该分类器实际是有多少类就有多少分类器输出),和类似Softmax来得到最终的图层输出(Softmax计算仍然是采用对得分最高的取值为解码对应的查询结果)。解码器可以堆叠为N层高,每层都可以从编码器前面的层中获取对应的输入,通过堆叠层,模型可以学会从注意力层中提取并关注不同的注意力组合,从而可以提高对应的预测能力。

解码器是自回归的。什么叫自回归呢?即可以将输出的列表当成后续的输入,直到生成一个结束标记信息才算解码停止。因为,对于Decoder来说,没有并行处理,其只能类似RNN一样的方式,这一时刻依赖于上一时刻的输出作为当前输入。

如上图所示,解码器Decoder和编码器Encoder一样由完全相同的N个大模块堆叠而成,每个大模块分为三部分:多头注意力、交互层、前馈神经层,且每个层内部尾端都含有残差链接&层归一化Add&Norm。这里与Encoder相关的内容我们将跳过,如果有不理解的部分,可以参考之前的文章。

如下将重点讲解整个Decoder如何工作的?参考上图所示,模块1表示为掩膜状态下的多头注意力机制。模块2为交互层(这一层相对于Encoder来说是新增层)。实际上,decoder交互层Q矩阵来自本身,K/V矩阵来自整个Encoder层输出。也就是说整个Encoder输出与Decoder的交互。Encoder生成KV矩阵,Decoder生成Q矩阵,交互时候主要是通过如上生成的不同矩阵进行交互。Encoder的每个输出会和每个Decoder进行交互,这是一个“一对多”的关系。具体交互方式如上右图详,假设这里有多个Encoder输入到位置编码矩阵后生成K、V矩阵,然后数据进入到Decoder模块中的Attention模块中进行交互(实际就是查询位置还原数据帧的过程)。在交互过程中是Decoder模块是通过Q、K、V的交互映射关系就采用了对多头注意力机制的应用。

输入通过嵌入层和位置编码层得到位置嵌入,送入到多头注意力层,同样通过Softmax计算后生成对应的缩放层。然后,缩放层乘以对应子网掩膜层,这种掩膜计算实际是抹去参考矩阵时间线之后才出现的数据帧,那么什么叫掩膜状态的多头注意力机制呢?

实际就是在解码的时候很好的规避过分关注之后才出现的内容对当前解码的“贡献度”,从而产生解码误判。(因为从时间线上讲,解码时候调用的关联关系肯定是只和当前关注位置之前的部分强相关,你不可能预测到未来能发生什么?)

其实从代码角度解析更加容易理解。也就是解码的时候需要将当前处理输入帧数据时间序列之后的数据都要Mask掉,原因是因为解码时候是无法从上帝视角参考到还未发生的事件“Event”的(也就是GroundTruth)。也就是可以认为时间关系靠后的位置矩阵数据无法提前被参考和解析。这时候就需要加入掩膜Mask,对位置矩阵之后的数据进行屏蔽。举个例子,如下图所示,如果我们需要解码Frame_3这一帧数据,就需要参考之前周边与其相关的图像帧。然而,没有Groundtruth的前提下,Frame_4和Frame_5对于Frame_3都是单独存在的。也就是说没办法在解码端做代码运行遍历到当前时间域之后的数据的。通过Mask操作后,实际上是矩阵点积乘的方式将对应位置处的数据直接相乘为0了。

总结

Transformer利用注意力的力量可以提供更好的预测,特别是在编码和形成较长序列时,其效能明显更优。做工程项目的人可能对于transformer的理解没有完全掌握,笔者的意思是对于这类新技术可以做的不深,但是掌握其基本要义,便于理解、应用,甚至到后期对场景的cornercase分析都是有百利而无一害的。本系列文章通过两篇将以小白的视角通透性的讲解了其中的原理及迷惑的部分,可以作为入门的软文供大家探讨。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O3lkQczeyPLJX-PmCGDCca3w0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com