前言
文章性质:学习笔记 📖
学习资料:吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2
主要内容:根据学习资料撰写的学习笔记,该篇主要介绍了 vision Transformer 和 Swin Transformer 。
目录
前言
一、Transformer
1、Vision Transformer
2、Swin Transformer
一、Transformer
Transformer 目前在自然语言处理领域取得了很好的效果,并且在很多场景中,Transformer 的 性能 和 训练速度 等均已远超传统的循环神经网络。因此,人们自然想到将其应用到视觉处理领域。凭借 Transformer 的长注意力和并发处理能力,研究人员通过 Vision Transformer(ViT)和 Swin Transformer(Swin-T)等架构在图像分类、目标检测、语义分割等方面取得了目前最好的成绩。Transformer 有望跨越视觉处理、自然语言处理之间的鸿沟,建立一个更通用的架构。
1、Vision Transformer
Transformer 应用到视觉处理领域,首先把图像分成多个小块,对这些块排序,构成块序列,至于这些块原本在图像中的位置信息,通过添加 绝对位置信息 或 相对位置信息 等方法来处理。图 8-32 是 ViT 的架构图。
如图 8-32 所示,把输入图像划分成 9 个小块并展平成一维向量后通过线性映射成固定长度嵌入,然后与各小块的位置嵌入张量融合在一起,构成 Transformer 编辑器的输入,这些输入相当于 NLP 中的一个个单词标记。图 8-32 中的 0,1,2,3,… ,9 表示位置嵌入,星号(*)表示分类标记的嵌入。ViT 把 整张图像 作为自注意力的输入,如果图像像素较大或图像为多尺寸,则其计算复杂度较高。另外,ViT 通常只适合分类任务,不适合目标检测、语义分割等任务。是否可以把 Transformer 改造成更通用的架构,就像卷积神经网络处理视觉任务一样?接下来介绍的 Swin Transformer 就是一个这样的通用架构。
2、Swin Transformer
Swin Transformer 被评为 2021 ICCV 最佳论文,它对 ViT 进行了一些改进,更适合处理不同尺寸的图像,且同时可以处理目标检测、语义分割等任务。Swin Transformer 是如何实现的呢? 主要从以下两方面进行改进。
(1)使用层次化的网络结构
通过下采样的层级设计,能够逐渐增大感受野,从而使得注意力机制也能够注意到全局的特征,如图 8-33 所示。
Swin-T 的层级结构如何实现呢?其整体架构如图 8-34 所示。
Swin-T 的整个模型采取层次化的设计,共包含 4 个阶段,每个阶段都会缩小输入特征图的分辨率,像 CNN 一样逐层扩大感受野。
1)对输入图像实现分块,具体通过图中的 块划分并展平模块 来实现,这相当于 ViT 中的块嵌入模块(只不过这里没有位置嵌入,Swin Transformer 的位置嵌入在计算自注意力时采用相对位置编码),将图像切成一个个图块,展平再嵌入固定维度。
2)随后在第一个阶段中,通过 线性嵌入 (主要通过 CNN 实现,将 stride 和 kernel-size 设置为 patch_size)调整通道数为 C 。
3)在每个阶段里(除第一个阶段),均由 块合并 和 Swin-T 模块 组成。其中,块合并的作用是在每个阶段开始前做下采样,用于缩小分辨率,调整通道数进而形成层次化的设计。同时也能节省一定运算量。每次下采样是缩小两倍,因此在行方向和列方向上,按间隔 2 选取元素。然后拼接在一起作为一个张量,最后展开。此时通道维度会变成原先的 4 倍,因为 H 、W 各缩小 2 倍,最后再通过一个全连接层调整通道维度为原来的两倍。
4)块的具体结构可见图 8-35,主要由 LayerNorm 、 MLP 、窗口多头自注意力(Window Multi-head Self-Attention, W-MSA )、移动窗口多头自注意力(Shifted Window Multi-head Self-Attention, SW-MSA )组成。
由图 8-35 可知,每个块都是由着两个子块构成,所以子块的个数都是偶数。
(2)使用 W-MSA 和 SW-MSA
Swin-T 块由局部多头自注意(MSA)模块组成,在连续块中基于交替移位的块窗口。在局部自注意力中,计算复杂度与图像大小成线性关系,而移动窗口可以实现跨窗口连接。论文作者还展示了移动的窗口如何在开销很小的情况下提高检测精度,增加 窗口循环移动(window cyclic shift)功能,如图 8-36 所示。
从图 8-35 可以看出 Swin-T 的最大创新点就是 W-MSA 和 SW-MSA ,其他则是些大家熟悉的处理模块。W-MSA 就是在一个窗口内实现多头注意力,为了更好地与其他窗口进行信息交互,Swin-T 引入了 移动窗口操作 。具体操作如图 8-37 所示。
图 8-37 的左边是没有重叠的窗口,右边则是将窗口进行移位的移动窗口注意力。可以看到移位后的窗口包含原本相邻窗口的元素。但这也引入了一个新的问题,即窗口的个数增加了,由原本的 4 个窗口变成 9 个窗口。这里是通过对特征图移位,并给自注意力通过设置掩码来间接实现,如此就可在保持原有窗口个数的前提下,实现跨窗口的信息交互,具体步骤如下:
① 特征图移位操作
对特征图移位是通过 torch.roll 来实现的,如图 8-38 所示。
② Masked MSA
通过设置合理的掩码机制,让 SW-MSA 与 W-MSA 在相同的窗口个数下,达到等价的计算结果。首先我们对移动窗口后的每个窗口都加上索引,并且执行一个 roll 操作( window_size = 2 , shift_size = -1 ),如图 8-39 所示。
在计算 SW-MSA 的时候,让具有相同索引的 进行计算,而忽略不同索引的 计算结果,即把不同索引的 区域设置为一个负数,如 -100 ,这样通过 softmax 计算后相关领域的值将为 0 ,计算结果如图 8-40 所示。
这些创新不但提升了 Swin-T 的精度、速度,还拓展了应用领域(如目标检测、语义分割等)。
使用 Transformer 架构处理 CV 任务时,需要处理标记的时序问题,ViT 采用 输入 + 绝对路径嵌入 的方法,而 Swin-T 在输入中添加绝对路径嵌入作为一个选择项,且在计算注意力的 Q 、K 时,加上一个相对位置偏置(B)的处理,具体计算公式如下:
实验证明加入相对位置编码可以提升模型性能。
如何获取输入图像的相对位置偏置呢?生成输入图像的相对位置偏置的基本思路是:先生成一个相对位置偏置的表,然后基于特征图的相对位置索引获取相对位置偏置表中对应的值。具体步骤如下:
① 生成特征图的相对位置编码
假设输入的特征图的高宽都为 2 ,由此可以构建出每个像素的绝对位置,如图 8-41 中左下角的 2×2 矩阵,每个像素的绝对位置分别用行号和列号表示。假设第 1 个像素对应的是第 0 行第 0 列,则其绝对位置索引是 (0, 0) 。再来看相对位置索引,首先看第 1 个像素,它使用 Q 与所有像素 K 进行匹配,这里以第 1 个像素为参考点。然后用位于 (0, 0) 的绝对位置索引与其他位置索引相减,得到其他位置相对 (0, 0) 位置的相对位置索引。例如第 2 个像素的绝对位置索引是 (0, 1) ,则它相对第 1 个像素的相对位置索引为 (0, 0) - (0, 1) = (0, -1) 。同理,可以得到其他位置相对第 1 个像素的相对位置索引矩阵。同样,也能得到相对第 2 、3 、4 个像素的相对位置索引矩阵。将每个相对位置索引矩阵按行展平,并拼接在一起得到下面的 4×4 矩阵,如图 8-41 所示。
这里描述的是相对位置索引,而不是相对位置偏置参数。相对位置偏置需要根据相对位置索引获取。
如图 8-42 所示,第 2 个像素在第 1 个像素的右边,所以相对 (0, 0) 位置的相对位置索引为 (0, -1) 。第 4 个像素是处于 (1, 1) 位置的像素,在第 3 个像素的右边,所以相对第 3 个元素的相对位置索引为 (0, -1) 。可以发现这两者的相对位置索引都是 (0, -1) ,所以它们使用的相对位置偏置参数都是一样的,这也说明相对位置应好于绝对位置。
② 把二维索引转换成一维索引
因为输入图像需要进行展平,所以对应的相对位置索引也需要转换为一维索引。
如何把二维索引转换成一维索引呢?具体实现步骤如图 8-42 所示。
③ 根据索引获取相对位置偏置
根据相对位置索引从相对位置偏置表中获取偏置值,即前文的 B 值,如图 8-43 所示,相对位置偏置表的大小为 (2M-1)×(2M-1) 。