大数跨境
0
0

搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了(十三)

搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了(十三) 极市平台
2021-07-01
1
导读:本文介绍了一种提升视觉 Transformer 性能的极简方法和新网络CoAtNet。
↑ 点击蓝字 关注极市平台

作者丨科技猛兽
来源丨极市平台
编辑丨极市平台

极市导读

 

本文介绍的第 1 篇文章是一种提升视觉 Transformer 性能的极简方法,就是直接在Transformer前面放几层卷积。第2篇文章调研了CNN和Transformer的特性,并将两者结合提出新的家族式网络:CoAtNet,无额外数据时高达86%准确率,在JFT加持下,高达89.77%!性能优于CvT、BotNet和Swin等网络。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

本文目录

29 FAIR提出:Convolutional stem is all you need! 探究ViT优化不稳定的本质原因
(来自 FAIR,RossGirshick等巨佬 )
29.1 原理分析

30 谷歌提出CoAtNet:结合卷积和注意力 89.77% Accuracy!
(来自 谷歌大脑,Quoc V. Le团队)
30.1 CoAtNet原理分析

Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer。Transformer 模型使用了 Self-Attention 机制,不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。

本文介绍的第 1 篇文章是一种提升视觉 Transformer 性能的极简方法,就是直接在Transformer前面放几层卷积。第2篇文章调研了CNN和Transformer的特性,并将两者结合提出新的家族式网络:CoAtNet,无额外数据时高达86%准确率,在JFT加持下,高达89.77%!性能优于CvT、BotNet和Swin等网络。

29 FAIR提出:Convolutional stem is all you need! 探究ViT优化不稳定的本质原因

论文名称:Early Convolutions Help Transformers See Better

论文地址:

https://arxiv.org/pdf/2106.14881.pdf

29.1 原理分析:

本文基于的背景是:Vision Transformer 这种结构训练不稳定,其训练时对于下面的一些参数很敏感:

  • 优化器的选择 (AdamW v.s. SGD)
  • 特定数据集要有特定的超参数 (learning rate 和 weight decay 等)
  • 训练策略 (training schedule)
  • 网络深度
  • ... ...

这些问题极大地增加了研究者们在训练不同架构,或者在不同的数据集上训练 Vision Transformer 时的困难。

但是 CNN 训练的稳定性就高很多了,优化器选择简单的SGD,基本的数据增强方法,传统的超参数值可以直接迁移到不同类型的卷积网络中。

为什么 CNN 和 Vision Transformer 存在这样的差异?

作者在本文给出了一个回答:问题出在了 Vision Transformer 在对输入图片进行预处理时的分块操作, 本文的重点是探究ViT优化不稳定的本质原因。

具体来讲,ViT 首先把  图片,变成一个  序列。它可以看做是一系列的展平的2D块的序列,这个序列中一共有  个展平的2D块,每个块的维度是  。其中  是块大小,  是channel数。

注意作者做这步变化的意图:Transformer希望输入一个二维的矩阵  ,其中  是sequence的长度,  是sequence的每个向量的维度,常用 768/384/192。

所以这里也要设法把  的三维图片转化成  的二维输入。

所以有: 

其中, 是Transformer输入的sequence的长度。

这步的代码是 (来自 timm 库):

class PatchEmbed(nn.Module):    """ Image to Patch Embedding    """    def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):        super().__init__()        img_size = to_2tuple(img_size)        patch_size = to_2tuple(patch_size)        num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0])        self.img_size = img_size        self.patch_size = patch_size        self.num_patches = num_patches
self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)
def forward(self, x): B, C, H, W = x.shape # FIXME look at relaxing size constraints assert H == self.img_size[0] and W == self.img_size[1], \ f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})." x = self.proj(x).flatten(2).transpose(1, 2) return x

上述就是 ViT 的做法,分块操作的核心就是这句话:

self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)


这是一个  的卷积操作,输入 channel 数是3,输出 channel 数是embed_dim=768/384/192,我们称之为 patchify stem

作者认为就是这里出了问题,所以把这个  的卷积操作变成了大约5个 或者  的标准卷积,如下图1所示,我们称之为 convolutional stem。这会导致计算量增加一点,所以为了补偿这部分计算量,就直接砍掉Transformer的一个Block。

就是这一点点小小的变化,作者观察到会对ViT模型的训练稳定性和最终的精度产生很大的影响,具体的影响是:

  • 使 ViT 收敛更快。
  • 不论是用更简单的 SGD 还是更复杂的 AdamW,精度不受影响。
  • 使得 ViT 在训练时受超参数 (learning rate 和 weight decay 等) 影响更小。
  • 在 ImageNet 上精度提升1-2个点。

作者在计算量从1G FLOPs-36G FLOPs的模型和ImageNet-1k-21k上做了丰富的实验来证实这一点:把 patchify stem 简单地改成 convolutional stem 可以带来很积极的影响,结合了 CNN 的归纳偏置能力 (inductive bias) 和 Transformer 的序列建模能力。

图1:Vision Transformer 在对输入图片进行预处理时的分块操作需要优化:把一个s=p,k=p的卷积换成大约5个标准卷积。

模型结构参数

下面是对几种模型的定义。

ViT  模型: 就是使用上面提到的 patchify stem 的方式的 ViT 模型,其对应的参数如下图2所示,图2中的GF代表 gigaflop,1 GF= 1e9 FLOPs。其中 ViT -4GF 的计算量和 ViT-S 相当,ViT -18GF 的计算量和 ViT-B 相当。

图2:ViT-P模型的参数设置

ViT  模型: 就是使用上面提到的 convolutional stem 的方式的 ViT 模型,其对应的参数如下图3所示。

ViT -1GF 的 stem:使用4个3×3卷积,输出通道数为[24, 48, 96, 192],所有卷积之后加 BN+ReLU。

ViT -4GF 的 stem:使用4个3×3卷积,输出通道数为[48, 96, 192, 384],所有卷积之后加 BN+ReLU。

ViT -18GF 的 stem:使用6个3×3卷积,输出通道数为[64, 128, 128, 256, 256, 512],所有卷积之后加 BN+ReLU。

ViT -18GF 的 stem 与 ViT -18GF 的相同。

以上所有都是最后加一个1×1卷积使得卷积的输出通道数和 Transformer 的 embedding dimension 匹配。ViT  模型为了补偿这部分计算量,就直接砍掉Transformer的一个Block。

图3:ViT-C模型的参数设置

其实在 ViT 头上加卷积的做法在 ViT 论文中已有尝试,当时替换 patchify stem 的方式是使用 BiT-ResNet-50 的前4个 stage,大概是40个卷积层。本文的目的不是为了找到到底几层卷积合适,而是去探索简单加几层卷积以后对训练的影响。

度量方式

ViT  模型相比于ViT  模型的变化,主要通过可优化性 (Optimizability) 来度量。

可优化性 (Optimizability) 是指模型优化过程是否鲁棒的属性,一个模型的可优化性不好,稍微去掉一个数据增强方法,或者超参数稍微变化一点,模型的性能就会大幅下降。具体而言体现为以下4点:

  • Training length stability: 像 DeiT/ViT 这些模型的训练长度都是 300 或 400 epochs,如果降到 100 则性能就会降低 2-4 个点。作者对比的是训练 50,100 或 200 epochs的精度,定义 Training length stability 作为收敛速度的衡量尺度。那些收敛快的模型在 200 epochs的精度和400 epochs 的精度一致,反之则不然。

  • Optimizer stability: Vision Transformer 一般都使用 AdamW 作为优化器,原因是 SGD 会在 ImageNet 上使得精度下降大约7个点。但是 CNN 却没有这种情况,SGD 一样可以把 CNN 优化得很好。相比于 AdamW 来讲,SGD参数少,且占的显存只有 AdamW 的一半左右。所以 Optimizer stability 被定义为使用 AdamW 和 SGD 的精度差距。

  • Hyperparameter (learning rate, weight decay) stability: 为了探究超参数对模型训练稳定性的影响,Hyperparameter stability 被定义为不同超参数 (lr, wd) 下模型的错误分布函数 error distribution functions (EDFs)。 如果模型对于不同超参数 (lr, wd) 是鲁棒的,则 EDF 的分布就会很 shallow,如果模型对于不同超参数 (lr, wd) 是敏感的,则 EDF 的分布就会很 steep。获取它的方法是随机采样一些 lr, wd,训练模型。

  • Peak performance: 指的是训练 400 epochs,微调 lr, wd,的最好的模型性能。

Training length stability 实验结果

如下图4所示是Training length stability 实验结果,图4有3个子图,分别是1GF 模型,4GF 模型,18GF 模型的实验结果。每个子图的3条曲线分别是ViT 模型,ViT  模型,RegNetY的实验结果,记录了训练50,100,200,400 epochs的精度。可以看到相比于ViT 模型,ViT  模型的收敛速度更快,且收敛速度更接近于全部是卷积的 RegNetY。

图4:Training length stability 实验结果

Optimizer stability 实验结果

如下图5所示是Optimizer stability 实验结果,图5有3个子图,分别是1GF 模型,4GF 模型,18GF 模型的实验结果。每个子图的6条曲线分别是ViT 模型,ViT  模型,RegNetY 在 AdamW 和 SGD 两种优化器下的实验结果,记录了训练50,100,200,400 epochs的精度。可以看到 RegNetY 在 AdamW 和 SGD 两种优化器下的实验结果基本完全一致;ViT 模型在 SGD 这种优化器下的实验结果会有个很大的性能下降;ViT 模型的性能下降大幅缩减到了小于0.2%。

图5:Optimizer stability 实验结果

Hyperparameter (learning rate, weight decay) stability 实验结果

下面图7代表3个1GF模型的 EDF 曲线,曲线代表有一堆不同 lr 或者 wd 的模型,随着采样的越来越多,纵轴代表的 cumulative prob 就会越大,全部采样完时为1,横轴是采样的这些模型的性能与最好模型的差值。即:曲线越陡峭代表模型对于 lr 或者 wd 的变化更稳定。所以可以看到相比于ViT iT 模型更稳定的。

图6:Hyperparameter (learning rate, weight decay) stability 实验结果

下面图6代表3个1GF模型的 EDF 曲线,曲线代表有一堆不同 lr 或者 wd 的模型,随着采样的越来越多,纵轴代表的 cumulative prob 就会越大,全部采样完时为1,横轴是采样的这些模型的性能与最好模型的差值。即:曲线越陡峭代表模型对于 lr 或者 wd 的变化更稳定。所以可以看到相比于ViT 模型,ViT  模型对于 (lr, wd) 的稳定性更高。

图7:ViT-P, ViT-C, RegNet 的1GF模型的 EDF 曲线

Peak performance 实验结果

ViT  模型,ViT  模型超参数:

超参数
batch size 2048
学习率 cosine lr decay
学习率 warm-up 5
AdamW beta1: 0.9, beta2: 0.999
SGD momentum: 0.9
epochs 400
Data Augmentation AutoAugment, mixup, CutMix, label smoothing
学习率 (lr) 1e-3
weight decay (wd) 0.24
学习率 (lr) 36GF模型 6e-4
weight decay (wd) 36GF模型 0.28

上表示这个实验的超参数设置,下图7, 8, 9展示的是peak performance的结果,图6由3张子图组成,前2张图是ImageNet-1k实验结果,最后一张是在ImageNet-21k上先预训练的实验结果。

图8对比的是典型的 CNN 模型的性能v.s.训练速度 (注意这里的训练速度其实指的是模型大小不同,大模型训练速度慢,每个epoch训练时间长,小模型反之)。

图8:典型的 CNN 模型的性能v.s.训练速度

图9对比的是 ResNet,RegNetY 模型和ViT  模型,ViT  模型的性能v.s.训练速度。ViT 模型在所有的情况下都不如RegNetY,但是ViT  模型的性能更优于ResNet,RegNetY 模型。

图9:ResNet 模型和ViT-P 模型,ViT-C 模型的性能v.s.训练速度

汇总的实2验结果如下图11所示。,RegNetY 模型和ViT 模型,ViT  模型的性能v.s.训练速度,和图8相比不同的是这次的预训练数据集换成了ImageNet-21k。ViT 模型在所有的情况下都不如RegNetY,但是ViT  模型的性能更优于ResNet,RegNetY 模型。有趣的是,ViT 模型即使在这个更大的数据集上训练,也不能超过CNN。

图10:ResNet 模型和ViT-P 模型,ViT-C 模型的性能v.s.训练速度(ImageNet-21k)

汇总的实验结果如下图10所示。

图11:Peak performance 实验结果

小结

本文的重点是探究ViT优化不稳定的本质原因。给出的解决方案是把一开始的这个  的卷积操作变成了大约5个 或者  的标准卷积,从Training length stability,Optimizer stability,Hyperparameter (learning rate, weight decay) stability 和 Peak performance这4个角度证明了有效性。

30 谷歌提出CoAtNet:结合卷积和注意力 89.77% Accuracy!

论文名称:CoAtNet: Marrying Convolution and Attention for All Data Sizes

论文地址:

https://arxiv.org/pdf/2106.04803.pdf

30.1 CoAt原理分析:

本文系统调研了CNN和Transformer的特性,并将两者结合提出新的家族式网络:CoAtNet,无额外数据时高达86%准确率,在 JFT 300M 数据集的加持下,高达89.77%!在 ImageNet-21k 数据集的加持下,高达88.56%!性能优于CvT、BotNet和Swin等网络。

本文的论点是:虽然 Transformer 往往具有更大的模型容量,但由于缺乏正确的归纳偏置 (inductive bias),它们的泛化可能比卷积网络更差。之前已有一些工作尝试将卷积引入Transformer架构,主要做法是:把FFN换成卷积,或者卷积与attention结合,或者像第一节介绍的方法是把一开始的这个  的卷积操作变成了大约5个 或者  的标准卷积。本文认为这些方法通过生硬地结合卷积来引入归纳偏置,而缺乏对卷积和attention操作各自作用的系统理解。

本文从机器学习的两个基本角度:泛化能力 (generalization capacity)模型拟合能力 (model capacity) 来研究卷积和attention操作,结论是:卷积由于良好的先验的归纳偏置特性,有好的泛化能力和收敛速度。而attention可以借助大数据集具有很强的模型拟合和表征能力。那现在的问题就是:

  1. 如何把二者给有效地结合起来?
  2. 结合起来的不同Block如何堆叠?

作者在本文给出的答案是:

  1. Depthwise Convolution 可以自然地融合到 Self-attention 层里面。
  2. 以一种合适的方式堆叠 Convolution 层和 Self-attention 层在提高泛化能力和模型拟合能力方面非常有效。

Depthwise Convolution 的表达式可以写成:

式中  表示第  个位置的输入和输出,  表示第  个位置的邻域,比如3×3的邻域。

Self-attention 的表达式可以写成:

式中,  代表全局的位置空间。

它们各自的特点是:

  • Depthwise Convolution 的权重  是个独立于输入值的参数,但是 Self-attention 的参数  却是个随着输入值变化的参数。所以 Self-attention 建模不同空间位置的复杂的关系是更容易的,但是也更容易过拟合,对数据集的数量要求较高。
  • 给定任意的位置对  ,  只与  的值有关,而与  和  的绝对数值无关,这个性质就是平移不变性 (translation equivalence),这个性质对于在数据集有限的情况下提升泛化能力帮助很大。但是  不具备这个性质,解释了为什么 Self-attention 泛化能力不强,需要更多的数据集。
  • 二者的感受野大小不同,大的感受野可以提供更多的上下文信息,提高模型的拟合能力,但同时也需要更多的计算量。

以上3点不同如下图11所示。

图12:卷积和 Self-attention 各自的特点

Depthwise Convolution 可以自然地融合到 Self-attention 层里面

要是想把 Convolution 和 Self-Attention 的优秀属性结合起来,可以按照下式的做法:

式中,  代表 Self-attention 在softmax之后融合  ,而  代表 Self-attention 在softmax之前融合 

就相当于是 Self-attention 的权重除了考虑  之外,还要考虑  ,即相当于是为 Self-attention 机制引入了平移不变性,这就使得 Self-attention 机制具备了图11的三条性质,所以本文采用 

以一种合适的方式堆叠 Convolution 层和 Self-attention 层在提高泛化能力和模型拟合能力方面非常有效

以上确定了  作为融合 Convolution 层和 Self-attention 层的方法,下面的问题是如何交替堆叠这个层。

这种方式有哪些弊端呢?就是计算量会暴涨。因为之前的 Convolution 层的  只会考虑 3×3 的区域里面,但是现在  这种方式你要考虑全局的空间,导致网络计算量很大,推理速度慢,所以为了解决这个问题,我们主要有下面3种选择:

  • A: 模型通过不断地下采样减少空间维度,以降低计算量,再采用  这种方式。
  • B: 强制使用 local attention,就是不考虑全局的空间,也只考虑3×3范围的小空间。
  • C: 把原来的 attention 机制变成线性 attention 机制,使得计算量随着空间维度的关系由二次方关系变为线性的一次方关系。

本文做实验发现 BC 这2种方式都会影响性能。对于 A 这种办法,下采样的方式有很多种:

比如像 ViT 一样直接使用这个  的卷积操作完成下采样,定义为ViT 

再比如使用多个stage (S0, S1, S2, S3, S4) 进行下采样,空间维度从 S0 到 S4 逐渐下降,每个阶段空间维度下采样2倍,通道数增加2倍。

stage S0 就是2层的卷积。

stage S1使用 MBConv with SE (Squeeze-Excitation) 模块,因为空间维度较大。

stage S2-S4 考虑使用 MBConv (C) 或者 Transformer Block (T,指采用  ),但要求 MBConv 必须比 Transformer Block 较早出现,因为 MBConv 能更好地处理图片信息。所以S1-S4 可能的选择有:C-C-C-C, C-C-C-T, C-C-T-T, C-T-T-T

所以对于 A 这种办法,我们要比较的是这5种情况:

  • ViT 
  • C-C-C-C
  • C-C-C-T
  • C-C-T-T
  • C-T-T-T

评价指标

比较的指标就是泛化能力 (generalization capacity)模型拟合能力 (model capacity)。

泛化能力 (generalization capacity) 通过训练loss和Evaluation Accuracy 之间的 gap 来衡量。

模型拟合能力 (model capacity) 通过在超大数据集 (JFT-300M,为了防止出现过拟合) 下的精度来衡量。

ImageNet-1K 结果

泛化能力:

发现  的泛化能力大幅低于其他的模型,说明使用这个  的卷积操作并不适合底层视觉信息的抽取。

模型拟合能力:

发现  的泛化能力是最强的,只有 MBConv 或者 Transformer Block 的结果都不是最优的。同时  表明,就处理底层视觉信息的能力而言,MBConv 和  是相当的。最后为了最终决定是采用  还是  ,作者把在 JFT-300M 上预训练好的两个模型在 ImageNet-1k 上微调 30 epochs。

结果如下图13所示,根据结果最终选择了  ,其中的  代表3式中的 

图13:ImageNet-1k迁移学习性能

所以 CoAtNet 的最终模型包含5个 stage:

  • stage S0 就是2层的卷积。
  • stage S1使用 MBConv with SE (Squeeze-Excitation) 模块,因为空间维度较大。
  • stage S1-S4 使用  其中的  代表3式中的 

CoAtNet 的最终模型架构如下图14所示。

图14:CoAtNet 的最终模型架构

CoAtNet model family 如下图15所示。

图15:CoAtNet model family

从 CoAtNet-0 到 CoAtNet-5 的前两个 stage 是相同的,后面的 stage 逐渐变大。

评价指标是在 ImageNet-1K (1.28M images), ImageNet-21K (12.7M images) 和 JFT (300M images) 上分别预训练 300,90,14 epochs,再在 ImageNet-1K 上 Fine-tune 30 epochs,取最终的性能。结果如下图16所示。

图16:ImageNet-1K性能对比

可以看到最优的性能88.56%是使用 ImageNet-21K 预训练150 epochs (E150),并在 ImageNet-1K 做Fine-tune 30 epochs 的结果 (PT-RA 表示在 ImageNet-21K 预训练阶段使用了 Rand Augment 的数据增强方法),超过了EfficientNetV2-L和NFNet-F5这两个基于卷积的strong baseline。

下图17是使用了 JFT-300M 预训练的结果。CoAtNet-4的精度匹配 NFNet-F4+,同时参数量和训练时间只有后者的一半。CoAtNet-4的精度可以达到89.77%!

图17:使用了 JFT-300M 预训练的结果

对比实验:融合Depth-wise Convolution 和 Self-attention (即是否使用  )的影响

结果如下图18所示。With Rel-Attn 是指使用  作为 Self-attention,Without Rel-Attn 是指使用原来的Self-attention,结果发现无论是否使用 ImageNet-21k 预训练,使用  作为 Self-attention 精度都有提升。

图18:融合Depth-wise Convolution 和 Self-attention的影响

小结

CoAtNet 的创新主要有2点:其一是Depthwise Convolution 可以自然地融合到 Self-attention 层里面,如上式3所示。其二是以一种合适的方式堆叠 Convolution 层和 Self-attention 层,主要是分成5个stage,stage S0 就是2层的卷积,stage S1-S4 使用  ,其中的  代表3式中的  。最终在 JFT-300M 预训练的加持下,ImageNet-1k 的精度可以达到89.77%。

总结

本文介绍的2篇文章都是结合卷积和Attention的工作,第 1 篇文章是一种提升视觉 Transformer 性能的极简方法,就是直接在Transformer前面放几层卷积,增强 ViT 的训练稳定新。第 2 篇 CoAtNet 设计了一种Depthwise Convolution 自然地融合到 Self-attention 层的方法,并探索了一种合适的方式堆叠 Convolution 层和 Self-attention 层,它们的特点是简单有效,容易复现。

如果觉得有用,就请分享到朋友圈吧!

△点击卡片关注极市平台,获取最新CV干货

公众号后台回复“84”获取第84期直播PPT


极市干货
YOLO教程:一文读懂YOLO V5 与 YOLO V4大盘点|YOLO 系目标检测算法总览全面解析YOLO V4网络结构
实操教程:PyTorch vs LibTorch:网络推理速度谁更快?只用两行代码,我让Transformer推理加速了50倍PyTorch AutoGrad C++层实现
算法技巧(trick):深度学习训练tricks总结(有实验支撑)深度强化学习调参Tricks合集长尾识别中的Tricks汇总(AAAI2021
最新CV竞赛:2021 高通人工智能应用创新大赛CVPR 2021 | Short-video Face Parsing Challenge3D人体目标检测与行为分析竞赛开赛,奖池7万+,数据集达16671张!



极市原创作者激励计划 #


极市平台深耕CV开发者领域近5年,拥有一大批优质CV开发者受众,覆盖微信、知乎、B站、微博等多个渠道。通过极市平台,您的文章的观点和看法能分享至更多CV开发者,既能体现文章的价值,又能让文章在视觉圈内得到更大程度上的推广。

对于优质内容开发者,极市可推荐至国内优秀出版社合作出书,同时为开发者引荐行业大牛,组织个人分享交流会,推荐名企就业机会,打造个人品牌 IP。

投稿须知:
1.作者保证投稿作品为自己的原创作品。
2.极市平台尊重原作者署名权,并支付相应稿费。文章发布后,版权仍属于原作者。
3.原作者可以将文章发在其他平台的个人账号,但需要在文章顶部标明首发于极市平台

投稿方式:
添加小编微信Fengcall(微信号:fengcall19),备注:姓名-投稿
△长按添加极市平台小编


觉得有用麻烦给个在看啦~  
【声明】内容源于网络
0
0
极市平台
为计算机视觉开发者提供全流程算法开发训练平台,以及大咖技术分享、社区交流、竞赛实践等丰富的内容与服务。
内容 8155
粉丝 0
极市平台 为计算机视觉开发者提供全流程算法开发训练平台,以及大咖技术分享、社区交流、竞赛实践等丰富的内容与服务。
总阅读3.2k
粉丝0
内容8.2k