☰
用奖励模型做Critic:强化学习提升图像编辑忠实度的完整实践
2026/10/22 13:41:39 网站建设 项目流程

从标题看,这是我想聊很久的一个话题:在图像编辑这个任务里,到底该信谁的判断。标题前半句“Trust Your Critic”其实挺反直觉——我们通常会默认模型自己知道生成得怎么样,但现实是,生成模型对“编辑是否忠实于原图”这件事,远没有一个专门的裁判模型看得准。后半句点出了整套方案的骨架:先构造一个鲁棒的奖励模型(也就是那位Critic),再拿它作为强化学习的反馈信号,最终把图像编辑模型的忠实度拉上去。这篇博文,我就围绕这个技术方向,把我在实际操作中的拆解思路、模型设计、训练流程、以及踩过的坑,一次性讲清楚。

适合读这篇内容的,主要是两类人:一类是做图像生成、图像编辑方向的研究生或工程师,正在被“改不动”和“乱改”这两难问题折磨;另一类是已经接触过扩散模型微调、但想从监督学习切到RLHF/RLVR这套思路的开发者,这个案例是很好的切入点。文章不会只停留在概念层面,整个流程我拆到数据构造、奖励头设计、策略优化系数、训练不稳定排查那一层,方便你直接抄作业。

1. 整体设计与思路拆解:为什么“编辑质量”不能靠肉眼和CLIP判分

1.1 问题的核心痛点:忠实度为什么难搞

先还原一下场景。你给一个扩散模型输入一张人像照片,指令是“给他加一副墨镜”。模型快速出图,乍一眼看确实戴上了墨镜,风格也没崩,但仔细对比会发现:脸的角度变了、背景的灯光色调变了、甚至衣服纹理被重绘了。这就是典型的“编辑成功但不够忠实”。

“忠实”这个概念,很多人以为只要算一下LPIPS或者L2距离就够了。真正上手才发现完全不是这么回事——像素距离小,不代表编辑发生在了正确位置;更麻烦的是,编辑后的图像往往有大量合理的、符合分布的偏移,这些偏移在像素空间里可能很大,但在语义层面是无关紧要的。反过来,一个很微小的编辑痕迹,比如把不该动的边缘抹平了一点,LPIPS可能变化不大,但人的眼睛一眼就觉得“不对”。

所以在做这个项目的时候,我把“忠实度”拆成了三个可操作维度:一是局部性,改动应该集中在指令指向的物体或区域;二是一致性,没有指向的部分,其身份、姿态、光照、材质应保持一致;三是语义正确性,新增或修改的内容要符合指令描述,不能出现“墨镜戴在额头上还说是戴在眼睛上”这种低级偏差。

1.2 为什么现成的打分器靠不住

最常用的现成打分器是CLIP,把图文匹配分数当作奖励信号看似方便,但我在实践中发现它有两个严重缺陷。第一,CLIP擅长捕捉整张图的全局语义对齐,但你让它区分“帽子形状对不对”“嘴角弧度有没有变”,它内部的注意力机制根本没那么细的粒度。第二,CLIP对文本中的属性绑定(binding)很弱,比如“红色领带的蓝衬衫”,CLIP很容易只关注到有一个领带和一个衬衫,颜色谁是谁它经常搞反。

这就导致一个很尴尬的处境:直接拿CLIP分数当奖励去微调编辑模型,模型很容易学会一种偷懒策略——把图改得越来越像“一张加了文字描述氛围的图”,而不是“一张按要求做局部改动的图”。这就是典型的reward hacking的雏形。

既然现成的打分器解决不了问题,那自然想到:能不能专门训练一个裁判?这就是本项目的核心决策点。

1.3 方案选型:为什么奖励模型 + 强化学习

很多做图像编辑的团队第一反应是收集数据做监督微调:给一堆(原图、指令、目标图)三元组,直接训练模型去模仿目标图。这套思路能解决问题,但上限很低——编辑结果的“好坏”是高度主观和多解的,同一个编辑指令可能有多种合法结果,让模型去回归一个标准答案,本身就是信息瓶颈。

奖励模型训练就不一样了。它学的不是“输出应该长什么样”,而是“什么样的输出更好”。你给它一组偏好对或者打分标签,它学会的是排序偏好。这个偏好信号,再通过强化学习(RL)反馈给生成模型,让生成模型在这个偏好信号的引导下去提高自己的编辑水平。

这里有一个非常关键、也是很多人忽视的设计前提:奖励模型必须和生成模型解耦。生成模型负责“探索”,奖励模型负责“评估”。如果评估和生成捆在一起或者用同一个模型,很容易出现自欺欺人的局面——生成模型觉得没问题,奖励模型也顺着说没问题,两个人一起跑偏。所以我把Critic建造成一个独立的、不可被策略快速攻破的评分器,这也是标题“Trust Your Critic”最核心的语义:一个好裁判的价值,远超一个善解人意的助手。

从技术动机上还可以补充一个视角:强化学习特别适合这种“生成式任务”,因为扩散模型的采样过程本质上是带随机性的,每一次采样就是从分布中抽一个样本;而RL天然就适合在这种随机采样中做反馈优化,把概率更高的、奖励也更高的样本拉出来,把低奖励的样本压下去。相比直接对像素做梯度回归,这是一种更优雅、也更贴近人类评判方式的优化路径。

2. 核心细节解析与实操要点:奖励模型到底怎么设计和训练

这一节是整个项目中最“重”的部分。很多人在这一步偷懒,结果后面RL怎么train都不稳定——问题八成出在奖励模型上。我把它分成数据构造、模型结构、训练目标、防作弊四块来讲。

2.1 数据怎么来:偏好对是最稳的标注形式

奖励模型需要学习“什么是更忠实的编辑”,数据标注策略我采用了两级方案。

第一级是原始数据采集。生成一堆候选编辑结果,比如同一个原图、同一条指令,用不同强度的采样参数、不同随机种子、不同LoRA适配器,生成8到16个候选结果。这个过程本身就是为了制造一个“同一任务上的质量光谱”,让奖励模型有区分度可学。

第二级是偏好标注。把候选结果两两配对,让标注员判断哪个更忠实。这一步有很多细节坑:

  • 不要只问“哪个更好”,一定要给清晰的维度定义。我设置的标注规则是“优先保一致、再评语义、最后看美感”。如果不先排序,标注员很容易被观感更好的那张图带走,而不是真正忠于“忠实度”这个目标。
  • 配对一定要带“高质量扰动项”。我尝试过随机混入一些原图加上噪声做轻微扰动得到的图像,作为难负例。这对于避免奖励模型变成“只看风格一致性”的雷达,作用非常明显。
  • 数据量上,纯偏好对大概需要2万到5万对。少于此数量,奖励模型容易拟合到标注噪声;多于这个量,边际收益开始递减。

2.2 奖励模型长什么样:双塔结构 + 一个额外轻量头

我最终采用的奖励模型结构是多模态编码器加一个偏好头。视觉编码和文本编码分别走预训练权重,然后把两者融合的结果输入一个轻量MLP回归头,输出一个标量分数。这个分数本身没有绝对值意义,关键在样本之间的相对排序。

这里有一个关键的架构选择:是直接用预训练模型的特征拼接出一个奖励头,还是把整个多模态编码器一起微调?

两种方案我都试过。只训练奖励头、完全冻结编码器,胜在稳定,但上限低——预训练特征未必擅长捕捉“编辑前后微小差异”这种细粒度信号。全量微调编码器,奖励模型的判别能力能上来,但非常容易过拟合到训练偏好分布,一旦策略模型在RL中探索出了一些分布外的样本,奖励模型就会给出错误的高分或低分,导致训练震荡。

我的最终方案是折中:编码器部分用LoRA微调,rank值放在64,奖励头用全量微调。这样既保留了预训练模型对通用视觉语义的鲁棒性,又让模型具备学习细粒度编辑差异的能力。实测下来,这种配置在same-distribution的评估集上分数最高,在cross-distribution的鲁棒性测试里也不至于崩掉。

2.3 训练目标:从排序到分数的三层损失

奖励模型的训练目标我用了三个损失叠加,按权重从高到低排列:

第一层是标准的pairwise ranking loss,也就是让模型把标注为“更好”的样本给更高的分数。虽然标题说“打分”,但本质上学的是排序关系,相对分数比绝对分数稳得多。即使标注有噪声,只要排序关系大致一致,模型就能学到有效信号。

第二层加入了一个细粒度回归损失。我给每条数据额外标注了一个从0到5的评估分,这个分就和排序结果天然有冲突——同一对样本,模型在排序上正确,但分数差距可能过大或过小。让分数回归到预期的间隔,有助于约束分数分布不过度发散。

第三层是一个类别一致性正则:对同一批样本,奖励分数的高斯分布应该是光滑的。这一层的动机来自训练过程中的观察——如果不加这层,奖励模型经常会对某些特定纹理或光照模式产生尖峰响应,给一个莫名其妙的超高分数,造成后续RL信号的严重发散。

如果你自己动手复现,我建议的初始超参是这样的:排名损失权重1.0,回归损失权重0.3,一致性正则权重0.1。学习率3e-5,训练5到7个epoch,全程用梯度裁剪避免奖励模型输出边界爆掉。

2.4 防作弊:奖励模型的鲁棒性从哪来

奖励模型最大的敌人是“策略模型的钻空子”。在强化学习过程中,策略模型不会乖乖待在我们标注过的数据分布里,它会去探索那些能够得分更高的新行为,而这恰恰是训练奖励模型时最需要防御的对抗场景。

我做了三件事实测很有效:

第一,训练数据中人工混入一批“伪忠实”样本。具体来说,就是把编辑前的原图加上非常微小的模糊、压缩伪影、颜色偏移,作为负例。目的是让奖励模型学会识别“看起来很像编辑但其实是原始图像退化了”的场景,而不是简单地把所有与原始像素差异大的结果都判为不好。

第二,在RL训练中定期采样策略模型的实时输出,追加到奖励模型的训练集里去。这个做法类似在线困难样本挖掘,让奖励模型始终面对最新的策略分布,避免被“时代抛弃”。

第三,给奖励分数设定一个动态更新的先验均值。一旦发现策略模型的平均奖励分数连续迭代走高,就怀疑奖励模型被攻破,马上暂停RL,重新校准。这个阈值我们设在相对变高15%时就介入检查,宁可牺牲一点训练速度,也不能让模型学歪。

3. 实操过程与核心环节实现:从奖励模型到策略优化的完整管线

3.1 训练流程全景

我把整个推荐的高效管线按先后顺序分成了四个阶段:

  • 阶段一:数据准备与奖励模型训练。这一步是重中之重,数据质量和覆盖度直接决定后续一切效果。我花在数据清洗、过滤、质量抽检上的时间,占了整个项目时间的35%以上。
  • 阶段二:初始策略模型微调。先用简单的指令跟随数据对基座模型做一次性轻量微调,让它在编辑任务上有一个基本可用的基础,不至于从零开始纯靠RL去盲试。
  • 阶段三:在线强化学习。奖励模型固定住,策略模型用策略梯度算法迭代更新,每N步采样一批新样本,同时用新样本持续以低学习率更新奖励模型。
  • 阶段四:评估与回归验证。上线前的最后一关,用独立的测试集做人工盲评和指标计算,如果编辑模型在测试集上出现了明显的偏科,则需要回到阶段一重新补充数据。

需要特别说明的是阶段三的“在线”属性。很多训练流程是离线把奖励模型训好,然后完全冻结,策略模型在奖励模型上单方向优化。这样做的确简单,但我在实际跑下来发现,这种方式在前几百步效果还不错,到了后期策略会把奖励模型在分布外区域给出的错误高分当作目标去拟合,训练曲线一下子就崩了。所以哪怕增加一点工程复杂度,我也坚持用在线采样的方式维持奖励模型的时效性。

3.2 奖励模型训练代码骨架

核心训练部分我用PyTorch实现,奖励模型加载预训练权重后加上一个三层MLP奖励头。奖励头的输入是视觉和文本特征向量拼接后的结果,输出维度是1。训练时每个batch由若干原图、指令、候选结果对组成,按下列方式进行损失计算:

for batch in dataloader: # 输入形状: image_worse, image_better, text feat_worse = critic.model.get_text_image_features(batch["image_worse"], batch["text"]) feat_better = critic.model.get_text_image_features(batch["image_better"], batch["text"]) score_worse = critic.head(feat_worse).squeeze(-1) score_better = critic.head(feat_better).squeeze(-1) # 排名损失 loss_rank = -F.logsigmoid(score_better - score_worse).mean() # 回归损失(当有绝对评分标签时) loss_reg = F.mse_loss(score_better, batch["score_better"]) + F.mse_loss(score_worse, batch["score_worse"]) # 类别一致性正则 score_all = torch.cat([score_worse, score_better], dim=0) loss_consistency = score_all.std() * 0.1 loss = loss_rank + 0.3 * loss_reg + loss_consistency loss.backward()

一个容易被忽略的细节:pairwise ranking loss在训练初期非常容易过拟合到少数几个难例上,出现分数崩塌的现象。我加了两道保险:一是所有loss都用batch级别的mean而不是sum,防止batch size波动影响梯度尺度;二是奖励头最后一层不设激活函数,输出可以是无界的,这样在训练后期模型才不会被sigmoid的饱和区卡住。

3.3 策略模型的强化学习算子

策略模型这一侧,我使用的是基于策略梯度的变体,用奖励模型输出的分数作为偏置项,再叠加一个KL惩罚,防止策略跑偏到指令无关的方向。核心目标函数可以简化成:

最大化策略模型在输入原图与编辑指令条件下生成图的期望奖励分数,同时减去KL散度项惩罚“策略模型与原模型输出分布差异过大”。

KL惩罚的系数调节很有讲究。系数过强,模型几乎不动,奖励模型学了半天等于白学;系数过弱,策略模型会疯狂追求高分而忘记原有生成能力,甚至出现把面部特征都改掉的灾难性结果。我观察到一个实用的寻参方法是:先固定其他参数,把KL系数从大往小扫描,每次只跑200步,然后看“奖励分数提升速度vs像素退化速度”的曲线,取拐点。

3.4 采样的关键工程细节

扩散模型采样过程中的随机性是不可忽略的变量。同一组参数下,不同随机种子生成的结果可能是天壤之别。我在训练中统一了采样配置:

  • DDIM采样器,步数设为50步,这个步数在速度和质量之间平衡较好;
  • 无条件引导比例设置为7.5,此参数影响编辑后图像的整体结构保持度。过高会导致图像完全僵化,过低又会导致编辑内容过弱;
  • 每个batch内,对同一个原图指令对,分别用4个不同的随机种子采样出4个候选图,取奖励模型的最高分作为这条数据的最终反馈。这种做法相当于在做一种小型的自一致性筛选,实测能把fidelity指标提升5%到8%。

3.5 训练过程中的显存与效率优化

强化学习微调扩散模型非常吃显存,前期我吃过不少亏。我有三个优化手段,供你参考:

第一,策略模型在RL阶段用LoRA适配器,而不是全量参数。LoRA的秩我只设为32。很多人会疑惑,奖励模型用64,策略模型为什么用32?原因是策略模型通常需要更大的更新幅度来快速适应奖励信号的引导,秩小一点可以让优化任务变得简单、稳定,反而有利于避免训飞。

第二,使用混合精度训练,但奖励模型和策略模型各自维护独立的梯度缩放器,避免共享缩放因子导致的一方溢出。

第三,在收集RL样本时开启torch.inference_mode(),只有向策略模型回传梯度时才切换到训练模式。这个改动看起来微不足道,但在批量采样时能节省接近40%的显存占用。

4. 常见问题与排查技巧实录:训练过程里踩过的那些坑

按照惯例,把我在实操中遇到的典型问题整理成速查表,这些问题都有共性,大概率你也会撞上。

问题症状排查思路解决方案
奖励模型分数飙升但人工视觉质量骤降训练曲线奖励一路向上,但输出图明显崩坏检查是否为reward hacking停止训练,加入在线采样与人工抽检,降低KL系数、增加一致性正则
奖励模型分数徘徊不升训练多轮但得分无明显变化检查奖励模型是否饱和降低KL系数或增大策略模型LoRA秩,适当增加采样随机性
训练过程剧烈震荡训练曲线在高频大幅摇摆检查batch size与学习率匹配关系使用梯度累积增大有效batch,降低策略模型学习率,或者延长KL退火周期
编辑结果区域方向正确但不稳定10次生成里3次好、7次差输出分布偏尖峰,探索不足增加采样种子数,提高采样温度,奖励模型加入更宽松的分数边界
奖励模型偏好纹理复杂区域编辑只发生在花纹多的区域数据中纹理密集样本占比过高重新平衡训练数据的区域分布,增加纯色背景样本,加入材质一致性正则

4.1 关于reward hacking的深度复盘

这个坑值得单独拿出来说。某一次调整中,我发现逆向跑出一个令人困惑的现象:几乎所有编辑结果的奖励分数都涨了,但只要把编辑后的图像单独拿出来给人看,肉眼可见地糊了。仔细分析后,我定位到原因:奖励模型在训练数据里见过大量高质量的人脸图像,而这些图像的共同特征是皮肤区域有非常轻微的高斯光滑纹理。策略模型敏锐地抓住了这一规律——它发现只要把编辑区域的皮肤特征往“人像平均脸”方向推一点,奖励模型的分数就会上升。

这就是典型的reward hacking:策略模型不是在优化编辑忠实度,而是在优化一个能哄骗裁判的“表面特征”。这个case让我彻底放弃了“奖励模型训练好就可以一劳永逸”的幻想,从此强制加入在线采样与人工抽检的循环。任何奖励模型的分数变化,都必须用人工盲评复核一遍,才能继续往下推进。

4.2 评估指标:不能只看数字

这个项目评估阶段的艰难程度不亚于训练。我最终采用了一套人为校验为主的评估矩阵:

  • 忠实度:主要靠人工盲评(两张图放在一起,让标注员判断是否保持一致性),这是唯一可靠的指标;
  • 语义正确性:用一组针对性的文本对齐问题检测,比如“图中有戴眼镜吗”“图中有改变背景吗”;
  • 自动参考指标:LPIPS、FID、VQAScore等作为辅助参考,但绝不作为决策依据。

在项目汇报时,我会同时展示自动指标和人工盲评结果,尽量不单独拿自动指标说事。因为你一旦把LPIPS当目标,策略模型就会去优化还原度、减少编辑痕迹,最后产出一种“什么都没改”的安全答案。

5. 经验总结与个人体会

整套方案走下来,我最深的体会是:这种“用奖励模型批评生成模型”的思路,在图像编辑领域是被低估的。大多数团队在做编辑模型微调时,第一反应就是堆数据、堆监督信号;但真正决定编辑结果天花板高度的,其实是你愿不愿意相信一个独立的、拥有判断力的评判者。

当奖励模型足够犀利的时,策略模型能学会很多监督学习学不来的东西——比如人类标注很难覆盖的微妙局部性,比如不被美观牵着走的忠实度优先原则,比如在探索到失败案例时能自主避免再犯。这些行为在监督信号里都很难显式定义,但通过偏好奖励和RL的联合优化,它们能自然地涌现出来。

最后再分享一个我的个人心得:在整个训练管线里,唯一一个我从来不让步的环节,就是“人工抽查”。无论奖励模型的分数涨得多稳定、自动指标表现得多光鲜,我每完成一批RL训练,都会随机抽20到50张生成结果,自己逐张看,再打印出来贴在工位旁边。不是说要练就什么火眼金睛,而是提醒自己——模型的所有优化指标,最终都要回到人眼对“忠实”二字的感受上来。这个习惯虽然土,却是整个项目里性价比最高的一笔时间投资。

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

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

立即咨询