关于self-attention的基本定义,以及在自然语言处理方向的发展,参考self-attention原理和改进方向。图像领域的综述见Transformers in Vision: A Survey
1、图像识别方向
Non-local Neural Networks
论文将self-attention抽象成为了一个如同卷积、循环操作类似的通用神经网络构件non-local,并主要应用于图像视频领域。non-local抽象出的主要思想是,每个位置上的响应都是通过所有位置上的特征加权求和得到的,因此它具有绝对的长程依赖特征。
对于CNN和RNN来说,卷积和循环操作只能处理局部邻域(即局部注意力),长程依赖是通过增加网络深度从而使高层网络具有更大的感受野来实现的,这样做的缺点是1)计算低效;2)优化困难;3)较远距离信息交互复杂。而non-local则可以通过任意距离的信息交互,用很少的网络层就可以实现原深度网络的效果。non-local可以表示为
y
i
=
1
C
(
x
)
∑
∀
j
f
(
x
i
,
x
j
)
g
(
x
j
)
y_i=\frac{1}{\mathcal{C}(x)}\sum_{\forall j}f(x_i, x_j)g(x_j)
yi=C(x)1∀j∑f(xi,xj)g(xj)
其中
C
(
x
)
\mathcal{C}(x)
C(x)表示归一化函数,
f
(
x
i
,
x
j
)
f(x_i,x_j)
f(xi,xj)表示
i
,
j
i,j
i,j两个位置的关系标量函数,
g
(
x
)
g(x)
g(x)表示特征映射函数。non-local和全连接层的差异在于,它保留有位置的相关信息,而全连接层会失去所有位置关系。如果
g
(
x
j
)
=
W
g
x
j
f
(
x
i
,
x
j
)
=
e
θ
(
x
i
)
T
ϕ
(
x
j
)
,
θ
(
x
i
)
=
W
θ
x
i
,
ϕ
(
x
j
)
=
W
ϕ
x
j
C
(
x
)
=
∑
∀
j
f
(
x
i
,
x
j
)
g(x_j) = W_g x_j\\ f(x_i, x_j) = e^{\theta(x_i)^T\phi(x_j)},\quad \theta(x_i)=W_\theta x_i, \phi(x_j)=W_\phi x_j\\ \mathcal{C}(x)=\sum_{\forall j}f(x_i, x_j)
g(xj)=Wgxjf(xi,xj)=eθ(xi)Tϕ(xj),θ(xi)=Wθxi,ϕ(xj)=WϕxjC(x)=∀j∑f(xi,xj)
此时通过softmax转换就是self-attention原有的形式。论文也提到,这里的softmax虽然提供了非线性,但是它并不是self-attention成功的本质,而令
C
(
x
)
=
N
\mathcal{C}(x)=N
C(x)=N,同时让Embedded Guassian形式的
f
(
x
i
,
x
j
)
=
e
θ
(
x
i
)
T
ϕ
(
x
j
)
f(x_i, x_j) = e^{\theta(x_i)^T\phi(x_j)}
f(xi,xj)=eθ(xi)Tϕ(xj)退化为Dot product形式的
f
(
x
i
,
x
j
)
=
θ
(
x
i
)
T
ϕ
(
x
j
)
f(x_i, x_j) = \theta(x_i)^T\phi(x_j)
f(xi,xj)=θ(xi)Tϕ(xj)同样可行。
具体实现以下图为例,输入为1024个通道的
T
×
H
×
W
T\times H\times W
T×H×W视频块,蓝色方块表示
1
×
1
×
1
1\times 1\times 1
1×1×1卷积操作,在计算一个二维attention矩阵的时候需要有reshape和transpose操作。最左边的旁路表示这是一个残差模块,它可以替换原有网络中任意部分的来引入non-local
An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
这篇文章提出的Vision Transformer(ViT)可以说是彻底的打通了transformer在图像和语言领域的应用,即将图像切分成固定 P × P P\times P P×P大小的patch并构成一个类似sentence的一维token序列,输入到一个没有任何改动的transformer encoder中,其余的设定基本和Bert一致(如下图),包括1)CLS位用于最后的表征输出,2)采用两层的MLP作为预训练分类器,而用单线性层作为微调分类器,3)使用可学习的一维positional embedding。
但是还有一些地方是与Bert完全不同的,ViT使用的是有监督的预训练方式,预训练的数据集要远大于微调的下游训练集(JFT有有303M图片,ImageNet-21k有14M图片,而一般的ImageNet只有1.3M图片)。论文也在大规模的自监督预训练方面进行了尝试,但是没有有监督预训练效果好。因此论文的重心就变成了训练数据量大小对ViT和传统的CNN的不同影响。
整体来看,ViT虽然具有全局依赖能力,但是其在图像上的归纳偏置能力(平移不变和局部感知)天然不如CNN,因此在中等规模的训练集上(如ImageNet),CNN的表现依然是最好的。但是实验发现,当训练集规模逐渐扩大,ViT的表现会快速赶上甚至超过CNN,也就是说,归纳偏置能力在数据量的碾压下变得不再重要了。同时,因为self-attention本身的高效性,相同计算量的ViT可以明显超过CNN。论文到这也基本结束了,下面可以列举一些其中比较有意思的结论:
- 预训练的时候为了减少计算压力可以使用较低分辨率图像(224),而微调的时候使用高分辨率图像(384)效果更好,这两步使用的patch大小可以保持一致,只是高分辨率图像对应的序列更长,而transformer恰好可以处理变长的序列
- positional embedding可以自动学习出patch的二维位置关系,相邻的patch具有相似的embedding。这里embedding的方式可以有多种:1)直接用一维向量,2)对二维的X,Y两个方向分别使用一维向量编码并最后concat,3)相对位置。经过实验后发现这几种方式效果接近,说明对位置的embedding是比较简单的任务,上述几种方法都可以实现
- 即使在最底层,self-attention也能整合整张图像的信息,只是在低层attention的距离比较分散,局部和全局都具有,但是到了高层后attention的距离都变得比较大,着重处理全局信息,这一点类似于CNN的感受野。