这是博主在五一期间对Transformer几篇相关论文阅读的小笔记和总结
也借鉴参考了很多大佬的优秀文章,链接贴在文章下方,推荐大家前去阅读
该文章只是简单叙述几个Transformer模型的基本框架,对其详细信息(如实验情况等)请阅读论文或点击下方对应文章链接前往阅读
阅读论文
A Survey on Visual Transformer[1]
Transformers in Vision: A Survey[2]
An Image Is Worth 16X16 Words: Transformers for Image Recognition at Scale[3]
Swin Transformer: Hierarchical Vision Transformer using Shifted Windows[4]
Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions[5]
ConvBERT: Improving BERT with Span-based Dynamic Convolution[7]
Tokens-to-Token ViT: Training Vision Transformers from Scratch on ImageNet[8]
AutoTrans: Automating Transformer Design via Reinforced Architecture Search[9]
综述
[1],[2]讲述了目前Visual Transformer的爆火和Transformer在CV方面的各种应用,

虽然Transformer爆火,但目前CV领域还是由CNN主导
但人们依然很看好Transformer在CV领域的应用于前景,希望将Transformer迁移到CV领域中,
主要分为两大类
- 将self-attention机制与常见的CNN架构结合
- 用self-attention机制完全替代CNN,如[3],[4],[5]
[3]提出VIT模型,应用于CV领域的Image Classification,在大规模数据上训练的得到的模型达到不错的效果
[4]提出Swin Transformer模型,基于VIT模型的改进,应用于Image classification,Object detection,Semantic segmentation
[5]提出Pyramid Vision Transformer模型,基于VIT模型的改进,应用于Object detection,Semantic segmentation
[6]提出Transformer in Transformer模型,应用于Image benchmark and downstream tasks
[7]提出ConvBERT模型,基于BERT的预训练语言模型
[8]提出Tokens-to-Token ViT模型,基于VIT模型改进
[9]讨论了Transformer Model 的自动化设计,对于layer-norm的位置,个数,attention head 的个数,使用哪个激活函数的问题
VIT
VIT是早期提出用于CV中Image classification的结构,虽然存在着不足,但对最近Swin Transformer,Pyramid Vision Transformer等模型提出提供了宝贵经验。
Transformer在NLP中处理的是序列化的数据,而CV中处理的是三维的图像数据(H,W,C)
所以,VIT提出了Patch划分的方法,将三维图像数据转化为序列化数据
基础模型

-
将图像转化为序列化数据
- 将图像划分为一个个Patch,对这一系列Patch进行reshape,从而得到序列化的Patch数据,即Flattened Patch
对于一张 H × W × C H \times W \times C H×W×C的图片,采用 P × P P \times P P×P的Patch来划分,得到 N = H P × W P N=\frac{H}{P} \times \frac{W}{P} N=PH×PW个patch( P × P × C P\times P\times C P×P×C),reshape后得到维度 P 2 C P^2C P2C的Flattened Patch(向量),对N个Flattened Patch进行concat之后得到一个 N × ( P 2 C ) N\times (P^2C) N×(P2C)的二维矩阵,相对于NLP中输入Transformer的Word Embedding
- Linear Projection:对维度
P
2
C
P^2C
P2C的Flattened Patch进行维度转化,得到固定长度
D
D
D的特征向量
- 防止模型结构受Patch大小的影响
综上,原本 H × W × C H \times W \times C H×W×C的图片转化为了 N 个 D N个D N个D维向量(或一个 N × D N \times D N×D的二维矩阵)
-
Position embedding
- 0-9的紫色框表示各个位置的position embedding,粉色框为经过Linear Projection后的Flattened Patch,二者相加
-
Learnable embedding
- 分类标志位[class],即图中0编号,它经过Encoder后的结果作为整个图像的表示
- 假如随意指定1-9作为整个图像的表示,则会导致整体表示偏向这个Embedding信息,即图像表示偏重于反映某个Patch
-
Transformer Encoder
-
第一层输入, x x x表示一个Patch, E E E表示Linear Projection转化矩阵
z 0 = [ x c l a s s ; x p 1 E ; . . . x p N E ] + E p o s E ∈ R ( P 2 ⋅ C ) × D , E p o s ∈ R ( N + 1 ) × D z_0=[x_{class};x^1_pE;...x_p^NE]+E_{pos}\\ E\in \Bbb R^{(P^2·C)\times D},E_{pos}\in \Bbb R^{(N+1)\times D} z0=[xclass;xp1E;...xpNE]+EposE∈R(P2⋅C)×D,Epos∈R(N+1)×D -
对于第 l l l层
z l ′ = M S A ( L N ( z l − 1 ) ) + z l − 1 z l = M L P ( L N ( z l ′ ) ) + z l ′ l = 1... L z^{'}_l=MSA(LN(z_{l-1}))+z_{l-1}\\ z_l=MLP(LN(z^{'}_l))+z^{'}_l\\ l = 1...L zl′=MSA(LN(zl−1))+zl−1zl=MLP(LN(zl′))+zl′l=1...L
- 每个块后使用Residual connection,每个块前使用Layernorm
-
不足
在中等大小的数据集(如 ImageNet)上训练得到的VIT模型准确率低于CNN模型
Swin
Swin Transformer基于VIT进行了改进,可以作为通用backone,应用于Image classification,Object detection,Semantic segmentation
- 引入层次化结构
- 解决CV领域scale变化范围大的问题
- 将self-attention计算限制在local window中
- 解决CV使用Transformer计算复杂度为图像size二次方的问题
- 支持cross-window connection
基础模型
创新
- 引入stage,随着网络深度增加,合并patch
- 使用基于Shifted Windows的W-MSA替换标准的MSA
- 提出Shifted Window划分
Stage
引入4个stage,每个stage的操作类似于上述的VIT模型
区别
Swin随着网络深度的加深,patch的数量在不断减少,且每个patch的感知范围在不断扩大,而VIT模型的patch保持不变
-
Patch Partition:如VIT模型将图像转化为序列化数据,将原始图像划分为一个个Patch,但彼此不重叠
- 根据设置的Patch大小( 4 × 4 4 \times 4 4×4),对输入的Image( H × W × 3 H\times W\times 3 H×W×3)划分为 H 4 × W 4 \frac{H}{4} \times \frac{W}{4} 4H×4W个Patch
- 将原始图像的像素值作为其 Feature
- 每个Patch的维度为 4 × 4 × 3 = 48 4 \times 4 \times 3 = 48 4×4×3=48
-
Stage1
- Linear Embedding:将 Feature 映射到任意维度,记作 C C C
- Transformer Block:进行Self-Attention运算,不改变token数量
-
Stage2
- Patch Merging:对
2
×
2
2 \times 2
2×2的相邻Patch进行合并,通过linear layer将Feature映射到
4
C
4C
4C维度
- 合并过后,Patch数量降为 1 4 \frac{1}{4} 41,MLP作用后,维度为 2 C 2C 2C
- Patch Merging:对
2
×
2
2 \times 2
2×2的相邻Patch进行合并,通过linear layer将Feature映射到
4
C
4C
4C维度
-
Stage3,Stage4
- 类似于Stage2,最终得到一个层次化的结构
W-MSA
每个window包含 M × M M \times M M×M个patch,整个图像包含 h × w h \times w h×w个patch,总共 h 4 × w 4 \frac{h}{4} \times \frac{w}{4} 4h×4w个Patch
复杂度计算
Ω
(
M
S
A
)
=
4
h
w
C
2
+
2
(
h
w
)
2
C
Ω
(
W
−
M
S
A
)
=
4
h
w
C
2
+
2
M
2
h
w
C
\Omega(MSA) = 4hwC^2 + 2(hw)^2C\\ \Omega(W-MSA)=4hwC^2 + 2M^2hwC
Ω(MSA)=4hwC2+2(hw)2CΩ(W−MSA)=4hwC2+2M2hwC
当
M
M
M固定大小时,
Ω
(
W
−
M
S
A
)
\Omega(W-MSA)
Ω(W−MSA)为线性增长
Shifted Window 划分
在连续的Swin Transformer Block之间交替进行两种划分配置,进而保持 non-overlapped windows 的高效计算同时引入 cross-window connection
- Layer1:将 8 × 8 8\times 8 8×8的Feature Map 划分为 2 × 2 2 \times 2 2×2个window,每个window大小为 4 × 4 , 即 M = 4 4 \times4,即M=4 4×4,即M=4
- Layer2:将Layer1的一系列window移动 ( ⌊ M 2 ⌋ , ⌊ M 2 ⌋ ) (\lfloor\frac{M}{2} \rfloor,\lfloor\frac{M}{2} \rfloor) (⌊2M⌋,⌊2M⌋)个像素
存在问题
- 可能会生成过多window,范围 [ ⌈ h M ⌉ × ⌈ w M ⌉ , ( ⌈ h M ⌉ + 1 ) × ( ⌈ w M ⌉ + 1 ) ] [\lceil\frac{h}{M} \rceil\times\lceil\frac{w}{M} \rceil,(\lceil\frac{h}{M} \rceil+1)\times(\lceil\frac{w}{M} \rceil+1)] [⌈Mh⌉×⌈Mw⌉,(⌈Mh⌉+1)×(⌈Mw⌉+1)]
- 生成window大小不一致,部分window较小
解决方案
Cyclic Shift
经过循环填补,Layer2的window划分类似于Layer1,此时的batch window由不相邻的sub-window构成,采用masking mechanism来限制seft attention在sub-window中的计算
不足
图像分类上比ViT、DeiT等Transformer类型的网络效果更好,但是比不过CNN类型的EfficientNet,猜测Swin Transformer还是更加适用于更加复杂、尺度变化更多的任务。
Swin Transformer没有提供类似反卷积的上采样的算法
每一个window的Q,K,V都是独立的,即没有CNN的权值共享特性
PVT
Pyramid Vision Transformer同样基于VIT模型进行改进,是一种使用Transformer模型的无卷积骨干网络,主要用于除图像分类外的密集预测任务。
- 引入金字塔结构
- Feature Map的分辨率随着网络加深,逐渐减小
- Feature Map 的Channel数随着网络加深,逐渐增大
- 解决了VIT模型中,输入高分辨率图像产生高内存占用甚至显存溢出的问题
- PVT继承了CNN和Transformer的优势,通过简单的替换CNN骨干使其成为不同视觉任务的统一骨干结构
- 在object detection,semantic and instance segmentation 任务上取得优越性
基础模型
创新
- 引入stage,随着网络深度增加,Feature Map的分辨率,逐渐减小,Channel数,逐渐增大
- 使用**spatial-reduction attention(SRA)**替换标准的MSA
Stage
- Stage1
- patch embedding:对输入的
H
×
W
×
3
H\times W\times 3
H×W×3 图像(Feature Map)进行token化,设定其patch的大小
p
×
p
p\times p
p×p,将RGB图像划分为
H
W
P
2
\frac{HW}{P^2}
P2HW个patch
- 对这一系列的patch进行展开,然后传入linear projection中进行Patch Embedding
- 将结果reshape后得到大小 H W P 2 × C \frac{HW}{P^2}\times C P2HW×C的embedded patch
- 将embedded patch 和其对应的position embedding 一起传入Transformer Encoder中
- SRA处理:使用函数 R e s h a p e ( x , R i ) Reshape(x,R_i) Reshape(x,Ri)将传入的embedding patch进行变形,由 R ( H W ) × C \Bbb R^{(HW)\times C} R(HW)×C转换为 R H W R i 2 × ( R i 2 C ) \Bbb R^{\frac{HW}{R_i^2}\times(R_i^2C)} RRi2HW×(Ri2C),然后乘以一个 W s ∈ R ( R i 2 C ) × C W^s\in \Bbb R^{(R_i^2C)\times C} Ws∈R(Ri2C)×C矩阵,进而将原本的空间规模降为 1 R i 2 \frac{1}{R_i^2} Ri21,即 R H W R i 2 × C \Bbb R^{\frac{HW}{R_i^2}\times C} RRi2HW×C,这是SRA的核心
- 将Transformer Encoder的结果进行reshape得到 H P × W P × C \frac{H}{P}\times\frac{W}{P}\times C PH×PW×C Feature Map,即 F 1 F_1 F1
- patch embedding:对输入的
H
×
W
×
3
H\times W\times 3
H×W×3 图像(Feature Map)进行token化,设定其patch的大小
p
×
p
p\times p
p×p,将RGB图像划分为
H
W
P
2
\frac{HW}{P^2}
P2HW个patch
- Stage2,Stage3,Stage4
- 由上一个Stage的输出作为输入,重复流程
SRA
SRA的核心是减少K与V的空间规模,也就是<K,V>对的数量,对比于MHA,K与V的空间规模降为其 1 R i 2 \frac{1}{R_i^2} Ri21
处理过程
S
R
A
(
Q
,
K
,
V
)
=
C
o
n
c
a
t
(
h
e
a
d
0
,
.
.
.
,
h
e
a
d
N
i
)
W
o
h
e
a
d
j
=
A
t
t
e
n
t
i
o
n
(
Q
W
j
Q
,
S
R
(
K
)
W
j
V
,
S
R
(
V
)
W
j
V
)
SRA(Q,K,V)=Concat(head_0,...,head_{N_{i}})W^o\\ head_j=Attention(QW_j^Q,SR(K)W_j^V,SR(V)W_j^V)
SRA(Q,K,V)=Concat(head0,...,headNi)Woheadj=Attention(QWjQ,SR(K)WjV,SR(V)WjV)
SR(·)为spatial-reduction operation,
W
s
W^s
Ws是一个linear projection,它把input sequence的维度降到
C
i
C_i
Ci。
S
R
(
x
)
=
N
o
r
m
(
R
e
s
h
a
p
e
(
x
,
R
i
)
W
s
)
SR(x)=Norm(Reshape(x,R_i)W^s)
SR(x)=Norm(Reshape(x,Ri)Ws)
不足
- 随着输入图片的增大,PVT的资源消耗增长率比ResNet高
TNT
Transformer in Transformer,用于视觉识别
- 对patch-level和pixel-level representation都进行建模
- 解决VIT相关模型忽略了每个patch内部固有结构信息的问题
- 堆叠TNT Block来构建TNT模型
基础模型
创新
- Inner Transformer Block用于提取pixel embedding的局部结构信息
- Outer Transformer Block用于提取patch embedding的全局信息
- 通过Linear Projection将pixel embedding投影到patch embedding space
-
将输入图像划分为一个个Patch,
-
Unfold & Linear:将输入的Patch,转换为对应的Patch Embedding,Pixel Embedding
-
Patch
γ 0 = [ Y 0 1 , . . . Y 0 n ] ∈ R n × p ′ × p ′ × c Y 0 i ∈ R p ′ × p ′ × c \gamma_0=[Y_0^1,...Y_0^n]\in\Bbb R^{n \times p^{'}\times p^{'} \times c}\\ Y_0^i\in \Bbb R^{p^{'}\times p^{'} \times c} γ0=[Y01,...Y0n]∈Rn×p′×p′×cY0i∈Rp′×p′×c -
Pixel
Y 0 i = [ y 0 i , 1 , . . . , y 0 i , m ] m = p ′ 2 Y_0^i=[y_0^{i,1},...,y_0^{i,m}]\\ m=p^{'2} Y0i=[y0i,1,...,y0i,m]m=p′2
-
-
TNT Block
-
inner transformer block
Y l ′ i = Y l − 1 i + M S A ( L N ( Y l − 1 i ) ) Y l i = Y l ′ i + M L P ( L N ( Y l ′ i ) ) Y_l^{'i}=Y_{l-1}^{i}+MSA(LN(Y_{l-1}^{i}))\\ Y_l^{i}=Y_{l}^{'i}+MLP(LN(Y_{l}^{'i}))\\ Yl′i=Yl−1i+MSA(LN(Yl−1i))Yli=Yl′i+MLP(LN(Yl′i)) -
outer transformer block 输入, V e c ( ) Vec() Vec()将Pixel展开成向量,b为bias
Z l − 1 i = Z l − 1 i + V e c ( Y l − 1 i ) W l − 1 + b l − 1 Z_{l-1}^i=Z_{l-1}^i+Vec(Y_{l-1}^{i})W_{l-1}+b_{l-1} Zl−1i=Zl−1i+Vec(Yl−1i)Wl−1+bl−1 -
outer transformer block
Z l ′ i = Z l − 1 i + M S A ( L N ( Z l − 1 i ) ) Z l i = Z l ′ i + M L P ( L N ( Z l ′ i ) ) Z_l^{'i}=Z_{l-1}^{i}+MSA(LN(Z_{l-1}^{i}))\\ Z_l^{i}=Z_{l}^{'i}+MLP(LN(Z_{l}^{'i}))\\ Zl′i=Zl−1i+MSA(LN(Zl−1i))Zli=Zl′i+MLP(LN(Zl′i)) -
TNT block
γ l , Z l = T N T ( γ l − 1 , Z l − 1 ) \gamma_l,Z_l=TNT(\gamma_{l-1},Z_{l-1}) γl,Zl=TNT(γl−1,Zl−1)
-
position encoding
- Pixel position encoding 在每一个Patch是共享的
ConvBERT
ConvBERT是一种基于span的动态卷积模型
- 提出span-based dynamic convolution来代替一些冗余的self-attention head
- 减少了预训练的计算花销,提高了local dependencies的建模能力
- 提出mixed attention block
- 结合span-based dynamic convolution和剩余的self-attention head
- 更高效地学习 global and local context
- 基于BERT结合mixed attention block,建立ConvBERT模型
- 在各种downstream tasks中表现比BERT及其变体模型优越
- 且更少的训练花销和更少的模型参数
基础模型

-
self-attention:使用所有token来捕获全局依赖关系,但由观察得知,BERT模型学习的更多是局部依赖关系
-
随着序列增长,复杂度呈现二次增长
-
故传统BERT模型存在大量冗余
-
-
dynamic convolution:使用一个Kernel Generator来为每一个word embedding生成自己的Kernel
- 但对于上下文相同的word生成的Kernel是相同的,无法解决一词多义的问题
-
span-based dynamic convolution:通过输入的word embedding和其周围的word embedding结合来生成Kernel
- 解决一词多义的问题
Span-based dynamic convolution

生成dynamic Kernel
f
(
Q
,
K
s
)
=
s
o
f
t
m
a
x
(
W
f
(
Q
∘
K
s
)
)
f(Q,K_s)=softmax(W_f(Q\circ K_s))
f(Q,Ks)=softmax(Wf(Q∘Ks))
span-based dynamic convolution公式
S
D
C
o
n
v
(
Q
,
K
s
,
V
;
W
f
,
i
)
=
L
C
o
n
v
(
V
,
s
o
f
t
m
a
x
(
W
f
(
Q
∘
K
s
)
)
,
i
)
SDConv(Q,K_s,V;W_f,i)=LConv(V,softmax(W_f(Q \circ K_s)),i)
SDConv(Q,Ks,V;Wf,i)=LConv(V,softmax(Wf(Q∘Ks)),i)
ConvBERT架构
- Mixed Attention
- 结合Self-Attention和Span-based dynamic convolution
- Self-Attention捕获全局信息,Span-based dynamic convolution捕获局部信息

-
Bottleneck design for Self-Attention
- 使用bottleneck structure来减少attention head
- 将输入的embedding映射到更低维度
-
Grouped Feed-Forward module
- 对Feed-Forward的改进,减少参数数量
M = ∏ i = 0 g [ f d g → m g i ( H [ : , i − 1 : i × d g ] ) M ′ = G e L U ( M ) H ′ = ∏ i = 0 g [ f d g → m g i ( M [ : , i − 1 : i × d g ] ′ ) ] M=\prod_{i=0}^{g}[f_{\frac{d}{g} \rightarrow \frac{m}{g}}^i(H_{[:,i-1:i\times \frac{d}{g}]})\\ M^{'} = GeLU(M)\\ H^{'}=\prod_{i=0}^{g}[f_{\frac{d}{g} \rightarrow \frac{m}{g}}^i(M_{[:,i-1:i\times \frac{d}{g}]}^{'})] M=i=0∏g[fgd→gmi(H[:,i−1:i×gd])M′=GeLU(M)H′=i=0∏g[fgd→gmi(M[:,i−1:i×gd]′)]
- 对Feed-Forward的改进,减少参数数量
Tokens-to-Token ViT
Tokens-to-Token Vit是基于Vit模型进行改进的
- 提出Tokens-to-token
- 解决Vit无法对图像相邻像素的局部结构信息(边缘,线条,纹理)进行建模
- 对token进行局部建模,保留token局部结构信息并且减少token长度
- 结合了deep-narrow结构的高效backone
- 解决Vit冗余attention对feature richness的限制
基础模型
创新
- Tokens to token Module:对图像的local structure 信息进行建模,并且减少了token的长度
- re-structurization
- soft split
- T2T-ViT backone:应用了deep-narrow结构,减少了attention冗余,提高feature richness
Tokens to token Module
-
Re-structurization
-
对输入进行传统Transformer处理
T ′ = M L P ( M S A ( T ) ) T^{'}=MLP(MSA(T)) T′=MLP(MSA(T)) -
Reshape:将 T ′ ∈ R l × c T^{'}\in \Bbb R^{l\times c} T′∈Rl×c转为 I ∈ R h × w × c I \in \Bbb R^{h \times w\times c} I∈Rh×w×c
I = R e s h a p e ( T ′ ) I=Reshape(T^{'}) I=Reshape(T′)
-
-
Soft Split
-
建立local structure信息,减少token长度 l l l
-
避免re-structurization过程中信息丢失,在split中采取overlap机制,将每一个patch与其周围的patch联系起来,从而捕获周围pixel和patch的信息
l 0 = ⌊ h + 2 p − k k − s + 1 ⌋ × ⌊ w + 2 p − k k − s + 1 ⌋ l_0=\lfloor\frac{h+2p-k}{k-s}+1 \rfloor \times \lfloor\frac{w+2p-k}{k-s}+1 \rfloor l0=⌊k−sh+2p−k+1⌋×⌊k−sw+2p−k+1⌋T i + 1 = S S ( T i ) T_{i+1}=SS(T_i) Ti+1=SS(Ti)
-
T2T-ViT backone
AutoTrans
- comprehensive search space
- 对layer-norm的位置设置
- PL strategy and parameter sharing strategy
- 对attention head数量的设置
参考文章
感谢下列文章提供的帮助,推荐大伙们阅读