Transformer相关理解

1.何为注意力机制

人生来就有Attention注意力机制,看任何画面,我们会自动聚焦到特定位置特定物体上。对于输入给网络的任何模态,不管是图像、文本、点云还是其他,我们都希望网络通过训练能够自动聚焦到有意义的位置,例如图像分类和检测任务,网络通过训练能够自动聚焦到待分类物体和待检测物体上。

2.图片分类

图片分类中通常不需要解码器模块,所以我们只需要关注编码器部分,其中主要是位置编码模块 Positional Encoding、多头自注意力模块 Muti-Head Attention、前向网络模块 Feed Forward 以及必要的 Norm、Dropout 和残差模块。

  • 位置编码模块 Positional Encoding 用于给输入的序列增加额外的位置信息。
  • 多头自注意力模块 Muti-Head Attention 用于计算全局空间注意力。
  • 前向网络模块 Feed Forward 用于对通道维度信息进行混合。
  • 必要的 Norm、Dropout 和残差模块提供了更好的收敛速度和性能。

3.步骤

  • 将图片分成无重叠的固定大小 Patch (例如 16x16),然后将每个 Patch 拉成一维向量, n 个 Patch 相当于 NLP 中的输入序列长度(假设输入图片是 224x224,每个 patch 大小是 16x16,则 n 是 196),而一维向量长度等价于词向量编码长度(假设图片通道是 3, 则每个序列的向量长度是 768)。
  • 考虑到一维向量维度较大,需要将拉伸后的 Patch 序列经过线性投影 (nn.Linear) 压缩维度,同时也可以实现特征变换功能,这两个步骤可以称为图片 Token 化过程 (Patch Embedding)。
  • 为了方便后续分类,作者还额外引入一个可学习的 Class Token,该 Token 插入到图片 token 化后所得序列的开始位置。
  • 将上述序列加上可学习的位置编码输入到 N 个串行的 Transformer 编码器中进行全局注意力计算和特征提取,其中内部的多头自注意模块用于进行 Patch 间或者序列间特征提取,而后面的 Feed Forward(Linear+ GELU+Dropout+ Linear+ Dropout) 模块对每个 Patch 或者序列进行特征变换。
  • 将最后一个 Transformer 编码器输出序列的第 0 位置( Class Token 位置对应输出)提取出来,后面接 MLP 分类后,然后正常分类即可。

4.存在的问题

  • 不采用超大的 JFT-300M 数据集进行预训练,则效果无法和 CNN 媲美,原因应该是 Transformer 天然的全局注意力计算,没有 CNN 这种 Inductive Bias 能力,需要大数据才能发挥其最大潜力。
  • ViT 无法直接适用于不同尺寸图片输入,因为 Patch 大小是固定的,当图片大小改变时,序列长度就会改变,位置编码就无法直接适用了,ViT 解决办法是通过插值,这种做法一般会造成性能损失,需要通过 Finetune 模型来解决,有点麻烦。
  • 因为其直筒输出结构,无法直接应用于下游密集任务。

5.技术改进

  • 隐式位置编码对于图片长度改变场景更加有效,因为其是自适应图片语义而生成。
  • 论文 How much position information do convolutional neural networks encode? 中已经证明 CNN 不仅可以编码位置信息,而且越深的层所包含的位置信息越多,而位置信息是通过 zero-padding 透露的。既然 Conv 自带位置信息,那么可以利用这个特性来隐式的编码位置向量。大部分算法都直接借鉴了这一结论来增强位置编码。
  • 注意力机制的最大优势是没有任何先验偏置,只要输入足够的数据就可以利用全局注意力学到泛化性能不错的特征。注意力机制还有一个比较大的缺点:因为其全局注意力计算,当输入高分辨率图时候计算量非常巨大。

6.Swin-Transformer

Swin Transformer 算法在解决图片尺度增加带来的巨大计算量问题上有不错的解决方案,但移位窗口注意力模块 Shifted window based Self-Attention (SW-MSA)存在以下问题:

  • 为了能够高效计算,SW-MSA 实现过于复杂
  • SW-MSA 对 CPU 设备不友好,难以部署
  • 或许有更简单更优雅的跨窗口交互机制

基于上述问题,有学者提供了诸多改进方式:

  • 抛弃 SW-MSA,依然需要全局注意力计算模块,意思是不再需要 SW-MSA,跨窗口交互功能由全局注意力计算模块代替,当然这个全局注意力模块是带有减少计算量功能的,典型的如 Twin 和 Imporved MViT。
  • 抛弃 SW-MSA,跨窗口信息交互由特定模块提供,典型的如 Shuffle Transformer 和 MSG-Transformer 等。
  • CSWin Transformer 提出一种新的十字形局部窗口划分方式,具备跨窗口局部注意力计算能力,而不再需要分成 W-MSA(Window based Self-Attention) 和 SW-MSA 两个模块,性能优于 Swin Transformer。

7.Vision Transformer

ViT 的核心在于 Attention,但是整个架构也包括多个组件,简单将 ViT 结构分成 6 个部分:

  • Token 模块,其中可以分成 Image to Token 模块 和 Token to Token 模块, Image to Token 将图片转化为 Token,通常可以分成非重叠 Patch Embedding 和重叠 Patch Embedding,而 Token to Token 用于各个 Transformer 模块间传递 Token,大部分方案都和 Image to Token 做法一样即 Patch Embedding。
  • 位置编码模块,其中可以分成显式位置编码和隐式位置编码,显式位置编码表示需要手动设置位置编码,包括绝对位置编码和相对位置编码,而隐式位置编码一般是指的利用网络生成自适应内容的位置编码向量,其主要目的是为了解决显式位置编码中所遇到的当图片尺寸变化时候位置编码插值带来的性能下降的问题。
  • 注意力模块,早期的自注意力模块都是全局注意力,计算量巨大,因此在图片领域会针对性设计减少全局注意力,典型做法是降低 KV 空间维度,但是这种做法没有解决根本问题,因此 Swin Transformer 中提出了局部窗口自注意力层,自注意力计算仅仅在每个窗口内单独计算,不再存在上述问题。
  • FFN 模块,其改进方向大部分是引入 DW 卷积增强局部特征提取能力,实验也证明了其高效性。
  • Normalization 模块位置,一般是 pre norm。
  • 分类预测模块,通常有两种做法,额外引入 Class Token 和采用常规分类做法引入全局池化模块进行信息聚合

你可能感兴趣的:(深度学习之图像分类,transformer,深度学习,人工智能)