部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >NeurIPS 2021 | 图像未必值16x16词:可变序列长度的动态视觉Transformer来了

NeurIPS 2021 | 图像未必值16x16词:可变序列长度的动态视觉Transformer来了

作者头像
AI科技评论
发布于 2021-10-22 02:20:32
发布于 2021-10-22 02:20:32
8590
举报
文章被收录于专栏:AI科技评论AI科技评论

作者 | 王语霖

本文主要介绍刚刚被NeurIPS-2021会议录用的一篇关于动态Transformer的最新工作:Not All Images are Worth 16x16 Words: Dynamic Vision Transformers with Adaptive Sequence Length,全部代码和预训练模型已经在Github上开源。

论文链接:https://arxiv.org/abs/2105.15075

代码:https://github.com/blackfeather-wang/Dynamic-Vision-Transformer

太长不看版:以ViT为代表的视觉Transformer通常将所有输入图像表征为固定数目的tokens(例如16x16和14x14)。这项工作发现采用定长的token序列表征数据集中所有的图像是一种低效且次优的做法,并提出一种可针对每个样本自适应地使用最合适的token数目进行表征的动态ViT模型。该方法在ImageNet上将T2T-ViT的平均推理速度(GPU实测)加快了1.4-1.7倍。其主要思想在于利用级联的ViT模型自动区分“简单”与“困难”样本,实现自适应的样本推理。为了减少级联模型中的冗余计算,文章还提出了特征重用与关系重用的模型设计思路。

图1 Dynamic Vision Transformer(DVT)示例

1

Introduction(研究动机及简介)

近半年来,以Google的工作《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》为代表的Vision Transformer(ViT)系列视觉模型受到了学界的广泛关注,这些模型通常将图像数据划分为固定数目的patch,并将每个patch对应的像素值采用线性映射等方式嵌入为一维的token,作为Transformer模型的输入,示意图如下所示。

图2 Vision Transformer(ViT)对输入的表征方式

假设模型结构固定,即每个token的维度大小固定,将输入表征为更多的token可以实现对图片更为细粒度的建模,往往可以有效提升模型的测试准确率;然而与此相对,由于Transformer的计算开销随token数目成二次方增长,增多token将导致大量增长的计算开销。为了在精度和效率之间取得一个合适的平衡,现有的ViT模型一般将token数设置为14x14或16x16。

而论文则提出,一个更合适的方法应当是,根据每个输入的具体特征,对每张图片设置对其最合适的token数目。具体而言,不同图片在内容、远近、物体大小、背景、光照等诸多方面均存在较大的差异,将其切分为相同数目和大小的patch没有考虑适应这些要素的变化,因而极有可能是次优的。以下图为例,左侧的苹果图片构图简单且物体尺寸较大,右侧图片则包含复杂的人群、建筑、草坪等内容且物体尺寸均较小。显然,前者只需要少量token就可以有效表征其内容,后者则需要更多的token描述不同构图要素之间的复杂关系。

图3 根据具体输入确定token数目

这一问题对于网络的推理效率是非常关键的。在下表中,文章使用比原文推荐值(14x14)更少的token数目训练了一个T2T-ViT-12模型,并报告了对应的测试精度和计算开销。从结果中可以看到,若将token数目设置为4x4,准确率仅仅下降了15.9%(76.7% v.s. 60.8%),但计算开销下降了8.5倍(1.78G v.s. 0.21G)。这一结果表明,正确识别占数据大多数的较“简单”的样本只需4x4或更少的token,相当多的计算浪费在了使用存在大量冗余的14x14 token表征他们。

表1 T2T-ViT-12使用更少token时的测试精度和计算开销

2

Method(方法详述)

受到上述现象的启发,论文提出了一个动态视觉Transformer框架(Dynamic Vision Transformer,DVT),意在针对每个样本选择一个合适数目的token来进行表征。

首先介绍DVT的推理过程,如图2所示。论文使用从小到大的token数目训练了一组Transformer模型,他们具有相同的基本结构,但是参数相互独立,以分别适应逐渐增多的token数目。对于任意测试样本,首先将其粗略表征为最小数目的token,输入第一个Transformer,以低计算成本迅速得到初步预测。而后判断预测结果是否可信,若可信,则直接输出当前结果并终止推理;若不可信,则将输入图片表征为更多的token,激活下一个Transformer进行更细粒度、但计算开销更大的的推理,得到结果之后再次判断是否可信,以此类推。论文采用将预测的置信度(confidence)与一个固定阈值进行比较的方式作为准出的判断准则,关于这一方法的细节和其合理性的验证,由于空间有限,请参见paper。

值得注意的是,处于下游的Transformer可以复用先前模型已产生的深度特征和注意力图(attention maps),以尽可能避免进行冗余和重复的计算,关于这一点,将在下文详述。

图4 Dynamic Vision Transformer(DVT)

显然,DVT框架中所有的Transformer都具有相同的训练目标。因此当一个处于下游位置的Transformer被激活时,一个显然更为高效的做法是,应当训练其在先前Transformer已提取的特征的基础上进行进一步提升,而非完全从0开始重新提取特征。出于这一点考虑,论文提出了一个特征复用机制,如下图所示。将上游Transformer最后一层输出的特征取出,经MLP变换和上采样(Upsample)后,作为上下文嵌入(Context Embedding)以Concat的方式整合入下游模型每一层的MLP模块中。

图5 特征复用(Feature Reuse)机制

除特征外,Transformer中还有一个关键的组分,即自注意力机制中的注意力图(attention maps)。视觉Transformer通过这些注意力图建模token之间的关系,从而实现对每个具体的token进行来自全局的信息整合。在论文所提出的DVT框架中,位于下游的模型同样可以借助上游Transformer已经得到的注意力图来进行更准确的全局注意力关系建模,论文称之为关系复用,示意图如下所示。将上游模型的全部注意力图以logits的形式进行整合,经MLP变换和上采样后,加入到下层每个注意力图的logits中。这样,下游模型每一层的attention模块都可灵活复用上游模型不同深度的全部attention信息,且这一复用信息的“强度”可以通过改变MLP的参数自动地调整。

图6 关系复用(Relationship Reuse)机制

值得注意的是,对特征图进行上采样需要对其行或列进行重组后分别完成,以确保其几何关系的对应性,下图给出了一个例子。

图7 对注意力图进行上采样

由于空间有限,关于DVT的更多细节以及对两种复用机制有效性的验证、结构设计的探究和更进一步的讨论,请参见paper。

3

Experiments(实验结果)

DVT的一个显著优势在于,大多数的视觉Transformer均可作为其的backbone以获得更高的计算效率,在实验中,论文基于T2T-ViT和DeiT测试了所提出的的方法。

DVT(T2T-ViT-12/14)在ImageNet图像识别任务上的计算效率如下,可见该方法对backbone的提速比在1.6-3.6x,对大模型效果尤为明显。

图8 DVT(T2T-ViT)在ImageNet上的计算效率

DVT(T2T-ViT-14)在ImageNet上的实际推理速度如下,基于Nvidia 2080Ti GPU,batch size=128,在每个出口移除终止推理的样本。对于小模型,DVT可以在不减慢速度的前提下显著提升效果;对于大模型,DVT可以在不降低表现的前提下显著提速。

表2 DVT(T2T-ViT)在ImageNet上的实际速度

DVT(T2T-ViT-12/14)在CIFAR图像识别任务上的计算效率如下。

表3 DVT(T2T-ViT)在CIFAR上的计算效率

DVT(DeiT)在ImageNet图像识别任务上的计算效率如下,该方法效果同样明显。

图9 DVT(DeiT)在ImageNet上的计算效率

那么,什么样的样本适合更少的token,什么样的样本适合更多的token呢?下图给出了可视化的结果,“easy”和“hard”分别代表需要少和多的token数目。可见,后者往往包含复杂的场景、较小的物体尺寸、以及一些非常规的姿态和角度。

图10 可视化结果

4

Conclusion(结语)

这篇工作的价值至少体现在两个方面:

(1)针对视觉Transformer提出了一个自然、通用、有效的自适应推理框架,理论和实际效果都比较显著。

(2)提出了一个颇具启发性的思路,即目前大多数视觉Transformer采用的、对全部图片以固定方式划分patch的表征方式,是不够灵活和次优的,一个更合理的策略是,应当根据输入数据动态调整表征方式。这或为开发高效、可解释性强、迁移性好的通用视觉Transformer提供了新方向。

如有任何问题,欢迎留言或者给我发邮件。

作者主页链接:https://www.rainforest-wang.cool/

本文经授权转载自知乎:rainforest wang

原文:https://zhuanlan.zhihu.com/p/377961269?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技评论 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《PHP技术大全·第1卷》Generator 通俗解读
下面是 Iterator 接口的伪代码(伪代码是指非真实代码,通常用于表达基本的用途)。
猿哥
2019/07/25
5590
关于PHP流不得不说的那些事
相信不少PHP开发者或多或少都见过类似于 "php://input" 或者 "php://output" 这样的内容,很多人都知道这两个的作用一个是接收的 POST 请求中的原始 body 内容,另一个其实和 echo 之类的输出一样是进行输出的。当然,我们的文章内容不会如此的简单,其实类似这样的 php:// 开头的协议还有好几种,它们共同称为 PHPIO流协议(PHP输入/输出流协议) 。
硬核项目经理
2020/05/18
6030
关于PHP流不得不说的那些事
PHP常用函数总结
$x = 5.7; $y = 1.3; // 两个浮点数,x>y 浮点余数 $r = fmod($x, $y); // $r equals 0.5, because 4 * 1.3 + 0.5 = 5.7
V站CEO-西顾
2018/06/12
3.3K1
了解PHP中Stream(流)的概念与用法
Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数。Stream可以翻译为“流”,在Java里,流是一个很重要的概念。 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。根据流的方向又可以分为输入流和输出流,同时可以在其外围再套上其它流,比如缓冲流,这样就可以得到更多流处理方法。 PHP里的流和Java里的流实际上
wangxl
2018/03/07
1.9K0
php的各种 I/O流 以及用法
php://协议 首先,我们来说一下一个php提供的协议:"php://" 或许有人看到这个会懵逼,这是什么东东?这有啥用?这咋用?我是谁?我在哪?我要去往何处? 恩,大家可以翻开php手册,搜索一下
仙士可
2019/12/19
1.4K0
php的各种 I/O流 以及用法
[Web安全]PHP伪协议
[Web安全]PHP伪协议 最近php伪协议的各种神奇妙用好像突然又常常提到了,php中支持的伪协议有下面这么多 复制代码 file:// — 访问本地文件系统 http:// — 访问 HTTP(s) 网址 ftp:// — 访问 FTP(s) URLs php:// — 访问各个输入/输出流(I/O streams) zlib:// — 压缩流 data:// — 数据(RFC 2397) glob:// — 查找匹配的文件路径模式 phar:// — PHP 归档 ssh2:// — Secure
安恒网络空间安全讲武堂
2018/02/06
2.5K0
php使用yield解决Fatal error: Allowed memory size of 134217728 bytes exhausted
yield生成器允许你 在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组。
崔哥
2022/09/23
4540
3分钟短文 | 大神救我!18G的大文件,PHP咋按行读取?
想逐行读取文件,完全避免把这个文件加载到内存中。如果文件太大(比如 18G),无法在内存中打开,还是要硬来的话,会抛出异常。
程序员小助手
2020/06/19
1.3K0
编程日记:PHP实用函数记录
ignore_user_abort() ,可以实现当客户端关闭后仍然可以执行PHP代码,可保持PHP进程一直在执行,可实现所谓的计划任务功能与持续进程,只需要开启执行脚本,除非 apache等服务器重启或有脚本有输出,该PHP脚本将一直处于执行的状态;
房东的狗丶
2023/02/17
2.7K0
PHP大文件读取操作
简单的文件读取,一般我们会使用 file_get_contents() 这类方式来直接获取文件的内容。不过这种函数有个严重的问题是它会把文件一次性地加载到内存中,也就是说,它会受到内存的限制。因此,加载大文件的时候是绝对不能使用这种方式的。我们还是先看看这种方式加载的例子。
硬核项目经理
2020/06/16
2.7K0
PHP-文件操作
1、文本流有明确的结束符,二进制流没有明确的结束符,通过文件大小判断文件是否读取完毕
cwl_java
2020/03/26
6450
PHP 多任务协程处理
上周 有幸和同事一起在 SilverStripe 分享最近的工作事宜。今天我计划分享 PHP 异步编程,不过由于上周我聊过 ReactPHP;我决定讨论一些不一样的内容。所以本文将探讨多任务协程这方面的内容。
柳公子
2018/09/17
1.3K0
PHP 多任务协程处理
PHP 字符串与文件操作
字符串比较(字节序): 字节序比较可以使用strcmp/strcasecmp两个函数,只需传入两个字符串即可.
王瑞MVP
2022/12/28
8160
PHP对大文件进行读取切割拆分
近期在对项目日志进行分析时,发现日志文件较大,里面的文件行数也较多,使用编辑器进行打开或使用分析工具打开时较慢,于是将其拆分成多个小文件,便于对其进行分析、查看。
申霖
2019/12/27
2K0
PHP-协议流学习
可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。
偏有宸机
2020/11/04
1K0
PHP读取大文件【php】
php操作文件一般是file、file_get_contents等此类函数。但是如果处理大文件,这些函数受限于性能和内存,可能就不是那么理想了!
sinnoo
2021/07/27
6.1K0
php面试笔记(7)-php基础知识-文件及目录处理考点
在面试中,考官往往喜欢基础扎实的面试者,而文件及目录处理相关的考点,往往是大家容易忽视的一个点,今天冷月就来帮各位小伙伴们梳理一下,在面试中文件及目录处理相关的注意点。
学长冷月
2020/08/02
7160
基于PHP常用文件函数和目录函数整理
string basename ( string $path [, string $suffix ] ) //给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。
用户2323866
2021/06/30
7530
PHP 中的文件处理(读取、写入、上传)
文件处理是 Web 开发中常见的需求,几乎所有的 Web 应用都需要与文件进行交互。不论是读取文件、写入文件,还是文件上传,都需要用到 PHP 中的文件操作函数。掌握 PHP 的文件操作功能,可以帮助开发者高效地处理服务器上的文件,实现数据存储、日志记录、文件上传等多种功能。本篇博客将详细介绍 PHP 中的文件处理,包括文件的读取、写入、上传等常用操作,并通过实例帮助你深入理解。通过学习这些基本的文件操作,您将能够在开发 Web 应用时轻松处理与文件相关的各种任务。
繁依Fanyi
2025/01/17
3270
【php学习笔记】文件系统---制作备忘录和修改配置文件
我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。
20岁爱吃必胜客
2022/11/13
1.2K0
【php学习笔记】文件系统---制作备忘录和修改配置文件
相关推荐
《PHP技术大全·第1卷》Generator 通俗解读
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档