Sora核心之一:可变时长、分辨率、尺寸

Overview

    • 一、总览
    • 二、摘要
    • 三、引言
    • 四、方法
      • 4.1、架构改动
      • 4.2、训练改变
      • 4.3、NaViT的效率

NaViT

一、总览

题目: Patch n’ Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution
机构:Google DeepMind
论文: https://arxiv.org/pdf/2307.06304.pdf
代码:
任务:
特点:
前置相关工作:Pix2Struct
同期类似工作:
后续衍生工作:

二、摘要

当我们在用CV模型处理图像时,会把图像调整为固定分辨率,但是往往这是一个次优的选择。
然而诸如Vision Transformer(ViT)之类的模型能够灵活地进行序列建模,因此可以改变输入序列的长度。本文提出NaViT(Native Resolution ViT)来利用这一点,它在训练期间使用序列打包(sequence packing) 来处理任意分辨率和宽高比的输入。
除了让模型更加灵活之外,NaViT能够有效地迁移到图像/视频分类、目标检测和语义分割等标准任务,并且在基准评测上提高鲁棒性。
推理时,这样一种输入分辨率的灵活性,能够在测试时对性能和效率之间做一个平稳的平衡。作者相信,NaViT不同于标准的,CNN型的输入建模设计,能够为ViTs指明一个有前途的方向。

三、引言

ViT(Dosovitskiy 等人,2021)的简单、灵活和可扩展的性质使其成为基于卷积的神经网络的几乎无处不在的替代品。该模型的基础是一个简单的操作:将图像分割成块,每个块都线性投影到一个token。通常,输入图像被调整为固定的正方形长宽比,然后分割成固定数量的补丁。

最近的工作探索了这种范例的替代方案:

  1. FlexiViT(Beyer 等人,CVPR 2023)在一个架构内支持多种patch size,从而实现序列长度/计算成本的平滑变化。这是通过在每个训练步骤中对patch size进行随机采样以及调整resize算法以允许初始卷积特征支持多个patch size来实现的
  2. Pix2Struct(Lee 等人,2022)引入了一种保留宽高比的替代patching方法,这对于图表和文档理解等任务特别有用。

我们提出了另一个备选方案,NaViT。许多来自不同图像的patches被打包在一个序列里面,因此也被叫做patch n’pack (补丁包),这能够允许可变的分辨率而且能够保持宽高比。方法也是受自然语言处理领域的example packing启发,将多个样例打包在一个序列里面,来在变长输入上进行更有效率的训练。

本文发现:

  1. 训练时,对分辨率进行随机采样,极大程度减少了训练代价。
  2. NaViT由于能够处理不同的范围的分辨率,因此能够在推理的时候,很好地在成本-效果之间做一个平衡,并且以一种较小的代价迁移到新的任务上。
  3. 由example packing产生的固定batch形状,能够激发一些新的研究点,比如保持长宽比,可变token dropping rate,自适应计算。

这些发现有重大的实际影响,在一个固定计算代价下,NaViT能够稳定地比ViT效果更优。比如,我们仅用了少于1 / 4的计算成本,就比ViT的最好表现更优。如下图中的左图。

我们认为在分配的计算预算内处理的训练示例数量的大幅增加是比 ViT 性能提高的主要贡献者 - 示例打包与可变分辨率输入和可变令牌丢弃相结合,使 NaViT-L/16 的处理能力增加了五倍训练期间的图像(表2)。
在这里插入图片描述

我们认为在分配的计算预算内处理的训练样本数量的大幅增加是比 ViT 性能提高的主要原因 - 示例打包与可变分辨率输入和可变token丢弃相结合,使 NaViT-L/16 的处理能力增加了五倍多的训练图像(表2)。
在这里插入图片描述
这种效率上的提高,在finetuning阶段也能有效地体现,比如上面图1中的(middle),在更小的预训练成本下,就能取得更高的finetune acc。

除此之外,由于在预训练和微调阶段都处理可变分辨率,因此只有一个模型也能在多种分辨率上取得很好的效果,很好地体现了NaViT在推理代价上的优势,如图1中的(right)。

NaViT在训练和迁移上的效率,灵活的推理,为 Vision Transformers 提供了一条充满希望的途径。Patch n’ Pack使计算机视觉系统能够超越当前数据和建模pipeline所施加的限制,实现以前受固定batch形状限制的想法,从而释放创新和进步的新可能性。

四、方法

深度神经网络通常使用批量输入进行训练和运行。为了在当前硬件上进行高效处理,这意味着固定的批次形状,这又意味着计算机视觉应用程序的图像大小固定。再加上历史上与卷积神经网络相关的架构限制,导致了调整图像大小或将图像填充到固定大小的做法。这两种方法都已被证明存在缺陷:前者会损害性能,后者效率低下(Lee et al., 2022)。对 ImageNet (Deng et al., 2009)、LVIS (Gupta et al., 2019) 和 WebLI (Chen et al., 2022c) 中长宽比的分析,结果表明大多数图像通常不是方形的(图 3)。
在这里插入图片描述

在语言建模中,通常通过示例打包来绕过固定序列长度的限制:来自多个不同样例的token被组合在一个序列中,这可以显着加速语言模型的训练(Krell 等人,2021)。通过将图像视为补丁(令牌)序列,我们表明 Vision Transformers(Dosovitskiy 等人,2021)可以从相同的范例中受益,我们称之为 Patch n’ Pack。使用这种技术,ViT 可以在“原始”分辨率的图像上进行训练,我们将这种方法命名为 NaViT。

4.1、架构改动

相对于原始的ViT,在模型的架构上做了如下的一些改动:

  1. Masked self attention and masked pooling 为了防止example之间彼此attend,引入了额外的self-attention掩模。类似地,masked pooling旨在池化每个示例中的token表示,从而导致序列中每个示例都有一个向量表示。图 2 展示了如何通过掩码来控制注意力的感受野。
  2. Factorized & fractional positional embeddings. 为了处理任意分辨率和纵横比,我们重新审视position embedding。给定分辨率为 R × R R×R R×R 的方形图像,补丁大小为 P 的普通 ViT 可以学习长度为 ( R / P ) 2 (R/P )^2 (R/P)2 的一维位置嵌入(Dosovitskiy 等人,2021)。线性插值这些嵌入对于以更高分辨率 R 进行训练或测试是必要的。

Pix2struct(Lee 等人,2022)引入了可学习的 2D 绝对位置编码,从而学习大小为 [maxLen, maxLen] 的位置嵌入,并用每个补丁的 (x, y) 坐标进行索引。这使得宽高比可变,分辨率高达 R = P ⋅ m a x L e n R = P·maxLen R=PmaxLen。然而,每一种组合(x, y) 坐标在训练过程中必须可见。

为了支持可变的纵横比并轻松外推(extrapolate )到没有见过的分辨率,我们引入了因式分解的位置嵌入,其中我们分解为 x 和 y 坐标的单独嵌入 ϕ x \phi_x ϕx ϕ y \phi_y ϕy。然后将它们组合在一起(第 3.4 节探讨了可选的组合策略)。我们考虑两种模式:绝对嵌入,其中 ϕ ( p ) \phi_(p) ϕ(p) : [0, maxLen] → R D R^D RD 是绝对补丁索引的函数,以及分数嵌入,其中 ϕ ( r ) \phi_(r) ϕ(r) : [0, 1] → R D R^D RD 是一个函数 r = p / s i d e _ l e n g t h r = p/side\_length r=p/side_length,即沿图像的相对距离。后者提供独立于图像大小的位置嵌入参数,但部分地混淆了原始长宽比,从而仅隐含在补丁数量中。我们使用了简单学习的embedding ϕ \phi ϕ,sinusoidal embeddings,以及用NeRF里面用到的傅立叶位置编码。

4.2、训练改变

Patch n’ pack技术使得在训练NaViT的时候,能够有一些新的训练技术。

  1. Continuous Token dropping. token丢弃(训练期间随机省略输入补丁)(Akbari 等人,2021;Li 等人,2023 flip)已被开发来加速训练。然而,它们通常从所有示例中删除相同比例的令牌;打包可以实现连续的令牌丢弃,从而可以根据图像改变令牌丢弃率。这样可以通过丢弃同时仍然看到一些完整图像来实现更快的吞吐量,从而减少训练/推理差异。此外,通过打包,在整个训练过程中,drop分布可能会根据一些预定义的schedule而变化。在第 3.3 节中,我们探讨了不同的schedules以及灵活token丢弃的好处。
  2. Resolution sampling. NaViT 可以使用每个图像的原始分辨率进行训练。或者,可以在保留纵横比的同时对像素总数进行重新采样。在普通 ViT 中,更大的吞吐量(在较小的图像上进行训练)和更高的性能(在更大的图像上进行训练,以在评估时实现高分辨率)之间存在着紧张关系。通常,模型会在较小的分辨率下进行预训练,并在较高的分辨率下进行微调。 (Touvron等人,2019)。 NaViT 更加灵活;它允许通过从图像尺寸分布中采样来进行混合分辨率训练,同时保留每个图像的原始长宽比。这允许更高的吞吐量和大图像的曝光,与同等 ViT 相比,性能得到显着提高(在模型大小和训练持续时间方面)。 3.2 节探讨了不同的采样策略以及用于预训练和微调的可变分辨率训练。

4.3、NaViT的效率

在这里,我们讨论 Patch n’ Pack 对 NaViT 计算效率的一些影响。
self attention cost. 当将多个图像打包成更长的序列时, O ( n 2 ) O(n^2) O(n2) 的注意力成本自然是一个值得关注的问题。尽管许多工作旨在消除这种二次缩放(Tay et al., 2022, 2020),但我们在这里证明,随着transformer隐藏维度的缩放,注意力在总体成本中所占的比例越来越小,其中包括计算成本MLP 也是如此。图 4 说明了这一趋势,表明与打包示例相关的开销相应减少。除了速度考虑之外,自注意力的内存成本也可能对极长的序列构成挑战。然而,这一挑战也可以通过采用内存高效的方法来解决(Rabe 和 Staats,2021;Dao 等人,2022)。
在这里插入图片描述
Packing, and sequence-level padding. 最终序列包含多个示例的长度必须是固定的。我们使用附录 A.3 中讨论的贪婪打包方法;通常不存在完全加起来等于固定长度的示例的完美组合,并且必须使用填充标记。例如,可以动态选择分辨率或令牌丢弃序列中最后一个示例与剩余标记完全匹配的比率;然而,我们发现通常只有不到 2% 的标记是填充标记,因此简单的方法就足够了。

Padding examples and the contrastive loss. 用打包序列可以很容易地实现每个令牌的损失。然而,许多计算机视觉模型都是通过示例级损失进行训练的,通常应用于池表示。首先,这需要对典型的池头进行修改以考虑堆积。其次,必须从每个序列中提取多个合并表示。固定批次形状需要假设,从一批 B 序列中,我们最多提取 B × Emax 池表示(即每个序列的 Emax 个示例)。如果序列包含超过 Emax 图像,则多余的图像将被丢弃,从而浪费模型编码器的计算。如果序列的示例少于 Emax,则损失将处理大量假填充表示。
后者是对比学习的一个问题,其中损失计算在时间和内存上扩展 ~ O(n2)。为了避免这种情况,我们使用了分块对比损失(Mustafa et al., 2023),它通过在本地设备子集上执行计算并有效地积累全局 softmax 归一化所需的统计数据来避免收集 softmax 的所有数据点的需要。这使得 Emax 值较高(从而有效地使用模型编码器),而不会受到损失的瓶颈。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python72-Python的函数入门,为函数提供文档

之前介绍过可以使用Python内置的help()函数查看其他函数的帮助文档,我们也经常通过help()函数查看指定函数的帮助信息,这对于Python开发者来说非常重要。 我们还可以为函数编写说明文档一只要把一段字符串放在函数声明之后、函数体之前,这段字符串将被作…

LVGL:切换页面

static lv_obj_t *contanier1 NULL; static lv_obj_t *contanier2 NULL;static void win_btn_event_callback(lv_event_t* e) {lv_event_code_t code lv_event_get_code(e);if (code LV_EVENT_CLICKED){lv_obj_t * obj lv_event_get_target(e);//按钮if(lv_obj_get_child(co…

回溯算法03-电话号码的字母组合(Java)

3.电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:d…

#define MODIFY_REG(REG, CLEARMASK, SETMASK)

#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) 这个宏 MODIFY_REG 是在嵌入式编程中,它用于修改一个寄存器的特定位,而不影响其他位。这个宏接受三个参数&#xff…

onav_rim 复现记录

onav_rim 复现记录 任务复现过程克隆项目,创建环境源码安装habitat-sim从github上安装CLIP环境配置收尾工作数据集下载模型评估其他问题训练训练模型 任务 上次复现one4all失败,但我就是想看看我的电脑能不能做end2end的视觉导航任务。这次看到了《Obje…

Java多线程——信号量Semaphore是啥

目录 引出信号量Semaphore ?Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——信号量Semaphore是啥 信号量Semaphore ? Semaphore 通常我们叫它信号量, 可以用来控制同时访问特…

Java实现布隆过滤器示例

布隆过滤器(Bloom Filter)是一种用于快速检查一个元素是否属于一个集合的数据结构。它基于哈希函数的思想,可以在空间和时间上实现高效的元素判断。 布隆过滤器通常用于解决以下问题: 1.快速查询:布隆过滤器可以在常数…

3. 在Go语言项目中使用Zap日志库

文章目录 一、介绍二、 默认的Go Logger1. 实现Go Logger2. 设置Logger3. 使用Logger4. Logger的运行5. Go Logger的优势和劣势 三、Uber-go Zap1. 为什么选择Uber-go zap2. 安装3. 配置Zap Logger4. 定制logger4.1 将日志写入文件而不是终端4.2 将JSON Encoder更改为普通的Log…

大学四年我从非科班到互联网大厂之路

文章目录 一、两度高考、依然选错?二、初来乍到、陷入囹圄三、破局重生、从头再来四、找实习的坎坷之路五、提前结束实习,开始秋招六、秋招一路凯歌七、写在最后:人生是一场长久的旅途 很久没来CSDN上写过文章了,上一次写已经是20…

pycharm安装pojie2024最新

pojie工具请关注微信公众号“program那些事儿”,回复ideapj,即可获取。 一、下载 官网:https://www.jetbrains.com/pycharm/download/?sectionwindows 点击如图所示,下载pycharm专业版的软件,安装就是一步一步的装&a…

让运维无忧,实战解析巡检报告功能实现方案

随着大数据技术的演进和信息安全性需求的提升,数据规模的持续扩张为数据运维工作带来了严峻考验。面对海量数据所形成的繁重管理压力,运维人员面临效率瓶颈,而不断攀升的人力成本也使得单纯依赖扩充运维团队来解决问题变得不再实际可行。 由…

黄金投资是收益高还是风险高?

黄金作为一种传统的投资工具,长久以来一直受到投资者的青睐。然而,在讨论黄金投资的收益与风险时,必须明确一点:黄金投资既有可能带来较高的收益,同时也伴随不可忽视的风险。 从收益的角度来看,黄金投资的确…

Linux上轻松搞定Docker环境安装

Docker环境安装 是否安装docker # 该命令通过查询Docker服务的状态来检查是否已安装,且是否在正常运行 systemctl status docker下面这种状态就是docker正常运行的状态: 安装yum-utils: yum install ‐y yum‐utils device‐mapper‐per…

手工将一个 llvm IR 汇编代码解析成为 bitcode 文件

1&#xff0c;原始c语言文件 sum.c int sum(int a, int b) {return ab; } 2&#xff0c;编译成为 LLVM-IR 汇编语言 clang sum.c -emit-llvm -S -c -o sum.ll 3&#xff0c;手工把 llvm IR 汇编语言解析成 bitcode 3.1&#xff0c;源码 gen_llvm_ir.cpp #include <ll…

C++初阶:初识C++

目录 1. 前言&#xff1a;C 与 C语言2. C对于C语言语法的完善与补充2.1 命名冲突与命名空间2.1.1 命名空间的定义2.1.2 调用方式 2.3 补充&#xff1a;流的概念2.4 缺省参数2.4.1 缺省参数的使用 2.5 函数重载2.5.1 什么是函数重载2.5.2 函数重载的使用2.5.3 特殊情况&#xff…

蓝桥杯-Set

目录 HashSet类常用方法 1 add(Object obj)方法 2 size() 方法 3 remove(Object obj)方法 4 contains()方法 5 clear() 方法 例题实战 set 一个不允许出现重复的元素&#xff0c;并且无需的集合&#xff0c;主要有HashSet实现类。 在判断重复元素的时候&#xff0c;Set…

2024年我强烈建议你一定要入局鸿蒙

随着华为鸿蒙系统的诞生&#xff0c;它一直备受程序员及全国人民深度关注。对于那些对鸿蒙开发感兴趣并希望在这一领域寻找职业发展的人来说&#xff0c;2024年学鸿蒙开发的就业前景如何呢&#xff1f; 在万物互联、技术发展飞快的时代&#xff0c;鸿蒙对于程序员和技术人员而…

MySQL 篇-深入了解多表设计、多表查询

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 多表设计概述 1.1 多表设计 - 一对多 1.2 多表设计 - 一对一 1.3 多表设计 - 多对多 2.0 多表查询概述 2.1 多表查询 - 内连接 2.2 多表查询 - 外连接 2.3 多表查…

激光炸弹c++

题目 输入样例&#xff1a; 2 1 0 0 1 1 1 1输出样例&#xff1a; 1 思路 由题知本题要求某个区间内数的和&#xff0c;联想到二维前缀和。我们可以先使用二维前缀和模板计算各区间的价值。然后枚举以某点为右下角&#xff0c;大小为R*R的正方形价值&#xff0c;取最大值。 …

C# LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…