当前位置: 首页 > article >正文

VIT论文阅读

把图片看成一个个16x16的patch堆起来的

摘要

卷积神经网络不是必备的,一个纯transformer表现也是非常好的
transformer?2500天tpu v3

介绍

大规模上预训练,小规模任务数据集上微调。扩大模型时候还没观察到瓶颈(还没出现过拟合)?

轴注意力机制:把2d的图片注意力分成从H和从W出发两个1d的注意力机制

将224x224的图片根据16x16的patch划分成为14x14,使用特征图展开成1d来进行attention操作

在不加强约束的情况下,transformer效果是比Resnet差的,因为少了归纳偏置
1是本地偏置,相近的特征会相邻;2是平移同变性f(g(x))=g(f(x)),无论先做平移还是卷积,输出永远是一样的。卷积有很多先验信息。

只要预训练的数据集够大,特征迟早会学到,效果会变好

前人工作

要么就是用transformer将CNN取代,要么两者结合
降低时间复杂度:

  1. 使用窗口代替所有像素
  2. 使用sparse transformer:只对一些稀疏的点使用自注意力
  3. 横轴和纵轴
    但是需要硬件加速

方法

尽可能使用原始的transformer

(无法上传原结构图)

每个patch会通过线性投影层转换成序列,最开始有一个cls标签(分类,从BERT中引进),然后只看该标签来预测类别

流程:224x224图片划分成为14x14=196的16x16x3=768的RGB图片,乘以一个线性投影矩阵得到196x768输出
加上一个cls标签1x768,得到197x768的最终输出,再与位置向量相加,得到patch embeddings
cls相信它可以学到图像的特征。cls经过很多层transformer encoder后融合了其他token的信息。将其最后通过一个MLP处理成分类信息。
位置编码选择一维还是二维?发现两者结果差不多

公式化:
在这里插入图片描述

z0是输入,
第二条是多头自注意力机制出来的结果,先LaynerNorm,然后注意力,加上过去输入
第三条就是LN 然后MLP+个残差
第四条是最后一层输出的第一个位置当成整体图像的特征作为分类任务

归纳偏置:
transformer没有先验知识

混合结构:
detr,CNM+tran的结合。使用CNN产生14x14的特征,拉直之后使用原始transformer

微调和更高清晰度

用预训练好的模型尝试高分辨率图片微调
从短序列到长序列,需要进行插值操作,但是效果不太好。微调有局限性。

实验

对比和resnet的表征学习能力
样本小, 小于ImageNet21k时候,bit占优,否则Vit后来居上,效果好一丢丢

可视化

贾柏滤波器(Gabor filter)

可视化注意力距离后,发现在训练初期,同一层自注意力机制是有距离的,并且随着网络越深距离越大且方差越小
这相对与CNN的好处是,CNN在浅层网络的感受野是很小的,只能看到邻近像素点的信息,
作图:将学习到的权重投射到原图的像素点中

消融实验

补充:全局平均池化是每一个channel得到一个元素,最后得到一个长度为channel的一维向量。
在ViT中,全局平均池化和cls token的方法效果一致

2维的位置编码:将一维的长度为D的位置编码换成D/2为高,D/2为宽的2维位置矩阵,根据具体位置选择两个向量拼接到一起就又成了长度D的向量

自监督学习

选择部分patch抹除,然后自监督重建这一部分patch。但是效果差一筹。

结论

不一样的是,我们不使用图像的归纳偏执,而是一个序列块
有可能规模增加还能带来更好的结果 VIT-G

额外

mataformer:用池化操作取代qkv,他觉得是结构好,并不是mlp的原因


http://www.kler.cn/a/302578.html

相关文章:

  • 学习日志010--python异常处理机制与简单文件操作
  • Vue计算属性computed
  • fastadmin多个表crud连表操作步骤
  • 【linux】centos7 换阿里云源
  • 数字IC后端实现之Innovus specifyCellEdgeSpacing和ICC2 set_placement_spacing_rule的应用
  • 操作系统lab4-页面置换算法的模拟
  • 工业相机飞拍的原理及工作原理
  • Python(TensorFlow和PyTorch)两种显微镜成像重建算法模型(显微镜学)
  • 简单计算机网络概念
  • Salting technique
  • flink中startNewChain() 的详解
  • Qt-QWidget的font属性(18)
  • 2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)
  • Linux 管道
  • vue原理分析(十一)研究new Vue()中的initRender
  • 基于深度学习的结构优化与生成
  • 深入理解Kotlin中的异步网络请求处理
  • JavaScript 将 json 美化输出
  • 前端速通面经八股系列(八)—— React篇(上)
  • 基于鸿蒙API10的RTSP播放器(八:音量和亮度调节功能的整合)
  • 数据结构之折半插入排序概念、折半插入排序的具体步骤、折半插入排序的具体代码示例
  • 摊牌了!一文教会你轻松上手豆包MarsCode 编程助手!
  • Android的内核
  • 【STM32】外部中断
  • 数据结构 - 栈
  • 多态(c++)