note
- GOP = Group of Pictures(图像组),指视频中由一个 I-frame(关键参考帧) 和后续若干 P-frames(预测帧) 组成的一组连续帧
- 研究动机:传统视频 MLLM 将每帧独立编码为视觉 Token,相邻帧大量内容重复,造成 Token 冗余、推理延迟高。作者借鉴视频编码中的 I/P 帧预测机制,只完整编码关键帧,其余帧仅保留变化信息。
- 核心方法:
- Adaptive GOP:根据相邻帧运动补偿后的预测误差(pcost),动态划分视频片段;误差过大则插入新的 I-frame。
- I-frame 编码:使用原始 ViT 提取完整视觉特征,每帧约 256 Tokens。
- P-frame 编码:通过块匹配计算运动向量(2通道)和像素残差(3通道),拼接成5通道输入,经轻量 P-tokenizer 压缩至 16 Tokens/帧。
- 两阶段训练:
- Stage 1:视觉特征蒸馏。先通过冻结视觉教师的特征蒸馏训练 P-tokenizer。
- 使用冻结的视觉编码器提取目标帧特征,训练 P-tokenizer 和辅助预测器,让压缩后的 P-tokens 配合参考帧信息,尽可能恢复目标帧的视觉语义特征。这里恢复的是特征,不是 RGB 像素。
- Stage 2:多模态对齐。再冻结视觉模块、仅微调 LLM,完成视频问答对齐。
- 将 I-tokens 与 P-tokens 按时间顺序输入 LLM,通过多模态训练,让语言模型学会利用这种新视觉表示进行问答。
- Stage 1:视觉特征蒸馏。先通过冻结视觉教师的特征蒸馏训练 P-tokenizer。
- 实验结果:基于 Qwen3-VL-8B,在11个视频理解基准上验证:视觉 Token 减少 84.7%;TTFT:9.26s → 1.62s;端到端延迟:11.18s → 3.20s;5项通用视频基准平均分:74.0 → 75.7。
- 技术评价:本质是将传统视频压缩的"关键帧 + 运动补偿 + 残差"思想迁移到 MLLM 的视觉 Token 表征层。区别于均匀抽帧或 Token Pruning,AdaCodec 直接消除跨帧冗余,在保留时序变化信息的同时降低推理成本。局限是需要额外训练 P-tokenizer 和适配 LLM,且尚未验证流式视频场景。
- AdaCodec 的核心创新不是直接对 256 个视觉 Tokens 做剪枝,而是先利用运动补偿消除视频时间冗余,再通过可训练的 P-tokenizer,把帧间变化聚合成 16 个视觉 Tokens。
文章目录
-
- note
- 结论
- [一、研究动机:逐帧 RGB 输入的问题不是"帧多",而是"重复信息多"](#一、研究动机:逐帧 RGB 输入的问题不是“帧多”,而是“重复信息多”)
- [二、核心方法:预测代价决定 I 帧位置,运动与残差组成 P-token](#二、核心方法:预测代价决定 I 帧位置,运动与残差组成 P-token)
-
- [2.1 整体流程](#2.1 整体流程)
- [2.2 自适应 GOP:何时重置 I 帧?](#2.2 自适应 GOP:何时重置 I 帧?)
- [2.3 双分支接口:I 帧提供状态,P-token 提供变化](#2.3 双分支接口:I 帧提供状态,P-token 提供变化)
- [2.4 完整推理流程](#2.4 完整推理流程)
- [2.5 P-tokenizer 内部如何压缩成 16 Tokens](#2.5 P-tokenizer 内部如何压缩成 16 Tokens)
- [三、训练方法:先让 P-token 能重建目标帧的视觉特征,再学习多模态问答](#三、训练方法:先让 P-token 能重建目标帧的视觉特征,再学习多模态问答)
-
- [第一阶段:让 P-token 对齐冻结视觉教师](#第一阶段:让 P-token 对齐冻结视觉教师)
- [第二阶段:冻结视觉侧,训练 LLM 使用预测视觉码](#第二阶段:冻结视觉侧,训练 LLM 使用预测视觉码)
- 两阶段训练流程图
- [四、实验结果:AdaCodec 在多个预算下形成性能---效率优势](#四、实验结果:AdaCodec 在多个预算下形成性能—效率优势)
-
- [4.1 三个长视频基准:32k 跨过 224k 基线](#4.1 三个长视频基准:32k 跨过 224k 基线)
- [4.2 预算扫描:优势跨越多个 token 规模](#4.2 预算扫描:优势跨越多个 token 规模)
- [4.3 时序、通用视频与感知基准](#4.3 时序、通用视频与感知基准)
- 五、效率结果:准确率与响应速度同时改善
-
- [5.1 主要效率指标](#5.1 主要效率指标)
- [5.2 延迟收益从何而来?](#5.2 延迟收益从何而来?)
- [六、消融实验:P-token 的价值来自"预测变化",而不是再给模型看一张小图](#六、消融实验:P-token 的价值来自“预测变化”,而不是再给模型看一张小图)
-
- [6.1 为什么不用低分辨率 RGB?](#6.1 为什么不用低分辨率 RGB?)
- [6.2 为什么不是 RGB 信息越多越好?](#6.2 为什么不是 RGB 信息越多越好?)
- [6.3 压缩率为什么没有达到理论最小值?](#6.3 压缩率为什么没有达到理论最小值?)
- 七、综合评价
- Reference
结论
AdaCodec:面向视频 MLLM 的预测式视觉 Token 压缩
AdaCodec: A Predictive Visual Code for Video MLLMs
AdaCodec 的核心创新不是"少抽帧",也不是把视频文件压缩得更小,而是改变了视频进入多模态大模型的方式:
- 预测代价低的帧:不再完整编码,只传运动向量和 RGB 残差;
- 预测代价高的帧:作为完整参考帧,进入原生 ViT;
- LLM 看到的不是一串彼此独立的 RGB 帧,而是"参考状态+时间变化"交错的视觉代码。
因此,AdaCodec 同时获得三项收益:
- 节省 token:平均只保留约 15.4% 的视觉 token;
- 降低延迟:通用评测中,首 token 时间由 9.26 秒降至 1.62 秒;
- 保持或提高准确率:五项通用视频基准平均分由 74.0 提高到 75.7。
最强的一组结果来自长视频:AdaCodec 只使用 32k 视觉 token ,即在约七分之一预算下,仍然超过逐帧 RGB 的 224k 基线。

**看图指引:**先看论文 Figure 2,重点看左侧的宏块运动估计、右侧的 I/P 双分支编码,以及视觉 token 如何按时间顺序送入 LLM。这张图可以一次性建立对 AdaCodec 的整体理解。
一、研究动机:逐帧 RGB 输入的问题不是"帧多",而是"重复信息多"
视频相邻帧通常共享大量对象、背景和画面布局。逐帧 RGB 编码会把先前帧已经表达过的信息反复送入语言模型,造成三重问题:
| 问题 | 具体表现 |
|---|---|
| 上下文冗余 | 稳定背景和重复对象反复占据视觉前缀 |
| 采样矛盾 | 稀疏采样容易漏掉短时动作,密集采样则增加 token 和延迟 |
| 成本增长 | 视觉 token 数量大致随采样帧数线性增长 |
现有高效视频 MLLM 方法主要分为三类:
- 选择或下采样更少帧;
- 在 ViT 之后压缩、合并或剪枝 token;
- 使用记忆、长上下文或在线状态管理历史信息。
这些路线都能降低部分成本,但它们有一个共同前提:保留下来的每一帧仍然是一张独立 RGB 图像。
AdaCodec 的切入点更直接:如果当前帧的大部分内容可以由前一帧预测,就不必再向 LLM 发送一个完整 RGB 帧;只有当预测失败时,才插入新的完整参考帧。

**看图指引:**可结合论文 Figure 1 和相关工作,重点关注表格中对"帧选择、token 压缩、记忆方法"的分类。阅读时要区分两条路线:
- 如何减少 RGB 帧数量或 token 数量
- 是否改变 RGB 帧这一基本视觉接口
AdaCodec 属于后者。
为什么不直接复用传统视频编解码器?
传统视频编解码器也使用 I 帧和 P 帧,但其目标是:
- 生成标准兼容的比特流;
- 降低传输码率;
- 保证人类观看时具有较好的重建质量。
AdaCodec 的目标完全不同:它生成的是给 LLM 消费的视觉 token ,优化的是理解性能、上下文预算和推理延迟,而不是可播放视频的压缩率。因此,论文对宏块划分、运动参考、搜索窗口、GOP 调度等机制进行了重新设计。
重要边界:"视觉 token 减少 84.7%"不能改写成"视频文件体积压缩 84.7%"。AdaCodec 输出的不是标准视频比特流。
二、核心方法:预测代价决定 I 帧位置,运动与残差组成 P-token
2.1 整体流程
AdaCodec 把视频组织成若干自适应 GOP:
- GOP 的第一帧是 I 帧;
- 后续帧是 P 帧;
- 每个 P 帧从前一采样帧估计运动和残差;
- 当预测代价超过阈值时,从当前帧开始新的 GOP。
I 帧编码
I 帧使用原生 ViT 编码,获得完整空间表征,承担对象、背景和布局等参考信息。论文中,I 帧输出 256 个视觉 token。
P 帧编码
对当前宏块,AdaCodec 在前一采样帧的局部搜索窗中寻找最匹配的参考块,同时考虑像素差异和位移惩罚:
- 运动向量:当前块相对于参考块的位移;
- 残差:当前块与预测块之间的像素差异;
- P 帧输入:残差图和运动场拼接成五通道输入;
- P-token:经 P-tokenizer 后输出 16 个 token。
因此,I 帧与 P 帧的 token 数量比为:256:16=16:1

看图指引:看论文 Figure 2 中的局部块匹配部分,重点观察:
- 运动向量如何从前一采样帧指向当前帧;
- 当前块如何由参考块和残差重建;
- P 帧携带的是"变化",而不是完整场景。
2.2 自适应 GOP:何时重置 I 帧?
AdaCodec 不是每隔固定几帧插入一个 I 帧,而是利用运动估计产生的预测代价进行决策:
- 当前帧可以由前一帧较准确预测:继续作为 P 帧;
- 当前帧难以预测:预测代价超过阈值 γ,重置新的 I 帧;
- 第一帧始终作为 I 帧。
阈值在训练划分上调整,目标为"每个 GOP 的中位数包含 8 个 P 帧";预测链上限设为 16 个 P 帧。
这种设计使预算由固定时间轴分配,转向按预测难度动态分配:
- 异常识别等稳定视频:GOP 可以较长;
- 第一视角、频繁切换或快速运动视频:I 帧重置更频繁;
- 静态片段:持续使用低成本 P-token。

看图指引:查看论文 Table 3 和 Figure 4。重点比较不同视频类别的平均 GOP 长度,尤其是:
- 异常识别:16.69
- 教程类:12.22
- 第一视角:9.07
这解释了 AdaCodec 的压缩率为什么不是视频级别的固定值。
2.3 双分支接口:I 帧提供状态,P-token 提供变化
| 视觉单元 | 输入 | 编码方式 | Token 数量 | 主要作用 |
|---|---|---|---|---|
| I 帧 | 完整 RGB 帧 | 原生 ViT | 256 | 建立完整视觉参考状态 |
| P 帧 | 运动向量+残差 | P-tokenizer | 16 | 描述位置、对象和运动变化 |
| 最终输入 | I/P 交错的视觉代码 | 按时间顺序送入 LLM | 动态变化 | 形成"参考状态+时序变化"的序列 |
AdaCodec 不是用一张小图简单替代全分辨率 RGB 图,而是把两种不同性质的信息分开表达:
- 空间完整性优先给 I 帧;
- 时序变化优先给 P 帧。
LLM 需要学习的信息也由"每帧都是新场景"转变为"在当前参考状态下发生了什么变化"。
2.4 完整推理流程
#mermaid-svg-KYdLE79Y7XlbLIdK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KYdLE79Y7XlbLIdK .error-icon{fill:#552222;}#mermaid-svg-KYdLE79Y7XlbLIdK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KYdLE79Y7XlbLIdK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KYdLE79Y7XlbLIdK .marker.cross{stroke:#333333;}#mermaid-svg-KYdLE79Y7XlbLIdK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KYdLE79Y7XlbLIdK p{margin:0;}#mermaid-svg-KYdLE79Y7XlbLIdK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster-label text{fill:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster-label span{color:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster-label span p{background-color:transparent;}#mermaid-svg-KYdLE79Y7XlbLIdK .label text,#mermaid-svg-KYdLE79Y7XlbLIdK span{fill:#333;color:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .node rect,#mermaid-svg-KYdLE79Y7XlbLIdK .node circle,#mermaid-svg-KYdLE79Y7XlbLIdK .node ellipse,#mermaid-svg-KYdLE79Y7XlbLIdK .node polygon,#mermaid-svg-KYdLE79Y7XlbLIdK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KYdLE79Y7XlbLIdK .rough-node .label text,#mermaid-svg-KYdLE79Y7XlbLIdK .node .label text,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape .label,#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape .label{text-anchor:middle;}#mermaid-svg-KYdLE79Y7XlbLIdK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KYdLE79Y7XlbLIdK .rough-node .label,#mermaid-svg-KYdLE79Y7XlbLIdK .node .label,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape .label,#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape .label{text-align:center;}#mermaid-svg-KYdLE79Y7XlbLIdK .node.clickable{cursor:pointer;}#mermaid-svg-KYdLE79Y7XlbLIdK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KYdLE79Y7XlbLIdK .arrowheadPath{fill:#333333;}#mermaid-svg-KYdLE79Y7XlbLIdK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KYdLE79Y7XlbLIdK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KYdLE79Y7XlbLIdK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KYdLE79Y7XlbLIdK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KYdLE79Y7XlbLIdK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KYdLE79Y7XlbLIdK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster text{fill:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster span{color:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KYdLE79Y7XlbLIdK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK rect.text{fill:none;stroke-width:0;}#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape p,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape .label rect,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KYdLE79Y7XlbLIdK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KYdLE79Y7XlbLIdK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KYdLE79Y7XlbLIdK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
输入:视频 V + 用户问题 Q
视频抽帧:得到时间序列 x0, x1, ..., xT
初始化:x0 设为 I-frame
逐帧处理 xt
与前一采样帧 xt-1 做 Block Matching
计算运动向量 M 与 RGB 残差 R
汇总块匹配预测代价 pcost
pcost > 阈值 γ
或 GOP 达到长度上限?
开启新 GOP:当前帧设为 I-frame
当前帧设为 P-frame
RGB 图像 → 原始 ViT
输出 256 I-Tokens
拼接 R(3通道) + M(2通道)
5通道张量 → P-tokenizer
输出 16 P-Tokens
按时间顺序拼接 I-Tokens 与 P-Tokens
加入问题 Q,输入 LLM
LLM Prefill + Decode
输出视频问答结果
2.5 P-tokenizer 内部如何压缩成 16 Tokens
#mermaid-svg-KLax6X5TTtTP4PP7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KLax6X5TTtTP4PP7 .error-icon{fill:#552222;}#mermaid-svg-KLax6X5TTtTP4PP7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KLax6X5TTtTP4PP7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KLax6X5TTtTP4PP7 .marker.cross{stroke:#333333;}#mermaid-svg-KLax6X5TTtTP4PP7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KLax6X5TTtTP4PP7 p{margin:0;}#mermaid-svg-KLax6X5TTtTP4PP7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster-label text{fill:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster-label span{color:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster-label span p{background-color:transparent;}#mermaid-svg-KLax6X5TTtTP4PP7 .label text,#mermaid-svg-KLax6X5TTtTP4PP7 span{fill:#333;color:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .node rect,#mermaid-svg-KLax6X5TTtTP4PP7 .node circle,#mermaid-svg-KLax6X5TTtTP4PP7 .node ellipse,#mermaid-svg-KLax6X5TTtTP4PP7 .node polygon,#mermaid-svg-KLax6X5TTtTP4PP7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KLax6X5TTtTP4PP7 .rough-node .label text,#mermaid-svg-KLax6X5TTtTP4PP7 .node .label text,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape .label,#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-KLax6X5TTtTP4PP7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KLax6X5TTtTP4PP7 .rough-node .label,#mermaid-svg-KLax6X5TTtTP4PP7 .node .label,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape .label,#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape .label{text-align:center;}#mermaid-svg-KLax6X5TTtTP4PP7 .node.clickable{cursor:pointer;}#mermaid-svg-KLax6X5TTtTP4PP7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KLax6X5TTtTP4PP7 .arrowheadPath{fill:#333333;}#mermaid-svg-KLax6X5TTtTP4PP7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KLax6X5TTtTP4PP7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KLax6X5TTtTP4PP7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KLax6X5TTtTP4PP7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KLax6X5TTtTP4PP7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KLax6X5TTtTP4PP7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster text{fill:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster span{color:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KLax6X5TTtTP4PP7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape p,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape .label rect,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KLax6X5TTtTP4PP7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KLax6X5TTtTP4PP7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KLax6X5TTtTP4PP7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 当前 P-frame xt
运动估计 + 残差计算
前一采样帧 xt-1
运动向量 M:H×W×2
RGB 残差 R:H×W×3
Concat:H×W×5
5通道 Patch Embedding
Patch Tokens
16个可学习 Latent Tokens
ViT Transformer
Patch Token 输出
16个 Latent Token 输出
不传给 LLM
P-Tokens + 时间位置编码
送入 LLM 视觉输入序列
三、训练方法:先让 P-token 能重建目标帧的视觉特征,再学习多模态问答
AdaCodec 采用两阶段训练,避免视觉表征学习与多模态指令学习相互干扰。
第一阶段:让 P-token 对齐冻结视觉教师
第一阶段训练 P-tokenizer 和辅助预测器,目标是:
给定 I 帧和 P 帧的运动、残差信息,预测目标 RGB 帧在冻结教师编码器中的视觉特征。
损失由两部分组成:
- L1 损失:约束目标特征与预测特征的逐维接近程度;
- 余弦损失:约束两者方向一致。
这一步非常关键。AdaCodec 并不要求 P-token 重建出"人眼可观看的像素",而是要求它能够在 LLM 使用的视觉特征空间中描述目标帧。
第二阶段:冻结视觉侧,训练 LLM 使用预测视觉码
第二阶段使用时间顺序交错的视觉代码,配合问题和答案进行自回归训练。训练时:
- 冻结视觉侧;
- 训练语言模型阅读预测视觉代码;
- 数据混合包含 3,904,313 条样本。
训练过程先使用 64k 视觉 token 预算 训练 40,000 步 ,再在 224k 预算 下训练 5,000 步。
这种解耦带来两个优势:
- P-token 先建立稳定的视觉预测语义;
- LLM 再学习如何基于变化信号进行问答和时间推理。
相应代价是:第二阶段无法反向修复第一阶段遗漏的视觉表征问题。
两阶段训练流程图
推理阶段只需要 I-frame Encoder、P-tokenizer 和 LLM。但 P-tokenizer 不能未经训练就直接将视觉信息压缩为有用的 16 Tokens。
#mermaid-svg-vDNVmFHAaQzbWMWA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vDNVmFHAaQzbWMWA .error-icon{fill:#552222;}#mermaid-svg-vDNVmFHAaQzbWMWA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vDNVmFHAaQzbWMWA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vDNVmFHAaQzbWMWA .marker.cross{stroke:#333333;}#mermaid-svg-vDNVmFHAaQzbWMWA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vDNVmFHAaQzbWMWA p{margin:0;}#mermaid-svg-vDNVmFHAaQzbWMWA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster-label text{fill:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster-label span{color:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster-label span p{background-color:transparent;}#mermaid-svg-vDNVmFHAaQzbWMWA .label text,#mermaid-svg-vDNVmFHAaQzbWMWA span{fill:#333;color:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .node rect,#mermaid-svg-vDNVmFHAaQzbWMWA .node circle,#mermaid-svg-vDNVmFHAaQzbWMWA .node ellipse,#mermaid-svg-vDNVmFHAaQzbWMWA .node polygon,#mermaid-svg-vDNVmFHAaQzbWMWA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vDNVmFHAaQzbWMWA .rough-node .label text,#mermaid-svg-vDNVmFHAaQzbWMWA .node .label text,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape .label,#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape .label{text-anchor:middle;}#mermaid-svg-vDNVmFHAaQzbWMWA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vDNVmFHAaQzbWMWA .rough-node .label,#mermaid-svg-vDNVmFHAaQzbWMWA .node .label,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape .label,#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape .label{text-align:center;}#mermaid-svg-vDNVmFHAaQzbWMWA .node.clickable{cursor:pointer;}#mermaid-svg-vDNVmFHAaQzbWMWA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vDNVmFHAaQzbWMWA .arrowheadPath{fill:#333333;}#mermaid-svg-vDNVmFHAaQzbWMWA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vDNVmFHAaQzbWMWA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vDNVmFHAaQzbWMWA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vDNVmFHAaQzbWMWA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vDNVmFHAaQzbWMWA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vDNVmFHAaQzbWMWA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster text{fill:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster span{color:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vDNVmFHAaQzbWMWA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA rect.text{fill:none;stroke-width:0;}#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape p,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape .label rect,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vDNVmFHAaQzbWMWA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vDNVmFHAaQzbWMWA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vDNVmFHAaQzbWMWA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Stage 2:多模态对齐
视频 + 问答训练数据
冻结 I-frame Encoder 和 P-tokenizer
生成 I/P 混合视觉 Tokens
可训练 LLM
Next Token Prediction Loss
Stage 1:视觉特征对齐
反向传播
反向传播
训练视频:参考帧、P-frames、目标帧
冻结 Teacher ViT 提取目标帧特征
运动向量 + 残差
可训练 P-tokenizer
16个 P-Tokens
参考帧 I-Tokens
辅助特征预测器 H
预测目标帧视觉特征
Feature Alignment Loss
移除辅助特征预测器
四、实验结果:AdaCodec 在多个预算下形成性能---效率优势
4.1 三个长视频基准:32k 跨过 224k 基线
| 长视频基准 | RGB 基线,224k | AdaCodec,32k | AdaCodec,224k |
|---|---|---|---|
| MLVU | 62.2 | 62.7 | 65.3 |
| LongVideoBench | 62.4 | 63.2 | 67.8 |
| LVBench | 58.0 | 58.2 | 58.4 |
三个任务中,32k AdaCodec 均已超过 224k RGB 基线;224k AdaCodec 进一步扩大了 LongVideoBench 上的优势。
看图指引:重点查看论文 Table 2。建议同时横向比较:
- 32k AdaCodec 与 224k RGB 基线;
- 224k AdaCodec 与 224k RGB 基线。
不要只关注单个任务,应比较三个长视频任务的收益稳定性。
这项结果说明,AdaCodec 并非依靠偶然取得某一组高分,而是在不同长视频任务上形成了一致的预算效率优势。但收益幅度并不完全相同:LongVideoBench 的改进明显,LVBench 的改进则相对较小。
4.2 预算扫描:优势跨越多个 token 规模
论文在 MLVU、LongVideoBench 和 LVBench 上比较 32k、64k、128k、224k 四种预算。AdaCodec 在全部预算下均优于逐帧 RGB 基线,且 32k 已超过 RGB 的 224k 结果。
这比"只在某一个预算点取得更好结果"更有说服力,说明优势来自视觉接口设计,而不是单一运行点调参。
看图指引:查看论文中的预算扫描曲线。重点观察两条信息:
- AdaCodec 与 RGB 基线的差距是否随预算变化而缩小;
- 不同长视频任务是否具有一致趋势。
需要注意,论文没有把其他压缩方法全部纳入同一组密集预算曲线,因此目前证据只能支持"相对于论文设定的 RGB 基线更优",不能据此直接宣布对所有视频压缩方法形成绝对优势。
4.3 时序、通用视频与感知基准
| 任务类别 | AdaCodec,32k | AdaCodec,224k |
|---|---|---|
| TempCompass | 75.8 | 75.9 |
| MotionBench | 58.8 | 59.9 |
| TOMATO | 39.8 | 40.0 |
| Video-MME | 75.0 | 75.5 |
| MVBench | 75.3 | 76.6 |
| NExT-QA | 83.1 | 84.2 |
| PerceptionTest | 75.1 | 80.5 |
| EgoSchema | 70.2 | 70.4 |
在匹配 token 预算时,论文还通过提高采样密度更充分地利用预算。因此,224k 条件下的部分增益同时包含:
- P-token 节省出来的上下文余量;
- 同一总预算下更密集的时间采样。
所以,这部分结果更准确的结论是:AdaCodec 提供了增加时间覆盖的空间,而且 P-token 足以避免冗余 RGB 信息抵消这一收益。
五、效率结果:准确率与响应速度同时改善
5.1 主要效率指标
论文对 11,347 段通用评测视频进行了效率统计:
| 指标 | RGB 基线 | AdaCodec | 变化 |
|---|---|---|---|
| 平均每视频视觉 token | 55,893.2 | 8,550.4 | -84.7% |
| 相对 token 比例 | 100% | 约 15.3% | --- |
| Codec 构建时间 | --- | 0.12 秒 | CPU 新增开销 |
| 首 token 时间,TTFT | 9.26 秒 | 1.62 秒 | 约 -82.5% |
| 端到端延迟,E2EL | 11.18 秒 | 3.20 秒 | 约 -71.4% |
| 峰值显存 | 34.6 GB | 36.5 GB | +1.9 GB |
| 五项通用基准平均分 | 74.0 | 75.7 | +1.7 |
这组结果的关键不是单纯更快,而是更少 token、更高平均分、更低 TTFT三者同时成立。
看图指引:查看论文 Table 4。建议优先关注:
- 视觉 token 下降幅度;
- TTFT 与端到端延迟的下降幅度;
- 平均分是否同步提高。
三者必须同时成立,才能称为真正的 Pareto 改进。
5.2 延迟收益从何而来?
延迟改善的直接原因是视觉前缀显著缩短,LLM 需要预填充的内容减少。实验环境为:
- 单卡 H800;
- Codec 构建使用 16 核 CPU;
- Codec 构建平均耗时 0.12 秒。
0.12 秒相对 9.26 秒到 1.62 秒的主要收益较小,但这只是论文的单机实验环境。真实服务中还需要考虑:
- 视频是否已经解码;
- CPU 与 GPU 能否流水化;
- 预处理与推理是否存在排队;
- 批量、分辨率和并发条件;
- P99 尾延迟与吞吐。
因此,当前数据适合证明接口具有明确优势,但不能直接代表高并发服务中的最终系统收益。
六、消融实验:P-token 的价值来自"预测变化",而不是再给模型看一张小图
论文在保持 GOP 覆盖条件基本匹配的情况下,比较不同 P 帧输入方案:
| P 帧方案 | 长视频平均 | 时序平均 | 通用平均 |
|---|---|---|---|
| 仅 I 帧 | 52.7 | 48.5 | 68.2 |
| 全 RGB P 帧 | 58.6 | 55.6 | 74.0 |
| 未训练缩略图 P 帧 | 58.2 | 53.8 | 73.6 |
| 训练缩略图 P 帧 | 61.4 | 54.4 | 73.2 |
| AdaCodec 运动残差 P-token | 63.8 | 58.2 | 75.7 |
6.1 为什么不用低分辨率 RGB?
训练后的缩略图 P 帧比全 RGB 方案更省 token,但三个任务类别上仍低于 AdaCodec:
| 任务类别 | 训练缩略图 | AdaCodec |
|---|---|---|
| 长视频 | 61.4 | 63.8 |
| 时序 | 54.4 | 58.2 |
| 通用 | 73.2 | 75.7 |
这说明 AdaCodec 的优势不只是"模型又多看到一张小图"。运动向量和残差携带的"从上一状态发生了什么变化",不能由单张低分辨率 RGB 图完全替代。
6.2 为什么不是 RGB 信息越多越好?
全 RGB P 帧保留了比 AdaCodec 更完整的单帧外观信息,但其结果并未占优:
| 任务类别 | 全 RGB P 帧 | AdaCodec |
|---|---|---|
| 长视频 | 58.6 | 63.8 |
| 时序 | 55.6 | 58.2 |
| 通用 | 74.0 | 75.7 |
这表明在有限预算下,更多 RGB 细节未必能抵消更长的视觉前缀。AdaCodec 的价值是把有限的上下文优先用于:
- 完整参考帧;
- 紧凑的时序变化;
- 更广的时间覆盖。
6.3 压缩率为什么没有达到理论最小值?
当 GOP 达到最大长度,即 1 个 I 帧加 16 个 P 帧时,理论最低 token 比例为:
256 + 16 × 16 256 + 17 × 256 = 512 4608 ≈ 11.8 % \frac{256+16\times16}{256+17\times256} =\frac{512}{4608} \approx11.8\% 256+17×256256+16×16=4608512≈11.8%
实际平均 GOP 长度为 10.21 帧 ,P 帧数为 9.21 帧 ,平均保留约 15.4% 的视觉 token。
两者之间存在差距,说明实际视频的动态变化迫使系统更频繁地插入 I 帧。这也可以视为一种保护机制:AdaCodec 没有为了追求更高压缩率而强行维持过长预测链。
七、综合评价
核心贡献
-
提出预测视觉码作为视频 MLLM 的视觉接口
只有预测代价高的帧才使用完整 RGB 编码;可预测帧只传递运动和残差。
-
将视频编解码思想重新设计为面向 LLM 的表示
改变宏块、运动参考、搜索窗口、GOP 调度等机制,目标不再是比特率或人类可观看重建。
-
构建 I/P 双分支 token 接口
I 帧负责完整空间状态,P-token 负责时序变化,两者按时间顺序进入 LLM。
-
提供从视觉表征到多模态对齐的两阶段训练
先让 P-token 对齐目标帧的教师视觉特征,再让 LLM 学习阅读预测视觉代码。
-
在 11 个基准上验证性能---效率优势
32k AdaCodec 跨过 224k RGB 基线,同时降低 TTFT 和端到端延迟。
方法本质
AdaCodec 解耦了视频理解中的两种需求:
- 时间覆盖:用低成本 P-token 覆盖更多时间点;
- 空间细节:只在必要时使用完整 I 帧。
传统逐帧 RGB 输入的问题在于,这两项需求被绑定在一起:增加时间覆盖,就必须同比例增加完整视觉 token。AdaCodec 的核心正是解除这种绑定。
适用条件与局限
该方法更契合以下视频:
- 相邻帧存在明显时间冗余;
- 变化主要可由运动、出现、消失和局部残差表达;
- 需要较长时序覆盖;
- 对首 token 时间和上下文成本敏感。
论文尚未重点验证的场景包括:
- 严重遮挡;
- 低纹理或重复纹理;
- 强模糊和快速闪光;
- 字幕覆盖、画中画、视频拼接;
- 真实流式服务和并发服务;
- 动态分辨率条件下的稳定性。
此外,pcost 衡量的是局部预测难度,并非严格语义重要性。它不能单独区分:
- "预测误差大但语义不重要";
- "误差较小却包含关键动作"。
因此,AdaCodec 的强项是基于时间冗余进行预算分配,而不是理解事件语义后再决定采样。
实践意义
AdaCodec 适合作为视频 MLLM 前端接口研究,而不是传统视频压缩器的替代品。它的潜在组合方式包括:
- 与帧选择方法叠加,优化 I 帧候选;
- 与 token 压缩方法叠加,进一步压缩 I 帧或 P-token;
- 与记忆机制叠加,管理跨 GOP 的长期状态;
- 与事件检测或语义不确定性结合,优化 I 帧重置。
值得继续研究的问题包括:
- 让 I 帧选择同时考虑语义重要性;
- 根据 P 帧复杂度动态分配 16 个 token;
- 支持动态分辨率;
- 研究跨 GOP 的长期预测;
- 在真实流式系统中验证延迟和吞吐收益。
Reference
1 AdaCodec: A Predictive Visual Code for Video MLLMs(PDF)