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

【深度学习】【图像分类网络】(二)VisionTransformer的更多相关文章

  1. UFLDL深度学习笔记 (二)SoftMax 回归(矩阵化推导)

    UFLDL深度学习笔记 (二)Softmax 回归 本文为学习"UFLDL Softmax回归"的笔记与代码实现,文中略过了对代价函数求偏导的过程,本篇笔记主要补充求偏导步骤的详细 ...

  2. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  3. 使用腾讯云 GPU 学习深度学习系列之二:Tensorflow 简明原理【转】

    转自:https://www.qcloud.com/community/article/598765?fromSource=gwzcw.117333.117333.117333 这是<使用腾讯云 ...

  4. 【Deeplearning】(转)深度学习知识网络

    转自深度学习知识框架,小象牛逼! 图片来自小象学院公开课,下面直接解释几条线 神经网络 线性回归 (+ 非线性激励) → 神经网络 有线性映射关系的数据,找到映射关系,非常简单,只能描述简单的映射关系 ...

  5. 深度学习卷积网络中反卷积/转置卷积的理解 transposed conv/deconv

    搞明白了卷积网络中所谓deconv到底是个什么东西后,不写下来怕又忘记,根据参考资料,加上我自己的理解,记录在这篇博客里. 先来规范表达 为了方便理解,本文出现的举例情况都是2D矩阵卷积,卷积输入和核 ...

  6. 深度学习基础(二)AlexNet_ImageNet Classification with Deep Convolutional Neural Networks

    该论文是深度学习领域的经典之作,因为自从Alex Krizhevsky提出AlexNet并使用GPUs大幅提升训练的效率之后,深度学习在图像识别等领域掀起了研究使用的热潮.在论文中,作者训练了一个含有 ...

  7. 使用Keras进行深度学习:(二)CNN讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 现今最主流的处理图像数据的技术当属深度神经网络了,尤其是卷积神经网 ...

  8. 深度学习基础网络 ResNet

    Highway Networks 论文地址:arXiv:1505.00387 [cs.LG] (ICML 2015),全文:Training Very Deep Networks( arXiv:150 ...

  9. 【Python开发】【神经网络与深度学习】网络爬虫之图片自动下载器

    python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识(没看的赶紧去看)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap show ...

  10. 【Python开发】【神经网络与深度学习】网络爬虫之python实现

    一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一 ...

随机推荐

  1. 使用Jquery的.css('border')在火狐不兼容

    改成如下就可以兼容火狐.IE.谷歌(border-left-color.border-left-width等)

  2. constexpr 和常量表达式

    常量表达式(是const expression) 是指值不会改变并且在编译过程中就能得到计算结果的表达式.显然,字面值属于常量表达式,用常量 表达式初始化的const 对象也是常量表达式.后面将会提到 ...

  3. 1.3Dmax界面_试图操作

    一.初始界面 1.菜单栏(软件的核心) 2.工具栏 3.石墨工具 4.命令板块 5.场景大纲 tools--> new Scene Explorer 创建的物体信息就会从出现在这里 6.视图窗口 ...

  4. Postman挂载外部文件,实现参数化

    一般来说,对一个接口进行测试,只能用边界值和等价类的方法,因此就会涉及到各种参数,使用Postman参数化,比较便捷: 但是自己这篇写得实在太浅陋了,将流花兄的博客内容附下,可以直接看他的 https ...

  5. ssh反向代理树莓派+motion,实现公网远程视频监控

    注意:本文公网远程监控部分需要借助有公网IP的云服务器进行ssh反向代理. 一.借助motion实现内网的视频监控 准备 插上摄像头,然后输入ls /dev/video*命令检查是否识别了摄像头 安装 ...

  6. MQ(部署模式)

    MQ部署模式 1.master-slave部署模式 1)shared filesystem Master-Slave部署方式 主要是通过共享存储目录来实现master和slave的热备,所有的Acti ...

  7. git 强制拉取远程到本地

    git fetch --all git reset --hard origin/master git pull

  8. 解决手机浏览器上input 输入框导致页面放大的问题

    加入以下代码在head 区,可解决此问题 <meta name="viewport" content="width=device-width, initial-sc ...

  9. vite不能用@做为路径的解决方法

    vite创建vue3后,发现原来用@做为路径的不能用了,报错信息是 Internal server error: Failed to resolve import "@ 在网上查了一下资料, ...

  10. win10试安装docker部署hyperf

    一:部署虚拟机,这里使用的win系统带的Hyper-V虚拟机,其它虚拟机也行 1.win+R打开命令行 2.安装Hyper-V . 失败放弃安装,选择其它吧 3.win10安装VMware 这里参考 ...