LLaVA-OneVision:单图像、多图像、视频统一模型
理解LLaVA-OneVision如何通过统一token预算和课程训练实现三场景统一
LLaVA-OneVision:单图像、多图像、视频统一模型
在LLaVA-OneVision (Li等人, 2024年8月)之前,开源VLM世界有独立的谱系:LLaVA-1.5用于单图像,Mantis和VILA等多图像模型,Video-LLaVA和Video-LLaMA等视频模型。每个在其基准上获胜而在其他场景上失败。LLaVA-OneVision论证单一课程可以训练一个模型在所有三个场景中占优,并且涌现的任务迁移效应(单图像技能导出到视频,多图像推理导出到单图像)击败专家之和。方案出奇地简单:一个跨场景保持恒定的视觉token预算,加上从单图像到OneVision(多图像)到视频的显式课程。本课程阅读预算、课程和涌现行为。
类型: 构建 语言: Python (stdlib, token预算求解器 + 课程规划器) 前置知识: Phase 12 · 05 (LLaVA), Phase 12 · 06 (任意分辨率) 时间: ~180分钟
学习目标
- 设计在单图像、多图像和视频输入间保持恒定的视觉token预算。
- 安排从单图像到视频的训练课程而不发生灾难性遗忘。
- 解释为什么课程正确时单一模型在相同参数量下击败专家。
- 说出LLaVA-OneVision报告的三种涌现能力:多摄像头推理、set-of-mark提示、iPhone截图agent。
问题
图像、多图像和视频各自以不同方式压力测试模型。
单图像想要高分辨率token(AnyRes,约2880视觉token)以捕获OCR和精细细节。每样本预算:一张图像,2880 token。
多图像想要多张中等分辨率图像(每张约576 token),以便跨图像推理适合上下文。每样本预算:4-8张图像,每张576,2300-4600 token。
视频想要许多低分辨率帧(池化后每帧约196 token)以捕获时间动态。每样本预算:8-32帧,每帧196,1600-6200 token。
如果你训练独立模型,你选择一个预算。如果你训练一个模型,你需要预算在场景间合理缩放而不爆上下文。
OneVision之前,默认答案是”训练一个场景,忽略其他”。Video-LLaVA通过额外训练阶段将视频改造到图像模型上。LLaVA-NeXT通过平铺添加多图像支持。没有一个干净地处理所有三种。
概念
OneVision token预算
LLaVA-OneVision选择约3000-4000 token每样本的统一视觉token预算,按场景不同分配:
- 单图像:AnyRes-9(3x3瓦片 + 缩略图),每个瓦片在384下729个patch,激进2x2双线性池化 → 每瓦片182。总计:9 * 182 + 182 = 1820 token。或AnyRes-4在729每瓦片 = 2916 + 729。
- 多图像:每张图像中等分辨率(384,不平铺),729 token无池化。预算6张图像 → 4374 token。
- 视频:32帧在384分辨率下,激进3x3双线性池化 → 每帧81 token。总计:32 * 81 = 2592 token。
分配保持大致恒定的总token。LLM从不看到爆其上下文的batch。编码器按场景产生不同几何,但LLM消费相同预算。
三阶段课程
LLaVA-OneVision分三个阶段训练:
- 单图像SFT(阶段SI)。所有数据是单图像加文本。在高分辨率AnyRes输入上训练。这教会感知、OCR和细粒度理解。使用LLaVA-NeXT数据加OneVision特定单图像数据。
- OneVision SFT(阶段OV)。混合单图像 + 多图像 + 视频(均匀采样帧)。在统一token预算上训练。这教会模型处理异构batch形状。无权重重置——从阶段SI继续。
- 任务迁移(阶段TT)。继续使用目标任务混合,通常根据产品偏向更多多图像或视频。可选部署微调。
关键:课程顺序很重要。先训练视频或多图像比先训练单图像产生更差的图像性能,即使数据相同。论文明确消融了这一点。
为什么课程有效
单图像训练建立感知基础。Patch token携带细粒度视觉特征;LLM学习将它们与文本整合。多图像和视频引入结构挑战(哪张图像是哪张,先发生了什么),在没有强感知基础的情况下很难学习。
如果你从头一起训练所有场景,模型欠拟合感知(每batch有限的单图像数据)并过拟合结构(大量多图像/视频数据)。结果:一个遵循跨图像推理模式但视觉浅薄的模型。
课程排序给你阶段SI的感知强度,然后阶段OV的组合/时间推理,而不丢失任何一个。
涌现跨场景技能
LLaVA-OneVision论文报告了三种涌现能力:
- 多摄像头推理。分别训练多图像 + 视频;推理时,要求推理多摄像头驾驶场景。模型正确整合视图,尽管训练中从未见过该确切格式。
- Set-of-mark提示。用户在图像中用编号标记标注对象;模型推理”标记3相对于标记7在做什么”。既未训练标记也未训练标注;从空间定位 + 多图像引用的组合中学习。
- iPhone截图agent。用户提供iPhone屏幕截图并要求计划下一次点击。在UI截图、用户工作流视频和多图像前后对上训练。泛化到agent用例。
这些不是训练任务;它们从课程的结构组合中涌现。
视觉token池化
token预算需要池化。OneVision在2D patch网格上使用双线性插值:24x24 = 576 patch变为12x12 = 144(2x因子)或8x8 = 64(3x因子)。池化在patch网格空间而非token空间完成,以保留局部性。
每场景的池化因子选择本身是超参数。更少池化 = 更多token = 更丰富表示。更多池化 = 更少token = 更多帧/图像适合。
LLaVA-OneVision-1.5
2025年跟进(LLaVA-OneVision-1.5, arXiv 2509.23661)在训练数据、模型权重和代码方面”完全开放”。在某些基准上匹配了专有差距,民主化了方案。相同课程,更多数据,更好基座LLM。无架构变化。
与Qwen2.5-VL对比
Qwen2.5-VL(课程12.09)做出不同选择。它使用M-RoPE和动态FPS而非固定池化。其预算随输入缩放——1分钟视频使用比5秒视频更多token。LLaVA-OneVision固定预算并缩放池化。两者都有效;它们用可配置性换可预测性。
实践
code/main.py是OneVision风格VLM的课程和预算规划器。给定每样本token预算和目标场景混合(比如40%单图像、30%多图像、30%视频),它:
- 为每个场景分配分辨率、池化因子和帧数。
- 检查每个场景是否适合共享预算。
- 报告预期token数量、LLM FLOPs以及哪些场景token不足。
- 打印逐阶段训练调度。
用于规划OneVision微调或健全检查VLM部署的每请求成本。
输出
本课程产生outputs/skill-onevision-budget-planner.md。给定目标任务分布和每样本预算,它输出AnyRes因子、每帧池化、视频帧数和课程阶段权重。每当你训练或微调统一场景VLM时使用。
练习
-
你的产品支持80%单图像、10%多图像(2-4张)、10%视频(8-16帧)。设计token预算。你从不需要重度多图像中节省的额外预算放在哪里?
-
阅读LLaVA-OneVision第4.3节(涌现能力)。提出课程可能解锁但论文未报告的第四种涌现技能。
-
交换课程顺序——先训练多图像,然后单图像,然后视频。预测哪些基准会退化以及为什么。
-
论文报告在每样本仅8帧上训练的视频基准。这能泛化到推理时的30秒视频吗?什么先崩溃——token预算还是时间推理?
-
24x24 patch到12x12的双线性池化是每维4倍缩减。用stdlib Python实现池化并验证每个2x2块上的均值匹配双线性输出。
关键术语
| 术语 | 常见说法 | 实际含义 |
|---|---|---|
| OneVision场景 | ”单图像、多图像或视频” | 统一VLM处理的三种输入形状之一;预算跨场景保持恒定 |
| Token预算 | ”每样本多少token” | LLM每训练/推理样本看到的总视觉token,通常3000-4000 |
| 课程 | ”训练顺序” | 为涌现迁移选择的阶段排序(单图像 → 多图像 → 视频) |
| 双线性池化 | ”Token缩减” | 对patch网格(2D)应用双线性插值以减少token数量同时保留局部性 |
| 涌现技能 | ”没训练但有效” | 推理时出现的无需匹配训练数据的能力,由于课程组合 |
| AnyRes-k | ”k瓦片设置” | k个固定分辨率子瓦片加一个缩略图,典型k ∈ {4, 9} |
| 任务迁移 | ”跨场景泛化” | 通过共享骨干在单图像上学到的技能应用到视频(反之亦然) |