彻底改变计算机视觉的 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中的预处理宏的替代方案有哪些呢?本文将深入探讨这个问题,为你揭示…...
【综合案例】使用鸿蒙编写掘金评论列表案例
效果展示 功能描述 整个页面分为三大模块:顶部 主体【评论列表】 底部。 点击顶部的最新和最热按钮可以进行切换,点击最新按钮的时候主体部分的评论列表是按照时间由近至远进行排列展示,点击最热按钮的时候主体部分的评论列表是按照点赞数…...
学生项目福音:AI超清画质增强快速入门,WebUI界面开箱即用
学生项目福音:AI超清画质增强快速入门,WebUI界面开箱即用 1. 为什么你需要AI画质增强技术 1.1 低清图像的普遍困扰 作为学生开发者,你可能经常遇到这样的场景:课程项目需要展示清晰的图片素材,但手头只有模糊的截图…...
软件架构风格深度研究报告
软件架构风格是软件工程领域中描述系统组织方式的惯用模式,定义了系统家族的构件、连接件类型及其组合约束。随着云计算、微服务、容器等技术的崛起,软件架构实践日趋多元化。本文从经典分类体系出发,系统梳理了数据流风格、调用/返回风格、独…...
从零配置上网行为管理:H3C AC本地认证与第三方AAA服务器切换指南
从零构建企业级网络认证体系:H3C AC与第三方AAA服务器实战解析 在数字化转型浪潮中,企业网络管理正面临前所未有的复杂挑战。当新员工入职第一天无法连接Wi-Fi,当市场部反映视频会议频繁卡顿,当IT部门发现内网存在异常流量却无法追…...
CSS如何避免浮动元素换行_计算所有浮动元素的总宽度不超过父容器宽度
浮动元素换行是因子元素总宽度(含padding、border、margin)超过父容器可用宽度,导致最后一个被挤至下一行;这是float原始行为,非bug,需用box-sizing:border-box、flex布局等规避。浮动元素换行是因为父容器…...
5个超能力解决10大资源下载难题:自媒体人必备的跨平台资源捕获工具
5个超能力解决10大资源下载难题:自媒体人必备的跨平台资源捕获工具 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …...
SecGPT-14B知识库增强:让OpenClaw支持最新CVE漏洞库
SecGPT-14B知识库增强:让OpenClaw支持最新CVE漏洞库 1. 为什么需要给OpenClaw注入CVE知识库 去年处理Log4j2漏洞时,我遇到了一个尴尬场景:当我让OpenClaw帮我检查服务器是否存在CVE-2021-44228漏洞时,它给出的回答是"未找到…...
生成式推荐GR4AD
prompt 快手《Generative Recommendation for Large-Scale Advertising》值得阅读,生成式推荐这事 这两年聊的人很多,真能在大规模系统里全量落地的,基本没有。 这次快手团队把生成式推荐真正搬进大规模广告系统,是国内生成…...
og3x-shtc3:ESP32/ESP8266平台SHTC3温湿度传感器驱动库
1. 项目概述og3x-shtc3是一个面向 ESP32/ESP8266 平台、专为og3(Open Gateway 3)固件生态设计的轻量级传感器驱动扩展库,核心目标是为 SHTC3 数字温湿度传感器提供完整、可靠且低功耗的 Arduino 框架兼容支持。该库并非独立运行的传感器 SDK&…...
seo中文网站如何应对算法更新
SEO中文网站如何应对算法更新 在互联网的迅速发展中,搜索引擎的算法更新频繁,这对SEO中文网站提出了更高的要求。面对这一挑战,我们需要深入分析问题,理解原因,并采取有效的应对策略。本文将详细探讨如何应对搜索引擎…...
如何永久保存微信聊天记录并挖掘数据价值?WeChatMsg全攻略
如何永久保存微信聊天记录并挖掘数据价值?WeChatMsg全攻略 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...
