从Transformer到VIT再到MAE

  • 引言
  • Transfomer
    • 提出的背景
    • 模型架构
    • 具体细节
      • Add&Norm
      • Attention:
      • Multi-Head Attention
      • 自注意力机制(self attention)
      • Positional Encoding
  • ViT
    • 提出的背景:
    • 模型架构:
    • 具体细节:
      • 维度
      • 序列信息
      • Class Token的作用:
      • Transformer处理任意长度的输入
    • 结论:
  • MAE(CV版的BERT完形填空)
    • 提出的背景
    • 模型架构
    • 注意的细节
      • 图片和语言的区别
      • 图片的冗余性

引言

最近一年来,Transformer在CV领域又掀起了一股新的潮流,尤其是ViT这篇文章,可以说是在CV的Transformer的应用方面挖了一个大坑,后面也如雨后春笋般掀起了一个改进和优化ViT的大潮,或者说在VIT的启发下又出现了新的方法(比方说MAE,BEIT等)。

这篇文章的主要目的是梳理从Transformer到VIT再到MAE都有什么思路上,架构上的变化,为什么要对某些地方进行修改或者提升,以及一些具体的技术细节,总的来说,是为了穿起来一个故事,来介绍这一整个趋势的前因后果和我自己的一些思考。

并且这三篇论文的写作可以说都是很成功的,从写作的角度也可以学到如何书写一篇优秀的论文。

Transfomer

先放论文链接:Attention Is All You Need

提出的背景

这篇文章在最初的时候是针对机器翻译的场景下提出的。

相对于RNN提出的主要原因

  1. RNN的计算是单向序列化的,当前词的状态是由钱前一个隐藏状态和当前词共同决定的,这样就保证了信息的传递。但这样带来的缺点是,计算当前状态的时候,必须要前面的状态计算完成才可以,是无法并行的,不能发挥GPU的计算优势。
  2. 如果当前的序列比较长,前面的状态都需要存下来,导致内存开销比较大。

相对于CNN提出的主要原因:
每个卷积核比较小(例如3*3),如果两个像素的距离比较远的话,想要融合两个像素的信息则需要很多层卷积才能办到。用注意力机制的话可以一次看到所有的输入序列。

模型架构

这里用的是论文里面的插图:

左边框内的是编码器,右边框内的是解码器,编码器解码器的层数都是N层的。

编码器:一次性可以看全句子,将输入序列的每一个元素转化为一系列的连续的向量。
解码器:自回归,在过去时刻的输出作为当前的输入,一个词一个词的往外翻译,不能看到全句。

具体细节

Add&Norm

这一层相当于是ResNet的直连和Normalization

但是需要注意的是,RseNet的Normalization是指在Batch中的Normalization,针对的场景是我们输入图片的尺寸都是相同的,这样的话可以对一个batch内的所有图片做Norm,但是对于文本序列来讲,很有可能长度是不一样的,这样在一个batch内做norm就会失去意义,因为尺度是不同的,用较短的序列求得的batch norm不一定会适合长序列,会有抖动比较大的问题。

所以,这里的Norm采用的是layer norm,是对每个样本的不同feature做的normalization,而batch norm是对同一个特征的不同样本做的normalization

Attention:

首先来解释什么是attention,一句话解释就是有等长的value和key,按照query与key的相似度来确定每个value对输出的权重

例如,现在有v1,v2,v3三个value和k1,k2,k3三个key,当一个新的输入query进来的时候,计算query和k1,k2,k3的相似度之后,发现query与k1最接近,所以输出的值中v1占最大的权重,v2次之,v3最小,得到最后的输出。不同的相似函数会有不同的注意力版本。Transformer用的相当于是内积。


这里的Q,K,V分别是Query矩阵,Key矩阵,Value矩阵,dk代表的是每个key的维度,如果我们有n个query,每个query有dk个维度写成一个矩阵,Q就是n*dk的维度,然后我们有m个key(注意n和m可以不同的)这样的话,K矩阵就是m*dk的维度,转置之后是dk*m的维度,和Q相乘之后,是n*m的维度,算到这里,相当于我们已经计算出了query中每个q对应m个key的相似度了(这里用的是内积的方法,其实就是cos距离)然后再做一次根号dk的归一化,并且用softmax对每个q对应的m个key的相似程度进行转换,得到的n*m的矩阵就是权重,再乘以m*dv的V矩阵,就是加权的结果,一次输出了n个query的结果,并行能力大大提升! 两次矩阵乘法可以高效计算。

根号dk的归一化主要是为了解决序列过长的时候softmax输出向0或者1偏斜导致梯度过小收敛慢的问题。

Mask的作用:避免模型在t时间看到t时间之后的序列,这样具体操作就是在t时间之后的输出换成一个很大的负数,这样经过softmax之后,计算结果会趋于0,自动的抛去了。

Multi-Head Attention


为什么做多头注意力:

从上面attention的分析来看,所有的计算都说是线性的,没有什么可供学习的参数,这里仿照CNN多通道的思路,VKQ线性投影h次到不同的低维空间(也就是给h次机会投影),其中投影的方向是可以学习的参数,然后对不同的头的结果再做一次投影回到原来的大小。也就是说,没有多头的概念模型是不能学到东西的。

自注意力机制(self attention)


这里的QKV都是从输如来的,分成了QKV,所以叫自注意力


接下来重点关注解码器的多头注意力,也就是红色标出来的地方,其中k和v是当前的输出,q来自于上一个时刻的输出,然后通过注意力机制来预测下一个时刻的输出,这样就完成了一个词一个词往外蹦的效果。即根据当前解码器的输入,去编码器的输出里面挑我感兴趣的地方。

Positional Encoding


这个部分主要是为了解决输入没有序列顺序信息的问题。不像是RNN用上一个状态来表示过去的时序信息,Transformer
具体做法是用周期不同的sin和cos函数将当前词的位置信息转化成一个长为512的向量,再相加到input的向量中。

ViT

照例是论文链接:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

提出的背景:

ViT主要是针对在CV领域还没有用Transformer的情况下提出的,提出之后,可以用于同一个模型框架的多模态任务当中。卷积神经网络还是主流,但是自注意力又很香。

解决的主要困难:

  1. 如何把图片序列化:把224*224的图片拆分成patch,每一个大小是16*16
  2. 把像素级的计算转化到了patch级的计算

模型架构:

具体细节:

维度

如果输入图片大小是224*224大小,每个patch我们设定的大小为16*16,这样的话,我们能得到14*14个图像块(224/16=14),共196个图像块。每个小块的维度就是16*16*3=768,所以原来的224*224*3变成了196*768,所以到这里,一张图片就变成了196个元素,每个元素有768维度的序列。

序列信息

同样,我们注意到在Transformer当中是有位置编码部分的,我们在图像的处理中当然也需要这部分,也就是下面图里的操作:

具体的操作是有一个表,表的每一行代表了图片的顺序,列的维度是768,然后把序列信息加到187*768的维度里面,这样的话就完成了数据的预处理。

这里用到的是1-D的位置编码(1-196),另外还有2-D的位置编码,具体是用行和列共同表示,例如11,12,13…21,22,23…这样的

Class Token的作用:

即上面图片的0#token,这里借鉴了BERT里面的Class Token, 是一个可以学习的特征,和图像的特征有相同的维度(768),但只有一个token,最终将这个输出当成整个transformer的输出。这样的话就和CNN的最终输出结果很像了。

但是需要注意的是,实际上ViT的输出也可以直接做全局平均池化来得到输出而不一定非得用 CLS, 这里只是为了保证大部分的操作与Transformer是相同的。

Transformer处理任意长度的输入

理论上是可以的,但是如果输入的大小改变了,相当于计算的patch的个数增加了,与训练好的模型就不好用了,这里也可以采用插值的方式来解决。

结论:

  1. 因为相对于CNN缺少一些归纳偏置(局部信息和平移等变性),导致在中小数据集上的效果不是那么好。
  2. 目前随着数据的增加,ViT还没有达到明显的过拟合,还有提升空间。
  3. 自注意力可以模拟长距离的关系,即对于距离比较远的两个像素的关系。随层数的增加距离会越来越远。

MAE(CV版的BERT完形填空)

论文链接:Masked Autoencoders Are Scalable Vision Learners

提出的背景

ViT的最大问题就是用Transformer的时候还是用的有监督的方式,而NLP任务中的Transformer大部分用的是自监督的方式,如何能在Transformer的方法中使用自监督的方法,就是MAE提出的背景。

模型架构


非对称的编解码器结构。非对称的意思是编码器只能看到可见的块(这样也可以极大的减少计算量),解码器可以看到全部。

一张图片进来,切小块,然后随机盖住,encoder收到的是未盖住的图片,然后我们补上缺失的序列,再送到decoder中去,得到的输出就是补全的结果。

注意的细节

图片和语言的区别

一个词是一个语义单元,但是在图片的前提下,可能一个patch里面有好几种物体。

图片的冗余性

图片的冗余性实际上是很高的,这就是为什么MAE中要去掉75%甚至80%的像素块,因为简单的确实完全可以通过插值来恢复。

从Transformer到ViT再到MAE相关推荐

  1. 神经网络学习笔记3——Transformer、VIT与BoTNet网络

    系列文章目录 神经网络学习笔记1--ResNet残差网络.Batch Normalization理解与代码 神经网络学习笔记2--VGGNet神经网络结构与感受野理解与代码 文章目录 系列文章目录 A ...

  2. Vision Transformer(ViT)PyTorch代码全解析(附图解)

    Vision Transformer(ViT)PyTorch代码全解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来,屠杀了各大CV榜单.本文将根 ...

  3. 【原理+源码详细解读】从Transformer到ViT

    文章目录 参考文献 简介 Transformer架构 Position Encoding Self-attention Multi-head Self-attention Masked Multi-H ...

  4. Transformer架构 VIT

    VIT 简单来说就说在视觉中怎么去做transfomer transfomer的输入得是一个序列,我们用transfomer做视觉的时候不能把一整张图片传进去,而是考虑把一张图片分成多个小块,比如下图 ...

  5. 神经网络学习小记录68——Tensorflow2版 Vision Transformer(VIT)模型的复现详解

    神经网络学习小记录68--Tensorflow2版 Vision Transformer(VIT)模型的复现详解 学习前言 什么是Vision Transformer(VIT) 代码下载 Vision ...

  6. 4.一脚踹进ViT——ViT再审视与DeiT的实现

    4.一脚踹进ViT--ViT再审视与DeiT的实现 1.ViT的几个问题 1.1 为什么不在MLP中做LayerNorm? 其实我们在MLP之后会做Norm,我们MLP层后会有Residual加法,若 ...

  7. GreenMiM:接地气的MiM,强强联合Swin Transformer和何凯明的MAE,没有大显卡也能跑起来

    ArXiv: https://arxiv.org/abs/2205.13515 Open Code: https://github.com/layneh/greenmim 摘要 这篇文章提出了一种针对 ...

  8. Swin Transformer、ViT作者等共话:好的基础模型是CV 研究者的朴素追求

    2021-2022 年,随着 Transformer 被引入计算机视觉领域,视觉基础模型研发迎来了又一个新的高潮.一时间,基于视觉 Transformer 的骨干模型设计.自监督学习.模型扩展.下游应 ...

  9. 【Transformer】ViT:An image is worth 16x16: transformers for image recognition at scale

    文章目录 一.背景和动机 二.方法 三.效果 四.Vision Transformer 学习到图像的哪些特征了 五.代码 代码链接:https://github.com/lucidrains/vit- ...

  10. Transformer:ViT、Swim、NesT

    1.Vision Transformer 整体框架 算法流程 使用大小为P的区块将H*W*C的二维图像分为N个P*P*C的区块(patch),N=H*W/(P*P) 将区块使用线性变换转为D维特征向量 ...

最新文章

  1. Windows Server 2008 R2 SP1遗忘管理员密码后的解决方案
  2. 百度嵌入式深度学习框架Paddle-Mobile介绍
  3. zookeeper安装包下载地址
  4. asp.net mvc使用的心得和问题的解决方法(陆续更新ing)
  5. Linux下,Pycharm到期,源不好使,无法安装pyqt5及pyqy5-tools的解决办法
  6. python可删除用户程序_Django 创建/删除用户的示例代码
  7. Atitit opencv模板匹配attilax总结
  8. ILSpy .NET反编译工具下载地址
  9. 这个用JAVA开发的全开源商城系统可免费商用
  10. 数据库迁移测试——功能测试
  11. 信息3.0 ,让机器完成熵增中的有序
  12. 计算方法(三)平方根法及其改进解线性方程组
  13. SageX3和车辆排队系统、地磅系统集成方案
  14. 关于security_huks安全模块的知识总结(一)
  15. 喜马拉雅音频下载器 V1.2 支持专辑批量下载 喜马拉雅mp3下载导出 喜马拉雅下载器...
  16. Centos8(Liunx) 中安装PHP7.4 的三种方法和删除它的三种方法
  17. UI设计师需要学习哪些知识?UI设计零基础怎么入门?
  18. vue 关闭vue项目中烦死人的ESlint
  19. Vhost Architecture
  20. 数据分析--对“数据分析”相关岗位的综合分析

热门文章

  1. python+opencv实现图像拼接
  2. Halcon学习之缺陷检测-凸点检测
  3. Halcon学习---毛刺凸点检测
  4. html 插入 flv,HTML中嵌入FLV视频文件
  5. docker 简单使用
  6. Win7专业版 下安装ArcGIS desktop 9.3总结
  7. 查看html源代码编码,查看网页源代码全是乱码,但前台页面可以正常显示
  8. 《了不起的盖茨比》极简版:进化神驱动的二舅和二伯
  9. /etc/shadow文件介绍
  10. 华为nova 2 Plus魔镜版语音助手逗趣玩不停