Transformer 系列网络(一):
CV-Model【5】:Transformer
Transformer 系列网络(二):
CV-Model【6】:Vision Transformer
Transformer 系列网络(三):
CV-Model【7】:Swin Transformer
Vision Transformer
,或称 ViT
,是一种用于图像分类的模型,在图像的补丁上采用了类似 Transformer
的结构。一幅图像被分割成固定大小的斑块,然后对每个斑块进行线性嵌入,添加位置嵌入,并将得到的向量序列送入一个标准的 Transformer
编码器。为了进行分类,使用了向序列添加额外的可学习"分类标记"的标准方法
原论文链接:
An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
虽然 Transformer
架构已成为 NLP 任务的事实标准,但它在 CV 中的应用仍然有限。在视觉上,注意力要么与卷积网络结合使用,要么用于替换卷积网络的某些组件,同时保持其整体结构。我们证明了这种对 CNNs 的依赖是不必要的,直接应用于图像块序列 ( sequences of image patches ) 的纯 Transformer
可以很好地执行 图像分类 任务。当对大量数据进行预训练并迁移到多个中小型图像识别基准时 ( ImageNet、CIFAR-100、VTAB 等 ),与 SOTA 的 CNN 相比,Vision Transformer ( ViT )
可获得更优异的结果,同时仅需更少的训练资源
受 NLP 中 Transformer 成功放缩 ( scaling
) 的启发,本文尝试将标准 Transformer 直接应用于图像,并尽可能减少修改。为此,本文将图像拆分为块 ( patch
),并将这些图像块的线性嵌入序列作为 Transformer 的输入。图像块 image patches 的处理方式与 NLP 应用中的标记 tokens
(单词 words) 相同。本文以有监督方式训练图像分类模型。
当在没有强正则化的中型数据集(如 ImageNet)上进行训练时,这些模型产生的准确率比同等大小的 ResNet 低几个百分点。 这种看似令人沮丧的结果可能是意料之中的 Transformers 缺乏 CNN 固有的一些归纳偏置 ( inductive biases
),例如平移等效性和局部性 ( translation equivariance and locality
),因此在数据量不足的情况下训练时不能很好地泛化。
Vision Transformer 网络结构如下所示(以 ViT-B/16 为例):
模型由三个模块组成:
标准 Transformer 接受一维标记嵌入序列 ( Sequence of token
embeddings ) 作为输入(token
序列),即二维矩阵 [num_token, token_dim]
为处理 2D 图像,我们将图像 x ∈ R H × W × C x \in \mathbb{R}^{H \times W \times C} x∈RH×W×C reshape 为一个展平 ( flatten
) 的 2D 块序列 x p ∈ R N × ( P 2 ⋅ C ) x_p \in \mathbb{R}^{N \times (P^2 \cdot C) } xp∈RN×(P2⋅C)
Transformer 在其所有层中使用恒定的隐向量 (latent vector)
大小 D D D(即 token
序列的长度),因此我们将图像块展平,并使用可训练的线性投影(FC 层)将维度 P 2 ⋅ C P^2 \cdot C P2⋅C 映射为 D D D 维,同时保持图像块数 N N N 不变。
此投影输出称为图像块嵌入 (Patch Embeddings
),本质就是对每一个展平后的 patch vector x p ∈ R N × ( P 2 ⋅ C ) x_p \in \mathbb{R}^{N \times (P^2 \cdot C) } xp∈RN×(P2⋅C) 做一个线性变换 / 全连接层 E ∈ R ( P 2 ⋅ C ) × D E \in \mathbb{R}^{(P^2 \cdot C) \times D} E∈R(P2⋅C)×D,由 P 2 ⋅ C P^2 \cdot C P2⋅C 维降维至 D D D 维,得到 x p E ∈ R N × D x_pE \in \mathbb{R}^{N \times D} xpE∈RN×D
以 ViT-B/16
为例,每个 token
向量长度为 768:
patch
进行划分,划分后会得到 ( 224 / 16 ) 2 = 196 (224/16)^2=196 (224/16)2=196 个 patchespatch
映射到一维向量中
patch
数据 shape 为 [ 16 , 16 , 3 ] [16, 16, 3] [16,16,3] 通过映射得到一个长度为 768 的向量 (token)在代码中,上述步骤直接通过一个卷积层来实现。直接使用一个卷积核大小为 16 × 16 16 \times 16 16×16,步距为 16,卷积核个数为 768 的卷积来实现。通过卷积 [ 224 , 224 , 3 ] → [ 14 , 14 , 768 ] [224, 224, 3] \rightarrow [14, 14, 768] [224,224,3]→[14,14,768],然后把 H
以及 W
两个维度展平即可 [ 14 , 14 , 768 ] → [ 196 , 768 ] [14, 14, 768] \rightarrow [196, 768] [14,14,768]→[196,768],此时正好变成了一个二维矩阵。
类似于 BERT 的
[ c l a s s ] t o k e n \mathrm{[class]} token [class]token,此处为图像块嵌入序列预设一个可学习的嵌入,数据格式和其他token一样都是一个向量(一个分类向量),用于训练 Transformer 时学习类别信息。
以 ViT-B/16
为例,就是一个长度为768的向量,与之前从图片中生成的tokens拼接在一起: C a t ( [ 1 , 768 ] , [ 196 , 768 ] ) → [ 197 , 768 ] Cat([1, 768], [196, 768]) \rightarrow [197, 768] Cat([1,768],[196,768])→[197,768]
位置嵌入 E p o s ∈ R ( N + 1 ) × D E_{pos} \in \mathbb{R}^{(N+1) \times D} Epos∈R(N+1)×D 也被加入图像块嵌入,以保留输入图像块之间的空间位置信息。不同于 CNN,Transformer 需要位置嵌入来编码 patch tokens 的位置信息,这主要是由于自注意力的扰动不变性 (Permutation-invariant),即打乱 Sequence 中 tokens 的顺序并不会改变结果。相反,若不给模型提供图像块的位置信息,那么模型就需要通过图像块的语义来学习拼图,这就额外增加了学习成本。
ViT 论文中对比了几种不同的位置编码方案:
最后发现如果不提供位置编码效果会差,但其它各种类型的编码效果效果都接近,这主要是因为 ViT 的输入是相对较大的图像块而非像素,所以学习位置信息相对容易很多。在源代码当中默认使用 1-D 位置嵌入,因为相对来说参数较少。
对学习到的位置编码进行了可视化,发现相近的图像块的位置编码较相似,且同行或列的位置编码也相近:
Transformer 编码器 由交替的多头自注意力层 (MHA
) 和多层感知机块 (MLP
) 构成。在每个块前应用层归一化 (Layer Norm
),在每个块后应用残差连接 (Residual Connection
)。
FC
层,
GeLU
(Gaussian Error Linear Unit,高斯误差线性单元)集合了类别向量、图像块嵌入和位置编码三者到一体的输入嵌入向量后,即可馈入Transformer Encoder
。ViT
类似于 CNN
,不断前向通过由 Transformer Encoder Blocks
串行堆叠构成的 Transformer Encoder
,最后提取可学习的类别嵌入向量 —— class token
对应的特征用于 图像分类。整体前向计算过程如下:
首先使用传统的卷积神经网络提取特征,再利用上述的 ViT 模型进一步进行图像分类
特征提取网络采用 Res50,并做出一下更改:
channel
调整为合适的大小Hybrid Architecture
作为原始图像块的替代方案,输入序列可由 CNN
的特征图构成。在这种混合模型中,图像块嵌入投影被用在经 CNN 特征提取的块而非原始输入图像块。
作为一种特殊情况,块的空间尺寸可以为 1 × 1 1 \times 1 1×1,这意味着输入序列是通过简单地将特征图的空间维度展平并投影到 Transformer
维度 获得的。然后,如上所述添加了分类输入嵌入和位置嵌入,再将三者组成的整体馈入 Transformer 编码器。
简单来说,就是先用 CNN 提取图像特征,然后由 CNN 提取的特征图构成图像块嵌入。由于 CNN 已经将图像下采样了,所以块尺寸可为 1 × 1 1 \times 1 1×1。
至此,Vision Transformer 的原理及模型结构以及全部介绍完毕。从实验给出的结果,在当时也达到了 SOTA,但是相比于 CNN,它需要更多的数据集。在小数据集上训练出来的精度是不如 CNN 的,但在大数据集上 ViT 精度更高。
一个直观的解释是:ViT 因为 self-attention 独特的机制,更多的利用 token 与 token 跨像素之间的信息,而 CNN 只是对领域的像素进行计算,所以相同参数的情况下,ViT获得的信息更多,在某种程度上可以看成是模型深度更深。所以小数据集上ViT是欠拟合的。
实际开发中的做法是:基于大数据集上训练,得到一个预训练权重,然后再在小数据集上Fine-Tune。
参考博客
视频资料