LLaVA-OneVision:单图、多图、视频合一


文档摘要

LLaVA-OneVision:单图、多图、视频合一 本节摘要:在 LLaVA-OneVision(Li 等人,2024 年 8 月)之前,开源 VLM 世界有各自独立的谱系:LLaVA-1.5 做单图,Mantis 与 VILA 做多图,Video-LLaVA 与 Video-LLaMA 做视频。每个赢了自己的基准,却在其余场景翻车。LLaVA-OneVision 主张:一套课程能训练一个模型统治全部三种场景,且涌现的任务迁移效应(单图技能外溢到视频,多图推理外溢到单图)胜过专家之和。配方简单到具有欺骗性:一个跨场景保持恒定的视觉 token 预算,加上一条从单图走向 OneVision(多图)再到视频的显式课程。本节读透预算、课程与涌现行为。

LLaVA-OneVision:单图、多图、视频合一

本节摘要:在 LLaVA-OneVision(Li 等人,2024 年 8 月)之前,开源 VLM 世界有各自独立的谱系:LLaVA-1.5 做单图,Mantis 与 VILA 做多图,Video-LLaVA 与 Video-LLaMA 做视频。每个赢了自己的基准,却在其余场景翻车。LLaVA-OneVision 主张:一套课程能训练一个模型统治全部三种场景,且涌现的任务迁移效应(单图技能外溢到视频,多图推理外溢到单图)胜过专家之和。配方简单到具有欺骗性:一个跨场景保持恒定的视觉 token 预算,加上一条从单图走向 OneVision(多图)再到视频的显式课程。本节读透预算、课程与涌现行为。

学习目标

阅读完本节,你应当能够:

  1. 设计一个在单图、多图、视频输入间保持恒定的视觉 token 预算。
  2. 排出一条把技能从单图迁移到视频、且不发生灾难性遗忘的训练课程。
  3. 解释为什么课程做对时,单模型在同参数量下胜过专家。
  4. 说出 LLaVA-OneVision 报告的三种涌现能力:多摄推理、set-of-mark 提示、iPhone 截图 agent。

一、问题与直觉

图像、多图、视频对模型的压力各不相同。

  • 单图想要高分辨率 token(AnyRes,约 2880 视觉 token)以抓住 OCR 与细节。每样本预算:一张图,2880 token。
  • 多图想要几张中等分辨率的图(每张约 576 token),让跨图推理塞得进上下文。每样本预算:48 张图,每张 576,共 23004600 token。
  • 视频想要许多低分辨率帧(池化后每帧约 196 token)以捕捉时间动态。每样本预算:832 帧,每帧 196,共 16006200 token。

如果你训分开的模型,只能挑一个预算。如果训一个模型,你需要预算在各场景间合理伸缩,又不撑爆上下文。

OneVision 之前,默认答案是「训一个场景,无视其余」。Video-LLaVA 用额外训练阶段把视频回填到图像模型;LLaVA-NeXT 用切图加多图支持。没有一个干净地同时处理三者。

OneVision 的 token 预算

LLaVA-OneVision 选定每样本约 3000~4000 token 的统一视觉 token 预算,按场景不同地分配:

  • 单图:AnyRes-9(3×3 子图 + 缩略图),每子图 384 分辨率、729 patch,激进的 2×2 双线性池化 → 每子图 182。总计 9×182 + 182 = 1820 token。或 AnyRes-4、每子图 729 = 2916 + 729。
  • 多图:每张图中等分辨率(384,不切图),729 token 不池化。预算 6 张图 → 4374 token。
  • 视频:32 帧、384 分辨率、激进 3×3 双线性池化 → 每帧 81 token。总计 32×81 = 2592 token。

分配让总 token 数大致恒定。LLM 永远不会看到撑爆上下文的 batch。编码器按场景产出不同几何,但 LLM 消费同一预算。

三阶段课程

LLaVA-OneVision 分三阶段训练:

  1. 单图 SFT(阶段 SI)。数据全是单图加文本,在高分辨率 AnyRes 输入上训练,教感知、OCR、细粒度理解。用 LLaVA-NeXT 数据加 OneVision 专属单图数据。
  2. OneVision SFT(阶段 OV)。混单图 + 多图 + 视频(均匀采样帧),在统一 token 预算上训练,教模型处理异构 batch 形状。不重置权重——从阶段 SI 继续。
  3. 任务迁移(阶段 TT)。继续用目标任务配比训练,通常按产品侧重多图或视频。可选的部署微调。

关键:课程顺序重要。先训视频或先训多图,即便数据相同,图像表现也比先训单图差。论文显式消融了这一点。

为什么课程管用

单图训练建立感知基座。patch token 携带细粒度视觉特征,LLM 学会把它们与文本整合。多图与视频引入结构性挑战(哪张是哪张、什么先发生),没有强感知基座很难学。

如果你从头一起训所有场景,模型会欠拟合感知(每 batch 单图数据有限)又过拟合结构(多图/视频数据多)。结果是个会遵循跨图推理模式但视觉浅薄的模型。

课程顺序让你从阶段 SI 拿到感知强度,再从阶段 OV 拿到组合/时间推理,两者都不丢。

涌现的跨场景技能

LLaVA-OneVision 论文报告三种涌现能力:

  1. 多摄推理。分别在多图 + 视频上训练;推理时被要求对一个多摄驾驶场景推理,模型正确整合视角——尽管训练里从没见过这种确切格式。
  2. set-of-mark 提示。用户用编号标记标注图中的物体,模型就「标记 3 相对标记 7 在做什么」推理。训练里既没见过标记也没见过标注;从空间定位 + 多图引用的组合里学来。
  3. iPhone 截图 agent。用户给一张 iPhone 屏幕截图,要求规划下一次点击。训练于 UI 截图、用户工作流视频、多图前后对。泛化到 agent 用例。

这些都不是训出来的任务,而是从课程的结构组合里涌现的。

视觉 token 池化

token 预算要求池化。OneVision 在二维 patch 网格上做双线性插值:24×24 = 576 patch 变 12×12 = 144(2 倍因子)或 8×8 = 64(3 倍因子)。池化在 patch 网格空间而非 token 空间做,以保留局部性。

每场景的池化因子本身就是超参。少池化 = 多 token = 更丰富表示;多池化 = 少 token = 容下更多帧/图。

LLaVA-OneVision-1.5

2025 年的后续(LLaVA-OneVision-1.5,arXiv 2509.23661)在训练数据、模型权重、代码上「完全开源」,在部分基准上追平闭源差距,让配方民主化。同课程、更多数据、更强基础 LLM,架构不变。

与 Qwen2.5-VL 对比

Qwen2.5-VL(第 09 节)做了不同选择:用 M-RoPE 与动态 FPS,而非固定池化。它的预算随输入伸缩——1 分钟视频比 5 秒视频用更多 token。LLaVA-OneVision 固定预算、伸缩池化。两者都成立,用可配置性换可预测性。

二、从零实现

code/main.py 是一个 OneVision 式 VLM 的课程与预算规划器。给定每样本 token 预算与目标场景配比(比如 40% 单图、30% 多图、30% 视频),它:

  • 为每场景分配分辨率、池化因子、帧数。
  • 检查每场景是否落在共享预算内。
  • 报告预期 token 数、LLM FLOPs、哪些场景 token 不足。
  • 打印逐阶段训练计划。

预算分配的伪代码

def allocate_budget(total_budget, scenario_mix): plans = {} # 单图: 高分辨率, AnyRes + 激进池化 plans["single"] = {"anyres": 9, "pool": 4, "frames": 1} # 多图: 中分辨率, 不切图 plans["multi"] = {"anyres": 1, "pool": 1, "images": total_budget // 729} # 视频: 低分辨率, 激进池化 plans["video"] = {"anyres": 1, "pool": 9, "frames": total_budget // 81} for s, p in plans.items(): p["tokens"] = compute_tokens(p) assert p["tokens"] <= total_budget # 不撑爆预算 return plans

双线性池化

def bilinear_pool_2d(patches, grid_h, grid_w, factor): # patches 形状 (grid_h*grid_w, D), factor=2 即每维缩 2 倍 out_h, out_w = grid_h // factor, grid_w // factor out = zeros((out_h*out_w, D)) for i in range(out_h): for j in range(out_w): block = patches_2d[i*factor:(i+1)*factor, j*factor:(j+1)*factor] out[i*out_w+j] = block.mean(axis=(0,1)) # 2x2 块均值 ≈ 双线性 return out

💡 关键洞察:池化在 patch 网格空间而非 token 空间做,是为了保留二维局部性——相邻 patch 的均值仍有空间意义,而一维 token 序列上的池化会打乱邻接关系。

三阶段课程

def curriculum(): stage_SI = train(single_image_data, lr=2e-5) # 感知基座 stage_OV = train(mix(single, multi, video), # 从 SI 继续, 不重置 init_from=stage_SI, lr=1e-5) stage_TT = train(task_mix, init_from=stage_OV, # 任务专属微调 lr=5e-6) # 注意: 顺序不能反 — 视频优先会损害图像表现

三、框架对比

  • LLaVA-OneVision 官方:三阶段课程脚本,AnyRes + 双线性池化的统一预算,Mantis/Video-LLaVA 数据混合;llava-onevision-qwen2 系列是事实标准。
  • Qwen2.5-VL:M-RoPE + 动态 FPS,预算随输入伸缩,配置性强但可预测性弱于 OneVision。
  • Video-LLaVA / Video-LLaMA:视频优先,把视频回填到图像模型,多阶段训练,图像能力受限。
  • VILA / Mantis:多图优先,交错图像 token,视频与单图是后加的。

工程取舍:要单模型统治三场景用 LLaVA-OneVision;要预算随输入动态伸缩用 Qwen2.5-VL;只做视频或只做多图可用专门模型;做产品部署用 OneVision-1.5 全开源版。

四、可复用产物

本节产出 outputs/skill-onevision-budget-planner.md。给定目标任务分布与每样本预算,它输出 AnyRes 因子、每帧池化、视频帧数、课程阶段权重。每当你训练或微调统一场景 VLM 时都用它。

五、练习

  1. 产品配比:你的产品是 80% 单图、10% 多图(24 张)、10% 视频(816 帧)。设计 token 预算,把省下的预算放哪?

  2. 第四种涌现:读 LLaVA-OneVision 第 4.3 节(涌现能力),提出一个课程很可能解锁、但论文未报告的第四种涌现技能。

  3. 换课程顺序:把课程顺序换成「多图优先 → 单图 → 视频」,预测哪些基准会退步、为什么。

  4. 8 帧泛化:论文报告视频基准只在每样本 8 帧上训练。这能泛化到推理时的 30 秒视频吗?什么先崩——token 预算还是时间推理?

  5. 池化验证:24×24 patch 双线性池化到 12×12 是每维 4 倍缩减。用标准库 Python 实现池化,验证每个 2×2 块的均值与双线性输出一致。

本节要点回顾

  1. 三场景合一:单图、多图、视频由一个模型统治,靠恒定 token 预算 + 显式课程。
  2. 恒定预算:每样本约 3000~4000 token,按场景不同分配(单图 AnyRes-9 池化、多图 729/张、视频 81/帧)。
  3. 三阶段课程:阶段 SI 单图(感知基座)→ 阶段 OV 混合(组合/时间推理)→ 阶段 TT 任务微调。
  4. 顺序重要:先单图胜过先视频/多图,论文显式消融。
  5. 课程为何管用:先建立感知强度,再加结构推理;一起训会欠拟合感知、过拟合结构。
  6. 三种涌现:多摄推理、set-of-mark 提示、iPhone 截图 agent——非训练任务,从组合涌现。
  7. 网格空间池化:双线性在 2D patch 网格上做以保局部性;池化因子是每场景超参。
  8. OneVision-1.5:2025 全开源,同课程更多数据更强 LLM,追平部分闭源基准。
  9. 与 Qwen 对比:OneVision 固定预算伸缩池化(可预测);Qwen2.5-VL 伸缩预算(可配置)。
  10. 任务迁移:单图技能外溢到视频,多图推理外溢到单图,胜过专家之和。

下一节,我们将进入 Qwen-VL 家族——它用 M-RoPE 与动态 FPS 走另一条路,把分辨率与帧率都交给输入决定,是国产开源 VLM 的代表路线。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U