跳转至

VLM 指令微调与对齐

预计阅读:40 分钟 | 前置知识:05-通用VLM架构与视觉编码器、Transformer 微调基础

上一篇讲的是零件怎么接。接好之后的模型仍然只是一个「会算相似度」的装置——它不会听话。从预训练权重到「能按指令回答问题」,中间那一段训练就是本篇的主题:数据怎么造、参数怎么省、什么时候该冻、什么时候会训坏。

本篇没有动手验证节。 指令数据构造、LoRA 秩的边界、灾难性遗忘这三件事,要量出可信数字需要真的训一个 VLM 并做多次消融——本仓的实验条件是 CPU-only 与 8 GB 显存,做不到。硬造一个「小规模代理实验」得到的数字既不能支持也不能否证本节任何一条判断,属于「看起来像实测的编造」。因此本篇所有关于数据与训练的定量说法都以引用文献为限,不作为本仓的实测结论;凡是本仓没有实跑的地方,下面一律标明「引用」而非「实测」。本卷通用方法三篇里有实测的是 05(token 预算)与 07(负样本划分)。


1. 从预训练到指令跟随

一个 VLM 从零到能用,通常走三段:

阶段 数据 训谁 得到什么
特征对齐预训练 大规模图文对(如 55.8 万条) 只训连接器 视觉特征被拉到语言模型的输入空间里
指令微调(SFT) 指令-回答对(如 66.5 万条) 连接器 + 语言模型 会按指令回答问题
对齐优化 偏好对 / 反馈 语言模型(可含连接器) 回答更符合人类偏好、更少幻觉

这个划分来自 LLaVA 的两阶段做法(2304.08485,数据规模见 2310.03744)。关键在第二列「训谁」上,不在第一列的数据量上。 第一阶段冻结语言模型,是因为大规模图文对的监督信号只有「图文是否匹配」这一条,用它去更新语言模型会把语言能力冲淡;第二阶段数据少得多,但监督信号是具体的回答文本,可以动语言模型。

判据:看一篇 VLM 的训练方案,先找冻结标记。冻结视觉塔、冻结语言模型、只训连接器,这三种组合各自对应一个明确的假设:「视觉塔够好」、「语言能力不能动」、「两个空间只差一个线性变换」。任何一条假设不成立,对应的冻结就是错的——而错误不会立刻显形,要等到指令微调阶段甚至评测阶段才暴露。


2. 视觉指令数据的构造

2.1 三条构造路线

规则转换。 LLaVA(2304.08485)把 COCO 的检测标注用 GPT-4 转成对话,产出三类样本:对话、细粒度描述、复杂推理。这条路的优点是产出可控、可追溯;缺点是信息量受限于原标注——原标注没有的信息(材质、氛围、运动趋势)转化不出来。

生成器直出详细描述。 ShareGPT4V(2311.12793)用 GPT-4V 直接为图像生成详细描述,把重点放在 caption 的信息密度上。SVIT(2307.04087)走规模路线。ALLaVA(2402.11684)则把目标放在用小模型消化合成数据上——省的是后续训练成本。

对话式复用。 InstructBLIP(2305.06500)、Otter(2305.03726)、mPLUG-Owl(2304.14178)、MiniGPT-4(2304.10592)分别从指令数据的不同角度切入:指令感知的视觉特征提取、上下文示例式指令、模块化训练、以及用少量高质量对做能力激活。

2.2 合成数据的三个内在偏差

数据是生成器写的,生成器的局限就成了模型的局限。这三条偏差在无人机侧会被放大(见第 7 节):

  1. 视角偏差。 生成器的训练分布里自然视角图像占绝对多数,俯视图的描述会系统性地更粗糙、更模板化。用这样的数据训无人机模型,学的其实是「自然视角的描述方式」再套到俯视图上。
  2. 信息密度偏差。 详细描述生成器偏好「长而丰富」,于是被训模型也会偏好长答案。这在以短答案为标准的评测上直接掉分(第 6 节)。
  3. 肯定偏差。 生成器很少说「我看不出这张图里有没有 X」。数据集里因此几乎没有拒答样本,训出来的模型在所有「有没有」问题上都倾向答「有」——这是 07 篇 讨论的幻觉来源之一,也是本篇与那篇的直接接口。

判据:评估一套指令数据,要看的不是它的样本数,是三个比例——任务类型分布(定位/计数/推理/描述各占多少)、拒答样本比例、以及答案长度分布。前两个决定模型会不会在「不该答」时乱答,第三个决定它在短答案评测上的表现。这三个比例在任何一篇 VLM 论文的数据表里通常都不报。


3. 参数高效微调与它的边界

3.1 几种做法

方法 动什么 省在哪
2106.09685 LoRA 给权重矩阵加低秩增量 ΔW = BA 可训参数降到千分之几,显存与存储都省
2305.14314 QLoRA 4-bit 量化基座 + LoRA 基座显存再降一档
2303.16199 LLaMA-Adapter 零初始化的可学习提示 训练初期不扰动原模型
2402.14289 TinyLLaVA 小模型 + 小数据配方整体设计 端到端的小规模方案

3.2 边界一:LoRA 是重加权,不是注入

LoRA 的增量被约束在低秩子空间里,这意味着它改变的是已有方向的组合方式,不是往模型里塞新知识。落到 VLM 上有两个具体后果:

  • 视觉塔与语言模型之间如果存在模态对齐的结构性错位(05 篇第 4.3 节),LoRA 加在语言模型上修不了它——错位发生在连接器与嵌入空间,不在语言模型内部;
  • 一个在预训练里从未见过的概念,靠 LoRA 是学不会的,只能学会「在已有概念里挑一个最近的」。

所以秩 r 这个超参的正确取法不是「显存够就调大」,而是「先判断要改的是重加权还是新能力」。后者用 LoRA 无论多大秩都不解决。

3.3 边界二:冻结带来的遗忘与不遗忘

冻结语言模型只训连接器时,语言能力几乎不受影响;联合微调时,通用语言基准上的分数通常会掉——这就是灾难性遗忘。缓解手段有三类:参数高效微调(少动参数)、回放通用数据(混入纯文本语料)、以及冻结图层策略(只动高层)。

值得记住的是这个取舍的两面:遗忘的另一面是「改不动」。冻结换来的稳定性,代价是当任务需要改变模型的语言行为方式(比如无人机指令要求极短的固定格式回答)时,冻结的部分就不肯变。

判据:看到「我们的方法在保持通用能力的同时提升了多模态能力」,要去它的训练数据表里找纯文本数据的占比。占比不报或很低而通用分数不掉的,通常是评测集与训练数据有重叠,或者「通用能力」用的是一组过于容易的基准。


4. 模态对齐:冻结视觉塔还是联合训练

这一节是第 3.3 节那条取舍的上游:既然冻结有代价,那到底该不该冻视觉塔。

冻结的理由。 视觉塔的参数是在几亿到几十亿图文对上训出来的,而指令微调数据通常小两三个数量级。用后者去更新前者,风险是把泛化能力训掉——视觉塔从此只擅长指令数据里出现过的场景类型。另一个理由与部署有关:同一个视觉塔如果要供多个下游复用(检测、分割、检索),它就不该被某一个下游改掉。

联合训练的理由。 冻结意味着视觉塔的表征分布是给定的,连接器必须去适应它。当视觉塔的输出与语言模型的输入空间差距较大(跨模态、跨域,比如遥感图像配通用语言模型)时,只靠连接器硬扭会留下系统性误差。Idefics2(2405.02246)与 Prismatic(2402.07865)都在这一轴上做过系统的消融,两篇的共识是数据与训练配方的权重不低于架构选择。

中间选项。 给视觉塔加 LoRA(低秩、可撤),或者只在最后几层解冻。这类做法在工程上最常见,代价是超参变多:解冻哪几层、秩多大,都要靠消融定。


5. 特殊 token 与模板

这一节讲的是「看不见但决定成败」的一层:token 与模板。

图像占位符。 <image> 这一类占位 token 在送入语言模型前被替换成实际的视觉 token 序列。原生分辨率路线下,一张图替换出的 token 数不固定,占位符与替换规则就成为模型行为的一部分。

坐标 token。 需要输出位置的任务要把坐标纳入词表。GeoChat 把 bounding box 坐标作为特殊 token 纳入的做法(见 01 篇)影响了后续一批遥感 VLM。这条路的一个直接后果是:坐标精度被离散化到了 bin 的粒度,而这个粒度决定了下游可用的定位精度——与 05 篇第 9 节量的量化误差是同一个机制。

对话模板。 谁说话用什么分隔符、系统提示放在哪里。模板的写法决定了模型在推理时能否复现训练时的格式。


6. 两种失效:模板过拟合与风格漂移

模板过拟合。 模型学到的是训练模板的表面模式,而不是任务本身。表现是:换个提问方式(同义改写、调整词序、加一个无关的上下文句)分数明显掉。这类失效在自建评测上尤其危险——用自己的模板建的测试集,测出来的往往是「模型记住了模板」,而不是「模型会做这道题」。

风格漂移。 用强模型生成的答案训出来的模型,会模仿强模型的回答风格:先复述问题、再分点、最后总结。这在以准确率为指标的短答案基准上直接掉分,且换了模板也治不好——它不是格式问题,是内容分布问题。这一点与第 2.2 节的「信息密度偏差」是同一件事的两面。

判据:任何一个 VLM 的评测结果,如果它的提问模板与训练模板完全一致,这个分数应当被当作上界读。要拿到可比数字,至少用两到三个语义等价、写法不同的模板重测一遍,取最差的一档。


7. 对无人机的含义

第一,合成数据是唯一现实路径,但偏差会被放大。 无人机指令数据稀缺,几乎只能靠强模型合成。第 2.2 节的三条偏差在无人机侧都更严重:俯视视角在生成器训练分布里本就稀少,长描述偏好与机载实时性要求直接冲突,而肯定偏差在「目标是否存在」这类安全相关问题上后果最大。

第二,拒答能力必须显式训。 无人机场景里,「我无法判断」比「猜一个」安全得多——地面机器人答错一句话的代价,与飞行器据此改变航向的代价不同级。而第 2.2 节第 3 条说明:通用指令数据集里几乎没有拒答样本。这一条不能靠换模型解决,必须在数据构造阶段就把它作为一类任务加进去。

第三,视图与模板的稳定性比绝对分数重要。 机载系统上线的不是「某个基准的最高分」,是「在机载视角、机载模板下发散最小的那个模型」。第 6 节的两种失效都会让「实验室分数」与「飞行表现」脱钩,而这两种失效都不会在单一模板的评测里显形。

第四,参数高效微调在机载上有额外价值。 LoRA 允许一个基座挂多个适配器,按任务切换(巡检 / 搜救 / 避障),存储与显存的增量都很小。但第 3.2 节的边界同样成立:适配器能换的是行为方式,不是能力集合——如果基座在俯视小目标上本就看不见,换多少适配器都看不见。


8. 关键论文

本节每条 arXiv 号已通过 arXiv API 核对标题。定量说法以原文为准,本仓未做独立复现。

视觉指令微调的起点

  • [arXiv'23.04] LLaVA / Visual Instruction Tuning — Visual Instruction Tuning arXiv GitHub 用 GPT-4 把检测标注转成对话的视觉指令微调框架,定义了后续主流的极简接法。

  • [arXiv'23.10] LLaVA-1.5 — Improved Baselines with Visual Instruction Tuning arXiv 把数据规模、MLP 投影与分辨率一并调优后的基线。

  • [arXiv'23.04] MiniGPT-4 — MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models arXiv 冻结视觉塔与语言模型,只训一个投影层即可激活多模态能力。

  • [arXiv'23.05] InstructBLIP — InstructBLIP: Towards General-purpose Vision-Language Models with Instruction Tuning arXiv GitHub 让 Q-Former 按指令提取视觉特征。

  • [arXiv'23.04] mPLUG-Owl — mPLUG-Owl: Modularization Empowers Large Language Models with Multimodality arXiv 模块化两阶段训练,视觉与语言能力分阶段接上。

  • [arXiv'23.05] Otter — Otter: A Multi-Modal Model with In-Context Instruction Tuning arXiv 用多模态上下文示例做指令微调。

  • [arXiv'23.11] SPHINX — SPHINX: The Joint Mixing of Weights, Tasks, and Visual Embeddings for Multi-modal Large Language Models arXiv 权重、任务、视觉嵌入三者混训的路线。

  • [arXiv'23.09] InternLM-XComposer — InternLM-XComposer: A Vision-Language Large Model for Advanced Text-image Comprehension and Composition arXiv 把理解与生成(图文编排)放在同一个模型里。

指令数据的构造

  • [arXiv'23.07] SVIT — SVIT: Scaling up Visual Instruction Tuning arXiv 用标注框与描述构造数据,把视觉指令微调推向更大规模。

  • [arXiv'23.11] ShareGPT4V — ShareGPT4V: Improving Large Multi-Modal Models with Better Captions arXiv 用强模型全量生成详细描述,把重点放在 caption 的信息密度上。

  • [arXiv'24.02] ALLaVA — ALLaVA: Harnessing GPT4V-Synthesized Data for Lite Vision-Language Models arXiv 面向小模型设计合成数据配方,把合成数据与轻量训练配起来用。

  • [arXiv'24.02] TinyLLaVA — TinyLLaVA: A Framework of Small-scale Large Multimodal Models arXiv 对小模型组件与训练配方做系统实验。

参数高效微调与偏好对齐

  • [arXiv'21.06] LoRA — LoRA: Low-Rank Adaptation of Large Language Models arXiv 低秩增量微调,参数量降到千分之几。

  • [arXiv'23.05] QLoRA — QLoRA: Efficient Finetuning of Quantized LLMs arXiv 4-bit 量化基座加 LoRA,显存再降一档。

  • [arXiv'23.03] LLaMA-Adapter — LLaMA-Adapter: Efficient Fine-tuning of Language Models with Zero-init Attention arXiv 零初始化注意力的适配器,训练初期不扰动原模型。

  • [arXiv'23.05] DPO — Direct Preference Optimization: Your Language Model is Secretly a Reward Model arXiv 跳过奖励模型直接优化偏好,是对齐阶段的主流做法之一。

  • [arXiv'23.09] Factually Augmented RLHF — Aligning Large Multimodal Models with Factually Augmented RLHF arXiv 把事实性信号加进偏好对齐,直接针对幻觉。

  • [arXiv'23.12] RLHF-V — RLHF-V: Towards Trustworthy MLLMs via Behavior Alignment from Fine-grained Correctional Human Feedback arXiv 用细粒度人工纠正反馈做行为对齐。

设计空间与综述

  • [arXiv'24.02] Prismatic VLMs — Prismatic VLMs: Investigating the Design Space of Visually-Conditioned Language Models arXiv 对视觉条件语言模型设计空间的系统消融。

  • [arXiv'24.05] Idefics2 — What matters when building vision-language models? arXiv 训练配方、数据与架构范式的对照实验。

  • [arXiv'23.06] A Survey on Multimodal Large Language Models arXiv 多模态大模型架构与训练的综述。

  • [arXiv'23.09] Multimodal Foundation Models: From Specialists to General-Purpose Assistants arXiv 从专才到通才助手的技术路线梳理。


9. 延伸阅读


10. 思考题

题目 1:LLaVA 的两阶段为什么要分开?把图文对和指令数据混在一起训有什么问题?

查看参考答案 两阶段分开的核心原因是**监督信号的粒度不同,需要的可训参数范围也不同**。 第一阶段用大规模图文对,监督信号只有「图文是否匹配」这一条粗信号。这个信号足够把连接器的输出分布拉到语言模型的输入空间里,但**不足以训练语言模型本身**——如果用它更新语言模型,模型会为了迎合这个粗目标而牺牲语言建模能力。所以这一阶段冻结视觉塔和语言模型、只训连接器。 第二阶段是指令-回答对,监督信号是**具体的回答文本**,可以逐 token 计算损失。这时动语言模型是安全的,而且必要——「怎么回答」这件事本来就存在语言模型里。 混在一起训的问题有三条: 1. **粗信号淹没细信号。** 图文对的数量级远大于指令数据,混合后的总损失被对比式目标主导,指令跟随的能力学不起来。 2. **尺度不同。** 两个阶段的学习率、batch 组成、甚至优化器状态都不同,混训要额外调这些权重。 3. **失败难归因。** 分开训时如果第二阶段的分数不对,可以回到第一阶段检查特征对齐是否成功;混训后两个阶段的误差交织在一起,无法二分定位。 这也解释了为什么后续很多工作仍然保留两阶段结构,改的是每阶段内部的做法(数据、投影器、解冻范围),而不是把这个结构取消。

题目 2:怎么判断一个 VLM 是「真的会看图」还是「记住了语言先验」?在没有条件训模型的情况下能做哪些检查?

查看参考答案 核心思路是**构造「图不支持但先验支持」的样本**,看模型是否跟着先验走。 不用训模型就能做的几项检查: 1. **遮挡/替换测试。** 把图像替换成纯噪声或另一张同域的图,只有提问不变。如果答案几乎不变,说明模型没在用图像。这是最省事、也最容易被忽略的一项。 2. **常见-罕见对照。** 同一句提问,把问题里的物体换成一类在训练分布里罕见的目标。先验驱动的模型在罕见类上的表现会断崖式下降,而真正看图的模型下降幅度小得多。 3. **否定式提问。** 问「图里有没有 X」时,X 选一类与图中物体高频共现但并不在场的(比如有桌子就问椅子)。这是 [07 篇](./07-通用VLM评测与幻觉.md) 第 9 节 demo 里的对抗档负样本,实测中先验模型在这一档会掉到 0.5 附近。 4. **yes-ratio 统计。** 只报准确率会被「全答 yes」的模型骗过去——[07 篇](./07-通用VLM评测与幻觉.md) 的实测中,全盲的先验模型在随机负样本档拿到 0.9250 的准确率,而它的 yes-ratio 在对抗档升到 0.9450,一眼就能看出它在猜。 5. **模板改写。** 同义改写提问、打乱词序、加无关上下文。模板过拟合的模型会明显掉分(第 6 节)。 这五项都不需要训练,只需要推理接口和一批构造好的问题。它们给出的不是「模型有多强」,而是「模型的分数有多少来自图像」——在把模型用到无人机上之前,这个比例比绝对分数重要。

题目 3:如果只能用 LoRA,机载无人机 VLM 的适配器该怎么设计?

查看参考答案 先按第 3.2 节划清 LoRA 能做到什么、不能做到什么,再定方案。 **LoRA 做不到的(不要指望适配器解决):** - 基座在俯视小目标上看不见的东西——那是视觉塔与分辨率的问题,加在语言模型侧的适配器改不了; - 预训练里完全没有的概念; - 格式以外的内容分布漂移。适配器能让回答变成固定格式,但改不了模型实际掌握的知识与判断能力。 **LoRA 擅长的(适配器应该负责的):** - 输出格式:无人机指令要求极短、结构化的回答,与通用 VLM 的啰嗦风格冲突,这一层用适配器改很合适; - 领域词汇与术语映射; - 任务特定的行为偏好(比如宁可不答也不要乱答的倾向)。 **具体设计要点:** 1. **一个基座、多个适配器**,按任务(巡检 / 搜救 / 避障)切换。存储与显存增量都很小,适合机载。 2. **秩要与「要改多少」匹配。** 只改格式,小秩(如 8)通常够;要改领域行为,需要更大秩与更多数据。别把秩定成显存上限。 3. **视觉塔侧是否加 LoRA,单独做消融。** 如果同一视觉塔还要供检测/分割复用(第 4 节),优先保持冻结。 4. **验收标准用第 2 题的检查项,不用绝对分数。** 适配器上线前至少做遮挡测试与对抗负样本测试,确认新适配器没有把「看图」的比例换掉。 5. **保留回滚。** LoRA 的一个实际优势是可撤销——适配器出问题可以回到基座,这一点在飞行器上比在服务端更重要。

下一节:07-通用VLM评测与幻觉 — 分数是怎么来的,以及它什么时候在骗人