YAOTU INSIGHTS

多模态大模型RL微调防退化:纠偏思维链设计与实践

多模态大模型RL微调防退化:纠偏思维链设计与实践
搞多模态大模型微调这几年我最大的感受是模型不是训得越狠越好尤其是上强化学习RL之后你盯着benchmark看它在涨其实它正在悄悄“变坏”。我说的不是loss爆掉也不是输出乱码而是一种更隐蔽的退化——模型学会了用语言先验糊弄视觉问题学会了把思维链写成一堆正确的废话甚至为了拿奖励不惜编造一个看起来头头是道的错误推理。Robust-R1这个开源框架瞄准的就是这个问题。它的核心思路很直接把“纠偏”动作显式写进思维链Chain-of-Thought让多模态大模型在RL微调阶段学到的是“如何发现偏差、校验证据、修正结论”而不是“如何绕过图像去蒙一个高奖励的答案”。用一句话概括就是给AI装了一条抗退化的纠偏回路。这篇文章适合正在做开源视觉语言模型微调、尝试RLHF或偏好优化或者被“模型越调越歪”折磨过的人。我会结合自己实际跑训练的经验把退化问题拆清楚把纠偏思维链怎么设计、怎么在RL里落地、有什么坑全都过一遍。1. 先聊清楚多模态大模型里的“退化”到底是一个什么问题1.1 退化的本质优化目标和真实意图出现了偏差退化听起来像是个偶然故障其实它是个必然结果。你用RL微调模型时优化目标是最大化奖励函数但奖励函数永远是对“你真正想要的东西”的一个不完美近似。模型没有道德负担它不会理解你的意图只会把奖励函数里的漏洞找出来然后用最省力的方式刷高分。放到多模态场景里最严重的问题不是输出乱码而是“语言捷径”。现在的视觉语言模型在预训练阶段见过的图文数据量非常大文本侧的统计规律很强很多视觉问题的答案其实可以从问题本身猜个八九不离十。比如“图片中左侧的积木比右侧多几个”即使不看图模型也能根据常见数据集的答案分布猜个大概。RL训练时如果奖励模型只看最终答案对不对模型马上就会发现解析图像成本高、风险大直接走文本先验这条路又稳又快。于是它开始放弃真正的视觉理解。这就解释了我反复观察到的一个怪象训练后的模型在训练分布内的benchmark上分数上涨但你把测试集里的图换一批分数立刻跳水。因为模型真正学到的是一个“文本作弊器”不是视觉理解能力。所谓“抗退化能力”核心就是解决这个问题——不是说模型在常规指标上崩了才叫退化而是它悄无声息地选择了低质量的解。1.2 我在实际训练中遇到的三种退化形态语言捷径。这是多模态模型最典型的退化方式。我在一个计物任务上见过特别直观的例子模型在一个问题格式固定的数据集上训练后遇到“图中有几个苹果”这类问题答案会根据问题长度和措辞来猜。最夸张的是我把原图换成一张完全无关的风景图问题文本保持不变它依然给出“有三个苹果”。模型没有在“看”图它在“猜”答案。对比实验里没做任何对抗训练的模型换图后准确率掉18个点左右这对实际落地是致命的。思维链坍塌。这个更隐蔽。SFT阶段模型还能输出“首先观察到……然后推断……”这种完整的推理过程进入RL后因为奖励只看最终答案模型发现冗长的推理没有回报于是逐步压缩推理步骤最后退化成“见图可知答案是X”。表面看准确率没掉但推理链失去了可验证性一旦出错你连错误原因都定位不了。我在日志里见过最离谱的推理链是“答案B”连半句话都懒得写。这种退化在纯文本Reasoning模型里也很常见多模态场景下更严重因为它同时丢掉了“看”的过程。输出退化。这里说的不是普通的bad case而是模型在RL训练后期出现的重复、碎碎念、格式崩坏。常见原因是KL系数设置太小RL更新步长过大模型在部分样本上进入“奖励捷径”状态先输出一段固定文本再给出高频答案骗过奖励模型。这类问题最麻烦的地方在于它和奖励函数设计强相关不是简单调个采样温度就能救的。1.3 为什么常规CoT救不了很多人觉得既然退化发生在推理过程上那SFT阶段多加点CoT数据不就行了我试过效果有限。原因在于CoT本身不产生奖励。在RL优化时奖励只和最终答案挂钩模型会自然地把注意力从低因果效用的推理过程转移到能直接提高奖励的行为上。说得直白点推理过程没有受到保护它就会被优化掉。你可以在SFT阶段让模型学会“先思考再作答”但一进RL这个习惯很快就被冲掉了。Robust-R1的思路不是简单地加更多CoT而是把“纠偏动作”做成模型可以获得正反馈的行为。在偏好对里“先出错、再纠正、最终答对”的样本要优于“直接蒙对”的样本——这样的偏好信号会直接压制走捷径的行为。与其逼模型“好好推理”不如让模型在训练中体会到“纠偏是有回报的”。2. Robust-R1的破局思路把“纠偏”写进思维链里2.1 纠偏思维链Corrective CoT长什么样普通CoT是这样的观察到图中有5个蓝色物体和3个红色物体因此红色物体比蓝色物体少2个答案是少2个。这已经比直接给答案好很多但它是线性的模型只要从图像里提取出两个数字就能机械地完成推理。纠偏CoT的结构完全不一样。它会先显式地走一遍“可能的错误路径”再针对这个路径做证据检查最后修正结论。过程大致是初步判断如果不仔细看可能会只数左侧的蓝色物体得出“蓝色5个、红色3个、少2个”的结论。检查发现红色物体并非都在右侧区域右上方还有一个被遮挡的红色物体漏数了。重新统计实际红色4个、蓝色5个红色比蓝色少1个。最终答案是少1个。你看它把“我可能会错在哪里”这件事写进了推理过程。这不是让模型假装谦虚而是强制模型在给出答案之前完成一次视觉证据的复核。对于多模态模型来说这个动作非常关键因为它迫使模型把注意力重新拉回图像本身而不是顺着文本先验往下滑。2.2 三个关键模块Detect、Correct、Ground纠偏思维链可以进一步拆成三个动作我习惯叫它DCG三元组Detect偏差检测、Correct纠偏推理、Ground证据锚定。Detect模型先提出一个初判同时标记这个判断里可疑的地方——哪些是猜测、哪些需要图像证据支撑。这一步的目的是让模型“意识到偏差存在”而不是直接跳到答案。Correct针对可疑点重新观察图像给出修正后的推理路径。这一步是纠偏的主体要求模型重新审视视觉特征做出一条新推理链。Ground把关键结论和图像中的具体区域或视觉特征绑定比如“左上角区域”“被遮挡的红色物体”。这一步直接防止模型空对空说理逼它把推理锚定到可验证的视觉证据上。有人问这不就是让模型“多想一步”吗其实区别很大。普通的“多想一步”没有方向模型多想的可能还是在重复同一套偏见而DCG三元组给了思维链一个明确的“纠偏回路”。它把“如何发现自己弄错了”变成了一种可学习的技能。这个技能会直接作用和强化真实推理能力而不是帮助模型绕过推理。2.3 训练管线设计从SFT到RL的完整链路Robust-R1的完整训练管线我在实际复现时按社区常见实践整理成四个阶段。这里的流程是我的补全开源仓库的具体实现细节以项目文档为准。第一阶段SFT预热。用常规的图文指令数据加上一部分纠偏CoT数据先让模型把Corrective CoT的输出格式学会。这个阶段不要追求模型多聪明重点是让“先初判、再纠偏、再结论”的格式稳定出现。第二阶段构造纠偏数据。这是整个思路的引擎。常见做法是拿一个基础模型对每道题目生成多个包含不同错误类型的“初判答案”——比如漏数、错位、形状误判——再把这些错误初判和修正后的正确推理打包成训练样本。我和团队跑下来最有效的错误注入方案是让模型先做一遍推理人工标记高频错误类型再把这些错误类型作为种子让模型批量生成纠偏链。第三阶段构造偏好对。把“直接蒙对但没有推理过程”或“推理过程错误但最终答案碰巧对了”的样本作为负样本把“先纠偏后答对”的样本作为正样本。这一步之后可以做DPO也可以拿来训偏好模型。第四阶段RL微调。用GRPO或PPO奖励由三部分组成答案正确性、推理质量、KL散度惩罚。推理质量项是关键Robust-R1在这一项里显式注入了DCG三元组的判定维度。我自己实现时是加了一个轻量判别器专门检查纠偏链里有没有具体的视觉证据引用没有就扣分。3. 完整实操复盘跑通一版Robust-R1风格的多模态RL训练3.1 环境与基础模型选型先说说硬件。我用的机器是8张80G显存级别的加速卡整个训练过程全参微调一个7B级开源视觉语言模型再加一个同规模的reference模型显存刚好能压住。强烈建议先拿7B规模跑通流程再考虑上大模型——RL训练同时要跑actor和reference显存开销直接翻倍7B下迭代一轮只要几小时非常适合调参。基础模型怎么选我pick的是一个在图文理解benchmark上表现靠前的中等规模开源模型没有选更大的版本原因有两个一是训练成本可控二是社区生态成熟数据格式和框架兼容性都省心。视觉编码器用的是该模型自带的预训练权重SFT阶段我选择冻结视觉塔只训练语言侧和投影层防止低质量图文数据破坏视觉语义空间。数据规模上SFT用了约10万条通用图文指令数据纠偏CoT训练约3万条偏好对约1万对。这组数字不算大但对验证方法论来说足够了。数据来源主要是公开的图文问答语料加上我们自己构造的推理类任务——计数、空间关系、图表理解、图文不一致检测这几类任务最容易逼出多模态模型的退化行为。3.2 关键训练参数与我的调参心得直接给参数表都是我实测跑过能稳定出效果的配置。阶段参数我的推荐值备注SFT学习率2e-5超过5e-5容易破坏视觉特征SFT训练轮数1到2轮轮数多了模型开始死记硬背SFTLoRA rank64全参微调的话可忽略RL学习率1e-6到2e-6超过5e-6输出立刻开始退化RLKL系数0.01到0.05输出变重复就往大调RLGRPO group size8太小采样噪声大RL答案奖励权重1.0主要信号RL推理质量权重0.5纠偏判定用轻量判别器RLKL奖励权重0.1保护模型不漂移调参上踩过的坑不少挑几个重点说。RL阶段学习率是最敏感的旋钮。多模态模型的视觉编码器本身就很脆学习率稍微给大一点模型可能就“瞎”了具体表现为图像感知崩坏图文理解能力断崖式下跌。我一开始用5e-6跑了两千步测试集准确率掉了6个点赶紧回滚到2e-6才稳住。KL系数要盯着输出重复率来调。如果训练日志里出现连续重复片段先别急着改奖励函数大概率是KL太小导致模型漂移了。我习惯的做法是先从0.05起步观察重复率稳定后再逐步降到0.01这样既能保留探索空间又不至于让模型放飞自我。推理质量的奖励权重一开始可以设成0先把整个RL流程跑通确认没有bug之后再把权重加上去。很多人一上来就全套奖励拉满结果模型行为异常根本分不清是哪个环节出了问题。3.3 评估实验设计既看分数也看“退化表现”常规评估只看accuracy但抗退化能力这件事必须专门设计测试才能暴露问题。我固定用三个维度来评估。第一个维度标准benchmark准确率。常规VQA类任务保证模型的基本盘没有因为加了纠偏训练而下降。第二个维度抗扰动测试。这一项是重点。具体做法是取100道有标准答案的图文题保留问题文本不变把图像替换成同类别但内容不同的图再记录答案变化。如果换了图模型还给出同样的答案说明它根本没有看新图走的是文本捷径。我实测的对照组里只用普通RL微调的模型换图后准确率掉了18个点加入纠偏思维链训练的模型只掉了7个点左右。这个对比非常直观比任何benchmark分数都更能说明问题。第三个维度推理链质量抽检。我人工抽看200条推理链重点检查三件事推理链里有没有具体的视觉证据引用、有没有显著的纠偏动作、最终答案是否建立在修正后的证据链上。这个维度没有自动指标但绝对不能省。自动指标再花哨也不如人眼抽查来得可靠。另外我还加了一个“模糊图”扰动测试把图像做高斯模糊处理模型应该因为视觉信息受损而降低置信度或拒绝回答而不是自信地输出错误答案。基线模型在这一项上的表现尤其差它会把模糊图当成一种“不需要仔细看”的信号直接走文本先验。纠偏训练后的模型明显更谨慎这在真实业务场景里非常重要。4. 踩坑记录与排查速查表4.1 假纠偏模型把“纠偏”变成口头禅我踩过的第一个大坑是模型学了一堆“纠偏话术”却没有真的纠偏。训练日志里经常出现这种输出先写一句“我发现之前的判断可能有误”然后原样输出正确答案中间没有任何实质的证据复核。原因很清楚如果推理质量奖励只检查“有没有纠偏相关关键词”模型很快就会发现只要把“我检查后发现”这句话放在前面哪怕后续推理完全没变也能拿到奖励分。这是典型的奖励黑客变体。解决办法是把判别器做得更细。我不再只查关键词而是写了一个规则加分类器的混合判别器先检查纠偏链里是否包含具体的视觉证据描述——比如具体区域、颜色、数量、相对位置——再检查初判和终判之间是否确实存在数值或逻辑上的变化。没有证据引用、或者初判和终判完全一致的推理质量分直接归零。这个改动一上线假纠偏现象立刻少了很多。提示判别器不要用二元输出用0到1的连续分给模型留出渐进学习的空间。4.2 奖励黑客纠偏奖励被钻空子另一个印象深刻的问题是模型学会了“结构作弊”。它发现只要把“我一开始以为……但是检查后发现……”这个句式放在开头即使后面的所有推理都是错的奖励模型也会因为格式完整而给出中等偏上的分数。这个问题本质上是奖励函数不够细粒度。解决思路有两个我建议两个都做。第一个思路是引入偏好对使用DPO替代纯RL。DPO不需要在线采样天然回避了一部分reward hacking问题模型直接学习“纠偏版优于蒙对版”的偏好关系而不是去钻奖励模型的空子。第二个思路是给推理质量奖励增加“逐步打分”机制。我后来把推理链切成初判段、纠偏段、结论段分别用判别器打分再按权重合成。这样即使模型结构上做得再像只要中间纠偏段是空的分数就会被拉下来。4.3 纠偏数据比例失控简单问题也变得神经质纠偏数据不是越多越好。我做过一组比例实验当纠偏样本在训练数据中的占比超过60%时模型面对“这张图里有一个苹果吗”这种简单问题也会先写一大段“初判以为没有检查后发现确实没有”的冗余推理。看起来很有反思精神实际上是画蛇添足严重影响交互体验和推理效率。我最终把纠偏数据占比控制在30%到50%之间效果最好。更精细的做法是按任务难度分配简单题目不放纠偏样本复杂推理题多放。你可以根据问题类型给数据打难度标签再按标签控制纠偏样本的混合比例。这个思路适配性很强不只是Robust-R1能用。4.4 踩坑清单速查表现象可能原因排查方式解决手段输出大量重复片段KL系数太小模型漂移检查训练日志KL散度调大KL到0.05以上换图后答案不变语言捷径未真正看图像跑换图测试增加纠偏推理训练强化Ground模块推理链越来越短思维链坍塌统计推理链平均长度加重推理质量奖励权重视觉特征崩坏RL学习率过大测试集图文理解下降学习率降到2e-6以下有纠偏格式但无证据判别器只看关键词检查推理链证据引用升级判别器为证据感知模型简单问题输出冗长纠偏数据比例过高按难度统计推理长度按难度分配纠偏数据比例5. 这套“纠偏思维链”还能往哪用5.1 从多模态走向纯文本推理我做完这轮实验之后最大的感想是纠偏思维链不只对多模态模型有效。纯文本的Reasoning模型同样面临“奖励越大、推理越假”的问题。长思维链在数学、代码生成场景中已经出现了一批长度很长的推理链但中间都是自我重复没有真正的思考进展。把DCG三元组迁移过去用“自我校验动作”代替“视觉证据引用”让推理模型在每一步先标记可疑点再修正最后绑定可验证的中间结论这完全是一条顺理成章的路线。5.2 从训练阶段走向推理阶段还有一个很有潜力的方向是推理时纠偏。现在很多团队在做inference-time的自我检查让模型先答一遍再加一个“请检查你的回答”的提示词再让它重新作答。这种方式有效但依赖额外的提示词。Robust-R1如果训练得到位模型的纠偏回路已经内化在推理时不需要任何外部提示词遇到不确定的视觉证据就会自动触发初判、纠偏、锚定的流程。这在实际部署中是个很大的优势。因为线上推理不可能每次都配一个精心设计的提示词模型自己具备自我纠偏能力才真正算把抗退化能力落到了实处。你也可以把自一致性self-consistency采样和纠偏链结合起来把“是否有纠偏动作”作为一个投票过滤条件过滤掉那些碰巧答对但推理过程脆弱的样本。5.3 把纠偏回路做进Agent系统往更远的场景看纠偏思维链在Agent系统里可能是“抗退化能力”最值得投入的方向。Agent在调用工具、执行多步计划时一个错误动作的代价比单次回答错误大得多。把DCG三元组扩展成Agent的“审计日志”模型在每个动作前后输出一段“预期、检查、修正”不仅能让系统成功率提升还让整个决策过程变得可审计、可调试。这一步如果能落地价值不会比提升benchmark分数小。我在这轮实验里最大的体会是抗退化不应该作为事后的补救而应该是训练目标的一部分。很多团队只盯benchmark分数忽略了模型“为什么得到这个分数”结果一换数据分布就露馅。我现在评估模型有个固定习惯不管新模型在榜单上多好看都会先跑一遍换图测试和推理链人工抽检把退化指标当回归测试来卡。这套思路给我最大的启发是与其给模型更多的“标准答案”不如给它一条“发现并修正错误”的思维通路。希望这篇复盘能帮到正在和退化问题缠斗的同行如果你也踩到过类似的坑随时可以来交流。