V2PE 论文深度解读

执行摘要

V2PE 这篇论文要解决的核心问题很直接:为什么很多视觉语言模型在短上下文里表现不错,一旦遇到长视频、多页文档、多图拼接或超长图文混合输入,性能就会明显下滑。作者的结论是,问题不只出在“上下文变长”本身,还出在视觉 token 的位置编码方式上:现有模型通常把文本 token 和视觉 token 一视同仁,都按“位置每次加 1”的方式编码;但视觉 token 在空间上高度连续、彼此更相似,这样做会让视觉部分过快“吃掉”位置预算,一旦位置索引超出模型训练时见过的范围,性能就会急剧恶化。V2PE 的关键想法是:文本 token 仍然按 +1 前进,视觉 token 改为按更小、而且训练时可变的步长 (δ\deltaδ) 前进。这样既不减少视觉 token 数量,也不改主干架构,只是重写“坐标轴”。

这项方法在论文中被应用到 InternVL2-2B 上。结果很有代表性:在 Long-VQA 上,单纯把 InternVL2 做 32K 长上下文微调,平均分能从基线的 28.4 提升到 43.0;而加上 V2PE 后,最优固定步长附近可以进一步到 51.3。更醒目的结果来自 MM-NIAH 图像检索:InternVL2-V2PE-256K 在 1M token 的扩展测试上,(δ\deltaδ=1/256) 时达到 64.5,而普通的 InternVL2-2B 是 0.0,基于线性插值和 NTK 插值的 RoPE 扩展方法也远低于它。与此同时,作者报告 V2PE 在常规短上下文多模态基准上基本维持住了原模型水准,没有出现“长上下文变强、短上下文全面崩掉”的现象。

从工程角度看,V2PE 的价值在于它非常“轻”:它不要求换 backbone,不要求删 token,也不是单纯靠更大模型“堆”出来的,而是把一个通常被忽略的设计点——视觉 token 的位置坐标——变成了可控变量。官方仓库已经公开了代码、模型、数据入口和训练脚本;README 说明 32 张 GPU 大约需要 48 小时训练,做 256K 长度训练时还用到了 Ring Attention 来控制显存。对研究生来说,这篇论文最大的学习价值,不只是“又一个长上下文技巧”,而是它展示了一种很典型的研究路径:先做诊断,再找最小改动点,再把想法落到可复现代码中

论文信息与问题背景

这篇论文的正式信息如下:Junqi Ge, Ziyi Chen, Jintao Lin, Jinguo Zhu, Xihui Liu, Jifeng Dai, Xizhou Zhu. “V2PE: Improving Multimodal Long-Context Capability of Vision-Language Models with Variable Visual Position Encoding.” ICCV 2025. arXiv 版本发布于 2024-12-12,ICCV 2025 官方开放获取页已经收录,官方项目页也列出了作者、机构与相关资源;ICCV 2025 会议网站还给出了该论文在 Poster Session 5 的会议信息。作者机构包括清华大学、商汤研究院、香港大学和上海 AI Laboratory。

以下资源都属于官方来源,适合做一手阅读与复现参考。

  • 官方代码仓库:OpenGVLab/V2PE。
  • 官方模型卡:Hugging Face OpenGVLab/V2PE
  • 官方数据集入口:Hugging Face OpenGVLab/V2PE-Data

为了读懂这篇论文,先把几个基础概念讲清楚。视觉语言模型(Vision-Language Model, VLM)可以理解为“看图的模型”和“读写文本的模型”拼在一起:前者负责把图像变成向量表示,后者负责在统一的 token 序列上做推理和生成。V2PE 论文本身把这类模型定义为能够感知视觉内容、做视觉推理并进行多模态对话的模型;InternVL2 官方介绍则说明它支持文本、图像、视频等多模态输入,还支持动态分辨率切块。

Patch embedding 可以把它想成“把一张大图切成很多小格子,再把每个小格子变成一个 token”。这正是 Vision Transformer(ViT)的基本思路:图像不再先经过传统卷积网络提特征,而是直接被拆成 patch 序列送进 Transformer。这样做好处是模型能够用统一的“序列”视角看待图像,但代价也很明显:图像分辨率一高,patch token 数会非常快地膨胀。这正是多模态长上下文里“视觉 token 特别贵”的根源之一。

位置编码(positional encoding)是 Transformer 里一个基础但常被忽略的部件。因为自注意力(self-attention)本身并不知道“谁在前、谁在后”,所以必须给 token 注入位置信息。V2PE 论文把位置编码拆成两步:先给每个 token 分配一个位置索引 (pip_ipi),再把这个索引变成真正进入注意力计算的位置表示。Rotary Position Embedding(RoPE)是当前大模型里非常常见的一种相对位置编码方式,它通过对 query/key 做旋转,把位置差映射成注意力中的相位差。

长上下文注意力难,不只是因为“记不住”,还因为“算不起”。Transformer 的标准自注意力会让每个 token 和所有 token 两两交互,因此时间和显存复杂度都随序列长度近似二次增长。FlashAttention 的论文直接指出:标准 self-attention 的时间和内存复杂度都对序列长度呈二次增长;Ring Attention 则进一步说明,长序列的主要难点之一就是如何把注意力块计算分摊到多张 GPU 上。V2PE 本身不减少 token 数,所以它不是“省 FLOPs 的方法”,而是“让相同 token 数下的位置编码更合理的方法”。

这也带出本文最重要的直觉:相邻文本 token 往往代表不同词语,语义跳跃大;相邻视觉 token 往往只是相邻 patch,内容连续性更强。论文明确说,像素空间具有连续性,邻近视觉 token 之间的相似性通常高于邻近文本 token;因此让两者都用同样的“+1 步长”并不理想。也正因为如此,V2PE 并不是去改注意力公式本身,而是去改“视觉 token 在位置轴上如何排布”。

论文结构与核心思想

按论文原文结构,这篇文章可以概括为六个部分:前面先讲问题和相关工作;中间两小节介绍作者构造的长上下文数据集与 V2PE 方法本身;实验部分先做诊断,再给出主结果、和其他模型比较、最后做消融。这个组织方式很值得学习,因为它不是一上来就给方法,而是先证明“问题确实存在,而且不是随便调参就能解决”。

下表是按论文章节整理的阅读大纲。

论文部分 主要内容
引言 诊断多模态长上下文退化的根源,提出“视觉位置编码不该照搬文本”的核心判断
相关工作 回顾 VLM、长上下文建模、位置编码与 RoPE 扩展方法
方法中的数据集 构造 Long-VQA、Long-MR 和 MM-NIAH1M,用于训练与更长长度评测
方法中的 V2PE 保持文本步长为 1,把视觉步长改为更小的 (\delta),且训练时让 (\delta) 变化
实验前半段 先证明长上下文数据有用,再证明传统位置扩展对 VLM 作用有限
实验后半段 展示 V2PE 在 Long-VQA、MM-NIAH、MileBench、Video-MME 等上的收益,并做消融

如果把整篇论文压缩成一句话,它的逻辑是:多模态长上下文的问题,并不只是“token 太多”,而是“视觉 token 在位置轴上扩张得太快”;所以应该压缩的是“视觉位置跨度”,而不是先天把视觉信息压没”。 这也是它和很多 token compression 方法的根本区别。

下面这个示意图可以帮助直观理解 V2PE 的核心变化。它不是“删除视觉 token”,而是“重新安排视觉 token 的位置坐标”。对应论文里的表述,就是文本 token 继续按 1 递增,视觉 token 按更小的 (δ\deltaδ) 递增。

V2PE

+1

...

文本 token

文本 token

视觉 token 1

视觉 token 2

视觉 token 3

更多视觉 token

标准位置编码

+1

+1

+1

+1

...

文本 token

文本 token

视觉 token 1

视觉 token 2

视觉 token 3

更多视觉 token

方法详解

论文先把多模态输入形式化成一个交错序列:
X=[x0,x1,…,xN−1], \mathbf{X}=[x_0,x_1,\dots,x_{N-1}], X=[x0,x1,,xN1],
其中每个 (xix_ixi) 要么是文本 token,要么是视觉 token。接下来,位置索引由一个递推函数 (fposf_{\text{pos}}fpos) 产生;在常规 LLM/VLM 中,这个位置索引通常都是统一地按 1 递增。论文原文把这件事写成:第一个 token 位置是 0,之后每个位置由前一个位置递推得到;在现有方法中,不管模态是什么,都满足 (pi=pi−1+1p_i=p_{i-1}+1pi=pi1+1)。

把这件事展开来看,标准做法其实非常“奢侈”。假设某一段输入里有 (TTT) 个文本 token、(VVV) 个视觉 token,那么标准位置索引的总跨度近似是
spanstandard≈T+V. \text{span}_{\text{standard}}\approx T+V. spanstandardT+V.
也就是说,视觉 token 有多少个,它就在位置轴上同等地占掉多少单位长度。但如果视觉 token 本身来自同一张图片的相邻 patch,这种做法未必合理。

V2PE 的新定义非常简单:
pi={pi−1+1,xi 是文本 tokenpi−1+δ,xi 是视觉 token p_i= \begin{cases} p_{i-1}+1,& x_i \text{ 是文本 token}\\ p_{i-1}+\delta,& x_i \text{ 是视觉 token} \end{cases} pi={pi1+1,pi1+δ,xi 是文本 tokenxi 是视觉 token
其中
δ={1,12,14,18,116,132,164,1128,1256}. \delta=\left\{1,\frac12,\frac14,\frac18,\frac1{16},\frac1{32},\frac1{64},\frac1{128},\frac1{256}\right\}. δ={1,21,41,81,161,321,641,1281,2561}.
训练时不是固定某个 (δ\deltaδ),而是从这组候选里随机采样;测试时再根据任务长度选一个固定 (δ\deltaδ)。论文后面的经验结论是:常规短上下文多模态基准更适合较大的 (δ\deltaδ)(比如 (1/21/21/2)),而极长上下文任务更适合更小的 (δ\deltaδ)(比如 (1/256))。

这一步可以做一个非常有帮助的推导。若只看视觉部分,原来 (V) 个视觉 token 会占掉 (V) 的位置跨度;改成 V2PE 后,只占掉
spanvisualV2PE=δV. \text{span}_{\text{visual}}^{\text{V2PE}}=\delta V. spanvisualV2PE=δV.
因此,总体有效跨度从
T+V T+V T+V
变成了
T+δV. T+\delta V. T+δV.
这里最关键的一点是:视觉 token 数没变,只有位置轴被“压缩”了。 所以 V2PE 不像 token compression 那样牺牲输入信息,而是保留同样多的视觉证据,只让 RoPE 看见一个更“稠密”的视觉坐标系。这个推导是直接由论文的位置递推式得到的。

这个差异可以用一个极简例子说明。假设一张图最终对应 256 个视觉 token,那么不同策略下,视觉部分在位置轴上的占用大致如下。这里的表是由上面的公式直接推出来的。

方案 256 个视觉 token 占用的位置跨度
标准位置编码 256
V2PE,(δ\deltaδ=1/2) 128
V2PE,(δ\deltaδ=1/16) 16
V2PE,(δ\deltaδ=1/256) 1

到这里你可能会有一个自然问题:RoPE 不是通常用整数位置索引吗?V2PE 的分数位置怎么实现? 这正是论文代码里最有价值、也最容易被忽略的一点。官方实现分成两层。
第一层在数据侧构造 position_ids:文本段用整数累加;视觉段如果是 v2pe_fix,就令 small_stride = rope_pos_id_stride / num_image_token
再用 torch.arange(..., step=small_stride) 给视觉 token 分配分数位置;如果是 v2pe_rnd,就先从 [1, 2, 4, 8, 16, 32, 64, 128, 256] 随机采样一个 stride,再除以 num_image_token 得到真正的单视觉 token 步长。视觉段结束后,代码用 ceil 把最后一个视觉位置上取整,再继续给后面的文本分配整数位置。

第二层在模型侧改造 RoPE。本来标准实现会先按整数位置生成一整张 cos/sin 表,再根据 position_ids 去索引。但 V2PE 的实现不是这么做:它新增了一个 V2PE 类,直接把真实的全局位置值 global_posid 送进
freqs=outer(pos_id,inv_freq), \text{freqs}=\text{outer}(\text{pos\_id},\text{inv\_freq}), freqs=outer(pos_id,inv_freq),
然后对这个频率矩阵求 cossin。换句话说,它是先用浮点坐标生成旋转相位,再把这些相位应用到 query/key 上。这是为什么 V2PE 能支持分数步长的根本原因。对应的注意力模块还会把 rope_scaling['type'] 切到 v2pe 分支,并在这个分支里先基于 global_posid=position_ids 生成 cos/sin,再用局部顺序索引把旋转应用回 token 序列。

如果你愿意把它写成一个更“代码友好”的公式,V2PE 在 RoPE 层做的事可以概括为:
freqs=p⊗ω,cos⁡=cos⁡(freqs),sin⁡=sin⁡(freqs), \text{freqs} = p \otimes \omega,\quad \cos = \cos(\text{freqs}),\quad \sin = \sin(\text{freqs}), freqs=pω,cos=cos(freqs),sin=sin(freqs),
再把它代回标准 RoPE 旋转:
q′=q⊙cos⁡+rotate_half(q)⊙sin⁡k′=k⊙cos⁡+rotate_half(k)⊙sin⁡ q' = q\odot \cos + \text{rotate\_half}(q)\odot \sin\\ k' = k\odot \cos + \text{rotate\_half}(k)\odot \sin q=qcos+rotate_half(q)sink=kcos+rotate_half(k)sin
这里和普通 RoPE 唯一真正本质的差别在于:位置 (ppp) 不再只允许是整数均匀网格,而可以是为视觉 token 特制的稠密浮点网格。

下面这张 Mermaid 图把“数据侧位置构造”和“模型侧连续 RoPE”连起来看,会更清楚。它对应的是官方实现逻辑,而不是我额外杜撰的框架。

图像切块与文本分词

交错 input_ids

构造 position_ids

文本段: +1

视觉段: +δ 或随机 δ

视觉段末尾取 ceil 再衔接文本

送入自定义 V2PE RoPE

用 global_posid 直接生成 cos/sin

旋转 Q/K

自注意力

多模态回答 / 检索

如果要把论文算法写成伪代码,最小版本大致如下。它保留了论文与官方代码最关键的三个决定:文本整数步长、视觉分数步长、视觉段结束后回到整数网格

输入:
  交错多模态序列 S
  每个视觉段的长度 M_j
  候选步长集合 Δ
  模式 mode ∈ {fixed, random}

输出:
  position_ids

cursor ← -1
position_ids ← []

for 每个段 segment in S:
    if segment 是文本段:
        依次追加 cursor+1, cursor+2, ..., cursor+len(segment)
        cursor ← 最后一个文本位置
    else if segment 是视觉段:
        if mode == random:
            δ ← 从 Δ 中随机采样
        else:
            δ ← 预设固定值
        依次追加 cursor+δ, cursor+2δ, ..., cursor+M_j·δ
        cursor ← ceil(最后一个视觉位置)

返回 position_ids

从直觉上看,V2PE 之所以有效,可以归纳成三层原因。第一,它防止视觉位置索引过快越过训练窗口;第二,它保留了全部视觉 token,不像压缩方法会丢信息;第三,训练时让 (δ\deltaδ) 变化,相当于在教模型适应不同“视觉坐标尺”。论文的消融实验正是支持这三层直觉:视觉-only 的 V2PE 最稳定,变量训练优于固定训练,V2PE 优于纯 token compression。

实验设计与结果

实验主干使用的是 InternVL2-2B。论文表格把它按 2.0B 量级统计;InternVL2 官方博客给出的 InternVL2-2B 总参数量是 2.21B,而 Hugging Face 上发布的 OpenGVLab/V2PE 模型卡又写成“1.8B activated parameters,3B in total”。这说明公开材料里对参数统计口径存在差异,但可以确定它是一个小模型量级的开放多模态模型,而不是靠数十 B 规模换来的结果。InternVL2 官方资料还说明,训练时支持动态分辨率,最多把一张高分图切成多块 448×448 的 tile。

训练数据方面,作者构造了两个核心数据集。Long-VQA 由 17 个常见视觉问答数据集扩展而来,总计 533K 样本,其中 392K 用于训练、长度最高 32K token,141K 用于验证、长度最高 64K token。Long-MR 则模仿 MM-NIAH 的 needle-in-a-haystack 风格,包含 Long-MR-32K 的 488K 样本和 Long-MR-256K 的 50K 样本。除此之外,作者还按 MM-NIAH 官方代码把测试长度继续扩展到 1M token,形成 MM-NIAH1M。混合训练集还会并入 InternVL2 原有的短上下文 SFT 数据。

训练流程分两阶段。第一阶段得到 InternVL2-V2PE-32K:在 32K 级别的混合训练集上加入 V2PE,并在训练时随机采样 (\delta)。第二阶段得到 InternVL2-V2PE-256K:在 Long-MR-256K 上继续训练,同时保留 50% 第一阶段数据,以避免短上下文能力被破坏。论文明确说,为了优化显存,他们在第二阶段用了 Ring Attention 做模型并行。官方 README 则补充:建议用 32 张 GPU 训练,约需 48 小时;256K 脚本需要打开 --chunk_num 8--attn_type ring

从公开脚本里还能看到更细的工程超参数:图像 tile 分辨率 448、down_sample_ratio=0.5bf16=Truemax_steps=20000、学习率 (5\times10^{-6})、weight_decay=0.05warmup_ratio=0.03、Deepspeed ZeRO-3、打包数据集(packed dataset)开启,第一阶段和 32K 脚本里 max_seq_length=34000,而 256K 脚本是在此基础上再加 chunk_num=8 和 ring attention。也就是说,作者的“长上下文”不仅来自单样本长度,还来自打包和跨 GPU 分块策略。

先看 Long-VQA。下表是根据论文表 1 整理的关键结果,重点看平均分即可。可以很清楚地看到:只做长数据微调有提升,但 V2PE 才是把长上下文性能真正拉起来的关键

模型 (\delta) Long-VQA Avg
InternVL2-2B 28.4
InternVL2-FT-32K 43.0
InternVL2-V2PE-32K 1/256 48.1
InternVL2-V2PE-32K 1/64 50.2
InternVL2-V2PE-32K 1/32 50.8
InternVL2-V2PE-32K 1/16 51.3
InternVL2-V2PE-32K 1/8 51.1
InternVL2-V2PE-32K 1/2 44.1
线性插值 40.9
NTK 插值 45.3

这个表透露出一个很重要的规律:(δ\deltaδ) 不是越小越好,也不是越大越好,而是和上下文长度有匹配关系。 对 Long-VQA 这类中长上下文,(1/16) 到 (1/8) 一带是甜点区;当回到 (1/2) 或 (1) 这种更接近普通 RoPE 的设定时,长上下文优势会明显减弱。

再看标准短上下文多模态基准。论文表 2 给了完整数值,结论和 Long-VQA 正好互补:在常规 ChartQA、DocVQA、AI2D、InfoVQA 等基准上,较大的 (δ\deltaδ) 反而更稳。作者后续因此在一般 benchmark 上固定用 (δ\deltaδ=1/2) 测试。

模型 (\delta) 标准 VQA Avg
InternVL2-2B 72.4
InternVL2-FT-32K 72.0
InternVL2-V2PE-32K 1/256 71.6
InternVL2-V2PE-32K 1/64 72.0
InternVL2-V2PE-32K 1/16 72.5
InternVL2-V2PE-32K 1/4 72.8
InternVL2-V2PE-32K 1/2 72.9
InternVL2-V2PE-32K 1/1 72.7

接着看最能体现“超上下文”能力的 MM-NIAH 图像检索结果。这里论文表 3 很有说服力,因为它直接把长度拉到了 1M token。最值得看的,是普通基线、V2PE-32K、V2PE-256K 与 RoPE 插值方法的对比。

模型 (\delta) 64K 128K 256K 512K 1M
InternVL2-2B 26.0 17.3 21.8 5.3 0.0
GPT-4o 92.7 62.1 60.0 58.6 NA
InternVL2-V2PE-32K 1/256 81.5 61.2 56.9 36.7 6.0
InternVL2-V2PE-256K 1/256 97.1 99.1 95.7 95.1 64.5
InternVL2-FT-32K + 线性插值 34.7 26.4 21.9 16.3 0.5
InternVL2-FT-32K + NTK 插值 25.7 12.3 16.8 14.8 0.0

这张表说明了两件事。第一,VLM 上直接套 LLM 的位置插值方法并不够;线性插值和 NTK 插值对文本 LLM 可能有帮助,但对这里的视觉-文本混合长序列表现很弱。第二,真正把训练长度推进到 256K,再配合 V2PE,外推到 1M 才会出现“还能工作”的结果。论文摘要和项目页也都强调了这一点:训练到 256K 后,模型可以处理最高 1M token 的多模态序列。

与其他模型的横向对比同样重要。论文表 4 显示,在一般多模态 benchmark 上,InternVL2-V2PE-32K 的平均分 72.9,基本与同量级开源模型持平,略低于 Qwen2-VL-2B 的 73.1,但明显高于不少其它 2B–4B 级模型。表 5 则显示,在长上下文基准上,这个 2B 级模型的 MM-NIAH 平均分 81.8、MileBench 平均分 72.4、Video-MME 52.3,在 MM-NIAH 和 MileBench 上相当强,甚至接近或超过一些更大或闭源模型的部分指标。

官方仓库和 Hugging Face 模型卡后来还给出了“released model”的重新评测结果,数值与论文表格略有差异,例如 released model 的标准基准平均分写成 72.5、长上下文项写成 MM-NIAH 平均 81.8、MileBench 平均 72.5。这说明作者在整理代码库和重新训练公开版本后,结果有过更新;这对复现者是好事,因为它说明论文不是“只放结论不放工程”,但也提醒我们:读论文时要区分 camera-ready 结果和 released model 结果。

最后看消融。作者做了三组很关键的对比。第一,V2PE 只加在视觉 token 上最好;只加在文本上,对纯语言理解略有帮助,但会伤害视觉主导任务;文本和视觉都加,表现反而不稳定。第二,V2PE 不等价于 token compression:压缩 token 虽然能省计算,但会损失视觉信息,而 V2PE 保留了全部视觉 token,因此在 MM-NIAH 图像检索上显著更稳。第三,变量训练优于固定训练:训练时随机变化 (δ\deltaδ),测试时再选固定 (δ\deltaδ),比“训练时就写死某个 (δ\deltaδ)”泛化更强。

批判性分析与复现性

我认为 V2PE 最强的地方,不在于它“多么复杂”,恰恰在于它足够克制。它没有把问题简单归结为“上下文不够长就继续堆长度”,也没有通过 aggressive token drop 直接牺牲视觉信息,而是精准地抓住了“视觉 token 的位置索引增长过快”这个中层问题,再用一个几乎不改主干的办法去修。对于研究来说,这种“最小有效改动”通常比“大改架构”更有迁移价值。实验结果也支持这种判断:表 3 里 V2PE-256K 在 512K 和 1M 上的表现,不像普通基线那样迅速坍塌。

它的第二个优点是不以牺牲全部短任务为代价换长任务。很多长上下文方法的常见后遗症是短输入也变差,或者模型变得很挑 prompt、很挑长度。但 V2PE 的表 2 说明,只要把 (δ\deltaδ) 选得合适,比如常规 benchmark 用 (1/2),整体平均分不仅没崩,甚至略高于原始 InternVL2-2B。换句话说,它不是“只能用于很长输入的特种模型技巧”,而更像是一个可按场景调节的位置信号设计

它也有明显局限。第一,论文的核心训练实验基本都围绕 InternVL2-2B 展开,虽然横向比较包含了其他模型,但没有展示“在 Qwen2-VL、LLaVA、MiniCPM-V 等 backbone 上重新训练 V2PE”的系统性证据。因此,V2PE 是“对多模态长上下文普适的思想”,还是“和 InternVL/InternLM2 代码路径高度耦合的技巧”,还需要更广泛验证。

第二,虽然论文强调 1M token 能力,但超长部分的强证据主要还是集中在 MM-NIAH 图像检索。这当然已经很难了,但它和真正开放式的长文档问答、长视频跨帧推理、复杂多图 reasoning 还不完全等价。论文确实也评了 MileBench 和 Video-MME,但 1M 级别的展示重点还是 retrieval,而不是完整多样化 reasoning。换句话说,V2PE 目前最强的证据是:它让模型更能“在超长多模态序列里找对地方”;至于“找到以后能否更好地推理”,还可以继续做更细的超长 reasoning 基准。

第三,复现材料虽然公开得很不错,但仍有几个值得注意的“工程缝隙”。例如,README 说 256K 训练脚本对应长长度训练,且靠 chunk_num=8attn_type=ring 实现跨 GPU 分块;但公开的 256K 脚本里仍然显示 META_PATH="shell/data/annotation_train_32k.json"max_seq_length 34000。结合 README 对 ring attention 的说明,我倾向于认为作者的有效超长长度是通过pack + chunk + ring attention 的组合实现的,而不是单张 GPU 直接喂入 256K 序列;但这一点对第一次复现的人来说,确实需要自己从脚本和 README 中推断。

还有一个细节非常像真实研究代码里常见的情况:脚本前面计算了 GRADIENT_ACC=$((BATCH_SIZE / PER_DEVICE_BATCH_SIZE / GPUS)),但实际传给训练器的却是 --gradient_accumulation_steps 1。这不代表代码有错,但至少说明公开脚本和“想表达的整体 batch 配置”之间存在信息落差。对复现者来说,不要只看脚本文件名和开头注释,一定要逐项核对真正传给 trainer 的参数

从潜在失败模式看,V2PE 最大的风险不是“无效”,而是**(\delta) 选错**。如果 (\delta) 太大,视觉位置轴几乎和原方法没区别,长上下文收益会消失;如果 (\delta) 太小,虽然位置跨度被强烈压缩,但视觉局部顺序也可能被压得过于紧密,从而伤害短上下文里的细粒度视觉理解。论文表 2 和表 3 的结果正体现了这个张力:超长检索偏爱极小 (\delta),常规 VQA 则偏爱较大 (\delta)。所以 V2PE 不是“一个全局万能默认值”,而是需要和任务长度共同调谐

如果让我设计后续实验,我会优先做四类。第一,跨 backbone 验证:在 Qwen2-VL、LLaVA-NeXT、MiniCPM-V 上完整对照。第二,自适应 (\delta):不是从固定集合里随机采样,而是根据图片块数、token 长度或视觉冗余度动态预测。第三,更强的 1M reasoning 评测:不仅让模型定位 needle,还让它做跨图跨段整合推理。第四,和视频专用位置编码结合:因为 V2PE 目前本质上还是 1D 交错序列位置设计,而视频还有时间维结构,未来可以与视频专用的 RoPE 方案进一步结合。后两项更多是基于本文设计边界做出的合理推断,而不是论文已完成内容。

在实际选 (δ\deltaδ) 时,一个很实用的工程经验可以直接来自论文:短 benchmark 先从 (1/2) 试起,超长 benchmark 先从 (1/256) 试起。更一般地,如果你的总视觉 token 特别多、主要目标是“别让位置超窗”,就优先试更小 (\delta);如果你的任务对细粒度视觉顺序非常敏感,且总长度没那么极端,就试 (1/4)、(1/2) 这类更保守的设置。论文正是根据 benchmark 上下文长度差异,采用了这样的测试策略。

术语表与延伸阅读

视觉语言模型 VLM:把视觉输入和文本输入统一到一个可共同推理的模型里。本文里的 V2PE 是在这类模型的“位置编码层”上做改造。

多模态大语言模型 MLLM:通常指带有图像、视频等多模态输入能力的大语言模型。V2PE 论文在表格和项目页里常把它与 VLM 混用。

Patch Embedding:把图像切成多个小 patch,每个 patch 映射成一个 token。图像越大、切得越细,token 就越多。

位置编码 Positional Encoding:给 token 注入“顺序/位置”的信息。否则 Transformer 只知道“有哪些 token”,不知道“它们排在什么地方”。

RoPE:Rotary Position Embedding,旋转位置编码。它通过旋转 query 和 key,把位置信息编码进注意力中。V2PE 本质上是在 RoPE 的“位置坐标输入”这一层做改造。

长上下文 attention:指模型在很长序列上做自注意力。标准 self-attention 的时间和显存代价会随长度近似二次增长,所以长上下文不仅是“理解难题”,也是“计算难题”。

感受野 Receptive Field:一个 token 能“看到”输入中的多大区域。对视觉 token 来说,初始 patch 只覆盖图像中的一个小区域;经过多层注意力后,信息才逐步融合到全局。

FLOPs:Floating Point Operations,浮点运算次数。它常用来粗略衡量计算成本。V2PE 不减少 visual token 数,因此相比 token compression,它不是“降 FLOPs”的主要手段。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐