5、Video-LLAMA / LLaMA-VID / LLaVA-Video
Video-LLAMA / LLaMA-VID / LLaVA-Video:视频多模态大模型的三条路线详解
视频多模态理解的核心难点在于:输入是“时序的、多模态的、长上下文的”,而主流大语言模型(LLM)天生以文本 token 为接口。围绕“如何把视频(帧序列)与音频(声学片段)转成 LLM 可消费的软提示(soft prompt)/ token 序列”,下面三类代表性方法给出了不同答案:
- Video-LLAMA:双分支(视觉-语言 / 音频-语言)并行,用 Q-Former 聚合 + 线性投影到 LLM 嵌入空间,通过两阶段训练获得指令跟随能力;音频分支依赖 ImageBind 的共享对齐空间解决音频文本数据稀缺。
- LLaMA-VID:强调“token 生成策略”,把每帧视觉 embedding 变成 少量 context token + 若干 content token,并支持超长视频输入(长视频 tuning)。
- LLaVA-Video:把重点放在“高质量大规模视频指令数据的自动合成”,用多级描述生成与多类型 QA 合成,形成可扩展的数据引擎,并配合对视频表示的结构化建模(如 SlowFast 采样与池化)。
1. Video-LLAMA:视觉-语言分支(Vision-Language Branch)
1.1 组件与目标
视觉-语言分支的目标是:让冻结的 LLM 能“读懂”视频内容。典型结构由以下模块串联:
- 预训练图像编码器(Vision Encoder):逐帧抽取视觉特征。
- 位置嵌入层(Temporal Positional Embedding):为帧表示注入时间顺序信息。
- 视频 Q-Former(Video Q-Former):将多帧特征聚合为固定长度的查询表示。
- 线性层(Projection):将视频侧表示投影到与 LLM 文本嵌入相同的维度,作为“视频软提示”。
1.2 从视频帧到 LLM 输入:完整前向流程(含公式)
(1) 帧级视觉嵌入提取
给定一个包含 NNN 帧的视频,记第 iii 帧经过视觉编码器得到 KfK_fKf 个 patch/token 级嵌入,每个嵌入维度为 dfd_fdf。则帧表示为:
vi∈RKf×df,i=1,2,…,N v_i \in \mathbb{R}^{K_f \times d_f}, \quad i=1,2,\ldots,N vi∈RKf×df,i=1,2,…,N
将所有帧拼接得到视频帧表示序列:
V=[v1,v2,…,vN] V = [v_1, v_2, \ldots, v_N] V=[v1,v2,…,vN]
其中 VVV 是一个“按时间排列的帧 token 集合”,但此时 不显式包含时间信息(因为每帧编码器通常只在单帧内部做空间建模)。
(2) 时间位置嵌入注入
为让模型区分“同一物体在不同时间的变化”,对每一帧 viv_ivi 注入可学习的时间位置嵌入 pip_ipi:
v~i=vi+pi \tilde{v}_i = v_i + p_i v~i=vi+pi
这里 pip_ipi 会广播到帧内的 KfK_fKf 个 token(或等价地,为每个 token 加同一个帧级时间编码),从而把“第 iii 帧”的时间身份写入表示。
(3) Video Q-Former 聚合多帧信息
Q-Former 的关键思想是:引入一组可学习 query,去“读取”视觉 token,并输出固定数量的聚合向量(便于喂给 LLM)。
设 Video Q-Former 输出 KvK_vKv 个视频聚合 token,每个维度为 dvd_vdv:
V^∈RKv×dv \hat{V} \in \mathbb{R}^{K_v \times d_v} V^∈RKv×dv
直观理解:
- 输入端是“很多帧 × 每帧很多 token”,长度随视频增长;
- 输出端强行压缩成“固定 KvK_vKv 个 token”,解决 LLM 上下文长度与计算成本问题。
注:你给的文字里写到“生成 kVk_VkV 个视频嵌入向量”,以及 v^\hat{v}v^ 的形状描述出现过与 Kf×dfK_f \times d_fKf×df 相同的写法。实际语义通常是 输出固定长度 KvK_vKv(类似 BLIP-2 的 Q-Former 输出固定 query 数),因此这里用 KvK_vKv 来表达“聚合后的固定 token 数”。
(4) 投影到 LLM 的文本嵌入空间并拼接输入
LLM 的文本嵌入维度记为 dllmd_{\text{llm}}dllm。通过线性投影将视频 token 从 dvd_vdv 映射到 dllmd_{\text{llm}}dllm:
ZV=V^WV+bV,WV∈Rdv×dllm, bV∈Rdllm Z_V = \hat{V} W_V + b_V,\quad W_V \in \mathbb{R}^{d_v \times d_{\text{llm}}},\; b_V \in \mathbb{R}^{d_{\text{llm}}} ZV=V^WV+bV,WV∈Rdv×dllm,bV∈Rdllm
得到:
ZV∈RKv×dllm Z_V \in \mathbb{R}^{K_v \times d_{\text{llm}}} ZV∈RKv×dllm
最终把视频 token 作为“软提示”与文本 token 的嵌入拼接,构成 LLM 的输入序列(用嵌入层面表达更清晰):
Ein=[ZV; ET] E_{\text{in}} = [Z_V;\; E_T] Ein=[ZV;ET]
其中 ETE_TET 是文本 prompt 的 token embedding 序列。LLM 在自回归生成时,就会把 ZVZ_VZV 当作“前缀上下文”,从而生成与视频内容一致的文本输出。
1.3 直观案例:为什么 Q-Former + 固定 token 很关键?
案例:短视频“一个人拿起杯子喝水,然后放下杯子离开画面”。
- 若只看单帧:任意一帧可能只告诉你“有人、杯子、桌子”,难以推断“喝水”这一动作。
- 注入时间位置嵌入后:模型能区分“杯子从桌上到嘴边再回到桌上”的顺序变化。
- Q-Former 聚合后:固定 KvK_vKv 个 token 可以总结出:
- “主体是谁/在哪里”
- “关键对象(杯子)”
- “动作轨迹(拿起→喝→放下→离开)”
- 这样 LLM 才更可能生成“他喝了一口水后离开”的描述,而不是静态的“桌上有杯子”。
1.4 实现细节(结构层面)
- 视觉侧采用 BLIP-2 的预训练视觉组件并冻结,包括:
- EVA-CLIP 的 ViT-G/14 作为 vision encoder
- 预训练 Q-Former
- 新增的 位置嵌入层 / 视频 Q-Former / 投影层 随机初始化并训练
- LLM 冻结,通过“前缀软提示”方式注入视频信息
这种设计的一个直接收益是:训练主要集中在“跨模态对齐桥梁”,避免端到端训练视频大模型的巨大成本。
2. Video-LLAMA:音频-语言分支(Audio-Language Branch)
2.1 组件与目标
音频-语言分支让模型在推理时能够利用视频中的听觉信息(语音、环境声、音乐节奏、爆炸声等),典型组件为:
- 预训练音频编码器(Audio Encoder)
- 音频位置嵌入(Temporal Embedding for Audio Segments)
- 音频 Q-Former(Audio Q-Former)
- 线性投影到 LLM 嵌入空间(Projection)
2.2 从原始音频到 LLM 输入:流程拆解
(1) 音频片段采样与声学表示
从视频中均匀采样 MMM 段音频片段(例如每段 2 秒),并转换为梅尔频谱图表示。记第 jjj 段音频的声学输入为 xjAx^A_jxjA。
音频编码器将每段频谱图映射为向量表示:
aj=fA(xjA),j=1,2,…,M a_j = f_A(x^A_j),\quad j=1,2,\ldots,M aj=fA(xjA),j=1,2,…,M
把所有片段表示拼接为:
A=[a1,a2,…,aM] A = [a_1, a_2, \ldots, a_M] A=[a1,a2,…,aM]
(2) 注入时间位置嵌入 + Q-Former 聚合
同样为让模型知道音频事件发生在何时,引入可学习时间嵌入 qjq_jqj:
a~j=aj+qj \tilde{a}_j = a_j + q_j a~j=aj+qj
再通过 Audio Q-Former 把变长序列聚合为固定长度的音频 token:
A^∈RKa×da \hat{A} \in \mathbb{R}^{K_a \times d_a} A^∈RKa×da
(3) 投影到 LLM 嵌入空间并与文本拼接
设投影矩阵为 WA∈Rda×dllmW_A \in \mathbb{R}^{d_a \times d_{\text{llm}}}WA∈Rda×dllm:
ZA=A^WA+bA Z_A = \hat{A} W_A + b_A ZA=A^WA+bA
得到 ZA∈RKa×dllmZ_A \in \mathbb{R}^{K_a \times d_{\text{llm}}}ZA∈RKa×dllm,与文本嵌入拼接形成 LLM 输入:
Ein=[ZA; ET] E_{\text{in}} = [Z_A;\; E_T] Ein=[ZA;ET]
在多模态同时使用时,也可以把视觉 token 与音频 token 都作为前缀(具体拼接顺序是实现选择):
Ein=[ZV; ZA; ET] E_{\text{in}} = [Z_V;\; Z_A;\; E_T] Ein=[ZV;ZA;ET]
2.3 关键挑战与解决:音频-文本数据稀缺
挑战:直接用“音频-文本对”来训练音频分支很难,因为高质量大规模音频文本标注稀缺且噪声大。
解决方案:利用 ImageBind 的共享对齐空间,用“视觉-文本数据”间接训练音频分支。
直观逻辑是:
- ImageBind 让音频与视觉/文本在同一嵌入空间中对齐;
- 训练时即便只出现视觉-文本样本,也能通过共享空间让音频接口学到“该如何对齐到文本语义”。
案例:视频里出现“狗叫声”,画面里也出现狗。
- 训练数据可能只有“画面+字幕:一只狗在叫”
- 音频接口没直接见过“狗叫声→狗在叫”的标注
- 但 ImageBind 已把“狗叫声”嵌入靠近“狗”与“barking”的语义区域
- 因此推理时输入音频,LLM 仍可能生成“听到狗在叫”的文本
3. Video-LLAMA 的训练策略:视觉分支与音频分支分开训练、两阶段优化
3.1 视觉-语言分支训练
阶段 1:预训练(大规模视觉-字幕数据)
- 数据:WebVid-2M(短视频字幕)+ CC595K(图像字幕)
- 任务:给定视频表示,提示冻结 LLM 生成对应文本描述(Video-to-Text Generation)
目标是让“视频 token 前缀”携带足够的视觉知识,使 LLM 能被稳定引导输出描述性文本。这个阶段即便字幕不完美,也更像是“用规模换覆盖”。
阶段 2:微调(高质量指令跟随数据)
- 数据:图像细节描述(如 MiniGPT-4)、图像指令(如 LLaVA)、视频指令(如 Video-Chat)
- 目标:提升对话式指令跟随能力与更复杂的视觉/视频理解问答能力
案例:
- 预训练后模型能说“一个人在厨房”
- 微调后模型能回答“他在做什么?下一步可能做什么?”或“把画面中所有可见物体按类别列出”等指令型任务
3.2 音频-语言分支训练
- 由于音频-文本数据稀缺,采用 ImageBind 对齐空间,使用视觉-文本数据训练音频分支,使其学会把音频表示映射到 LLM 可理解的语义提示上。
- 推理时,音频分支即便未在音频数据上直接监督,也能通过共享空间迁移出“听觉理解”。
4. LLaMA-VID:强调 token 生成策略的长视频建模路线
4.1 框架概述
LLaMA-VID 的关键是:如何把每一帧的视觉信息变成对 LLM 更友好的 token 序列,并在计算预算可控下支持更长视频。
- Vision Encoder:对每帧生成视觉 embedding
- Text Decoder / Text-Guided Module:从用户指令生成 text-guided query
- Token 生成策略:为每帧生成两类 token:
- context token:概括“与问题相关”的全局信息
- content token:保留一定数量的细节信息(可自适应池化控制长度)
- Instruction tuning:释放 LLM 在图像/视频任务的指令跟随潜力
4.2 Encoder 与跨模态交互模块
输入视频帧为:
Vt∈RH×W×3 V_t \in \mathbb{R}^{H \times W \times 3} Vt∈RH×W×3
经过基于 Transformer 的视觉编码器得到 patch embedding:
Xt∈RN×C,N=Hp×Wp X_t \in \mathbb{R}^{N \times C},\quad N=\frac{H}{p}\times\frac{W}{p} Xt∈RN×C,N=pH×pW
其中:
- ppp 是 patch size(常见为 14)
- CCC 是视觉 embedding 通道维度
用户指令生成 text-guided query:
Qt∈RM×C Q_t \in \mathbb{R}^{M \times C} Qt∈RM×C
接下来在 text decoder(可用 BERT 或 Q-Former 风格)里进行跨模态交互,让 QtQ_tQt 去关注 XtX_tXt。
4.3 Token 生成:context token 与 content token(含核心公式)
(1) Context Attention:生成与指令相关的帧级摘要向量
先计算 query 与视觉 token 的相似度,再对视觉 token 做加权求和。给定 QtQ_tQt 与 XtX_tXt:
- 相似度矩阵为 QtXtTQ_t X_t^TQtXtT,形状为 M×NM \times NM×N
- 对 NNN 维做 softmax 得到对每个 query 的注意力分布
- 用注意力加权求和得到每个 query 聚合出的视觉向量
- 最后对 MMM 个 query 的结果取均值,得到一个帧级上下文向量 EtE_tEt
公式写为:
Et=Mean(Softmax(QtXtT) Xt) E_t = \text{Mean}\Big(\text{Softmax}(Q_t X_t^T)\, X_t\Big) Et=Mean(Softmax(QtXtT)Xt)
这里每一项代表的含义非常具体:
- QtXtTQ_t X_t^TQtXtT:第 mmm 个 query 与第 nnn 个视觉 patch 的匹配分数
- Softmax(⋅)\text{Softmax}(\cdot)Softmax(⋅):沿 NNN 维归一化,使每个 query 得到一个“在整帧所有 patch 上的注意力分布”
- Softmax(QtXtT) Xt\text{Softmax}(Q_t X_t^T)\, X_tSoftmax(QtXtT)Xt:把整帧视觉信息按“与 query 的相关性”做加权汇聚
- Mean(⋅)\text{Mean}(\cdot)Mean(⋅):把多个 query 的汇聚结果压成 1 个向量(全局摘要)
得到 Et∈R1×CE_t \in \mathbb{R}^{1 \times C}Et∈R1×C。
(2) Context Token:线性投影得到每帧 1 个上下文 token
通过投影把 EtE_tEt 变成 context token:
EtT=EtWT+bT E^T_t = E_t W_T + b_T EtT=EtWT+bT
其中 WT∈RC×CW_T \in \mathbb{R}^{C \times C}WT∈RC×C(或映射到 LLM 维度,具体取决于实现),最终 EtT∈R1×CE^T_t \in \mathbb{R}^{1 \times C}EtT∈R1×C(或 1×dllm1 \times d_{\text{llm}}1×dllm)。
这 1 个 token 的定位很明确:“这一帧里,与问题最相关的是什么”。
(3) Content Token:自适应池化生成细节 token
为了在预算内保留部分细节,用 adaptive pooling 把 XtX_tXt 压缩为 nnn 个 content token:
EtV∈Rn×C,n∈[1,N] E^V_t \in \mathbb{R}^{n \times C},\quad n \in [1, N] EtV∈Rn×C,n∈[1,N]
- nnn 可随算力预算变化
- nnn 越大细节越足,但 token 成本越高
- nnn 越小更省,但容易丢信息
(4) 每帧 token 拼接成最终视觉 token 序列
把该帧的 context token 与 content token 拼接:
Etframe=[EtT; EtV] E_t^{\text{frame}} = [E^T_t;\; E^V_t] Etframe=[EtT;EtV]
对整段视频再按时间拼接:
Evideo=[E1frame; E2frame; …; ETframe] E^{\text{video}} = [E_1^{\text{frame}};\; E_2^{\text{frame}};\; \ldots;\; E_T^{\text{frame}}] Evideo=[E1frame;E2frame;…;ETframe]
这就形成了可喂给 LLM 的“视频 token 序列”。
4.4 三阶段训练策略(从对齐到指令到长视频)
4.4.1 Modality Alignment(模态对齐)
- 数据:约 790K 高质量 image/video-caption 对
- 冻结:预训练 visual encoder 与 text decoder
- 训练:context attention 与投影层(projectors)
目标是让生成出来的 token 真正与文本语义对齐,形成稳定的跨模态接口。
4.4.2 Instruction Tuning(指令微调)
- 数据:40K 纯文本对话(ShareGPT)+ 625K 视觉 QA + 98K 视频 QA
- 训练:除 visual encoder 外的大部分模块
目标是把“能对齐”变成“能对话、能按指令完成任务”。
4.4.3 Long Video Tuning(长视频微调)
- 数据:15K 长视频 QA(9K 电影场景对话 + 6K LongLoRA 数据)
- 关键做法:拼接 visual tokens 与 subtitle tokens 做 instruction tuning
- 结果:支持 64K token 级别上下文,覆盖超过 3 小时的视频输入
案例:电影场景问答
- 短上下文模型可能只回答“当前这句台词在说什么”
- 长视频 tuning 后可以回答“这段冲突在前面哪次事件埋下伏笔?人物动机如何变化?”这类跨段落问题
5. LLaVA-Video:用“数据合成引擎”驱动的视频指令跟随能力
如果说 Video-LLAMA / LLaMA-VID 更像“结构接口创新”,LLaVA-Video 的主线更像“如何把视频指令数据规模化、系统化地做出来”。
5.1 数据合成的关键:内容动态性与语言注释多样性
构建高质量视频指令数据时,两个因素决定上限:
- 视频内容必须有显著时间动态(否则变成图像任务)
- 语言注释必须足够丰富(不仅是短字幕,还要有解释、推理、对比、计数、因果等)
因此它从多个来源收集视频,并覆盖大量公开视频-语言基准,最终形成大规模训练集。
5.2 视频详细描述的自动生成:三级层次化描述(核心机制)
由于视频长且信息密度大,直接对全视频生成一次描述往往会遗漏细节或逻辑不连贯。一个更稳定的做法是:把视频按时间切片,逐段生成描述,并用多层“摘要记忆”保持一致性。
- 帧采样:1 fps(在输入限制下尽可能保留时间信息)
- 每个时间间隔生成描述,采用三级结构:
层次 1(局部描述):基于
- 当前帧
- 前一时间间隔的字幕
- 层次 2 的最新摘要
输出当前时间段的细节描述。
层次 2(中期摘要):基于
- 前一个层次 2 的摘要
- 层次 1 最近三个时间间隔的描述
输出更稳定的中期叙述。
层次 3(全局摘要):基于
- 层次 2 的最新摘要
- 层次 1 的当前描述
输出全局一致的摘要状态。
直观案例:
- 视频前半段出现“一个人拿钥匙开门”,后半段出现“他进入房间与人争吵”
- 层次 1 很容易只写局部动作
- 层次 2/3 会把“开门进入房间”作为连续事件链保存下来,使后面的争吵叙述不会丢掉上下文
5.3 视频问答自动生成:16 种问题类型覆盖多任务
在生成 QA 对时,预先定义问题类型(参考公开视频问答基准),并对每个类型最多生成一个问题-答案对,从而避免单一类型过度重复。
典型覆盖方向包括(用“能力”来理解更清晰):
- 事实回忆:发生了什么?出现了哪些物体?
- 时序理解:先发生什么后发生什么?
- 因果推断:为什么角色这么做?
- 计数与比较:出现了几次?哪一个更大/更快?
- 角色关系与意图:谁在对谁说话?动机是什么?
- 场景变化:从哪里转移到哪里?光线/天气如何变化?
案例:
- 类型“时序理解”:问“他是在拿起杯子之前还是之后喝水?”
- 类型“因果推断”:问“他为什么突然停下脚步回头看?”
- 类型“计数比较”:问“视频中门被打开了几次?”
这种设计让训练数据天然支持多种视频理解能力,而不是只会“复述字幕”。
5.4 数据规模与构成
- 视频总量:178K
- 指令样本:约 1.3M
- 178K 字幕
- 960K 开放式问答
- 196K 多项选择问答
并且新注释比例非常高(大量样本是新生成而不是复用旧基准),从而更适合大规模指令微调。
5.5 视频表示:SlowFast 结构化建模(概念层)
为同时捕捉“慢变化的语义”和“快变化的动作”,可以把帧按采样率 sss 分成慢帧组与快帧组,并采用不同池化率处理,形成 SlowFast 风格的表示。
一种参数化表示方式:
V=(T,M,s,p) V = (T, M, s, p) V=(T,M,s,p)
可用于描述视频 token 构造的关键配置(例如总时长切片数 TTT、每段内部采样/池化策略等)。其核心直觉是:
- Slow 分支:用更稀疏的帧捕捉场景与语义主线
- Fast 分支:用更密的帧捕捉动作细节
- 合并后:既不丢主线也不丢关键瞬间
案例:
- “挥手示意”动作很短,靠 fast 分支捕捉
- “在街道上走向商店”是慢变化场景,靠 slow 分支保持语义连续
6. 三者对比:同一目标下的不同取舍
6.1 关注点不同
- Video-LLAMA:强调“多模态接口层”的可训练桥梁(Q-Former + 投影),并用 ImageBind 解决音频训练难题。
- LLaMA-VID:强调“token 预算下的有效表达”,用 context/content token 把相关信息优先编码,天然适配长视频。
- LLaVA-Video:强调“数据规模化生产”,用合成管道覆盖更多任务类型与动态视频分布,提升指令跟随与泛化。
6.2 适用场景直觉
- 你更关心“快速把视频/音频接入现有 LLM,训练成本可控”:更贴近 Video-LLAMA 的思路。
- 你更关心“长视频输入、token 成本、问题相关信息优先表达”:更贴近 LLaMA-VID。
- 你更关心“做一个强视频助手,需要海量高质量指令数据与任务覆盖”:更贴近 LLaVA-Video。
7. 一个贯穿示例:同一视频在三种路线下会如何工作?
假设视频内容是:
“一个人走进房间,先关门,然后对着镜头说话,背景传来电话铃声,最后他接起电话并离开。”
-
Video-LLAMA(视觉分支):
- 时间位置嵌入让“关门→说话→接电话→离开”的顺序可被区分
- Video Q-Former 把多帧压缩成固定 token,总结动作链
- 输出可能是“他进入房间后关门,对镜头讲话,随后接电话离开”
-
Video-LLAMA(音频分支):
- 音频片段中“电话铃声”对应的嵌入可被映射到语义提示
- 即使画面里电话不明显,也能回答“你听到什么声音?”→“电话铃声”
-
LLaMA-VID:
- 指令若是“他为什么离开?”
- context attention 会把与“电话铃声/接电话”相关的区域与帧优先汇聚到 context token
- content token 保留必要细节(电话/人物手部动作)
- 更容易形成“因为电话响了他去接电话所以离开”的因果回答
-
LLaVA-Video:
- 数据层面会为这种视频生成多种 QA:时序、因果、听觉、计数(电话响了几次)、角色意图等
- 模型因此更可能学到“同一视频可以被不同任务 interrogate”,从而表现为更强的指令泛化
8. 小结:视频多模态的“接口、token、数据”三角
视频多模态建模经常可以被归纳为三类杠杆:
- 接口层(Bridge):把视频/音频变成 LLM 可用的软提示(Video-LLAMA 代表)
- token 组织(Tokenization Strategy):在预算内把“相关信息”优先编码(LLaMA-VID 代表)
- 数据引擎(Data Engine):用规模化合成覆盖更多任务与分布(LLaVA-Video 代表)
在实际系统里,这三者往往并不互斥:
强接口让训练更稳,强 token 策略让长视频更可行,强数据让能力边界更广。
更多推荐
所有评论(0)