Swin Transformer V2 论文解析

date
May 17, 2022
Last edited time
Mar 27, 2023 08:52 AM
status
Published
slug
Swin_Transformer_V2论文解析
tags
DL
CV
summary
type
Post
Field
Plat
Swin Transformer V2 论文解析
MSRA时隔八个月放出了Swin Transformer 2.0版本,在1.0版本的基础上做了改动,使得模型规模更大并且能适配不同分辨率的图片和不同尺寸的窗口;这篇博客记录一下自己的对于论文的理解,如有错误欢迎指正! 论文链接: 理解V2的前提是要搞清楚V1的结构和方法,这里贴一下我自己对于V1版本的解析,建议两篇博客同时食用! Swin Transformer 论文及代码解析: 论文中不止一次提到Swin Transformer V2 和 V1一样,最终的目的都是为了能够联合建模NLP和CV模型。 V2直接目标是得到一个大规模的预训练模型(图片分类),可以应用到其他的视觉任务(分割、识别)并取得高精度。 NLP目前的模型参数已经达到了千亿级别并且出现了像BERT这种成功的预训练模型可以适配不同的NLP任务;CV目前最主要的一个问题就是模型规模不够大,ViT-G参数量也只有不到20亿,并且所有大规模的视觉模型都只应用于图片分类任务。 不够大(模型规模不够大) 不适配(预训练与下游任务图片分辨率和窗口大小不适配) 方法主要就是为了解决以上三个问题, post-norm and cosine similarity: 论文中提出了SwinV2-G: C=512, layer numbers={2,2,42,2},通过增加处理数据的维度(192-->512)和Transformer层数(18-->42)增大模型规模,但是会产生一个问题:模型训练不稳定甚至不能完成训练。通过对模型每一层输出的分析,发现随着模型变深,没层的输出是不断变大的,随着层数增加,输出值不断累加,深层输出和浅层输出幅值差很多,导致训练过程不稳定(Figure 2),解决这个问题就是要稳定每一层的输出,其幅值要稳定才会使得训练过程稳定。 为了稳定深层和浅层的输出,Swin V2 提出了两个方法: post-norm 就是把之前通用ViT中的Transformer block中的Layer Norm层从Attention层前面挪到后面,这么做的好处就是计算Attention之后会对输出进行归一化操作,稳定输出值 ViT中Transformer block计算Attention是采用dot(Q,K)的操作,在Swin V2中将其替换为了cosine(Q,K)/τ,τ是可学习参数,block之间不共享。cosine自带normalization操作,会进一步稳定Attention输出值 通过post-norm和cosine similarity操作将block的输出稳定在可接受范围内(Figure 2), 帮助模型进行稳定的训练。 模型不适配主要是图片分辨率和窗口大小的问题,在预训练过程中为了节约训练成本,采用的训练图片分辨率通常比较低(192/224),但是很多下游任务要求的图片分辨率远大于训练分辨率的(1024/1536),这就导致一个问题,将预训练模型迁移到下游任务时为了适配输入图片分辨率势必要改变窗口大小,改变窗口大小就会改变patch数量,改变patch数量就会导致相对位置编码偏置发生变化。e.g: 8×8 window size 变为 16×16 window size,其相对编码坐标就从[-7,7] --> [-15,15],多出来的位置如何计算相对位置编码? 之前通用的方法是采用二项三次差值,但是效果次优,不够灵活。 为了解决这个问题,Swin V2 提出了 Continuous relative position bias 和 Log-spaced coordinates: 二项三次差值不够灵活,那就直接上神经网络 (秒啊~),下图中蓝色圈位置,Swin V2直接用一个两层的MLP(论文中的Meta network)来自适应生成相对位置偏置,Meta network的输入是 和 或者 在Log-spaced中会讨论这两个的区别。 上面提到的 是相对位置编码坐标,在本章开头提到过,patch数量变化之后需要将相对位置编码外推,在例子中的外推率是1.14×,我们希望的是降低这个比率,外推的越小越好,毕竟Meta network没见过外推特别多的输入,为了保证相对位置编码的准确性,需要将外推控制在一个可接受范围内。 这个问题其实就是一个坐标变换,之前的[-7,7] --> [-15.15]是线性变换,那换一个坐标计算方法不就可以解决了吗?于是乎,Log-spaced coordinates出现了,将线性变换转换为了对数变换: 直接截图了,图中公式 hat上面用 表示的,大家清楚就好了,这里有一个要吐槽的点,公式中的log其实是ln,通过这个公式,带入上面例子的[-7,7] --> ...
Swin Transformer V2 论文解析

引言

MSRA 时隔八个月放出了 Swin Transformer 2.0 版本,在 1.0 版本的基础上做了改动,使得模型规模更大并且能适配不同分辨率的图片和不同尺寸的窗口;这篇博客记录一下自己的对于论文的理解,如有错误欢迎指正!
论文链接:

Swin Transformer V2 的目标是什么?存在什么问题?

论文中不止一次提到 Swin Transformer V2 和 V1 一样,最终的目的都是为了能够联合建模 NLP 和 CV 模型。
V2 直接目标是得到一个大规模的预训练模型 (图片分类),可以应用到其他的视觉任务(分割、识别) 并取得高精度。
NLP 目前的模型参数已经达到了千亿级别并且出现了像 BERT 这种成功的预训练模型可以适配不同的 NLP 任务;CV 目前最主要的一个问题就是模型规模不够大,ViT-G 参数量也只有不到 20 亿,并且所有大规模的视觉模型都只应用于图片分类任务。

为了统一视觉和自然语言处理,CV 模型存在两个问题:

  1. 不够大 (模型规模不够大)
  1. 不适配 (预训练与下游任务图片分辨率和窗口大小不适配)

Swin Transformer V2 方法:

方法主要就是为了解决以上三个问题,

首先对于模型不够大的问题:

post-norm and cosine similarity:
论文中提出了 SwinV2-G: C=512, layer numbers={2,2,42,2},通过增加处理数据的维度 (192–>512) 和 Transformer 层数 (18–>42) 增大模型规模,但是会产生一个问题:模型训练不稳定甚至不能完成训练。通过对模型每一层输出的分析,发现随着模型变深,没层的输出是不断变大的,随着层数增加,输出值不断累加,深层输出和浅层输出幅值差很多,导致训练过程不稳定(Figure 2),解决这个问题就是要稳定每一层的输出,其幅值要稳定才会使得训练过程稳定。
notion image
为了稳定深层和浅层的输出,Swin V2 提出了两个方法:

1. post-norm

post-norm 就是把之前通用 ViT 中的 Transformer block 中的 Layer Norm 层从 Attention 层前面挪到后面,这么做的好处就是计算 Attention 之后会对输出进行归一化操作,稳定输出值。

2. cosine similarity

ViT 中 Transformer block 计算 Attention 是采用 dot(Q,K) 的操作,但由于没有在乘之前进行 Layer Norm,会导致相乘的结果过大。在 Swin V2 中将其替换为了 cosine(Q,K)/ττ是可学习参数,block 之间不共享。cosine 自带 normalization 操作,会进一步稳定 Attention 输出值
通过 post-norm 和 cosine similarity 操作将 block 的输出稳定在可接受范围内 (Figure 2), 帮助模型进行稳定的训练。
notion image

其次对于模型不适配的问题:

模型不适配主要是图片分辨率和窗口大小的问题,在预训练过程中为了节约训练成本,采用的训练图片分辨率通常比较低 (192/224),但是很多下游任务要求的图片分辨率远大于训练分辨率的 (1024/1536),这就导致一个问题,将预训练模型迁移到下游任务时为了适配输入图片分辨率势必要改变窗口大小,改变窗口大小就会改变 patch 数量,改变 patch 数量就会导致相对位置编码偏置发生变化。
e.g: 8×8 window size 变为 16×16 window size,其相对编码坐标就从 [-7,7] –> [-15,15],多出来的位置如何计算相对位置编码? 之前通用的方法是采用二项三次差值,但是效果次优,不够灵活。
为了解决这个问题,Swin V2 提出了 Continuous relative position bias 和 Log-spaced coordinates:

Continuous relative position bias:

二项三次差值不够灵活,那就直接上神经网络 (秒啊~),下图中蓝色圈位置,Swin V2 直接用一个两层的 MLP(论文中的 Meta network) 来自适应生成相对位置偏置,Meta network 的输入是 或者
notion image
Swin中采用相对距离编码, 使用相对距离把可以学习的参数映射为偏置。本文把可学习参数改为mlp模块,使用相对距离作为输入,输出偏置。这样就不需要相对距离是整数,就可以使用下面的对数空间编码。

Log-spaced coordinates:

上面提到的 是相对位置编码坐标,在本章开头提到过,patch 数量变化之后需要将相对位置编码外推,在例子中的外推率是 1.14×,我们希望的是降低这个比率,外推的越小越好,毕竟 Meta network 没见过外推特别多的输入,为了保证相对位置编码的准确性,需要将外推控制在一个可接受范围内。
这个问题其实就是一个坐标变换,之前的 [-7,7] –> [-15.15] 是线性变换,那换一个坐标计算方法不就可以解决了吗?于是乎,Log-spaced coordinates 出现了,将线性变换转换为了对数变换:
图中公式 上面用 表示的,大家清楚就好了,这里有一个要吐槽的点,公式中的 log 其实是 ln,通过这个公式,带入上面例子的 [-7,7] –> [-15.15],就转换为了 [-2.079,2.079] –> [-2.773.2.773],外推率降低至 0.33×。
通过以上的方法解决了模型不够大,不适配的问题,接下来通过实验证明了上述方法的有效性并将预训练模型应用到了其他的下游任务中。

实验:

在开篇就提到过,Swin Transformer V2 其实也是要做一个足够大的适配多尺度的预训练模型,可以迁移到其他的视觉任务,可以作为一个通用 CV 模型。
目前视觉预训练大多采用的都是图片分类任务带监督的方法 (JFT-3B dataset),因为 SwinV2-G 做到了 30 亿参数,监督需要的数据量太大,所以论文中采用了监督和无监督相结合的方法来预训练模型:
  1. 首先在 ImageNet-22K (14M) 的基础上进行了数据扩增,扩增五倍,得到了 ImageNet-22k-ext (70M) 带有噪声标签的数据集 (MSRA 私有数据集)
  1. 为了节约训练成本,以 192 分辨率图片作为输入,先按照自监督 (论文中引用了其他论文的自监督方法,感兴趣的同学自行查阅) 的方法在 ImageNet-22k-est 训练了 20 个 epochs,然后以图片分类任务的形式继续在该数据集上训练 30 个 epochs 得到最后的预训练模型,根据不同的下游任务 (分割,识别) 进行微调
实验的重点主要有两点:
  1. 大规模视觉模型 (SwinV2-G) 能否稳定训练
  1. 大规模模型能够带来更好的效果
所以没有对预训练数据进行调整(获取调整一下预训练集效果更好,不过不重要)
这里贴一部分实验结果
notion image
SwinV2-G 在 ImageNet-1K-V2 数据集上得到了最佳结果,相比较于 ViT-G 预训练图片分辨率更低 (预训练消耗更小),时间更短,精度更高
notion image
notion image
notion image
在分类任务与训练之后,将其应用于 COCO 目标检测、ADE20K 语义分割、Kinetics-400 视频动作分类都取得了最好结果,在密度视觉识别 (目标检测)、像素视觉识别(语义分割)、视频识别(视频动作分类) 都实用,证明 SwinV2-G 可以作为预训练通用模型适配不同的机器视觉任务。
论文中的实验非常丰富,我一直认为真正看懂实验部分才能算真正理解了论文方法,有兴趣的同学可以自行阅读原文。

© Lazurite 2021 - 2024