彻底改变计算机视觉的 Vision Transformer (ViT) 综合指南(视觉转换器终极指南)
欢迎来到雲闪世界。大家好!对于那些还不认识我的人,我叫 Francois,我是 Meta 的研究科学家。我热衷于解释先进的 AI 概念并使其更容易理解。
今天,让我们深入探讨计算机视觉领域最重要的贡献之一:Vision Transformer(ViT)。

首先介绍一些历史......
Vision Transformer 由 Alexey Dosovitskiy 等人 (Google Brain) 于 2021 年在论文《一张图片价值 16×16 个字》中提出。当时,Transformers 已被证明是实现 NLP 任务出色性能的关键,并于 2017 年在必读论文《注意力就是你所需要的一切》中提出。
2017 年至 2021 年间,曾有多次尝试将注意力机制集成到卷积神经网络 (CNN) 中。然而,这些尝试大多是混合模型(将 CNN 层与注意力层相结合),缺乏可扩展性。谷歌通过完全消除卷积并利用其计算能力来扩展模型来解决此问题。
这篇文章回答的价值百万美元的问题是……
Google Vision 团队遵循了 Google 内部另一个设计文本 Transformers 的团队提供的指导方针。他们解决的关键挑战是:
“注意力机制如何适应图像?”
在 NLP 中,标记(单词或子单词)是计算注意力的基础。然而,图像本身并不适合进行这样的标记化。单个像素应该被视为一个标记吗?还是应该将整个图像视为一个标记?
如果将每个像素视为一个单位,则需要计算所有像素的注意力机制。对于 224×224(包含 50,176 个像素)这样的低分辨率图像,这将需要大约25 亿次运算——以目前的技术来说,这是一项不切实际的任务。
相反,将整个图像视为单个标记太过简单。解决方案介于两者之间:将图像转换为一系列补丁。在他们的论文中,作者使用了分辨率为16×16 像素的补丁。
Vision Transformer 架构:

关键符号:
- P = 16:补丁大小
- H, W:图像的高度和宽度,必须能被 P 整除
- C = 3:通道数(RGB)
- D:潜在向量大小,表示补丁标记展平后的维度。
从数学上来说:

这是需要理解的最重要的部分。一旦我们有了一系列标记,我们就可以应用 Transformer 编码器。我们只需要了解如何向这些标记添加位置编码,以及如何从所有标记中获取单个向量表示。
CLS(类)标记:整个图像的表示
如果您熟悉注意力机制,您就会认识到,从N 个标记开始并应用L层注意力会产生N 个标记 — 每个补丁一个。这形成了“特征图”,其中每个补丁被编码为维度为 D 的向量(标记)。
然而,要对图像进行分类,我们需要一个向量来表示它。虽然可以将所有N 个token 平均或“池化”为一个向量,但作者采用了一种类似于 BERT 的方法,即引入一个专门用于此用途的 token:CLS token。
此标记附加到图像中的其他N 个标记。因此输入序列由N+1 个标记组成。
位置编码

将 token 直接输入注意力机制会导致缺乏空间意识,因为该机制不知道每个块的位置。为了解决这个问题,我们为每个 token 添加了位置编码。
位置编码可以是硬编码的(例如,使用 sin/cos 函数,如在“Attention is All You Need ”论文中所述)或在训练期间学习。
我个人非常喜欢 Barton 和 Sutton 的“惨痛教训”,即每当我们尝试将归纳偏差放入模型中时,我们都会发现,如果有足够的数据和缩放,让模型自己学习实际上会更好。
在 VIT 论文中,位置编码是可以学习的。从上一部分中,我们看到我们以维度(N+1, D) 的矩阵结束。因此,位置编码也是添加的维度(N+1, D)的矩阵。
很好!现在我们对 ViT 架构有了全面的了解。
更高分辨率下的微调
在现代深度学习中(例如 2017 年 Transformer 问世之后),解决问题的标准方法变成了:
步骤 1:在非常大的数据集上预训练一个非常大的神经网络
第 2 步:针对我们想要解决的任务进行微调。
在计算机视觉中,有一个很酷的技巧可以提高性能:以比预训练期间使用的分辨率(通常较低)更高的分辨率对 Vision Transformer (ViT) 进行微调。但“以更高的分辨率进行微调”到底是什么意思?这是否意味着我们在图像中使用更小的块,以便我们拥有更多的标记,还是我们只是拍摄更高分辨率的图像?它是如何工作的?
让我们开始吧!
这是我个人偶然遇到的一个问题,所以我将深入解释它。
当我们提到以更高的分辨率进行微调时,我们的意思是增加图像分辨率,同时保持补丁分辨率固定。
例如,将图像分辨率从 224×224 增加到 640×640 会导致补丁数量从 196 个增加到 1600 个。这带来了挑战,因为位置嵌入矩阵最初的大小为 196 个标记,不再与新的标记数量相匹配。
那么,解决办法是什么?
插值。我们通过使用双三次插值填充间隙来扩展原始位置嵌入,从而有效地调整嵌入大小以匹配新的补丁数量。

ViT 的缩放定律

ViT 的缩放定律
与卷积神经网络 (CNN) 不同,视觉变换器 (ViT) 缺乏内置归纳偏差,例如空间局部性和平移不变性。这意味着 ViT 必须完全从数据中学习这些模式,这使得它们成为高度数据密集型模型。
因此,我们可以想知道随着数据和参数的增多,VIT 的性能会如何发展。
ViT 的优点在于,它们的性能能够随着更多数据和更多参数而很好地扩展。
然而,有一个问题。在数据有限的情况下,传统的 CNN 往往占上风。CNN 采用归纳偏差设计,使其能够更有效地从较小的数据集中学习。它们利用空间层次和局部特征等模式,这使得它们在数据稀疏时表现更好。
因此,如果您要解决数据有限的问题,CNN 可能是更好的选择。但如果您的数据集很大,ViT 可能会提供更出色的性能。盈亏平衡点取决于您的数据的具体情况。
模型到底学到了什么?
让我们来分析一下一些关键见解:
1.嵌入过滤器是什么样的?
2.模型如何学习位置嵌入?
3.注意力机制是关注附近的标记还是远处的标记?
1.嵌入过滤器:
值得注意的是,ViT 学习到的 RGB 嵌入过滤器与 CNN 中的过滤器类似,可以捕捉垂直线和水平线等基本视觉纹理。从本质上讲,尽管 ViT 不使用卷积,但它们学习到的嵌入在识别和表示基本图像特征方面具有类似的用途。
2. 位置嵌入:
当谈到位置嵌入时,ViT 会形成网格状结构。学习到的嵌入通常表现出一种模式,即同一行或同一列中的值相似。
有趣的是,发现模型自己学习了这种位置编码,它能够理解图像的结构(虽然它只能看到一个标记列表)。
3.注意力机制:
ViT 中的注意力机制在整个网络层中不断发展。在早期阶段,它倾向于关注附近的标记,这类似于捕获局部特征的方式。随着您深入网络,注意力机制会转向更全局的视角,使模型能够整合来自远处标记的信息并理解整个图像的高级关系。
这种从局部到全局注意力的进展凸显了 ViT 在处理图像时如何构建越来越复杂的表示,从而使其能够捕捉复杂的模式。
总之,虽然 ViT 从学习基本的视觉模式和位置信息开始,但它们逐渐发展出推理图像中更大、更抽象特征的能力。

恭喜你,你成功了!
感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)
相关文章:
彻底改变计算机视觉的 Vision Transformer (ViT) 综合指南(视觉转换器终极指南)
欢迎来到雲闪世界。大家好!对于那些还不认识我的人,我叫 Francois,我是 Meta 的研究科学家。我热衷于解释先进的 AI 概念并使其更容易理解。 今天,让我们深入探讨计算机视觉领域最重要的贡献之一:Vision Transformer&…...
vue3 v-bind=“$attrs“ 的一些理解,透传 Attributes相关说明及事例说明
1、可能小伙伴们经常会在自己的项目中看到v-bind"$attrs",这个一般是在自定义组件中看到。 比如: <template><BasicModalv-bind"$attrs"register"registerModal":title"getTitle"ok"handleSubm…...
鸿蒙开发基础知识-页面布局【第四篇】
1.类型转换 2.交互点击事件 3.状态管理 4.forEch渲染和右上角图标 测试案例 Stack 层叠布局一个生肖卡 5. 动画展示图片 6. Swiper 轮播组件的基本使用 图片等比显示 aspectRatio()...
用CSS实现前端响应式布局
一、响应式布局的重要性 随着移动设备的普及,越来越多的用户通过手机、平板电脑等设备访问网页。如果网页不能适应不同的屏幕尺寸,就会出现布局混乱、内容显示不全等问题,严重影响用户体验。响应式布局可以确保网页在各种设备上都能保持美观…...
【docker】docker启动sqlserver
sqlserver-docker官方地址 # sqlserver不是从docker的中央仓库拉取的,而是从ms的仓库拉取的。 docker pull mcr.microsoft.com/mssql/server:2019-latest# 宿主机即docker程序运行的linux服务器 docker run -d \ --user root \ --name mssql2019 \ -e "ACCEPT…...
Python爬虫01
requests模块 文档 安装 pip/pip3 install requestsresponse.text 和 response.content的区别 1.response.text 等价于 response.content.decode("推测出的编码字符集")response.text 类型:str 编码类型:requests模块自动根据Http头部对…...
关于vue项目启动报错Error: error:0308010C:digital envelope routines::unsupported
周五啦,总结一下这周遇到的个别问题吧,就是关于启动项目的时候其他的东西都准备好了,执行命令后报错Error: error:0308010C:digital envelope routines::unsupported 这里看一下我标注的地方,然后总结一下就不难发现问题所在 查看…...
随笔1:数学建模与数值计算
目录 1.1 矩阵运算 1.2 基本数学函数 1.3 数值求解 数学建模与数值计算 是将实际问题通过数学公式和模型进行描述,并通过计算获得模型解的过程。这是数学建模中最基本也是最重要的环节之一。下面是详细的知识点讲解及相应的MATLAB代码示例。 1.1 矩阵运算 知识点…...
SDN架构详解
目录 1)经典的IP网络-分布式网络 2)经典网络面临的问题 3)SDN起源 4)OpenFlow基本概念 5)Flow Table简介 6)SDN的网络架构 7)华为SDN网络架构 8)传统网络 vs SDN 9…...
platform框架
platform框架 注册设备进入总线platform_device_register函数 注册驱动进入总线platform_driver_register函数 注册设备进入总线 platform_device_register函数 int platform_device_register(struct platform_device *pdev) struct platform_device {const char * name; 名…...
零成本搞定静态博客——十分钟安装hugo与主题
文章目录 hugo介绍hugo安装与使用方式一:新建站点自建主题方式二:新建站点使用系统推荐的主题 hugo介绍 通过 Hugo 你可以快速搭建你的静态网站,比如博客系统、文档介绍、公司主页、产品介绍等等。相对于其他静态网站生成器来说,…...
windows C++ 并行编程-转换使用取消的 OpenMP 循环以使用并发运行时
某些并行循环不需要执行所有迭代。 例如,搜索值的算法可以在找到值后终止。 OpenMP 不提供中断并行循环的机制。 但是,可以使用布尔值或标志来启用循环迭代,以指示已找到解决方案。 并发运行时提供允许一个任务取消其他尚未启动的任务的功能。…...
经验笔记:跨站脚本攻击(Cross-Site Scripting,简称XSS)
跨站脚本攻击(Cross-Site Scripting,简称XSS)经验笔记 跨站脚本攻击(XSS:Cross-Site Scripting)是一种常见的Web应用程序安全漏洞,它允许攻击者将恶意脚本注入到看起来来自可信网站的网页上。当…...
演示:基于WPF的DrawingVisual和谷歌地图瓦片开发的地图(完全独立不依赖第三方库)
一、目的:基于WPF的DrawingVisual和谷歌地图瓦片开发的地图 二、预览 三、环境 VS2022,Net7,DrawingVisual,谷歌地图瓦片 四、主要功能 地图缩放,平移,定位 真实经纬度 显示瓦片信息 显示真实经纬度和经纬线 省市县…...
【C++】static作用总结
文章目录 1. 在函数内(局部静态变量)2. 在类中的静态成员变量3. 在类中的静态成员函数4. 在文件/模块中的静态变量或函数总结 1. 在函数内(局部静态变量) 当 static 用于函数内的局部变量时,该变量的生命周期变为整个…...
视频提取字幕的软件有哪些?高效转录用这些
探索视频的奥秘,从字幕开始!你是否曾被繁复的字幕处理困扰,渴望有一款简单好用的在线免费软件来轻松解锁字幕提取? 告别手动输入的烦恼,我们为你精选了6款视频字幕提取在线免费软件,它们不仅能一键转录&am…...
(4)SVG-path中的椭圆弧A(绝对)或a(相对)
1、概念 表示经过起始点(即上一条命令的结束点),到结束点之间画一段椭圆弧 2、7个参数 rx,ry,x-axis-rotation,large-arc-flag,sweep-flag,x,y (1)和(2&a…...
docker国内镜像源报错解决方案
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. 遇到 Job for docker.service failed because the control process exited with error …...
《C++进阶之路:探寻预处理宏的替代方案》
在 C编程的历程中,预处理宏曾经扮演了重要的角色。然而,随着 C语言的不断发展和编程理念的进步,预处理宏的一些弊端也逐渐显现出来。那么,C中的预处理宏的替代方案有哪些呢?本文将深入探讨这个问题,为你揭示…...
【综合案例】使用鸿蒙编写掘金评论列表案例
效果展示 功能描述 整个页面分为三大模块:顶部 主体【评论列表】 底部。 点击顶部的最新和最热按钮可以进行切换,点击最新按钮的时候主体部分的评论列表是按照时间由近至远进行排列展示,点击最热按钮的时候主体部分的评论列表是按照点赞数…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
