【论文精读】VIT:vision transformer论文

news2024/11/19 10:32:35

相关文章

【论文精读】Transformer:Attention Is All You Need

文章目录

  • 相关文章
  • 一、文章概览
    • (一)研究背景
    • (二)核心思路
    • (三)相关工作
    • (三)文章结论
  • 二、模型细节
    • (一)组成模块
    • (二)模型的大体流程
    • (三)具体的模型的前向过程
    • (四)transformer encoder的公式表达
    • (五)消融实验
      • 1、关于图像分类编码方式的消融实验
      • 2、关于位置编码的消融实验
  • 三、实验
    • (一)模型的变体
    • (二)分类精度结果对比
    • (三)数据集的大小对ViT的影响
    • (四)BiT、ViT、Hybrids模型集的比较
    • (五)vit的内部表征


一、文章概览

AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
一张图像相当于 16X16 个单词:大规模图像识别的transformer

(一)研究背景

  • Transformer 架构已成为nlp任务事实上的标准(BERT、T5、GPT3),但是用transformer做cv较少
  • 视觉领域的注意力要么与卷积网络结合使用,要么就是替换卷积网络的某些组件,但是整体结构不变

(二)核心思路

  • 将图像分割为patch,将这些patch的线性嵌入序列作为 Transformer 的输入。这个时候图片就变成了图片块,图片块可以类比于nlp任务中的单词。
  • 训练方式:有监督的训练

nlp中transformer采用的无监督方式

(三)相关工作

ViT和其它 self-attention in CV 的工作不同: ViT除了将图片转成 16 * 16 patches + 位置编码 之外,没有额外引入图像特有的归纳偏置,因此不需要对 vision 领域的了解,直接把图片理解成 a sequence of patches。

(三)文章结论

  1. 当在中型大小的数据集上,比如ImageNet进行训练时,如果不加比较强的约束,ViT模型和同等大小的残差网络相比会弱一些。这个结果是可以预计到的:Transformer 与CNN相比,会少一些inductive biases 归纳偏置。

inductive biases 归纳偏置:先验知识 or 提前的假设

  • 卷积神经网络中常说的 inductive biases :
    • locality:假设图片上相邻的区域会有相邻的特征
    • translation equaivariance平移等变性: f ( g ( x ) ) = g ( f ( x ) ) f (g(x)) = g( f(x) ) f(g(x))=g(f(x)),也就是说 f f f g g g 函数的顺序不影响结果。
  • CNN 有 locality 和 translation equivariance 归纳偏置,因此CNN 有 很多先验信息,进而可以利用较少的数据去学好一个模型。
  • Transformer 没有这些先验信息,只能 从图片数据里,自己学习对 视觉世界 的感知。
  1. 当以足够的规模进行预训练并转移到数据点较少的任务时,ViT能够取得优异的结果。当在公共 ImageNet-21k 数据集或内部 JFT-300M 数据集上进行预训练时,ViT 在多个图像识别基准上接近或击败了最先进的技术。特别是,最佳模型在 ImageNet 上达到 88.55% 的准确率,在 ImageNet-ReaL 上达到 90.72%,在 CIFAR-100 上达到 94.55%,在 19 个任务的 VTAB 套件上达到 77.63%。

二、模型细节

(一)组成模块

在模型设计上,ViT 尽可能使用了最原始的Transformer,大体由三个模块组成:

  • Linear Projection of Flattened Patches(Embedding层)
  • Transformer Encoder(图右侧有给出更加详细的结构)
  • MLP Head(最终用于分类的层结构)

在这里插入图片描述

(二)模型的大体流程

  • 给定一张图片输入,先将图片划分成patch,然后将其转换为序列
  • 每个patch会通过一个线性投射层得到一个特征
  • 为了确保图片的位置信息得到保留,因此需要加上一个位置编码
  • 将处理后的token输入transformer的encoder当中,将其中的class token经过一个mlp模块得到最终的分类

(三)具体的模型的前向过程

  1. 输入图像为224×224×3,将其切割成16*16的patches,就会得到196个图像块,每一个图像块的维度是16×16×3=768

此时图片就从原先的224x224x3转变成了196个维度为768的patch

在这里插入图片描述

  1. 将这些patch输入到线性投射层(一个维度为768x768的全连接层,第一个768依据图像的patch得到,是不变的,第二个768可以发生改变,如果transformer变得更大了,它也可以相应的变得更大),因此线性投射的输出为196x768的矩阵

此时有196个token,每个token向量的维度为768

在这里插入图片描述

  1. 此时可以将vision的问题转变成NLP的问题了,输入就是一系列1d的token,而不再是一张2d的图片了。在图片本身的token基础上,回家一个额外的cls token(维度为768),所以整体进入transformer的序列长度为197x768

图像的位置编码信息是直接加到token上去的,不是拼接,因此不会改变序列的维度,序列还是197x768

  1. 输入序列先经过一个layer norm,维度不变,依然是197x768;在多头注意力机制里,总共包括k、q、v三份,每一份都是197×768;再过一层layer norm,还是197×768;然后再过一层MLP,这里会把维度先对应地放大,一般是放大4倍,所以就是197×3072,然后再缩小投射回去,再变成197×768,就输出了。

多头自注意力中的维度其实并不是768,假设现在使用的是VIsion Transformer的base版本,即多头使用了12个头,那么最后的维度就变成了768/12=64,也就是说这里的k、q、v变成了197×64,但是有12个头,有12个对应的k、q、v做自注意力操作,最后再将12个头的输出直接拼接起来,这样64拼接出来之后又变成了768,所以多头自注意力出来的结果经过拼接还是197×768

在这里插入图片描述

综上就是一个Transformer block的前向传播的过程,进去之前是197×768,出来还是197×768,这个序列的长度和每个token对应的维度大小都是一样的,所以就可以在一个Transformer block上不停地往上叠加Transformer block,最后有L层Transformer block的模型就构成了Transformer encoder。

(四)transformer encoder的公式表达

在这里插入图片描述

  • X p X_p Xp是图像块的patch,共有n个patch,即 X p 1 X_p^1 Xp1 X p N X_p^N XpN
  • E E E是线性投影的全连接层,通过线性投影得到了patch embedding
  • 在patch embedding前边拼接一个class embedding,即 X c l a s s X_{class} Xclass,然后加上位置编码信息 E p o s E_{pos} Epos
  • 每个transformer block中包含一个多头自注意力MSA和MLP,做这两个操作前需要经过layer norm,操作完成后进行一次残差连接
  • l l l个transformer block出来的结果即为 Z l Z_l Zl
  • L L L层循环解释后将最后一层输出的第一个位置也就是class token对应的输出( Z L 0 Z_L^0 ZL0)作为整体图像的特征去完成分类任务。

(五)消融实验

1、关于图像分类编码方式的消融实验

在做图像分类的任务时,模型可以通过全局平均池化得到一个全局特征然后去做分类,也可以用一个class token去做。文章中所有的实验都是用class token去做的,主要的目的是跟原始的Transformer尽可能地保持一致,作者就是想证明,一个标准的Transformer照样可以做视觉。
在这里插入图片描述

  • 绿线表示全局平均池化
  • 蓝线表示class token
  • 可以发现到最后绿线和蓝线的效果是差不多的,但是作者指出绿线和蓝线所使用的学习率(lr, Learning rate)是不一样的,如果直接将蓝线的学习率拿过来使用得到的效果可能如橙线所示,也就是说需要进行好好调参。

2、关于位置编码的消融实验

  • 1d:NLP中常用的位置编码,也就是本文使用的位置编码(把一个图片打成九宫格,用的是1到9的数来表示图像块)
  • 2d:使用11、12、13、21等来表示图像块,这样就跟视觉问题更加贴近,因为它有了整体的结构信息。具体的做法就是,原有的1d的位置编码的维度是d,现在因为横坐标、纵坐标都需要去表示,横坐标有D/2的维度,纵坐标也有D/2的维度,就是说分别有一个D/2的向量去表述横坐标和纵坐标,最后将这两个D/2的向量拼接到一起就又得到了一个长度为D的向量,把这个向量叫做2d的位置编码
  • relative positional embedding(相对位置编码):在1d的位置编码中,两个patch之间的距离既可以用绝对的距离来表示,又可以用它们之间的相对距离来表示(文中所提到的offset),这样也可以认为是一种表示图像块之间位置信息的方式

在这里插入图片描述最后的结果显示三种表示方法的效果差不多。

三、实验

(一)模型的变体

一共有三种模型,参数如下图所示。由于transformer的序列长度其实是跟patch size成反比的,因为patch size越小,切成的块就越多,patch size越大,切成的块就越少,所以当模型用了更小的patch size的时候计算起来就会更贵,因为序列长度增加了。
在这里插入图片描述

(二)分类精度结果对比

将几个ViT的变体和卷积神经网络(BiT和Noisy Student)进行对比,结果如下表所示。
在这里插入图片描述

(三)数据集的大小对ViT的影响

  • 左侧的图像表示:在小数据集上进行预训练时,大型ViT模型的表现要比BiTResNets 差,但在较大数据集上进行预训练时,ViT更好。随着数据集的增长,较大的ViT变体会取代较小的ViT变体。
  • 右侧的图像表示:ResNets在较小的预训练数据集上表现更好,但ViT在较大的预训练数据集上表现更好。

在这里插入图片描述

(四)BiT、ViT、Hybrids模型集的比较

在相同的计算开销下,ViT的性能一般优于ResNet。对于较小的模型尺寸,混合Transformer比纯Transformer有所改善,而对于较大的模型尺寸,纯Transformer比混合Transformer有所改善。

左图的average-5就是他在五个数据集(ImageNet real、pets、flowers、CIFAR-10、CIFAR-100)上做了evaluation,然后把这个数字平均了

在这里插入图片描述

(五)vit的内部表征

  • vision transformer的第一层(linear projection layer,E)提取出的头28个主成分,其实vision transformer学到了跟卷积神经网络很像,都是这种看起来像gabor filter,有颜色和纹理,所以作者说这些成分是可以当作基函数的,也就是说,它们可以用来描述每一个图像块的底层的结构
  • 学到的位置编码是可以表示一些距离信息的,同时它还学习到了一些行和列的规则,每一个图像块都是同行同列的相似性更高,也就意味着虽然它是一个1d的位置编码,但是它已经学到了2d图像的距离概念,这也可以解释为什么在换成2d的位置编码以后,并没有得到效果上的提升,是因为1d已经够用了
  • 随着网络越来越深,所有注意力头的注意距离增加,网络学到的特征也会变得越来越高级,越来越具有语义信息;大概在网络的后半部分,模型的自注意力的距离已经非常远了,也就是说它已经学到了带有语义性的概念,而不是靠邻近的像素点去进行判断。

在这里插入图片描述

参考:
ViT论文逐段精读【论文精读】
《Vision Transformer (ViT)》论文精度,并解析ViT模型结构以及代码实现
ViT(Vision Transformer)全文精读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1540112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 修改element-plus主题色

一、安装SCSS npm install sass --save-dev npm install sass-loader --save-dev npm install node-sass --save-dev npm install vue-style-loader --sava-dev 二、添加主题文件theme.scss forward "element-plus/theme-chalk/src/common/var.scss" with ($col…

vulnhub prime1通关

目录 环境安装 1.信息收集 收集IP 端口扫描 目录扫描 目录文件扫描 查找参数 打Boss 远程文件读取 木马文件写入 权限提升 方法一 解锁密钥 方法二: linux内核漏洞提权 总结 环境安装 Kali2021.4及其prime靶机 靶机安装:Prime: 1 ~ Vul…

腾讯云GPU服务器介绍_GPU实例规格价格_AI_深度学习

腾讯云GPU服务器是提供GPU算力的弹性计算服务,腾讯云GPU服务器具有超强的并行计算能力,可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景,腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…

docker 和K8S知识分享

docker知识: 比如写了个项目,并且在本地调试没有任务问题,这时候你想在另外一台电脑或者服务器运行,那么你需要在另外一台电脑或者服务器配置相同的软件,比如数据库,web服务器,必要的插件和库等…

Excel数字乱码怎么回事 Excel数字乱码怎么调回来

在日常工作中,Excel是我们最常使用的数据处理软件之一,它强大的功能使得数据处理变得既简单又高效。然而,用户在使用Excel时偶尔会遇到数字显示为乱码的问题,这不仅影响了数据的阅读,也大大降低了工作效率。那么&#…

光速论文能用吗 #媒体#知识分享#学习方法

光速论文是一个非常有效的论文写作、查重降重工具,它的使用非常简单方便,而且功能强大,是每个写作者必备的利器。 首先,光速论文具有强大的查重降重功能,能够快速检测论文中的抄袭部分,帮助作者避免不必要的…

clang-query 的编译安装与使用示例

1,clang query 概述 作用: 检查一个程序源码的抽象语法树,测试 AST 匹配器; 帮助检查哪些 AST 节点与指定的 AST 匹配器相匹配; 2,clang-query 安装 准备: git clone --recursive https://git…

ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境:Linux系统CentOS7.6、宝塔、PHP7.4、MySQL5.6,根目录public,伪静态thinkPHP,开启ssl证书 具有文章改写、广告营销文案、编程助手、办公达人、知心好友、家庭助手、出行助手、社交平台内容、视频脚本创作、AI绘画、思维导图等功能 ai通道:文心一言、MiniMax、智…

38 mars3d 对接地图图层 绘制点线面员

前言 这里主要是展示一下 mars3d 的一个基础的使用 主要是设计 接入地图服务器的 卫星地图, 普通的二维地图, 增加地区标记 基础绘制 点线面园 等等 测试用例 <template><div style"width: 1920px; height:1080px;"><div class"mars3dClas…

Linux :环境基础开发工具

目录: 1. Linux 软件包管理器 yum 1. 什么是软件包 2. 查看软件包 3. 如何安装软件 4. 如何卸载软件 2. Linux开发工具 1. Linux编辑器-vim的基本概念 2. vim使用 3. vim的基本操作 4. vim正常模式命令集 5. vim末行模式命令集 6. 简单vim配置 3. Linux编译器-gcc/…

python(django)之流程接口管理后台开发

1、在models.py中加入流程接口表和单一接口表 代码如下&#xff1a; from django.db import models from product.models import Product# Create your models here.class Apitest(models.Model):apitestname models.CharField(流程接口名称, max_length64)apitester model…

人事管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW调试部署环境&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java…

力扣面试150 加一 模拟 加法进位

Problem: 66. 加一 文章目录 思路复杂度Code 思路 模拟加法运算&#xff0c;逢十进一 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int[] plusOne(int[] d) {int n d.length;for(int i n-1; i > 0; i--){i…

2、怎么优化google网站才能获得好的排名

怎么才能让google搜索引擎对你的网站青睐且获得更好的排名&#xff1f;这个不的不说google的算法和机制。 什么是google搜索引擎算法&#xff1f; 是一套用于索引前对数据的入库的赛选及将用户所需要东西搜索显示的一个过程。从各种算法的赛选到用户曝光来确定网站关键词的排名…

【开发环境搭建篇】Nacos的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

使用插件将swagger文档转html或pdf

github上有maven开源插件swagger2markup将swagger文档转为.adoc格式的文档&#xff0c;另外一个maven开源插件asciidoctorj-pdf则可以将.adoc格式的文档转为html和pdf。由于GitHub访问不稳定&#xff0c;在gitee上有镜像项目。所以我就贴gitee上的项目地址了。 实现从swagger文…

135. 分发糖果(力扣LeetCode)

文章目录 135. 分发糖果题目描述贪心算法代码如下 总结 135. 分发糖果 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩…

【Netty 源码】NioEventLoop 源码分析 篇二

【Netty 源码】NioEventLoop 源码分析 篇二 1.NioEventLoop 继承关系 NioEventLoop继承自SingleThreadEventLoop&#xff0c;一次只能执行一个线程任务&#xff0c;因此在父类SingleThreadEventLoop中维护了 Queue tailTasks 线程队列。 NioEventLoop又间接继承了 AbstractS…

uni-app里面如何使用图标

目录 一、导入 1.在官方&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己想要的图标&#xff0c;加入购物车 2. 在点击购物车下载代码 3.解压文件夹 并更改名字 4.将文件夹&#xff08;iconfont&#xff09;整个放到项目中的static中 5.修改iconfont.css文件…

手机实时监控电脑屏幕(手机可以看到电脑在干什么吗)

已经2024年了&#xff0c;假如你还在问我&#xff0c;手机可以看到电脑在干什么吗&#xff0c;有没有手机实时监控电脑屏幕的系统。 那么证明&#xff0c;你可能已经out 了。 现代科技告诉发展的态势下&#xff0c;这种技术已经很成熟了。 域智盾软件就可以实现这种效果↓我们…