想象你是一位班主任,任务是把一个只会写作文的孩子,培养成“看一眼图画就能对答如流”的优等生。这个孩子的大脑已经有了很好的语言能力——他能看懂文字、写出通顺的句子,却天生看不见。要让他“睁开眼”,你得给他配一双眼睛,在眼睛和大脑之间搭一座桥,再让他做大量“看图题”,最后请一位金牌评委调教他的回答口吻。LLaVA(Large Language and Vision Assistant)正是这样一套培养多模态大模型的完整方案:用 CLIP 当眼睛、Vicuna 当大脑、投影层当桥,先用小成本把桥搭稳(阶段一:特征对齐),再解冻大脑做端到端看图问答训练(阶段二:指令微调)。训练完还要考试——和 GPT-4V 同台竞技;治病——消除“看不见却瞎编”的视觉幻觉;请评委——用 RLHF/DPO 对齐人类偏好。这篇文章就是一本完整的“带娃手册”,从数据配方、超参设置到复现落地,帮你亲手跑出一个会看图说话的 AI 助手。

岗位关联

掌握 LLaVA 两阶段微调的完整流程,你就能在实际项目中复现或改进开源多模态模型,避开幻觉与训练崩溃的坑,是从算法工程师走向多模态大模型实操专家的关键一课。

目录
  1. 可视化演示
  2. 架构四件套:给会说话的孩子装上眼睛
  3. 数据配方:教材与习题册
  4. 阶段一特征对齐:先把桥搭稳
  5. 阶段二指令微调:再做综合卷
  6. 效果评估:和 GPT-4V 同台考试
  7. 幻觉治理:治一治看图作文的“脑补”
  8. RLHF对齐:请来金牌评委
  9. 实战复现:算清预算再开班
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示LLaVA视觉指令微调的训练的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

LLaVA视觉指令微调的训练:LLaV LLaVA模型架构与设计理念 视觉指令数据格式与准备 核心机制可视化 LLaVA视觉指令微调的训练整体架构与关键组件

架构四件套:给会说话的孩子装上眼睛

想象你是一位班主任,任务是把一个只会写作文的孩子,培养成“看一眼图画就能对答如流”的优等生。这个孩子的大脑已经装了很好的语言能力——他能看懂文字、写出通顺的句子,却天生看不见。要让他“睁开眼”,你得给他配一双眼睛,再搭一座桥,最后还要用大量看图练习和一位金牌评委,让他学会“看懂并好好回答”。

LLaVA(Large Language and Vision Assistant)干的就是这件事:给大语言模型装上视觉系统,再通过两步训练让它掌握“看图说话”。它也是 GPT-4V、Gemini 这类闭源多模态模型的开源平替路线中最有代表性的一条。

整套架构由四件套组成:CLIP 视觉编码器(眼睛)负责把图片变成视觉特征;Vicuna 语言模型(大脑)负责理解和生成文本;投影层(桥)负责把视觉特征映射到语言模型的词嵌入空间;训练按“先搭桥、后问答”分两阶段进行。原版 LLaVA 用 ViT-L/14 作视觉编码器、Vicuna-7B/13B 作语言骨干,投影层早期是线性层,后来升级为两层 MLP。

眼睛、桥、大脑齐了,孩子才真正“看见”世界。可看见不等于会用,更不等于答得漂亮——这正是后面两阶段课程和各种“补课”要解决的问题。

hv=Wzv+bh_v = W z_v + b
投影层本质是一层线性映射:把“眼睛看到的信号”翻译成“大脑听得懂的语言”。
  1. 视觉特征 \(z_v\)CLIP 把图片切成若干 patch 后输出的向量序列,是“眼睛看到的最初信号”。
    zv∈Rdvz_v \in \mathbb{R}^{d_v}
  2. 投影矩阵 \(W\) 与偏置 \(b\)可学习的线性参数,相当于桥的“承重结构”,决定信号如何搬运。
    W∈Rdh×dv,b∈RdhW \in \mathbb{R}^{d_h \times d_v}, \quad b \in \mathbb{R}^{d_h}
  3. 映射结果 \(h_v\)把视觉特征转到语言模型的词嵌入空间,之后可与文字 token 直接拼接。
    hv=Wzv+bh_v = W z_v + b

数据配方:教材与习题册

好老师不会一上来就发综合卷。先备一本图文对照的“识字教材”,再备一本把问题和标准答案配好的“习题册”。数据,就是 LLaVA 老师的备课核心。

阶段一的教材叫“图文对”:约 59.5 万张图,每张配一句简短描述,任务极简——看图说一句“图片说明”。阶段二的习题册叫 LLaVA-Instruct-158K:15.8 万条指令数据,全部由 GPT-4 看图生成,覆盖三种题型。

这份 158K 数据的配比很有讲究:58K 是“对话型”(图中的人在做什么)、77K 是“详细描述型”(请详细描述这张图)、23K 是“复杂推理型”(为什么/怎么办)。每一条数据在喂给模型之前,都要按固定模板拼成“图像 token + 指令 + 回答”三段的序列,这就是 LLaVA 的对话模板格式。

教材和习题册的质量,直接决定孩子学正还是学歪。LLaVA 成功的一半功劳,要记在这份精心的“数据配方”上。

S=[hv(1),…,hv(N),xi(1),…,xi(M),y(1),…,y(K)]\mathbf{S} = [\mathbf{h}_v^{(1)}, \ldots, \mathbf{h}_v^{(N)}, \mathbf{x}_i^{(1)}, \ldots, \mathbf{x}_i^{(M)}, \mathbf{y}^{(1)}, \ldots, \mathbf{y}^{(K)}]
一条训练样本 = 图像 token 段 + 指令 token 段 + 回答 token 段,三段依次拼接。
  1. 视觉 token 段铺在序列最前面的 N 个图像 token,模型从这里“看”画面。
    hv(1),…,hv(N)\mathbf{h}_v^{(1)}, \ldots, \mathbf{h}_v^{(N)}
  2. 指令 token 段人类问题的文本 token,模型从这里“听”问题。
    xi(1),…,xi(M)\mathbf{x}_i^{(1)}, \ldots, \mathbf{x}_i^{(M)}
  3. 回答 token 段标准答案,训练时唯一参与损失的部分——先记住“损失掩码”这个伏笔。
    y(1),…,y(K)\mathbf{y}^{(1)}, \ldots, \mathbf{y}^{(K)}

阶段一特征对齐:先把桥搭稳

搭桥阶段。孩子先不学答题,只练“眼到口”的基本功:看到苹果说“苹果”,看到红色说“红色”。桥还没搭稳就做综合题,只会两头都崩掉。

阶段一的目标只有一个:让视觉特征和语言空间“对齐”。所谓对齐,就是让“眼睛看到的信号”和“大脑习惯的词向量”处在同一套坐标系里,这样后续指令微调时,模型才真正“看得懂”图。

训练时 CLIP 和 LLM 都原地冻结(参数不动),只有投影层在更新。数据用 59.5 万图文对,训练 1 个 epoch,学习率 1e-3,batch size 128。因为只训一层投影,这个阶段又快又稳——投影层的参数量摆在 70 亿参数的语言模型面前,几乎可以忽略不计。

桥搭好后,孩子能把看到的和说出的对上号了。但“叫得出名字”离“回答复杂问题”还差得远——第二阶段,正式开始“看图做题”。

Nproj=dv×dh+dh=1024×4096+4096≈4.2×106N_{proj} = d_v \times d_h + d_h = 1024 \times 4096 + 4096 \approx 4.2 \times 10^6
线性投影层只有约 420 万可学习参数,相对 7B 模型仅占 0.06%,所以阶段一训练非常轻量。
  1. 投影层参数量线性层的权重矩阵加上偏置项,单位是“个参数”。
    Nproj=dv×dh+dhN_{proj} = d_v \times d_h + d_h
  2. 代入维度ViT-L/14 输出 1024 维,Vicuna-7B 隐藏层 4096 维,相乘再加偏置。
    Nproj=1024×4096+4096=4,202,240N_{proj} = 1024 \times 4096 + 4096 = 4{,}202{,}240
  3. 占比把 420 万除以 70 亿,得到约 0.06%,这就是“只动桥、不动脑”的代价。
    4.2×1067×109≈0.06%\frac{4.2 \times 10^6}{7 \times 10^9} \approx 0.06\%

阶段二指令微调:再做综合卷

桥已稳,老师开始发综合卷。孩子看着图回答问题,老师全程陪练、当场纠错。这就是阶段二:端到端指令微调。

阶段二把语言模型解冻,视觉编码器依旧冻结,投影层继续跟着训练。数据换成 15.8 万条指令数据,让模型学习“看图 + 听指令 → 组织完整回答”。LLaVA 的原始实验里,阶段二在 8×A100-80G 上数小时即可完成,整个训练流程轻量得让人意外。

两个关键细节。第一,学习率从 1e-3 大幅降到 2e-5——语言模型已经会说话,步子太大会把它“震”坏,学完反而忘掉语言能力,也就是灾难性遗忘。第二,损失掩码:训练时只有“回答”位置的 token 计入损失,指令和图片 token 不计。相当于告诉模型:题目不用背,专心练答题。

经过一套综合卷的锤炼,孩子已经能对答如流。可“会答”不等于“答得准、答得可靠”——接下来要看考试成绩,也要揪出“不懂装懂”的老毛病。

L(θ)=−∑t=1Tmtlog⁡Pθ(yt∣hv,xi,y<t)L(\theta) = -\sum_{t=1}^{T} m_t \log P_{\theta}(y_t \mid \mathbf{h}_v, \mathbf{x}_i, \mathbf{y}_{<t})
损失只计算回答位置的 token,图像 token 和指令 token 都被掩码屏蔽,模型专注学习“如何作答”。
  1. 掩码标记 \(m_t\)只在“回答位置”取 1,指令和图像 token 处取 0,形同给试卷划出“只改这段”。
    mt∈{0,1}m_t \in \{0, 1\}
  2. 逐词对数概率模型对每个位置给出的下一个词预测概率的对数,答错时数值更负、惩罚更大。
    log⁡Pθ(yt∣hv,xi,y<t)\log P_{\theta}(y_t \mid \mathbf{h}_v, \mathbf{x}_i, \mathbf{y}_{<t})
  3. 求和取负所有回答位置累加,取负号得到损失;训练就是最小化这个损失。
    L(θ)=−∑t=1Tmtlog⁡Pθ(yt∣hv,xi,y<t)L(\theta) = -\sum_{t=1}^{T} m_t \log P_{\theta}(y_t \mid \mathbf{h}_v, \mathbf{x}_i, \mathbf{y}_{<t})

效果评估:和 GPT-4V 同台考试

期末考试来了。家长把孩子与“别人家的孩子”GPT-4V 拉进同一考场,试卷是 ScienceQA——一个需要结合科学图表推理的选择题基准。

LLaVA-13B 交出了 90.7% 的准确率,明显超过此前约 84% 的最优方法;作为对比,当年纯文本 GPT-4 在这个基准上只有 80% 出头。这说明“看图 + 文字一起推理”确实比纯文字答题更有优势,也验证了“先对齐后微调”这套培养方案的含金量。

但与 GPT-4V 正面对比仍有差距:GPT-4V 在复杂逻辑推理、小区域细节感知、世界知识广度上更强;LLaVA 的优势在于开源可私有化部署、数据与权重可控、能按业务需求继续微调。评测不能只看准确率,还要做零样本迁移测试和人工打分,比如用 GPT-4 给开放性回答评分、用 POPE 测幻觉。

考试暴露了孩子的两个毛病:一是会编造没看见的东西(幻觉),二是答题口吻不够讨人喜欢。前者去“治幻觉”,后者请“金牌评委”——两条补救路线,对应接下来的内容。

Acc=1N∑i=1N1[y^i=yi]Acc = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}[\hat{y}_i = y_i]
准确率就是“答对的题目数除以总题数”,考试中最直观的指标。
  1. 指示函数括号里的判断成立记 1、不成立记 0,也就是“这一题答对没有”。
    1[y^i=yi]\mathbb{1}[\hat{y}_i = y_i]
  2. 求平均把所有样本的对错加起来除以样本数,得到一个 0 到 1 之间的分数。
    Acc=1N∑i=1N1[y^i=yi]Acc = \frac{1}{N}\sum_{i=1}^{N}\mathbb{1}[\hat{y}_i = y_i]

幻觉治理:治一治看图作文的“脑补”

看图作文里,图里明明只有一只猫,孩子却写“猫在公园追蝴蝶”。这不是眼睛的问题,是“脑补”的毛病——他太习惯顺着常见搭配编故事了。

多模态幻觉,指模型一本正经地说出图片中不存在的物体。根源在于语言模型的“先验”太强:它太会顺着语感“顺口溜”,而当视觉信号弱的时候,根本压不住它。换句话说,不是眼睛没看见,是大脑太爱抢戏。

评测上通用 POPE 法:对每张图反复提问“图中有 X 吗?”,统计模型回答的精确率、召回率和 F1。缓解有三板斧:数据层加“图中没有 X”的负样本,让模型见过“不存在”该怎么说;解码层用对比解码,把原图与扰动图的输出做差,强迫模型更依赖视觉证据;还有基于注意力图的视觉接地约束,让每个词都能“指”向图里的区域。后续的 LLaVA-RLHF 更是直接用强化学习把幻觉率显著压了下去。

治幻觉,就是纠正孩子“不懂装懂”:一边告诉他“没看见就别说”,一边教他“以眼睛为准,别光靠猜”。

F1=2×TP2×TP+FP+FNF1 = \frac{2 \times TP}{2 \times TP + FP + FN}
F1 是精确率与召回率的调和平均,幻觉越重,假阳性 FP 越大,F1 就越低。
  1. 真阳 \(TP\)对象存在且模型回答“有”,正确命中,多多益善。
    TPTP
  2. 假阳 \(FP\)对象不存在模型却说“有”——这就是要严打的幻觉。
    FPFP
  3. 假阴 \(FN\)对象存在模型却说“没有”,属于漏报。
    FNFN
  4. F1 综合分子是两倍真阳,分母把假阳假阴都算进去,幻觉越重 F1 越低。
    2TP2TP+FP+FN\frac{2TP}{2TP + FP + FN}

RLHF对齐:请来金牌评委

“会答”和“答得讨人喜欢”是两件事。家长请来金牌评委,给孩子同一道题的两版回答打分:一版干巴巴的“有猫”,一版贴心的“有一只橘猫,正趴在窗台上晒太阳”。孩子从此学会往高分的方向作答。

这套“评委指导法”在业界叫 RLHF(基于人类反馈的强化学习)。流程分四步:收集人类偏好数据(两个回答哪个更好)→ 训练奖励模型(学会打分)→ 用强化学习优化策略 → 多轮迭代。LLaVA-RLHF 用这套方法训练后,幻觉率显著下降,回答也变得更“像人”。

RLHF 工程重、训练不稳定,于是有了 DPO(直接偏好优化):不再训练奖励模型,直接把“好回答的概率要高于差回答”写成损失函数。参考模型的概率比当“锚点”,防止模型跑偏;温度系数 \(\beta\) 控制它偏离原模型多远。DPO 只需普通监督训练就能完成对齐,成本大幅下降。

有了评委的牵引,孩子不仅“看到什么说什么”,还学会“说得像个人类喜欢的口吻”——多模态对齐的最后一课,就这么补上了。

LDPO(πθ)=−E(x,yw,yl)∼D[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))]L_{DPO}(\pi_\theta) = -\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}} \left[ \log \sigma\left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)} \right) \right]
DPO 的直觉是:让“好回答的相对概率”尽量高于“差回答的相对概率”,用偏好对直接监督,绕开奖励模型。
  1. 偏好数据对同一问题 \(x\) 下的好答案 \(y_w\) 与差答案 \(y_l\),来自人工标注。
    (x,yw,yl)∼D(x, y_w, y_l) \sim \mathcal{D}
  2. 概率比差值当前策略与参考策略在“好答案”上的概率比,减去“差答案”上的概率比;我们希望前者总是更大。
    βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x)\beta \log \frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}
  3. 胜率化与求期望sigmoid 把差值压成 0 到 1 的胜率,取负对数后对所有偏好对求平均,得到最终损失。
    −E(x,yw,yl)∼D[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))]-\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\left[\log \sigma\left(\beta \log \frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}\right)\right]

实战复现:算清预算再开班

培训结束不等于马上能开班。想自己“办个学”(复现或微调 LLaVA),得先算清预算:要几块显卡、训多久、容易栽在哪个坑。

显存是头号预算。全参微调时,模型参数、梯度、优化器状态都要驻留显存,经验公式大约是“每 1B 参数吃掉 16GB 显存”。算下来 7B 约 112GB、13B 约 208GB,单卡 A100-80G 根本放不下。所以 13B 全参训练需要 4×A100-80G 或 8×A100-40G;预算不够就用 LoRA/QLoRA,单卡 A100-40G 也能跑 7B。

训练时长方面,batch size 128 时,阶段一(595K 图文对)约 4650 步、阶段二(158K 指令数据)约 1235 步,各训 1 个 epoch;8×A100-80G 上 13B 模型两阶段通常半天到一天收工。常见坑:OOM 就减小 batch、开梯度累积;多训几个 epoch 准确率不升反降,就回归 1 epoch,去提数据质量而不是加轮数;中文回答差,就往指令数据里补中文样本。

账算清了,就知道开源社区为什么都在用 LoRA 和 QLoRA——先把课开起来,再谈把课上好。复现 LLaVA 不神秘:两阶段、两套数据、两个学习率,外加耐心修 bug。

M≈2Φ+2Φ+12Φ=16ΦM \approx 2\Phi + 2\Phi + 12\Phi = 16\Phi
全参微调显存约等于 16 字节 × 参数量:权重、梯度各 2 字节,优化器状态 12 字节。
  1. 权重与梯度bf16 混合精度下模型参数占 \(2\Phi\) 字节,反向传播的梯度再占 \(2\Phi\)。
    M=2Φ+2ΦM = 2\Phi + 2\Phi
  2. 优化器状态Adam 需要保存 FP32 主权重(\(4\Phi\))与一阶、二阶动量(各 \(4\Phi\)),共 \(12\Phi\)。
    M=4Φ+4Φ+4Φ=12ΦM = 4\Phi + 4\Phi + 4\Phi = 12\Phi
  3. 合计三项相加得到 16 字节/参数;代入 7B 得 112GB,代入 13B 得 208GB。
    M≈16ΦM \approx 16\Phi

AI 应用场景

电商多模态导购助手

阶段:数据构建与指令微调(对应正文阶段一、阶段二与数据配方)

解决的问题:传统图像搜索只能“以图搜图”,无法回答“这条裙子适合什么场合”“这个包和那件上衣搭不搭”这类开放问题。用 LLaVA 微调后,模型可以结合商品图和知识库生成自然语言导购建议,回答从“图匹配”升级为“语义理解”。

具体案例:某电商平台收集 5 万条“商品图 + 导购问答”,按 LLaVA 的对话模板包装成指令数据,在 7B 模型上做两阶段微调,在线导购回复的采纳率提升了约 30%。微调时特意在数据里加了“图中没有的标签”负样本,把商品幻觉率从 18% 压到 6%。

医疗影像辅助初筛报告

阶段:幻觉治理与评估(对应正文 POPE 评测、负样本与对比解码)

解决的问题:模型对着 CT 片胡说会造成严重的医疗事故风险。通过 POPE 式“图中有没有病灶”的专项评测,加上负样本指令数据与对比解码,把“没看见的不要编”写进模型的回答习惯,让生成式报告更可靠。

具体案例:某影像 AI 团队在 X 光胸片场景微调 LLaVA,要求模型只描述可见结构;用 POPE 风格数据做评测与负样本增强后,明确性幻觉率从约 25% 降到 8%,医生初筛采纳率明显提升。

端侧多模态助手的偏好对齐

阶段:RLHF/DPO 对齐(对应正文第七节)

解决的问题:模型能答但语气生硬、冗长,用户不喜欢。RLHF 需要奖励模型和强化学习采样,端侧难以承受;改用 DPO 直接在偏好对上做监督,训练成本低,还能把“简短、准确、有温度”的偏好融入模型。

具体案例:某车载语音助手用 DPO 微调视觉问答模型,收集 1.2 万条“同一问题两个回答谁更好”的司机偏好数据,一轮训练后人工评分提升 1.2 分(5 分制),回答平均长度缩短 40%。

Python 演示

python63 行
"""LLaVA两阶段指令微调的最小可运行演示:阶段一只训练投影层(桥), 阶段二解冻语言头(说话能力)做端到端微调."""import torchimport torch.nn as nnimport torch.nn.functional as F torch.manual_seed(0)VDIM, HDIM, VOCAB = 64, 128, 1024     # 视觉维度/语言维度/词表大小  def make_loss_mask(seq_len, ans_start):    """损失掩码: 只让回答位置参与损失, 指令和图片token不计损失"""    mask = torch.zeros(seq_len, dtype=torch.bool)    mask[ans_start:] = True    return mask  class TinyLLaVA(nn.Module):    """简化版LLaVA: 投影层(桥) + 语言头(说话能力)"""     def __init__(self):        super().__init__()        self.proj = nn.Linear(VDIM, HDIM)         # 桥: 视觉特征到语言空间        self.lm_head = nn.Linear(HDIM, VOCAB)     # 语言头: 预测下一个词     def forward(self, vis_feat):        h = self.proj(vis_feat).mean(dim=1)       # 视觉token过桥后平均池化        return self.lm_head(h)  def train_stage(model, vis_feat, targets, lr, train_lm, steps=80):    """核心逻辑: 阶段一只把投影层加入优化器, 阶段二再加入语言头"""    params = [model.proj.weight, model.proj.bias]    if train_lm:        params += [model.lm_head.weight, model.lm_head.bias]    opt = torch.optim.AdamW(params, lr=lr)    losses = []    for _ in range(steps):        logits = model(vis_feat)                  # 前向: 图到桥到说话        loss = F.cross_entropy(logits, targets)        opt.zero_grad()        loss.backward()        opt.step()        losses.append(round(loss.item(), 3))    return losses  def main():    vis_feat = torch.randn(8, 16, VDIM)           # 8张图, 每张16个视觉token    captions = torch.randint(0, VOCAB, (8,))      # 阶段一目标: 看图说单词    answers = torch.randint(0, VOCAB, (8,))       # 阶段二目标: 指令回答    mask = make_loss_mask(seq_len=16, ans_start=8)    print("损失掩码示例:", mask.tolist())     model = TinyLLaVA()    s1 = train_stage(model, vis_feat, captions, lr=1e-3, train_lm=False)    s2 = train_stage(model, vis_feat, answers, lr=2e-5, train_lm=True)    print("阶段一Loss从{}降到{}".format(s1[0], s1[-1]))    print("阶段二Loss从{}降到{}".format(s2[0], s2[-1]))  if __name__ == "__main__":    main()
目的:用一个几十行的小模型模拟 LLaVA 两阶段微调的核心逻辑——阶段一只更新投影层,阶段二解冻语言头,并演示损失掩码与两套学习率。
  1. params = [model.proj.weight, model.proj.bias]优化器只拿到投影层参数,对应“阶段一冻结两侧只训桥”。
  2. if train_lm: params += [model.lm_head.weight, model.lm_head.bias]阶段二才把“说话能力”加入可训练集合。
  3. mask[ans_start:] = True回答位置才参与损失,这就是训练中的损失掩码机制。
  4. model.proj(vis_feat).mean(dim=1)视觉 token 过桥后做池化,模拟“图片输入”的 token 级处理。
  5. torch.optim.AdamW(params, lr=lr)两个阶段用不同学习率:阶段一 1e-3,阶段二 2e-5。
  6. F.cross_entropy(logits, targets)下一个词的交叉熵损失,对应正文中带掩码的负对数似然。
  7. if __name__ == "__main__": main()可执行入口,运行后能看到两阶段各自 loss 的下降轨迹。

常见误区

误区“我把 LLaVA 两个阶段都训练完了,模型应该能处理任何图片和问题了吧?为什么换到我的业务图片上就胡言乱语?”

正解两阶段只是“通用看图说话”的起步。LLaVA 的 158K 指令数据覆盖的是通用场景,换到特定业务(医学影像、工业质检、电商主图)必须用业务数据继续微调。就像孩子学完通用课程,不代表会做你公司的专业考试卷,数据和领域适配决定效果边界。

为何常见:把“训练流程跑通”误解为“模型已经掌握所有视觉技能”,忽略了数据分布决定模型能力这个基本事实。

误区“与其分两阶段,不如把 CLIP、投影层、LLM 全部放开一起训练,一步到位不是更省事?”

正解全放开会导致灾难性遗忘和多模态对齐失败。CLIP 的特征空间是预训练好的“通用视觉语言”,直接大改会破坏它;LLM 在指令数据量不足时则会忘掉原本的语言能力。阶段一冻结两侧只训桥、阶段二只解冻 LLM,是大量实验验证过的稳定配方。

为何常见:“训练得越多越好”的直觉,忽视了参数空间与数据规模之间的匹配关系。

误区“模型看图说胡话,肯定是 CLIP 眼睛不行,换一个更强大的视觉编码器就能根治幻觉。”

正解幻觉更多源于语言先验过强和训练数据的“确认偏误”——数据里总是在讨论“图中有的东西”,而“图中没有的东西”从未被显式标注为不存在。换视觉编码器只能改善感知,不能解决“脑补”;负样本数据、对比解码、视觉接地约束才是针对性解法。

为何常见:把问题归因到最直观的“眼睛”,忽略了语言模型先验在生成中的主导作用。

误区“RLHF 不就是把人工标注的好答案拿来做监督学习,多微调几个 epoch 嘛?”

正解RLHF 的输入是“偏好对”(同一问题两个回答谁更好),先训练奖励模型打分,再用 PPO/DPO 优化策略。它优化的是“相对偏好”而非“绝对答案”。DPO 则把偏好直接写成损失,无需奖励模型和强化学习的复杂采样。简单加训几轮好答案,学不到“为什么这个更好”。

为何常见:习惯了监督学习“标签即答案”的范式,没理解偏好学习背后的“比较”逻辑。

误区“多模态指令数据我使劲收集,从网上爬几十万条图文丢进去训练,效果应该直线上升。”

正解数据质量大于数量。LLaVA-158K 是精心设计的配比(对话/描述/推理),大量噪声、重复或图文错配的数据会导致训不收敛、幻觉加重。就像给孩子喂劣质习题册,做得越多学得越歪。

为何常见:大模型时代“数据多 = 效果好”的惯性思维,忽略了任务配比和标注质量对指令微调的决定性影响。

面试题

Q1. LLaVA 视觉指令微调的第一阶段(特征对齐预训练)主要训练哪个组件?

单选题 · easy

  • A.视觉编码器 CLIP
  • B.投影层 Projector← 正确答案
  • C.语言模型 LLM
  • D.奖励模型 RM

答案:B。阶段一冻结 CLIP 和 LLM,只有投影层在更新参数,目的是把视觉特征映射到语言空间。就像搭桥阶段只施工桥面,不动两岸的建筑。选其他选项都混淆了阶段一的训练范围。

Q2. LLaVA 使用的视觉编码器一般选自哪一类模型?

单选题 · easy

  • A.CLIP 视觉分支← 正确答案
  • B.纯 CNN 网络
  • C.扩散模型 UNet
  • D.SIFT 手工特征

答案:A。LLaVA 用 CLIP 的 ViT 视觉分支当“眼睛”,因为它已经具备图文对齐的预训练特征。扩散模型的 UNet 是生成模型的组件,SIFT 是传统手工特征,都不适合直接作为视觉编码器。

Q3. 阶段二端到端指令微调的典型学习率是多少?

单选题 · mid

  • A.1e-3
  • B.2e-5← 正确答案
  • C.1e-6
  • D.0.5

答案:B。阶段一特征对齐用较大的 1e-3 快速搭桥,阶段二解冻 LLM 后必须用很小的 2e-5,防止破坏语言模型的已有能力。好比孩子学走路可以大步快走,但纠正口音时必须小步慢调。

Q4. LLaVA 训练中“损失掩码”的主要作用是?

单选题 · mid

  • A.只让回答位置参与损失← 正确答案
  • B.只让图像参与损失
  • C.随机屏蔽一半样本
  • D.屏蔽所有指令文本

答案:A。损失掩码让“回答”位置的 token 才计算损失,指令和图像 token 不参与。这告诉模型“题目不用背,专心学答题”,避免它把力气花在复述指令上。

Q5. 关于 LLaVA 两阶段训练策略,下列说法正确的有?

多选题 · mid

  • A.阶段一只更新投影层参数← 正确答案
  • B.阶段二解冻语言模型微调← 正确答案
  • C.阶段一需要复杂指令数据
  • D.CLIP 阶段二必然全部解冻

答案:AB。阶段一用图文对数据、只训投影层;阶段二用指令数据、解冻 LLM 一起端到端微调。阶段一不需要复杂指令数据(那是阶段二的事),且原版 LLaVA 在阶段二也保持 CLIP 冻结。

Q6. POPE 评测方法主要用于衡量模型的哪方面能力?

单选题 · mid

  • A.多模态幻觉程度← 正确答案
  • B.语言流畅程度
  • C.图像清晰程度
  • D.模型压缩程度

答案:A。POPE 通过反复提问“图中有 X 吗”并统计回答的精确率、召回率和 F1,专门度量模型是否“编造不存在的物体”,也就是多模态幻觉程度。

Q7. 下列哪些方法可以有效缓解多模态幻觉?

多选题 · hard

  • A.训练数据中加入负样本← 正确答案
  • B.对比解码放大视觉信号← 正确答案
  • C.增加更多纯文本训练
  • D.使用更大的词表

答案:AB。负样本让模型学会说“图中没有 X”,对比解码用原图与扰动图的输出差迫使模型更依赖视觉证据。增加纯文本训练只会强化语言先验,让“脑补”更严重;扩大词表与幻觉无关。

Q8. DPO 相比传统 PPO-RLHF 的最大区别是什么?

单选题 · hard

  • A.无需显式训练奖励模型← 正确答案
  • B.需要更多人工标注
  • C.完全不需要偏好数据
  • D.只适用于视觉模型

答案:A。DPO 直接把“好回答概率高于差回答”写成损失函数,绕开了奖励模型训练和强化学习采样,训练更稳定、成本更低。它依然需要偏好数据,也适用于任何生成模型。

Q9. 一个完整的 RLHF 对齐流程通常包含哪些组件?

多选题 · mid

  • A.收集人类偏好数据← 正确答案
  • B.训练奖励模型打分← 正确答案
  • C.优化策略模型参数← 正确答案
  • D.重建高清图像

答案:ABC。RLHF 的经典三步是收集偏好对、训练奖励模型、用强化学习(如 PPO)优化策略模型。图像超分重建与人类偏好对齐无关,属于另一条技术路线。

Q10. 全参微调一个 7B 多模态模型,粗略估算至少需要多少显存?

单选题 · easy

  • A.约 100GB 以上← 正确答案
  • B.约 1GB 左右
  • C.约 10MB 级别
  • D.约 2TB 级别

答案:A。全参微调显存约等于参数量 × 16 字节,7B 模型约需 112GB,所以单卡 A100-80G 放不下,需要多卡或 LoRA。10MB 是单张图片的规模,2TB 则过度高估了常规 7B 微调需求。