百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

FlexiViT:一个适应所有 Patch 大小的 ViT 模型

bigegpt 2025-02-10 11:29 9 浏览

作者丨科技猛兽

编辑丨极市平台

本文目录

1 FlexiViT:一个适应所有 Patch 大小的 ViT 模型
(来自谷歌,ViT,MLP-Mixer 作者团队)
1 FlexiViT 论文解读
1.1 背景和动机
1.2 标准 ViT 对于 Patch Size 灵活吗?
1.3 对于 Patch Size 更灵活的 FlexiViT 模型
1.4 如何改变 Patch Embedding 的尺寸?
1.5 与知识蒸馏的关系
1.6 FlexiViT 的内部表征
1.7 实验:使用预训练的 FlexiViT 模型

1 FlexiViT:一个适应所有 Patch 大小的 ViT 模型

论文名称:FlexiViT: One Model for All Patch Sizes

论文地址:

https://arxiv.org/pdf/2212.08013.pdf

1.1 背景和动机

视觉 Transformer (ViT) 和 CNN 模型不同的一点是对输入图片处理方式的不同:ViT 的处理方式是分块化 (Patchification) 将图像切割成不重叠的 Patches,并对这些 Patches 通过线性映射得到的 tokens 进行后续的运算。而 CNN 通过一些密集的,重叠的卷积来处理输入图片,使之转化成特征图。那么我们可以发现,ViT 这种与 CNN 完全不同的处理图片的范式解锁了新的功能。比如,我们可以随机丢弃一些不重要的 tokens 来提升模型的效率,额外增加一些 tokens 来适应新的任务,或者混合一些不同模态的 tokens。

尽管分块化对 ViT 模型很重要,但块的大小的作用却在之前的工作中很少受到关注。最初的 ViT 使用三种 Patch Size (32×32, 16×16 和 14×14 像素),但许多后续工作将 Patch Size 固定在 16×16。在这项工作中,作者提出 Patch Size 在不改变模型参数量的前提下,为模型的计算复杂度和预测性能提供了一个简单而有效的平衡。

比如,一个 ViT-B/8 模型在 156 GFLOPs 和 85 M 参数的情况下,在 ImageNet-1K 上的 Top-1 准确率为 85.6%,而一个 ViT-B/32模型在 8.6 GFLOPs 和 87 M 参数的情况下,在 ImageNet-1K 上的 Top-1 准确率仅仅为 79.1%。尽管在性能和计算复杂度方面存在巨大的差异,但是这些模型在本质上具有相同的参数。一个标准的 ViT 模型,训练时候的 Patch Size 是多大,它只能够在那个 Patch Size 的情况下取得良好的性能。当 Patch Size 改变时,一般模型就需要重新训练。

为了克服这一限制,本文提出 FlexiViT,希望在不增加成本的前提下,训练一个可以适应所有 Patch Size 的 ViT 模型。为了训练 FlexiViT,作者在训练过程中随机化 Patch Size,并对位置编码参数和 patch embedding 参数做 Resize 操作。这些简单的修改已经足以获得强大的性能,此外,作者借助 KD 获得更好的结果。

1.2 标准 ViT 对于 Patch Size 灵活吗?

图1:FlexiViT 方法框架

接下来作者表明,一个预训练好的标准 ViT 模型,在不同的 Patch Size 下会产生较差的性能,如下图2虚线所示。这里为了适配 Patch Size 大小的改变,作者简单地用双线性插值调整 Patch Embedding 权重ω 和位置编码 π 。

可以看到,标准 ViT 模型的性能随着 Patch Size 偏离预训练 Patch Size 的大小程度越大,ViT 性能的下降也越大。因此,标准 ViT 对于 Patch Size 是不灵活的,作者也因此开发了 FlexiViT,希望解决这个问题。

图2:一个预训练好的标准 ViT 模型,在不同的 Patch Size 下会产生较差的性能

1.3 对于 Patch Size 更灵活的 FlexiViT 模型

如图2中的实线所示是 FlexiViT-B 模型的性能,可以看到性能与 ViT-B/16 和 ViT-B/30 接近,且当 Patch Size 是16和30除外的其他数时,性能均优于 ViT-B/16 和 ViT-B/30。FlexiViT-B 模型的训练方法与 ViT-B/16 和 ViT-B/30 一致,但是不同的是,在训练的每一步,Patch Size 的大小都是从一组预定义的 Patch Size 中均匀随机选择的。只需要对模型和训练的代码做以下2处修改即可。

第1处: 模型需要为 Patch Embedding 的权重参数 ω 和位置编码 π 定义一个基本的 Shape,并在模型前进过程中动态调整大小。这个基本的 Shape 的具体大小并不重要,作者在所有实验中使用 32×32 的 Patch Embedding 的 7×7 的位置编码。

第2处: 为了做出各种各样的 Patch Size,作者使用了 240x240 的图像分辨率,也就是说,Patch Size 的大小可以是 {240,120,60,48,40,30,24,20,16,15,12,10,8,6,5,4,2,1},其中作者使用的 Patch Size 大小都在48和8之间。在每次迭代中,从这些 Patch Size 大小的均匀分布 P 中采样。

注意,改变 Patch Size 大小不等于改变图片分辨率的大小,这二者是完全不一样的两回事。Patch Size 大小纯粹是对模型的改变,而改变图像大小可能会大大减少可用信息。以上2处的改进,如下列算法所示。

model = ViT(...)
for batch in data:
  ps = np.random.choice([8, 10, ..., 40, 48])
  logits = model(batch["images"], (ps, ps))
  # [...] backprop and optimize as usual

class ViT(nn.Module):
  def __call__(self, image, patchhw):
    # Patchify, flexibly:
    w = self.param("w_emb", (32, 32, 3, d))
    b = self.param("b_emb", d)
    w = resize(w, (*patchhw, 3, d))
    x = conv(image, w, strides=patchhw) + b
    # Add flexible position embeddings:
    pe = self.param("posemb", (7, 7, d))
    pe = resize(pe, (*x.shape[1:3], d))
    return TransformerEncoder(...)(x + pe)

1.4 如何改变 Patch Embedding 的尺寸?

可以看到, Patch Size 为 p 和 2p 的情况下, Patch Embedding 结果的幅值差了4倍左右, 这也许就是标准 ViT 模型对于 Patch Size 不灵活的原因。

作者认为:理想情况下, Patch Size 调整大小的过程中没有信息丟失, 调整大小后的 ?x,ω? 与调整大小前的 ?x,ω? 应该保持相同。

然后,作者把双线性插值的过程等效为一次线性映射:

那么有了这样的一系列变换之后,Patch Size 调整大小的过程中就有:

在 Patch Size 减小的情况下,式2可以重写成:

类似式4的推导,最优解是:

总而言之,可以将定义 PI-resize (伪逆 resize) 为:

其中, Ppp? 就是对应于 PI-resize 变换的矩阵, 只需要将它乘以 vec?(ω) 即可得到新的 Patch Embedding 权重。PI-resize 操作调整 Patch Embedding 权重的大小。

为了验证 PI-resize 的有效性, 作者将其与几种备选方法 (包括标准线性 resize) 进行比较, 结果如下图3所示。首先加载一个预训练的 ViT-B/8 模型, 并调整图像和 Patch Size 大小, 保持序列长度 s=(224/8)2=784 不变。可以发现在下面的几种 resize 方法中, 只有 PI-resize 维持了性能。

图3:PI-resize 在模型输入和 Patch size 变化时可以维持性能

1.5 与知识蒸馏的关系

知识蒸馏中,一个通常较小的学生模型被训练来模仿一个通常较大的教师模型的预测。与标准标签监督训练相比,这可以显著提高学生模型的性能。使用 FlexiViT,可以用一个强大的 ViT 教师的权重初始化一个学生 FlexiViT,并显著提高蒸馏性能。本文从 ViT-B/8 模型初始化并且蒸馏得到一个 FlexiViT-B 模型。在初始化时,作者使用 PI-resize 调整教师模型的 Patch Embedding 权重为 32×32,并双线性地重新采样其位置编码为 7×7。然后按照 FunMatch 方法训练学生模型,最小化教师和学生 FlexiViT 之间的 KL Divergence。


1.6 FlexiViT 的内部表征

FlexiViT 有没有以与 ViT 相似的方式处理不同 Patch Size 的输入?

作者通过分析模型的内部表征来研究这个问题。作者应用了 Centered Kernel Alignment (CKA) 方法,这是一种广泛用于比较神经网络内部和跨模型表征的方法。可视化结果如下图3所示。从 Block1 到 Block 6 的 MLP 层,特征映射的表征相似。在 Block 6 的 MLP 层,开始发散,然后在最后一个 Block 再次收敛。

图4:FlexiViT 的内部表征的 t-SNE 可视化结果。不同大小的点代表不同的 grid size,不同颜色代表不同的层

1.7 实验:使用预训练的 FlexiViT 模型

作者使用预训练的 FlexiViT 模型在下列迁移学习任务中验证 FlexiViT 的性能。实验结果如下图4所示。在不同的任务集中,FlexiViT 模型大致与两个固定 Patch Size 的 ViT 模型的性能相匹配,在大 Patch Size 时几乎不落后,在小 Patch Size 时有改进。这些结果证实,与针对不同 Patch Size 预训练多个 ViT 模型相比,使用预训练的 FlexiViT 没有明显的缺点。FlexiViT 提供了一种新的方式,使迁移学习更有效地利用资源,节省加速器内存和计算量。我们可以使用大的输入 Patch Size 进行廉价的迁移学习,但稍后使用小的 Patch Size 部署得到的模型,以获得不错的性能。

图5:迁移学习实验结果

如下图5左侧所示,是微调 grid size 为8的 FlexiViT 模型,然后在其他 grid size 下评估的结果。标准 ViT 模型的精度很快就会下降,而 FlexiViT 随着网格尺寸的增加表现出极大的性能提升。

如下图5右侧所示,是一个 FlexiViT-B 模型在三种不同的 grid size 下进行了微调,并在不同的 grid size 下进行了评估。可以看到,无论FlexiViT-B 模型在哪种 grid size 下做微调,都能在更大的 grid size 下正常工作。比如,可以在 8×8 的 grid size 小下执行相对低计算代价的微调。当在 8×8 grid size 下评估时,模型达到 81.8% 的精度,但当在 24×24 grid size 下评估时,它达到 85.3% 的精度。

图6:FlexiViT 更灵活的迁移学习

作者进一步表明,FlexiViT 的预训练模型在迁移到下游任务时也更加灵活。如下图6所示是 SUN397 数据集的实验结果。在迁移学习实验中,作者随机化 Patch Size 的大小,并在不同的 Patch Size 大小下评估单个模型。FlexiViT 的迁移效果最好。当 Patch Size 的大小发生变化时,FlexiViT 的灵活性最好。

图7:FlexiViT 的预训练模型在迁移到下游任务时也更加灵活

如下图7所示,作者对 FlexiViT 的 attention 做了一些分析。可以观察到,attention relevance 在不同的 Patch Size 大小下会发生显著变化。随着 Patch Size 的减小,注意力会集中到更多的小区域。

图8:attention relevance 可视化结果

总结

一个标准的 ViT 模型,训练时候的 Patch Size 是多大,它只能够在那个 Patch Size 的情况下取得良好的性能。当 Patch Size 改变时,一般模型就需要重新训练。为了克服这一限制,本文提出 FlexiViT,希望在不增加成本的前提下,训练一个可以适应所有 Patch Size 的 ViT 模型。为了训练 FlexiViT,作者在训练过程中随机化 Patch Size,并对位置编码参数和 patch embedding 参数做 Resize 操作。这些简单的修改已经足以获得强大的性能,此外,作者借助 KD 获得更好的结果。

相关推荐

php-fpm的配置和优化

目录概述php-fpm配置php-fpm进程优化配置慢日志查询配置php7进阶到架构师相关阅读概述这是关于php进阶到架构之php7核心技术与实战学习的系列课程:php-fpm的配置和优化学习目标:理...

成功安装 Magento2.4.3最新版教程「技术干货」

外贸独立站设计公司xingbell.com经过多次的反复实验,最新版的magento2.4.3在oneinstack的环境下的详细安装教程如下:一.vps系统:LinuxCentOS7.7.19...

十分钟让你学会LNMP架构负载均衡

业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...

php从远程URL获取(mp4 mp3)音视频的流媒体数据

/***从远程URL中获取媒体(如mp4mp3)的内容*@parammixed$file_url*@parammixed$media_type...

Zabbix5.0安装部署

全盘展示运行状态,减轻运维人员的重复性工作量,提高系统排错速度,加速运维知识学习积累。1.png1、环境安装关闭SELinux并重启系统2.png安装httpd、mariadb、php运行yum-...

php 常见配置详解

以下是PHP常见的配置项及其含义:error_reporting:设置错误报告级别,可以控制PHP显示哪些错误。例如,设置为E_ALL将显示所有错误,而设置为0将禁止显示任何错误。displa...

实践分享|基于基石智算 DeepSeek API + WordPress 插件自动生成访客回复

基石智算举办的DeepSeek案例大赛汇集了不少基于CoresHubDeepSeekAPI服务或模型部署服务的精彩实践。本次我们将分享个人实践:通过DeepSeekAPI+Word...

如何在Eclipse中搭建Zabbix源码的调试和开发环境

Zabbix是一款非常优秀的企业级软件,被设计用于对数万台服务器、虚拟机和网络设备的数百万个监控项进行实时监控。Zabbix是开放源码和免费的,这就意味着当出现bug时,我们可以很方便地通过调试源码来...

MySQL自我保护参数

#头条创作挑战赛#之前(MySQL自我保护工具--pt-kill)提到用pt-kill工具来kill相关的会话,来达到保护数据库的目的,本文再通过修改数据库参数的方式达到阻断长时间运行的SQL的目...

Python闭包深度解析:掌握数据封装的高级技巧

闭包作为Python高级编程特性之一,为开发者提供了一种优雅的方式来实现数据封装和状态保持。这一概念源于函数式编程理论,在现代Python开发中发挥着重要作用。理解和掌握闭包的使用不仅能够提升代码的表...

Java服务网格故障注入与熔断实战

在分布式系统的高可用性挑战中,服务网格的故障注入与熔断机制是检验系统韧性的终极试金石。以下是10道逐步升级的"地狱关卡",每个关卡都对应真实生产环境中可能遇到的致命场景,并附具体场景示...

MySQL数据库性能优化全攻略:程序员必知的七大核心策略

作为程序员,我们每天都要与数据库打交道。当系统用户量突破百万级时,数据库往往成为性能瓶颈的首要怀疑对象。本文将深入探讨MySQL优化的七大核心策略,并提供可直接落地的优化方案,助您构建高效稳定的数据库...

如何在 Windows 11 上使用单个命令安装 XAMPP

XAMPP是一种广泛使用的软件,用于在Windows操作系统上快速运行LAMP服务器包,包括Windows11。尽管LAMP通常用于Linux系统,但XAMPP并不使用Li...

uTorrent怎样将bt种子转换为磁力

如何用uTorrent把BT种子转为磁力链接?以下方法希望能帮到你。1、在uTorrent窗口里,点击工具栏的按钮,所示。2、在打开窗口里,选取要转为磁力的种子文件,然后点击打开按钮,参照图示操作...

支持向量机SVM 分类和回归的实例

支持向量机(SupportVectorMachine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他...