【深度学习】【图像分类网络】(二)VisionTransformer
Transformer简介
![1png](file:///D:/资料/学习笔记/深度学习/图像分类/transformer/Self-Attention以及Multi-Head Attention/1.png?msec=1658713616368)
transformer最早提出是在自然语言处理(NLP)领域,在此之前NLP大都使用CNN(循环神经网络)以及LSTM(长短时记忆神经网络)等时序网络,这些时序网络存在着一些问题:
①记忆长度有限
②无法并行化,必须计算t0时刻数据后才能计算t1时刻数据
而transformer在不受硬件条件限制的条件下记忆长度可以是无限的,而且可以并行化计算
Self-Attention
①求出输入序列对应的qkv
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\2.png?msec=1658713616354)
首先假设输入持续序列数据为x(x1, x2...),通过一个Input Embedding映射到一个更高的维度,然后通过与三个参数矩阵wq、wk、wv相乘生成q k v,参数矩阵wq、wk、wv对所有的a都是共享的、可训练的,在源码中通过全连接层实现。q k v的涵义:
![](file:///D:/资料/学习笔记/深度学习/图像分类/transformer/Self-Attention以及Multi-Head Attention/3.png?msec=1658713616319)
a1、a2与参数矩阵的乘积都是矩阵运算, 因此可以通过连接实现并行运算:
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\4.png?msec=1658713616328)
②实现q k的match操作
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\5.png?msec=1658713616312)
上图的d为参数矩阵k的维度,如此可以得到alpha head矩阵,例如下图的alpha(1,1)=(1,2)点乘(1,0)/根号下2=0.71,同理可以求出alpha(1,2),alpha(1,1)和alpha(1,2)经softmax后得到alphahead(1,1)、alphahead(1,2),同理可以求出alphahead(2,1)、alphahead(2,2):
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\6.png?msec=1658713616354)
同样可以通过连接多个序列的qk参数矩阵实现这一步的并行运算,为了对应上面qk的点乘运算,这里是矩阵运算所以要对k1k2进行转置再连接:
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\7.png?msec=1658713616338)
③alpha head矩阵与value做乘积运算
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\8.png?msec=1658713616360)
alpha head(1,1)、alpha head(1,1)分别与v1、v2做点乘运算得到b1,alpha head(2,1)、alpha head(2,1)分别与v1、v2做点乘运算得到b2,依次可以得到所有序列的运算结果
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\9.png?msec=1658713616320)
同样,可以通过连接v1、v2的转置实现并行操作,①②③步合起来的公式如下图所示:
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\10.png?msec=1658713616353)
Multi head Self-Attention 多head情况 类似于ResNeXT的组卷积
①将求得的q、k、v按照head个数进行均分
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\11.png?msec=1658713616368)
如上图,在head=2的情况下,将q(1,1,0,1)均分为q11(1,1)、q12(0,1)
②将q、k、v参数矩阵第二个下标为i的参数矩阵归为headi
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\12.png?msec=1658713616369)
如上图将q11,k11,v11,q21,k21,v21归为head1,为了实现并行运算,同理可以将q11、q21等进行连接,得到两个head。
③对每个head执行self-attention
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\13.png?msec=1658713616380)
④对每个head得到的结果进行拼接
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\14.png?msec=1658713616341)
b11与b12进行拼接,b21和b22进行拼接
⑤通过参数矩阵w0与拼接数据进一步融合
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\Self-Attention以及Multi-Head Attention\15.png?msec=1658713616327)
Positional Encoding位置编码
![](file:///D:/资料/学习笔记/深度学习/图像分类/transformer/Self-Attention以及Multi-Head Attention/16.png?msec=1658713616394)
存在的问题
:如果改变输入序列的顺序,如将a2、a3调换,经过MultiHead Attention Layer层输出的结果只会影响b2、b3而不会影响其他的输出,这显然是不合理的。
因此对输入序列添加一个位置编码Position Encoding,这个位置编码可以通过两种方式求得:
①
VisionTransformer
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\VisionTransformer\1.png?msec=1658713630412)
模型架构
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\VisionTransformer\2.png?msec=1658713630414)
首先按照patch_size将输入图片分割成一个个patches,然后通过LinearProjectionof FlattenedPatches(Embedding层)得到对应的一个个向量,被称作token,然后在token的最前面新增一个class token(向量dim、长度均相等),然后需要在前面加上Position Encoding位置参数,随后通过Tansformer Encoder,只提取针对class token的输出,再通过MLPHeader得到最终分类的结果。
LinearProjectionof FlattenedPatches(Embedding层)
对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵[token_num,token_dim]
①将patches转换为token向量
代码实现是通过一个卷积层来实现的,以ViT-B/16为例,使用卷积核大小为16x16,卷积核个数为768(对应输出token的维度),stride为16的卷积层
例如输入[224,224,3]->[14,14,768]->(展平)[196,768]
(224-16)/16+1=14
即得到一个个数为196,维度为768的token序列
②在token变量上添加[class]token
拼接[class]token:Concat([1,768], [196,768]) = [197,768]
③叠加Position Embedding位置编码
叠加Position Embedding位置编码:[197,768]->[197,768]
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\VisionTransformer\3.png?msec=1658713630406)
上图是论文作者给出的使用位置编码对结果准确度的影响,可以看到使用1D的位置编码比不使用准确率高大概3%
Transformer Encoder
网络结构主要是将EncoderBlock堆叠L次,EncoderBlock首先输入一个Layer Normal层,紧接着通过一个Multi-Head Attention,再通过一个dropout层,也有使用的DropPath层。
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\VisionTransformer\4.png?msec=1658713630404)
第二部分类似,其中MLP block如下图:首先通过一个全连接层,输出节点个数为输入节点个数的四倍,再经过GELU激活函数后又由一层全连接层降维,最后经过一层全连接层输出。
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\VisionTransformer\5.png?msec=1658713630403)
MLP Head
在Transformer Encoder前有一个Dropout层,后有一个LayerNorm层
![](file://D:\资料\学习笔记\深度学习\图像分类\transformer\VisionTransformer\6.png?msec=1658713630407)
训练ImageNet21k时是由Linear+tanh激活函数+Linear,但是在ImageNet1k或者自己的数据集时,只有一个Linear