☰
视觉语言模型自我改进:对比学习如何提升视觉推理能力
2026/10/21 4:06:37 网站建设 项目流程

最近读了篇被主会议接收为 Oral 的视觉语言模型工作,题目是“透过对比的视角:视觉语言模型中的自改进视觉推理”。一开始以为又是那种“生成一堆候选答案然后用投票挑一个”的套路,读完发现完全不是。它解决的是一个我踩了很久的坑:视觉语言模型(VLM)做视觉推理时,错了还不认错。你把正确答案反馈给它,让它重新推理,它往往还是坚持原来的错误结果,甚至编出一套更完整的解释来合理化错误答案。这篇工作的做法是把“自我改进”重新定义成一个对比学习问题,让模型在自己的正确与错误输出之间找到稳定边界。我花了一周时间做复现和改造,把核心思路、训练细节、以及实验里遇到的坑全部整理出来,希望对正在做 VLM 推理、自训练、偏好优化方向的同学有实际帮助。

1. 先说痛点:视觉语言模型的推理盲区为什么这么顽固

1.1 “会做不会改”:模型缺乏真正的自我纠错能力

视觉语言模型这两年的进步集中在“感知”和“生成”两条线:感知端越来越能读懂图表、空间关系、物体计数、时序变化;生成端也能组织出结构化的推理链。但有一个能力始终没有跟上,就是基于自身错误的修正能力。

我做过一个很简单的实验:让模型数一张图里的马克杯,图里总共 7 个,模型回答 6 个。我把“请重新检查图中所有杯子的数量,特别注意堆叠和被遮挡的部分”作为额外提示输入,模型却回答“经过仔细检查,仍然是 6 个,因为右下角的物体不是杯子”。它错得很有逻辑,错得很有自信,这就是典型的“会做不会改”。

这种问题不是简单加一轮“自我反思”就能解决的。反思生成的文本本质上还是同一个策略分布的采样,模型只是在用自己的分布去“审核”自己的分布。如果模型没有在训练阶段见过“正确输出相比错误输出更好”的对比信号,它很难仅凭提示改变自己的偏好。这也是为什么很多人在 VLM 上做 Reflexion、Self-Refine 类方法时发现效果有限,文本模型上能涨点,换到视觉模型上就不太动。

1.2 简单反馈为什么失效:分布偏移与确认偏误的恶性循环

想让模型自我修正,最直觉的做法是给它提供外部反馈,比如“答案是错的,请重新看”。但问题在于,这种反馈非常稀疏,而且没有指出错在哪一步。模型往往把“正确答案”当成一个需要解释的异常,而不是一个需要学习的标签。

更麻烦的是确认偏误。当模型生成了一整条推理链,后续步骤会依赖前面的中间结论。即使后面发现数值对不上,模型也更倾向于“修补”而不是“推翻”。这种倾向在自回归生成里被进一步放大,因为生成概率高的 token 路径会获得局部最优的梯度信号。简单说,模型缺乏的不是“看第二眼”的能力,而是“判断哪条推理路径更可信”的能力。

1.3 这篇论文的出发点:把“对比”当成学习信号,不靠更强教师

我理解这篇 Oral 工作最核心的转向是:不引入更强模型、不引入外部标注、不依赖人类反馈,而是让模型自己生成多条推理路径,再通过任务自带的验证信号将路径分为“较好的”和“较差的”,最后用偏好优化把差距拉大。

这个设计非常讨巧的地方在于“透过对比的视角”这个表述。它没有让模型直接学习正确答案的绝对形式,而是让模型学习正确路径与错误路径之间的相对差异。对比信号比绝对信号更容易构造,也比绝对信号更稳定。因为只需要判断“哪个输出更接近正确”,不需要精确知道“正确输出长什么样”。

2. 核心方法拆解:从“答案”到“对比对”的自改进循环

2.1 总览:一个三阶段的迭代框架

如果你要跟同事讲清楚这篇方法,记住一句话就够了:采样、区分、偏好优化,然后重复。

第一阶段是采样。对于同一个视觉输入,模型在较高温度下生成多条独立推理路径。为了增加多样性,还会对输入图像做轻微扰动,比如随机裁剪、旋转、颜色抖动。第二阶段是区分。利用任务本身的可验证性质(比如计数题的最终答案是数字、空间关系题是明确的方位词)对每条路径打分,形成一好一坏的对比对。第三阶段是偏好优化。用 DPO、IPO 这类无需显式奖励模型的目标函数更新策略,让模型在下次生成时更倾向于产生与“好路径”相似的推理模式。

整个框架不依赖任何人工标注,只需要一个初始的 VLM 和一个可自动判定的任务集合。论文里报告的多轮自训练后准确率持续提升,而不是像普通自训练那样两轮之后就开始漂移,原因就在于对比对提供的是相对信号,模型不会朝着某个过拟合的绝对目标方向跑偏。

2.2 对比对怎么构造:答案层面与视角层面

这里我想展开讲一下“对比对”的具体粒度,因为一开始我误以为只是“正确答案 vs 错误答案”的二元对。实际上论文把对比对分成两层。

第一层是答案层。同一问题下,模型生成多条推理链,最终答案正确的归为偏好组,答案错误的归为非偏好组。这个信号最干净,但问题在于容易出现“一组正确、其余全错”的情况,对比对数量不够。第二层是视角层。对同一图像施加不同扰动,得到不同“视角”。如果模型在多个扰动视角下都给出正确答案,说明它的推理是鲁棒的;如果某个视角下出错,而这个视角的扰动本身没有改变语义,那么这个“正确-错误”对就包含了额外的学习价值。

把两层结合起来,对比对的数量可以做到普通采样方法的 3 到 5 倍。而且视角层的对比能在某种程度上缓解模型对特定图像纹理、背景的过度依赖,迫使其关注真正与推理相关的视觉元素。

2.3 透过对比的视角:为什么偏好优化能替代人工标注

很多同学会问:用 DPO 做自改进,和直接用正确答案做 SFT(监督微调)有什么区别?我复现时对这个问题的体会非常深。

SFT 本质上是在做“模仿”,告诉模型正确答案的 token 序列长什么样。但正确答案往往只是无数条可能路径中的一条,模型无法从 SFT 中学到“这条路径为什么比那条路径好”。当测试时遇到分布偏移,模型就不会应对。

偏好优化则是在做“判别”。它把好路径和坏路径同时摆出来,目标函数要求模型提高好路径的相对概率,降低坏路径的相对概率。这样模型学到的不只是内容,而是“偏好边界”。在视觉推理场景中,这个边界往往落在“是否关注了关键区域”“是否采用了正确的空间关系推理”这些抽象能力上,而不是落在具体的 token 序列上。这比 SFT 高效得多,尤其适合自改进这种没有外部教师信号的场景。

2.4 迭代更新策略:自训练循环与正则化

多轮迭代是这个方法能持续涨点的关键。一轮 DPO 之后,用更新后的模型重新采样对比对,再训练,如此重复。论文里的消融显示,三轮迭代收益最明显,四轮之后基本饱和,但没有出现明显的退化。

我最初的担心是模型会很快丧失输出多样性:DPO 把偏好组概率抬高,非偏好组概率压低,采样出来的路径可能越来越趋同,第二轮迭代时对比对就不“对比”了。论文里解决这个问题的方式有两个:一是采样时保留足够高的温度,二是视角扰动强度随时间略微加大。这两招让模型保持了一定的“探索性”,即使策略在收敛,采样分布依然有宽度。

3. 数据、评测与超参:最容易被低估的工程细节

3.1 任务选择与数据组织:哪些任务适合自监督评估

这个方法不适用于所有视觉任务。它要求任务具备自动可判定的验证信号。我整理了一下适合和不适合的任务类型:

任务类型示例自动判定方式适配程度
计数类数物体、数重叠区域答案是否为精确数字非常适合
空间关系左右、上下、遮挡判断是否为限定方位词集合非常适合
图表理解柱状图最大值、趋势方向是否为明确选项或数字适合
属性分类颜色、材质、形状是否为限定属性词适合
开放式描述场景描述、叙事无自动验证器不适合
创意生成写故事、想标题无明确标准不适合

实际组织数据时要用到一条经验:不要把不同类型的任务混合在同一个迭代批次里。计数和空间关系虽然都能自动判定,但模型出错的模式完全不同,混合训练会导致 DPO 的对比信号互相干扰。最好是每个任务单独做一轮自改进,或者按 batch 严格分隔。

3.2 图像扰动与答案归一化:保证对比对真的可比

视角扰动的度需要非常小心。我在实验里用了一套组合:随机裁剪原图的 80% 到 95%、水平翻转(仅在任务不依赖左右语义时)、亮度饱和度在正负 20% 范围内扰动。核心原则是:扰动不能改变人类判读答案所需的视觉信息。

有一个很隐蔽的坑:计数任务中,随机裁剪如果恰好裁掉一个物体,正确标注是 5 的图变成 4,模型即使回答 4 也算“正确”,但这条路径和原图的推理并不一致,对比对就失效了。解决办法是:轻微裁剪时不做缩放,保持图像比例,只裁掉边缘无关区域;涉及计数的任务不要用可能导致物体被裁出的扰动。每一类任务都应该有自己的一套扰动策略,不能全局统一。

答案归一化同样重要。VLM 生成“7 个”“seven”“the number is 7”这些等价答案,不能因为字符串不同就判定为错误。归一化层需要做到:数字提取、数量词映射、方位词到标准枚举的映射、单位词剥离。我建议在数据预处理阶段把答案归一化做成一个独立的模块,采样完成后先归一化再判定正误,不要在 prompt 里让模型输出特殊格式,那样会干扰模型本身的推理行为。

3.3 关键超参与实验现象

复现过程中我记录了一组比较稳定的超参配置,供参考。它们不一定是最优的,但至少能让你跑出和论文趋势一致的结果:

超参推荐值说明
采样温度0.8 - 1.0太低多样性不足,太高噪声过大
每条输入采样数8 - 12保证至少出现一对正确/错误
视角扰动种数3 - 5与采样数配合生成对比对
DPO 的 beta0.1 - 0.5数值越小更新越激进,但容易震荡
学习率1e-6 到 5e-6偏好优化对学习率极敏感
迭代轮数3论文和我的实验都指向三轮饱和
batch size32 - 64偏小时 DPO 损失很不稳定

这里特别想提醒一件事:DPO 的 beta 不能直接照搬文本模型上的经验。视觉任务的对比对之间差异通常比文本偏好对更大,beta 太大时模型容易被一两个极端对比对带偏,表现为训练过程中准确率突然掉一大截。从 0.5 开始往下调是比较安全的路径。

3.4 评估协议:不止看准确率,还要看一致性

只用最终准确率评估自改进方法是不公平的,因为准确率上升可能只是模型变得越来越“固执”,学会了某些任务上的捷径。我从这篇论文里学到的最有价值的一点是:评估必须同时看答案一致性和路径一致性。

答案一致性指同一输入多次采样下最终答案的离散程度。好的自改进应该提升答案一致性,说明模型不再是随机猜。路径一致性则更严格,指推理链中关键断言(比如“桌上有三个杯子,其中一个是咖啡杯”)在不同采样下是否保持一致。路径一致性越高,说明模型学到了结构化的推理模式,而不是背答案。复现时我也把这个指标加进了早停判断:如果准确率在涨但路径一致性在跌,马上回退到上一轮 checkpoint。

4. 复现过程中的三个大坑与排查链路

4.1 坑一:对比对冗余导致 DPO 训练崩溃

第一次做多轮迭代时,第二轮训练的损失降得非常快,但验证准确率几乎没动。排查了很久发现是对比对质量出了问题:由于第一轮迭代后模型已经变强,第二轮采样时大多数路径都正确了,有效对比对只剩很小一部分。剩下的“错误路径”往往都是极端噪声样本,比如模型突然乱码、输出重复 token、或者干脆答非所问。

这种对比对里坏路径和好路径之间的差异根本不是“推理能力差异”,而是“生成崩坏差异”。模型学到的是“不要乱码”,对推理能力毫无帮助。

排查链路是这样的:

  1. 统计每对对比对中坏路径的文字分布,发现约四成坏路径包含重复 token 或输出过早截断;
  2. 检查训练损失曲线,发现 loss 在几千步内从 0.4 掉到 0.1,明显是学了一个简单分类面;
  3. 对坏路径做过滤:答案归一化后为空、含大量重复片段、长度异常短或异常长的路径直接丢弃;
  4. 过滤后损失下降变得平缓,准确率和路径一致性同步回升。

经验是:自改进框架里,对比对的质量过滤模块比偏好优化目标本身更重要。

4.2 坑二:模型“自我表扬”——错误路径得分虚高

我用了很多方法给路径打分,最基础的版本是:答案正确即好路径,答案错误即坏路径。但我很快发现一个现象:模型生成错误答案时,如果推理链本身写得很完整,DPO 更新对它的压制没有那么强。两种错误路径往往有不同的“顽固程度”,而 DPO 对它们的惩罚是等权的,模型会自动学会牺牲那些容易改变的错误路径来保住更自信的错误路径。

换句话说,模型对坏路径有自己的“优先级”,如果 DPO 信号没有细化,它会把最弱的错误路径扔掉,留下那些和正确路径共享很多 token 的错误路径。最终效果是准确率微涨,但模型在错误时变得更加自信。

我的解决方案是引入一个轻量的“置信度标签”:对好路径,如果模型多次采样一致则认为置信度高;对坏路径,如果模型在多个视角扰动下都犯同一个错误,说明这个错误是“系统性的”,要在训练时给予更高的损失权重。实现方式很粗糙,就是在 DPO loss 里按对比对的难度乘上一个系数,但效果立竿见影。系统性的顽固错误在大约三轮之内被明显削弱。

4.3 坑三:视角扰动破坏语义,模型学到了“图像风格”而不是“推理规则”

我最初对视角扰动的理解过于激进,使用了类似图像增强里常见的大幅随机裁剪、颜色反转、加噪声。结果训练出来一个让我哭笑不得的模型:它学会了“看到黄色背景的图就用某种推理模式”,准确率在训练集扰动分布上很高,一换到干净的验证集立刻掉下来。

这个问题本质上是对比信号被污染了。当扰动已经改变了图像的语义内容时,模型在两个视角下看到的是不一样的场景,它把“视角不同导致结果不同”当成了学习信号。正确做法是做扰动有效性检查:每生成一个扰动图,都用原始未更新的模型简单推理一遍,如果原图正确而扰动图错误,并且错误类型和原图无关,就弃用这个扰动视角。这会损失一小部分数据,但能保住学习信号的质量。

4.4 我的实践建议与调优顺序

如果你准备自己复现,我建议按这个顺序调优:

  1. 先固定任务和扰动策略,不做 DPO,只验证采样多样性和自动判定的正确率;
  2. 加入答案归一化和坏路径过滤,跑一轮 DPO,确认损失能平稳下降;
  3. 加入置信度加权,观察系统性能否被针对性压制;
  4. 最后再引入多视角扰动,并且每新增一种扰动都要做语义保持验证;
  5. 达到三轮迭代后,别急着继续加轮次,先做一遍路径一致性分析。

这个顺序能最大程度避免我在 4.1 到 4.3 里遇到的三个坑同时爆发。一旦多个因素同时出错,你很难判断掉点到底来自哪个环节。

5. 局限性与我认为值得继续挖的方向

5.1 什么任务还不适合:开放生成的评估信号怎么办

说句公道话,这篇论文的适用边界非常清晰。凡是答案能被自动判定的任务,它都做得很好;但是视觉语言模型真正的应用场景里,大量任务是开放式的:比如生成一句对图像的描述、解释一个有歧义的画面、给出多个可行的操作建议。这些任务没有标准答案,也就无法构造“正确答案”的对比对。

论文里没有给出完美解决方案。我自己的尝试是用一个弱小的 off-the-shelf 奖励模型判断路径好坏,但效果不稳定,关键在于奖励模型本身也会被相似的视觉盲区影响。想让方法扩展到开放任务,可能得对每条推理链做更多维度的分解,把“视觉感知是否正确”和“文本组织是否合理”分开评估,而不是打包成一个对比信号。

5.2 和现有方法的边界:与 CoT、自我一致性、System 2 式慢思考的关系

如果你熟悉自我一致性(Self-Consistency)和 CoT(思维链),可能会觉得有点类似。它们确实同属“多路径生成”家族,但目标不同:CoT 是让单次推理更详细,自我一致性是用投票融合多条路径的输出,本方法则是把多路径作为训练信号反哺策略本身。换句话说,前两者是“推理时技巧”,这篇是“训练时自我改进”。

和 System 2 式慢思考类方法相比,这篇不改变推理时的计算图,它改变的是模型的权重。这也是我欣赏它的原因:不需要在推理时额外运行一个验证模型、也不需要修改解码逻辑,改进是“内化”的。推理成本不变,能力提升了,这在工程上非常友好。

5.3 扩展思路:多模态、多轮交互与持续自我改进

我目前正在自发做两个扩展。第一个是把对比信号从文本答案延伸到视觉 grounding 信号上,让模型对比不同注意力热力图下的推理结果,尝试教模型“看得更准”而不是“说得更准”。第二个是把方法放进多轮交互场景里:用户不给最终答案,而是给一个“再想想”的反馈,模型需要靠内部的对比信号来调整回答。前者的初步结果显示,路径一致性有提升,但训练稳定性还是挑战。

另外一个方向是“持续自改进”:让模型在部署之后继续采集对比样本,白天服务真实请求,夜里用对比视角做一轮小规模偏好优化。这个想法听着很美,但工程上要解决数据分布漂移和遗忘问题,我觉得是比方法本身更有价值的下一个课题。

最后分享一个我在实验中体会最深的小技巧:自改进训练里,最值得记录的不是每一轮的准确率,而是“模型错误类型的迁移轨迹”。我在第四轮迭代时发现,计数错误从“少数一个”逐渐变成“多数一个”,这说明模型的注意力正在从遮挡区域向边缘区域迁移。这种洞察比任何单一指标都能告诉你模型到底学到了什么,也更容易帮你判断该不该继续迭代下去。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询