Transformers [Vaswani et al., 2017] 最初在自然语言处理方面取得了巨大的成功[Devlin et al.,2018; Radford et al., 2018] ,而且适用于各种任务,包括情绪分类、机器翻译、单词预测等等。 Transformers 的关键特征是自我注意机制,它帮助模型学习全局上下文,使模型能够获得长期依赖关系。 由于自然语言处理的巨大成功,Transformers 已经被计算机视觉任务所采用,导致了Transformers 的发展。 Transformers 近年来已经流行起来,并在图像分类[Dosovitskiy et al., 2021; Liu et al., 2021]、视频分类[Arnab et al., 2021]、目标检测[Carion et al., 2020; Fang et al., 2021]、语义分割[Xie et al., 2021a; Li et al., 2021b]和姿态检测[Zhu et al., 2021]等许多领域取得了相当大的成功。
尽管该体系结构取得了成功,但仍有一些缺陷需要解决,例如,缺乏数据(data-hungry)、缺乏局部性(lack of locality)和跨补丁(cross-patch)信息。 因此,最近的一系列研究已经被提出来进一步增强视觉Transformers 。 本调查介绍了解决这些问题的重要思路,并旨在为未来的研究阐明这些主题。 此外,由于自监督学习方法在视觉Transformers中起着重要的作用,我们还提出了几种用于视觉Transformers 的自监督学习方法。 本文的其余部分组织如下。我们从Transformer和视觉Transformer的初步研究开始,然后介绍视觉Transformer的变体架构。随后,介绍了在视觉Transformer中使用的训练技巧,以及自监督学习。最后,我们总结了本文,并讨论了未来的研究方向和挑战。
2 准备工作
2.1 自注意力机制
注意机制是深度学习研究中最有益的突破之一,它衡量的是一个有助于获得最终结果的特征的重要性。 使用注意机制通常会教会模型集中于特定的特征。对于自我注意,输入和输出大小是相同的,而自我注意机制允许输入之间的交互,发现他们应该注意的。 然后,根据注意力分数,通过加权输入来增强每个输出。例如,有一句关于“a dog is saved from pond after it fell through the ice”的话,自我关注可以通过关注“dog”来增强“it”的嵌入。自我关注是为了帮助模型学习长期依赖属性下的全局上下文。
图1a是自注意力机制的模块。设
X
∈
R
L
×
d
X\in \mathbb{R} ^{L\times d}
X∈RL×d表示一个向量序列
(
x
1
,
x
1
,
.
.
.
,
x
L
)
(x_{1},x_{1},...,x_{L})
(x1,x1,...,xL),其中
d
d
d为每个向量的嵌入维数。为了帮助模型学习每个向量之间的关系,查询、关键和值矩阵从X中用线性层投影,分别用
Q
Q
Q、
K
K
K和
V
V
V表示。例如,查询矩阵是通过用一个线性层
W
q
W_{q}
Wq投影
X
X
X得到的,即
Q
=
X
W
q
Q = XW_{q}
Q=XWq。具体来说,注意权重
E
E
E由
Q
Q
Q和
K
T
K^{T}
KT与
s
o
f
t
m
a
x
softmax
softmax函数的归一化乘积计算,即:
E
=
s
o
f
t
m
a
x
(
Q
K
T
d
)
(1)
E=softmax(\frac{QK^{T} }{\sqrt{d} } ) \tag 1
E=softmax(dQKT)(1)
S
o
f
t
m
a
x
Softmax
Softmax函数将
(
0
,
1
)
(0,1)
(0,1)中每个查询键对的注意权重归一化,其中1表示最重要的信息,0表示无用的信息。最后,通过将注意权重
E
E
E应用到
V
V
V来增强输出特征
O
O
O,如下所示:
O
=
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
E
V
=
s
o
f
t
m
a
x
(
Q
K
T
d
)
V
(2)
O=Attention(Q,K,V)=EV=softmax(\frac{QK^{T} }{\sqrt{d} } )V \tag 2
O=Attention(Q,K,V)=EV=softmax(dQKT)V(2)
多头注意力机制
为了学习不同位置的不同表示,将输入
X
X
X转换为
n
h
n_{h}
nh不同的表示(头),用
h
1
,
⋅
⋅
⋅
,
h
i
,
⋅
⋅
⋅
,
h
n
h
h_{1},···,h_{i},···,{h_{n}}_{h}
h1,⋅⋅⋅,hi,⋅⋅⋅,hnh表示。首先分别用投影矩阵
W
q
i
W_{q}^{i}
Wqi、
W
k
i
W_{k}^{i}
Wki和
W
v
i
W_{v}^{i}
Wvi计算每个头部
h
i
h_{i}
hi的
Q
i
、
K
i
Q_{i}、K_{i}
Qi、Ki和
V
i
V_{i}
Vi的注意力。
h
i
=
A
t
t
e
n
t
i
o
n
(
Q
i
,
K
i
,
V
i
)
(3)
h_{i}=Attention(Q^{i},K^{i},V^{i}) \tag 3
hi=Attention(Qi,Ki,Vi)(3) 然后,所有的头连接形成多头表示H如下:
H
=
C
o
n
c
a
t
(
h
1
,
h
2
,
.
.
.
,
h
n
h
)
(4)
H=Concat(h_{1},h_{2},...,{h_{n}}_{h}) \tag 4
H=Concat(h1,h2,...,hnh)(4) 最后,用投影矩阵
W
O
W^{O}
WO将
H
H
H转换为
d
d
d维,即
O
=
H
W
O
O = HW^{O}
O=HWO。由于输入之间的关系的数量通常是未知的,因此多头注意力通常用于以数据驱动的方式捕获输入元素之间的不同关系。
前馈网络(
F
F
N
FFN
FFN)主要由全连接层组成,可写入:
F
F
N
(
X
)
=
δ
(
X
W
1
+
b
1
)
W
2
+
b
2
(5)
FFN(X)=\delta (XW_{1}+b_{1})W_{2}+b_{2} \tag 5
FFN(X)=δ(XW1+b1)W2+b2(5) 其中,
W
1
∈
R
d
×
h
W_{1}\in R^{d\times h}
W1∈Rd×h和
W
2
∈
R
h
×
d
W_{2}\in R^{h\times d}
W2∈Rh×d为权重,
b
1
b_{1}
b1和
b
2
b_{2}
b2为偏差项。
δ
\delta
δ是ReLU的激活函数。
h
h
h是隐藏的维度,通常被设置为
4
d
4d
4d。
位置编码(positional encoding)
由于自我注意放松了顺序,transformer使用位置编码来保持顺序信息。作者提出使用不同频率的正弦和余弦函数来推导出位置编码,这使得模型可以学习相对位置,因为任何位置编码都可以被其他位置编码线性组合。 具体来说,位置编码在位置位置的第
i
i
i维,用
P
E
(
p
o
s
,
i
)
PE_{(pos,i)}
PE(pos,i)表示,可以计算如下:
P
E
(
p
o
s
,
i
)
=
{
s
i
n
(
p
o
s
/
1000
0
i
/
d
)
i
f
i
i
s
e
v
e
n
,
c
o
s
(
p
o
s
/
1000
0
(
i
−
1
)
/
d
)
o
t
h
e
r
w
i
s
e
,
PE_{(pos,i)}=\begin{cases} sin(pos/10000^{i/d}) & if\ i\ is\ even,\\ cos(pos/10000^{(i-1)/d}) & otherwise, \end{cases}
PE(pos,i)={sin(pos/10000i/d)cos(pos/10000(i−1)/d)ifiiseven,otherwise, 其中,
d
d
d是输入特征的维数。
编码器
单个编码器块有两个子层,即多头注意网络和位置级前馈网络。每个子层之后都是残差连接[He et al.,2016]和层归一化[Ba et al.,2016]。编码器的输出将在第二个多头注意层中以
K
K
K、
V
V
V的形式发送到解码器中。
为了转换图像
X
∈
R
C
×
H
×
W
X\in \mathbb{R}^{C×H×W}
X∈RC×H×W到1维向量序列,图像将转换成
X
p
∈
R
N
×
(
P
2
C
)
X_{p}\in \mathbb{R}^{N×(P^{2}C)}
Xp∈RN×(P2C)如图1b所示,
P
×
P
P×P
P×P是每个补丁的分辨率,补丁的数量是
N
=
H
W
/
P
2
N = HW/P^{2}
N=HW/P2。然后通过一个线性层将补丁投影到补丁嵌入中。类似于BERT [Devlin等人,2018],在
X
p
X_{p}
Xp中添加了一个可学习的类令牌
x
c
l
s
∈
R
1
×
(
P
2
C
)
x_{cls}\in R^{1×(P^{2}C)}
xcls∈R1×(P2C)。然后,将位置嵌入添加到输出
[
x
c
l
s
;
X
p
]
[x_{cls}; X_{p}]
[xcls;Xp]中,以获取位置信息。
Transformer编码器
ViT不同时使用编码器和解码器,而是只使用变压器编码器,因为其目标是找到一个更好的表示,而不是自回归预测。图像补丁被转换成序列,然后发送到编码器中。唯一的区别是,图层的归一化是在子层(预范数)之前添加的[Xiong et al.,2020]。
Class Tokens
类标记被训练为包含类信息,并可用于表示整个特性。因此,它可以用来将数据分类为不同的类别。
MLP Head
MLP 头通常用于下游任务。具体来说,设
Z
=
[
Z
0
,
Z
1
,
⋯
,
Z
N
]
Z = [Z_{0},Z_{1},\cdots,Z_{N} ]
Z=[Z0,Z1,⋯,ZN]表示变压器编码器的输出。由于输入序列前的类标记可以视为图像表示,最终结果
y
y
y是根据编码器输出
Z
0
Z_{0}
Z0的第一个标记确定的,即:
Z
=
T
r
a
n
s
E
n
c
o
d
e
r
(
[
x
c
l
s
;
X
p
]
)
Z=TransEncoder([x_{cls};X_{p}])
Z=TransEncoder([xcls;Xp])
y
=
M
L
P
(
Z
0
)
y=MLP(Z_{0})
y=MLP(Z0)
[Zhou et al.,2021]是在作者检查了ViT的注意图并发现注意崩溃发生在更深层之后创建的。这个问题阻碍了模型的代表性,并会降低性能。作者改变了自注意层,并在注意层之后提供了一个可学习的变换矩阵,通过刺激模型生成一组新的注意映射来解决这个问题。
T2T-ViT
[Yuan et al.,2021b]是在作者观察从标记重塑的特征图并指出大多数标记图在ViT中没有意义后设计的。为了提高标记映射的多样性,作者在模型的开始部分插入了一个t2t模块。T2t模块由少量的T2t变压器组成。这些T2T-变压器可以被视为原始的变压器层,也可以被[Choromanski等人,2021]中使用的表演者所取代。在t2t变压器之间是t2t过程,它将图像裁剪成几个重叠的斑块。重叠策略使模型能够在相邻模型之间共享信息,从而提高特征的多样性。
[Chen等人,2021b]明确设计用于基于V1和V2的视觉变换器[He等人,2020;Chen等人,2020]。每个图像都有两个不同的版本,由数据增强生成,不同版本的图像被送入两个不同编码器。然后,该模型学习减少两幅相同图像之间的差异,并增加这些阴性样本的距离,其中差异由InfoNCE测量【Oord等人,2018年】。其他修改包括:1)删除内存队列,这样可以减少大batchsize的需求;2)采用对称化损失。假设第一个编码器输出q1、q2,第二个编码器输出k1、k2,则对称化损耗L通过以下公式计算:
ι
=
i
n
f
o
N
C
E
(
q
1
,
k
2
)
+
i
n
f
o
N
C
E
(
q
2
,
k
1
)
\iota = infoNCE(q_{1}, k_{2}) + infoNCE(q_{2}, k_{1})
ι=infoNCE(q1,k2)+infoNCE(q2,k1)