前言
本文是《从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式》的配套专篇。主篇里讲了三只流派,CLIP 走对比学习对齐,Flamingo 走交叉注意力,LLaVA 走的是生成式视觉指令微调。本文把 LLaVA 这一路从架构到损失函数的每一步完整拆开,包括线性投影的数学、视觉 token 如何进入语言模型、自回归交叉熵损失的推导,以及两阶段训练的具体流程。
阅读前提是了解 CLIP 的对比学习思想,可先看本站《CLIP 详解:对比学习如何让模型同时看懂图与文》。
核心思想
CLIP 学会的是"匹配",给它一张图,它能判断图和文本是否相关,但它不会开口回答。LLaVA(Large Language and Vision Assistant)要的是"对话",给它一张图加一句问题,它能像语言模型那样流利地回答。
实现办法很直接,把图像特征转成语言模型认识的 token,拼进输入序列,剩下的工作全部交给语言模型自回归生成。这条路线的核心假设是,语言模型足够强大,只要把图像信息以它看得懂的形式喂进去,它就能基于图像推理。因此"对齐"这一步被收敛成一个小而关键的组件,一个线性投影层。
整体架构
LLaVA 由三个模块串成一条链。
- 视觉编码器。把图像编码成一组 patch 特征,LLaVA 直接复用 CLIP 训练好的 ViT,不重新训练。
- 线性投影。把视觉特征映射到语言模型的嵌入空间,这是唯一需要从零训练的关键组件。
- 语言模型。接收"视觉 token + 文本 token"的混合序列,自回归生成回答,通常复用开源的 LLaMA、Qwen 等。
视觉编码器
LLaVA 的视觉编码器直接采用 CLIP 的 ViT,训练时全程冻结。这样做的原因有两点。
第一,CLIP 的视觉编码器已经学会了把图像映射进和文本共享的语义空间,提取的图像特征质量高。第二,冻结它可以大幅减少训练参数量,LLaVA 只需要训练投影层和语言模型的少量层,算力成本可控。
视觉编码器对一张图像输出一列 patch 特征。图像被切成固定大小的 patch,每个 patch 经过 ViT 的多层 Transformer 编码,得到一个特征向量。假设图像被切成 $N$ 个 patch,输出的特征序列记为
$$ Z_v = [z_{v,1}, z_{v,2}, \dots, z_{v,N}], \qquad z_{v,j} \in \mathbb{R}^{d_v} $$其中 $d_v$ 是视觉特征的维度,每个 $z_{v,j}$ 对应图像上的一个区域。
线性投影:把视觉特征映射进文本空间
视觉特征和语言模型的词向量维度不同,语义空间也不同。LLaVA 用一个可学习的线性投影矩阵把每个视觉特征对齐到语言模型的嵌入空间。
设单个 patch 特征为 $z_v \in \mathbb{R}^{d_v}$,语言模型词向量的维度为 $d_t$,投影矩阵为 $W \in \mathbb{R}^{d_v \times d_t}$,投影后的特征为
$$ h_v = z_v W $$其中 $h_v \in \mathbb{R}^{d_t}$,维度与词向量一致。对全部 $N$ 个 patch 特征做同样操作,得到一组视觉 token
$$ H_v = [h_{v,1}, h_{v,2}, \dots, h_{v,N}] $$各符号的含义如下。
- $z_v \in \mathbb{R}^{d_v}$ 是视觉编码器输出的单个 patch 特征。
- $W \in \mathbb{R}^{d_v \times d_t}$ 是可学习的投影矩阵,训练中更新。
- $h_v \in \mathbb{R}^{d_t}$ 是投影后的特征,与词向量同维。
投影矩阵 $W$ 可以理解为一个从视觉空间到文本空间的线性映射。它本身不产生语义,它的作用是让视觉特征和词向量落在同一个维度和语义尺度上,从而可以被语言模型当作 token 处理。
原始 LLaVA 论文用单层线性投影。到 LLaVA-1.5,投影层升级为两层 MLP(中间加一个激活函数),对齐能力更强,原理一致。一个直觉是,单层线性变换只能做一次空间旋转和缩放,两层 MLP 能表达更复杂的映射,能更好地弥合视觉和文本两种表示之间的语义鸿沟。
视觉 token 如何进入语言模型
投影完成后,$H_v$ 中的每个向量都和词向量同维,可以像文本 token 的嵌入一样拼进输入序列。具体做法是,把视觉 token 拼接在指令文本之前,构成一个混合序列
$$ X = [h_{v,1}, h_{v,2}, \dots, h_{v,N}, e_{t_1}, e_{t_2}, \dots, e_{t_M}] $$其中 $e_{t_i}$ 是指令文本 $X_{\text{instruct}}$ 中第 $i$ 个词的嵌入。语言模型对这个混合序列做自注意力时,视觉 token 和文本 token 可以任意交互,视觉信息由此参与每一层、每一步的计算。
这个拼接方式有一个直接推论。视觉 token 进入语言模型后,被当作普通的输入 token 处理,语言模型对它的位置、长度没有任何特殊约束。视觉 token 的个数 $N$ 等于图像 patch 的个数,分辨率越高 patch 越多,序列越长,注意力开销也越大。这是后文讨论高分辨率局限时的一个伏笔。
自回归交叉熵损失的推导
LLaVA 的训练目标和纯文本语言模型一致,用自回归的方式最大化真实回答的联合概率。给定图像特征 $X_v$ 和指令文本 $X_{\text{instruct}}$,模型要生成回答 $X_a = (y_1, y_2, \dots, y_L)$。
自回归模型把整段回答的联合概率拆成逐词条件概率的连乘
$$ p(X_a \mid X_v, X_{\text{instruct}}) = \prod_{i=1}^{L} p(y_i \mid X_v, X_{\text{instruct}}, y_{\lt i}) $$- $X_v$ 是图像特征,经过投影后以视觉 token 的形式进入输入。
- $X_{\text{instruct}}$ 是指令文本。
- $y_i$ 是回答中的第 $i$ 个 token。
- $y_{\lt i}$ 表示第 $i$ 个 token 之前已经生成的全部 token。
- $\prod$ 表示连乘,把整段回答的联合概率拆成每一步的条件概率。
从最大似然到负对数似然
训练的目标是让真实回答的联合概率尽量大,这等价于最大似然估计。但概率连乘在数值上容易下溢,且梯度计算不便,通常取对数再取负号,转化为最小化负对数似然
$$ \mathcal{L}_{\text{gen}} = - \log p(X_a \mid X_v, X_{\text{instruct}}) = - \sum_{i=1}^{L} \log p(y_i \mid X_v, X_{\text{instruct}}, y_{\lt i}) $$由于对数把连乘变成连加,损失是 $L$ 项之和,每一项是"第 $i$ 个位置预测正确 token 的概率的负对数"。
与标准交叉熵的关系
对单个位置 $i$,模型在词表上输出一个概率分布,$p(y_i \mid \cdot)$ 是模型给真实 token $y_i$ 的概率。如果把它看成一个类别数等于词表大小的分类问题,真实类别是 $y_i$,那么 $-\log p(y_i \mid \cdot)$ 正是标准交叉熵损失的形式。
因此 $\mathcal{L}_{\text{gen}}$ 就是标准的下一 token 预测损失,和纯文本语言模型训练用的损失完全相同。区别只在输入里多了一串由图像投影而来的视觉 token。这说明 LLaVA 不需要发明新的损失函数,它把多模态对齐融入了输入表示,语言模型的训练机制原封不动。
一个具体的直觉
回答的长度 $L$ 是可变的,损失对每步都算,不管回答是长是短。模型越早学会按图像内容回答,每一步的条件概率越高,整体损失越低。反过来,如果模型忽略了图像、只按文本先验乱答,它在关键 token 上的概率就低,损失就高,训练信号会引导它去关注视觉信息。
两阶段训练
LLaVA 的训练分两个阶段,先对齐特征,再解锁对话。
第一阶段,特征对齐(Pre-training for Feature Alignment)
冻结视觉编码器和语言模型,只训练线性投影层 $W$。数据用图文配对,通常是单张图配一句简单描述,比如一张猫的图和 “a cat”。这一阶段的目标很简单,让投影层把视觉特征映射到语言模型能识别的空间,使语言模型能"读懂"图像 token 的大致含义。因为只训练投影层,这一阶段数据量不需要太大,几百万条即可,成本很低。
第二阶段,端到端视觉指令微调(Visual Instruction Tuning)
冻结视觉编码器,解冻语言模型,同时继续训练投影层。数据换成高质量的视觉问答对,包含图像、用户指令、期望回答三元组。这一阶段让模型学会看图理解指令、生成合理的回答,解锁对话能力。
两阶段的区别在于解锁了哪些参数。第一阶段只动投影层,相当于给语言模型"配眼镜";第二阶段动语言模型本身,相当于让模型学会"用眼睛回答问题"。两阶段的损失都是上一节的自回归交叉熵损失,只是数据和可训练参数不同。
为什么走生成式路线而非 CLIP
对比 LLaVA 和 CLIP,两者对齐图像文本的方式截然不同。
CLIP 用对比损失把图像和文本拉到同一个向量空间,训练目标是对齐,输出是相似度。LLaVA 用线性投影把图像塞进文本空间,训练目标是生成,输出是自然语言。
CLIP 的优势是对齐高效,适合检索和零样本分类,但它不会生成新内容。LLaVA 的优势是直接复用语言模型的生成与推理能力,适合对话、问答、创作这类任务。两者互补,CLIP 常常为 LLaVA 提供现成的视觉编码器。
局限
LLaVA 的局限主要在视觉分辨率。视觉 token 的数量等于 patch 个数,高分辨率图像会切出大量 patch,序列变长,注意力开销按平方增长。原始 LLaVA 用较低分辨率(如 224×224)控制成本,但对小物体、密集文本的识别能力有限。后续版本通过多尺度、切片等方式缓解,这是后话。
另一个局限是,视觉信息经过投影后,细节可能被压缩。语言模型看到的是每个 patch 一个向量,patch 内部的细粒度信息已经丢失,这也限制了它对细节的感知。
总结
LLaVA 把多模态对齐从"训练一个专用损失"简化为"训练一个线性投影层"。视觉编码器复用 CLIP,投影层做维度对齐,语言模型做生成。它的训练目标是标准的自回归交叉熵损失,只是输入里多了视觉 token。两阶段训练先对齐特征再解锁对话,用较低成本得到了能看图说话的模型。
想对比其他两条路线,可回到《从 CLIP 到 LLaVA》看 Flamingo 的交叉注意力思路,或看《CLIP 详解》的对比学习细节。
参考
- Visual Instruction Tuning(LLaVA),Liu et al., 2023
- Improved Baselines with Visual Instruction Tuning(LLaVA-1.5),Liu et al., 2023
- CLIP: Learning Transferable Visual Models From Natural Language Supervision,Radford et al., 2021
- 本站《CLIP 详解:对比学习如何让模型同时看懂图与文》