这篇文章的核心是提出了Vision-Transformer
结构,将2017年Attention is All you Need在NLP中引入的Transformer结构应用于计算机视觉任务中。Transformer是一种基于自注意力结构的网络,和CNN捕捉卷积窗口内的局部信息不同,它利用注意力来捕获全局上下文信息之间的相关性。文章引入图像块(patch)的概念,patch由 P × P P\times P P×P个像素组成,通过将patch进行flatten,然后通过投影层转换成固定长度的特征向量,最后和NLP中表示1个token(word)的词向量一样输入到Transformer的Encoder结构中。
Note:
参考文档:
①Transformer 模型详解
②真香!Vision Transformer快速实现Mnist识别
Transformer in NLP \colorbox{violet}{Transformer in NLP} Transformer in NLP
Transformer是在2017被提出,和传统神经网络基于CNN不同,Transformer主要基于自注意力(虽然attention和CNN没有直接联系,但是整个Transformer结构中还是有CNN的成分的,只是作者刻意规避了CNN),当时是应用于NLP中去取代RNN这种串行递归结构处理语言的低效性,因为Transformer可以并行处理数据以及利用自注意力机制让Decoder部分更加关注在Encoder中相关的部分。主流的方法是在大型语言数据集上训练,然后在小型数据集上微调。
Transformer in Previous Vision \colorbox{lightseagreen}{Transformer in Previous Vision} Transformer in Previous Vision
Transformer结构在NLP中的成功应用,给在计算机视觉任务上的迁移提供了思路。2018年开始,一些将Transformer应用于计算机视觉的论文就出来了,比如:①Non-local Neural Networks、End-to-end object detection with transformers往CNN中引入自注意力机制进行结合;②Stand-Alone Self-Attention in Vision Models、Stand-alone axial-attention for panoptic segmentation将整个Transformer来取代CNN模型中的一部分结构。但是这些方法仍然无法脱离CNN,因此作者提出了一种纯使用Transformer结构的模型,即Vision-Transformer(ViT)结构。
Transformer in ViT \colorbox{dodgerblue}{Transformer in ViT} Transformer in ViT
ViT将标准的Transformer直接迁移到计算机视觉任务中,但是有一点略微的修改:
token
(word)通过嵌入层(比如torch.nn.Embedding())转换成词向量,你可以使用word2vec或者一些开源的神经网络库中的一些嵌入层(如Pytorch、Keras、TensorFlow等)将词用稠密向量表示。而在图像中,作者将图像块看成是1个词word,而最终输入进Transformer的patch-embdding就类似于词向量word-embedding。patch
)概念,先将整幅图像分块,然后将每个图像块(如 4 × 4 4\times 4 4×4)进行flatten
,再利用投影变换映射成图像块嵌入形式,即patch-embedding,这样一来每个图像patch就对应了1个固定长度的向量,然后就可以直接送进Transformer了!在正式介绍之前,先对一些符号做介绍:
ViT框架结构 \colorbox{tomato}{ViT框架结构} ViT框架结构
下图就是整个ViT的网络结构,接下来我们对它进行详细介绍:
整个模型分为5步:
patch-embedding
和position-embedding
,两者的size都是 R 1 × D \mathbb{R}^{1\times D} R1×D;所以 N N N个patch和 N N N个位置的嵌入结果就是 R N × D \mathbb{R}^{N\times D} RN×D。Encoder
中。Note:
Patch-Embedding
、Position-Embedding
、Word-Embedding
都属于固定长度的向量,是作为Transformer的直接输入信号;且他们都可以通过训练嵌入层(Embedding layer)输出得到。标准的Transformer的Encoder结构如下图所示:
但是ViT中使用了如下结构:
Encoder结构包含LN
(LayerNorm,为不是BN),它放置于注意力块的前面;Residual-connection
,它被放置于注意力块的后面;MLP
,即feed-forward network,使用2个全连接层内接GELU非线性函数;MSA
,即多头的自注意力模块,多头multi-head就是通过多个角度去产生注意力。此外Encoder往往会级联 L L L个上图结构。
整个ViT
的数学表达式如下:
z 0 = [ x c l a s s ; x p 1 E ⏞ 1 × D ; x p 2 E ; ⋯ ; x p N ] + E p o s , E ∈ R ( P 2 C ) × D , E p o s ∈ R ( N + 1 ) × D . (1) z_0 = [x_{class};\overbrace{x_p^1\bm{E}}^{1\times D};x_p^2\bm{E};\cdots;x_p^N] + \bm{E}_{pos},\\ \bm{E}\in\mathbb{R}^{(P^2C)\times D},\bm{E}_{pos}\in\mathbb{R}^{(N+1)\times D}.\tag{1} z0=[xclass;xp1E 1×D;xp2E;⋯;xpN]+Epos,E∈R(P2C)×D,Epos∈R(N+1)×D.(1)
z l ′ = M S A ( L N ( z l − 1 ) ) + z l − 1 , l = 1 , ⋯ , L . (2) z'_l = {\color{tomato}MSA}(LN(z_{l-1})) + z_{l-1},\\ l = 1,\cdots, L.\tag{2} zl′=MSA(LN(zl−1))+zl−1,l=1,⋯,L.(2)
z l = M L P ( L N ( z l ′ ) ) + z l ′ , l = 1 , ⋯ , L . (3) z_l = {\color{violet}MLP}(LN(z'_l)) + z'_l,\\ l=1,\cdots, L.\tag{3} zl=MLP(LN(zl′))+zl′,l=1,⋯,L.(3)
y = L N ( z L ) . (4) y = LN(z_L).\tag{4} y=LN(zL).(4)
Transformer的核心就是MSA这个多头自注意力模块(Multi-head Self-Attention
),接下去我们对它进一步展开介绍:
设 z ∈ R N × D z\in\mathbb{R}^{N\times D} z∈RN×D为经过LN之后的输出,则
[ Q , K , V ] = z U Q K V , U Q K V ∈ R D × 3 D h . (5) [Q,K,V] = z U_{QKV},\\ U_{QKV}\in\mathbb{R}^{D\times 3D_h}.\tag{5} [Q,K,V]=zUQKV,UQKV∈RD×3Dh.(5)其中 Q 、 K 、 V Q、K、V Q、K、V各自通过线性层得到, Q Q Q表示Query, K K K表示Key, V V V表示Value;
Q 、 K Q、K Q、K用于计算注意力权重, V V V是输入 z z z的另一种表达,则注意力权重矩阵 A A A可表示为:
A = s o f t m a x ( Q K T / D h ) , A ∈ R N × N . (6) A = softmax(QK^T/ \sqrt{D_h}),\\ A\in \mathbb{R}^{N\times N}.\tag{6} A=softmax(QKT/Dh),A∈RN×N.(6)因此,单头(single-head)的自注意力就可以总体表示为:
S A ( z ) = A v ∈ R N × D h . (7) SA(z) = Av\in \mathbb{R}^{N\times D_h}.\tag{7} SA(z)=Av∈RN×Dh.(7)
如果说单头是1个人对于图片的注意力,那么多头multi-head就是多个人对于图片的多份注意力,是不同的理解,即multi-head就是同时并行运行 k k k个single-head自注意力,最后将结果concat起来:
M S A ( z ) = [ S A 1 ( z ) ; S A 2 ( Z ) ; ⋯ ; S A k ( z ) ] U m s a , U m s a ∈ R k D h × D . (8) MSA(z) = [SA_1(z);SA_2(Z);\cdots;SA_k(z)]U_{msa},\\ U_{msa} \in \mathbb{R}^{kD_h \times D}.\tag{8} MSA(z)=[SA1(z);SA2(Z);⋯;SAk(z)]Umsa,Umsa∈RkDh×D.(8)为了使得输入的 z z z和输出的注意力保持相同的size,一般会取 D h = D / k D_h = D/k Dh=D/k。
Note:
patch-wise
注意力机制的Transformer模型——Vision Transformer
(ViT)。