DiffusionOPSD:只给最终图发奖励,中间预测却有了明确目标

奖励只在终点发放,中间那几十步该怎么学?

想象一场没有教练的接力赛。几十棒跑完,只在冲线那一刻有人给队伍拍了一张照片、打了一个分,中间每一棒跑得好不好、该往哪儿调整,没有任何人说一句话。扩散模型的强化学习(RL)后训练,每天就在跑这样的比赛。

文生图模型生成一张图,要先从噪声出发走几十步去噪,每一步都预测一张“更干净的图”,最后一步才得到成品。人类偏好打分器这样的奖励只看得见这最后一张成品。它给一个分数,然后沉默。中间的几十次预测,一次也没有被告知“你该往哪改”。这就是端点奖励的监督空缺(endpoint reward)。

这不是小问题。RL 的全部意义在于把奖励变成梯度,而梯度必须落在模型做过的每一步选择上。端点奖励只对整条轨迹的落点表态,中间每一步的预测对着空气。更糟的是,少步模型越来越流行,几步就出图,每一步的责任更重,这个空缺就被撑得更大。想绕开它也难,因为预训练模型对提示的服从和审美有天花板,不靠奖励信号做后训练,很难再往上走 DiffusionOPSD。

2023 年的 DDPO 第一次把这个设定摆上台面。它把去噪过程写成多步 MDP:状态是提示、当前步数和当前带噪样本,动作是预测下一步更干净的图,奖励却只在 t=0、也就是轨迹走到终点时发放一次 DDPO。

DDPO 的 VLM 奖励流水线

图注:DDPO 论文里一条典型的端点奖励流水线:prompt 进模型生成图像,图像送进 LLaVA 写出描述,描述再与原 prompt 一起送进 BERTScore 算出奖励标量。整条链上没有接口接到任何一步中间去噪,奖励只在最终图像上产生 DDPO。

这张图把“端点奖励”四个字画明白了。此后无论方法怎么翻新,reward 只在终点发放几乎成了 RL 后训练的默认设定。真正难的是后面这一步:奖励只在终点出现,那中间每一步的预测该怎么改?此后的方法给了三种答案,可它们都在绕着这个洞走。

更准确地说,这个空缺是结构性的。打分器(无论是人类偏好模型还是美学模型)的输入就是最终图像,中间那些“更干净的图”只是模型心里的残影,从来没有人给它们评过分。要让中间步也拿到指令,唯一的办法是有人先把“中间步应该变成什么样”这句话写出来。过去三年的方法都在做这件事,方式各不相同,但都差一口气。这一口气,正是这篇论文要补的。

此前的三种解法,都没告诉中间步「该变成什么样」

先把三条路摆开,看它们各自把“中间预测该变成什么样”藏在了哪里。

第一条是反向过程策略梯度。DDPO 开山,DPOK 给它加 KL 正则来防奖励过优化,Flow-GRPO 把这一套搬到 flow 模型上,用 ODE 转 SDE 注入随机性再上 GRPO DPOK Flow-GRPO。它们把整条去噪轨迹当成 RL 轨迹,用策略梯度把终点奖励往回摊。中间预测的方向被压缩进一个 advantage 权重里,模型只收到一个总括信号:这条轨迹整体该更招奖励喜欢。具体到某一步的某个预测该往哪儿挪,没有显式答案。要拿到这个 advantage,还得保存整条采样轨迹、沿轨迹逐点反传,这类方法训练开销大的根源也在这里。

第二条是末尾步反传。ImageReward 论文里的 ReFL 观察到,打分器在去噪后段就已经能分辨生成好坏,于是干脆把奖励梯度直接反传到末尾几步 ImageReward。它比策略梯度直接,但只动末尾几步,中间大部分步依然没有指令。

第三条是正向端点回归。2025 年的 DiffusionNFT 换了个坐标系:不做反向采样,而是在正向加噪过程上把奖励高低折成正负两个隐式速度场,拿采样端点的干净图当回归目标。好处立竿见影:不用存整条采样轨迹,solver 随便换。但细看,目标仍然来自终点那张图,中间预测该变成什么样,依旧没人说 DiffusionNFT。

正向过程 RL 与反向过程 RL 的对照

图注:DiffusionNFT 论文自制的正反两路对照。左半是反向过程 RL(以 GRPO 为例),优化要保存整条采样轨迹,solver 被 SDE 限定;右半是正向过程 RL,只保留干净的 x_0、可用任意 solver,通过 forward noising 与旧速度场 v^old 关联,图中 detached update 路径把 v^old 与 v_θ 解耦 DiffusionNFT。

方法家族代表中间目标藏在哪
反向过程策略梯度DDPO → DPOK → Flow-GRPOadvantage 权重里
末尾步反传ReFL末尾几步的梯度里
正向端点回归DiffusionNFT采样端点里

把这几家放进两个轴,坐标系就清楚了:优化走反向过程还是正向过程,监督是隐式还是显式。反向一列(DDPO、DPOK、ReFL、Flow-GRPO)都要沿轨迹反传,正向一列(DiffusionNFT 和将要登场的 OPSD)直接在加噪过程上写损失;隐式一行把方向藏在别处,显式一行把目标写出来。OPSD 要占的,是“正向 × 显式”这个此前空着的格子。

三家有一个共同点:都没有在更新模型之前,先造出一个“中间预测应该变成什么样”的显式目标。方向要么隐在权重里,要么隐在梯度里,要么隐在端点里。隐式并不是错,它是省事,advantage 权重本身就能驱动模型变好;它缺的是另一件事:目标一旦被显式写出来,就能被人看见、被人单独度量。一个自然的反问是:能不能在更新模型之前,把目标先显式地造出来?这个问题的答案,要从两个月前的一篇姊妹工作说起。

前置证明:轨迹上一个低噪声点就够,老师可以是模型自己

2026 年 6 月,字节跳动 Seed 团队发布了 DanceOPD,比 OPSD 早两个月。它在能力合成任务上先把一条蒸馏配方跑通了:学生模型在自己的采样轨迹上取一个低噪声状态,冻结的老师模型在这个状态给出速度场预测,学生用 MSE 对齐 DanceOPD。三个设计选择缺一不可:查询必须打在学生自己的 rollout 上,这叫 on-policy;只取一个低噪声点,这叫单查询;对齐用速度场 MSE(均方误差)。

为什么一个点就够?DanceOPD 的消融给出了数字:低噪声端的单查询比中噪声、高噪声查询分别高出 23.7% 和 19.5%,而密集的同步多查询反而掉 22.8%。老师不需要盯住每一步。学生最靠近成品的那一次预测,已经携带了几乎全部“该怎么变”的信息。

更关键的是老师的身份。DanceOPD 的老师是外部能力场,是别人训好的模型。OPSD 只换了一样东西:把外部老师换成学生自己的 EMA 快照,外部专家被彻底替换掉。既然一个查询点就够,目标就从“外部专家”变成了“模型自己的预测”。自己教自己的地基已经铺好,剩下的问题只有一个:这个目标到底怎么造?

为什么自己的慢速版本能当老师?老师不需要比学生聪明,只需要稳定。EMA 快照相当于把过去若干轮的权重做了平均,它比当前权重慢半拍,正因如此,它给出的目标不会跟着每一轮优化剧烈抖动。你今天学到的,明天由慢半拍的自己来教,目标永远和当前的预测保持一个可追赶的距离。

先造目标再拟合:奖励被翻译成中间步的显式监督

坐标系先定下来。OPSD 建立在 rectified flow 这种表征上,它让每个去噪步都显式输出一个速度场 v_θ,速度场就是“这个样本此刻该往哪儿挪”的方向场。整流化(reflow)还能把轨迹越扳越直,直到最后一步就能出清晰图,这正是少步模型的根基 Rectified Flow。在这个坐标系里,“模型此刻心里的干净图”有一个干净的表达式:

$$y_\theta(s) = z_\sigma - \sigma \cdot v_\theta(s)$$

把当前带噪样本 z_σ 减去 σ 倍的速度,剩下的就是模型此刻预测的干净图,论文叫它 clean-output。锚点、目标、信任球,全都定义在这个坐标里。

为什么锚点取在低噪声点而不是随便一步?DanceOPD 已经验证过:语义、风格这些“该怎么变”的信息几乎都集中在最靠近成品的那几步。低噪声点的锚点本身就已经是一张半成型的图,奖励梯度从这里出发,指出的方向也更有意义。

DiffusionOPSD 框架图

图注:DiffusionOPSD 的框架图。冻结的行为策略产生低噪声查询与干净输出锚点 y₀,奖励梯度在锚点周围构造有界正负目标并投影回半径 ρ‖y₀‖₂ 的信任球,可训练策略以停梯度的监督做一步有限拟合,EMA 刷新行为策略后回到第一环。图中间把“目标构造”和“有限拟合”标成两个独立阶段 DiffusionOPSD。

外层循环一共五步。第一步,采样与锚点:每轮先把行为策略冻结,行为策略是被冻结起来专门负责采样的那版模型。它为每个 prompt 采若干条轨迹,得到端点奖励,同时在低噪声处取一个查询点。冻结网络在这个点给出锚点:$y_0 = z_q - \sigma_q \cdot v_{\text{old}}(z_q, c, \sigma_q)$。锚点是“模型此刻认为的干净图”,是所有目标的地基。

第二步,造目标:从锚点出发,把奖励函数当成一张地形图。沿奖励上升的方向走几个归一化小步,得到一个正目标 ȳ₊;再沿下降方向走同样多步,得到负目标 ȳ₋。负目标不直接进损失当标签,它当排斥参照。每一步都投影回以锚点为球心的信任球里:

$$|\bar{y}_\pm - y_0|_2 \le \rho |y_0|_2$$

半径 ρ 默认取 0.10,也就是目标最多离锚点百分之十的模长。把打分器想成挑剔的评委,锚点是模型自己的草稿。OPSD 不让模型照抄评委的满分范文,而是在草稿上沿“评委会更满意”的方向轻轻描一笔,描到不超过一步之遥的范围,然后把描好的版本冻成固定答案,让模型照抄这一笔。描的方向是奖励梯度,一步之遥是信任球半径,冻结是 detach,照抄是后面那步拟合。有界必不可少:要是直接往“打分器最喜欢”的地方跳,模型会学会刷分而不是变好,这是 2023 年以来 reward hacking 教训早已证明的。

注意这里奖励梯度的用法:它不是在给网络权重算梯度,而是在图片空间里走路。奖励梯度作用的对象是那张“心里的干净图”,走出来的结果是一张目标图,网络的权重则是通过后面那步拟合去够这张图。奖励被翻译了两遍,先翻译成目标,再翻译成梯度。

举个具体的例子让这一步落地。prompt 是“一只雪地里的红狐狸”,模型跑到低噪声查询点时,心里的干净图是一只轮廓清楚、但毛色发灰的狐狸。打分器喜欢更鲜艳的红色。奖励梯度从锚点出发,指出“往加深红色的方向走,分数会涨”,于是正目标被描成一只红得更正的狐狸,负目标则是红得更淡的狐狸。这一轮的训练目标不是“生成一张完美的红狐狸”,而是“把此刻心里的灰狐狸往红的方向推一点”。一步拟合之后行为策略刷新,下一轮的锚点已经是那只略红的狐狸了。目标永远追着模型自己跑,这是它与外部老师最本质的区别。

第三步,detach 拟合:目标一经造好就切断反向传播,当成固定数值,detach 的意思就是不再让梯度穿过目标。拟合损失是正负两支的加权 MSE:

$$L_{\text{OPSD}} = \omega \cdot \frac{\text{mean}[(y_\theta^+ - \bar{y}+)^2]}{\gamma+} + (1 - \omega) \cdot \frac{\text{mean}[(y_\theta^- - \bar{y}-)^2]}{\gamma-}$$

γ_± 是自适应归一化。这一下 detach 的工程意义,后面会变成整篇论文最值钱的账:一旦目标冻结,奖励模型、解码器、采样计算图全部退出,一次更新不再需要穿过整个奖励管线反传。

第四步,有限拟合:只做一步优化器更新(M_fit=1),不求收敛。原因很朴素:目标每轮都重造,拟合过头是浪费,下一轮的锚点已经挪走了。

第五步,EMA 刷新:$\theta_{\text{old}} \leftarrow \eta \theta_{\text{old}} + (1 - \eta) \theta$。EMA 是给历次权重做加权平均,让参数缓慢滑行而不是一步换新。行为策略跟着新权重走,下一轮就在你刚学到的位置附近重新造目标。监督是活的:每一轮都在最新的预测附近重新生成,这是 OPSD 与一切静态目标方法最根本的分野。

把 DDPO 和 OPSD 并排看,差别只有一页纸:DDPO 用策略梯度把终点奖励散成每一步的梯度,OPSD 把终点奖励翻译成每一步的目标,然后停掉梯度。前者问“奖励怎么流回去”,后者问“目标先写下来”。这个差别直接决定了后面那笔算力账。

把终点奖励翻译成中间步的显式目标,这一步 OPSD 在更新模型之前就完成了。而它敢说自己“可分析”,靠的是下一章那把手术刀。

最锋利的一刀:目标造得好,不等于兑现得好

大多数论文把“目标设计得好不好”直接等同于“最终分数高不高”。OPSD 偏不,它把一整段流水线拆成两段来量:目标构造(construction)和目标实现(realization)。

实验是这样设计的。512 个没见过的 prompt,同一个低噪声查询点,五种目标构造方式挨个上场。先只量“造出的目标本身能带来多少奖励提升”,这叫构造增益;再在同一个点上做一次拟合更新,量“这一步真正兑现了多少”,这叫实现增益。

构造这一关,差距清清楚楚。奖励梯度目标带来 +0.03511 的构造增益,方向与奖励梯度高度对齐;DiffusionNFT 的端点目标反而是 −0.03551,方向几乎与奖励梯度无关。就算把端点目标的半径对齐到和 OPSD 一样,增益仍为负。差距来自方向,不是半径。

目标构造与有限实现的分离测量

图注:分离测量条形图。左 panel 是同一低噪声查询点上五种目标变体的构造增益:奖励梯度目标 +0.03511,DiffusionNFT 端点目标 −0.03551,no-op 为 0;右 panel 是 HPSv2.1 上做一次拟合更新后的实现增益,排序在 62.3% 的 prompt 上发生反转。垂直虚线标出零线 DiffusionOPSD。

反转是整个实验最刺眼的地方。在 HPSv2.1 上,62.3% 的 prompt 在一步拟合后出现“更好的目标反而兑现得更差”。同一批点上,构造增益领先 0.03496 的奖励梯度目标,一次 AdamW 更新后被随机方向目标反超了 0.000719。CLIPScore 上的反转率只有 29.5%,说明这不是一条能推广到所有评估器的铁律,但它的存在本身就够说明问题。

反转够刺眼,可别把结论滑向“方向没有用”。同一套目标变体跑 50 次更新再量,奖励梯度目标稳稳领先:held-out CLIPScore 0.3122,no-op、随机方向、rollout 残差目标分别是 0.2363 / 0.2303 / 0.1256。方向在长期是对的,反转发生在“一次拟合”这个时间尺度上。还有个对照:把查询状态换成前向加噪出来的状态(相同的噪声水平、不同的状态来历),分数只掉了 0.0033,相对差距 1.1%。在低噪声区,奖励的方向起决定性作用,查询状态的来历是次要的。

把它写成一笔账:

$$G_{\text{realized}} = G_{\text{construct}} - G_{\text{fit}}$$

实现增益等于构造增益减去拟合损失。G_fit 是带符号的拟合缺口,把三种失败方式揉在一起:要么没走够(欠实现),要么方向偏了(旋转),要么冲过头(过冲)。构造再好的目标也要过“一步有限拟合”这一关:优化器几何、过冲、欠拟合,任何一个环节都能把方向带偏。这解释了为什么造目标猛并不等于兑现好,也解释了论文为什么坚持“有限步拟合、目标不断重造”:单步实现本来就不那么可靠,与其赌一步到位,不如每轮都从新锚点出发。

两条边界必须说清,否则容易误读。第一,随机方向目标“单步后略胜”是拟合协议的产物:它的构造增益是负的,一步之后的小幅正差是优化器工件,不是端到端赢。端到端 20 个 reward-matched 设置,19 个是 OPSD 赢。第二,构造增益的排序只在同一个点、同一次拟合上可比,把它当跨方法的通用裁判就是过度解读。

回看此前的三种方法,没有人能回答“是目标造坏了,还是拟合没兑现”。OPSD 递出的不是一块更大的奖牌,而是一把能分步审计的量尺 DiffusionOPSD。

端到端 19/20 个设置最佳,省下的是算力不是显存

审计是一回事,上桌比赛是另一回事。OPSD 的主战场是双骨干乘十评估器。骨干一 SD 3.5-M 是 2.5B 参数的 MMDiT-X,带 QK-Norm,混合分辨率训练,512² 分辨率、无 CFG 的 10 步 rollout SD3。骨干二 Z-Image-Turbo 是少步蒸馏的 flow 模型,1024² 上用 9 步 FlowMatchEuler。十个评估器里七个开源(PickScore、CLIPScore、HPSv2.1、LAION-Aesthetic、ImageReward、HPSv3、DeQA),三个是团队的内部偏好模型。reward-matched 的意思是每个设置里训练用的奖励与最终评估器严格一致,谁也没占便宜。

结果:20 个 reward-matched 设置,19 个拿到最佳 held-out 得分,held-out 表示这些分数来自训练时没见过的提示。SD 3.5-M 上 9/10,唯一例外是 Aesthetic,OPSD 12.08 对 ReFL 12.09,差 0.01;Z-Image-Turbo 上 10/10。差距不是小打小闹:SD 3.5-M 上 HPSv3 列 +43.0%,VLM-Pairwise 列 +44.0%。口径要记牢:44.0% 是相对“这一列的最强 baseline”,每一列的最强对手可能不同,它不是对某一个固定方法的碾压。

19/20 个奖励设置的 Pareto 前沿

图注:两骨干乘十评估器的 Pareto frontier 网格。横轴是累计 GPU 小时(对数),纵轴是 held-out 得分,每个子图画 OPSD、ReFL、DiffusionNFT、Flow-GRPO 的训练轨迹。OPSD 在 9/10 个 SD3.5-M frontier 和全部 10 个 Z-Image-Turbo frontier 上落在右上角,唯一例外是 SD3.5-M Aesthetic。marker 是 checkpoint 均值,band 是一个标准误 DiffusionOPSD。

Z-Image-Turbo 上有个反常值得点破:ReFL 的算力其实更低,但十项 reward-matched 质量对比全输。算力低不等于质量高,Pareto 前沿上右上角比右下角值钱。

联合训练同样跑赢。PickScore、CLIPScore、HPSv2.1 三个奖励一起训 300 更新,OPSD 拿到 25.51 / 0.333 / 0.389,DiffusionNFT 是 23.62 / 0.294 / 0.340,分别 +8.0% / +13.3% / +14.4%。它甚至压过了用外部冻结专家当老师的两阶段蒸馏基线。自己教自己,没有吃亏。

定量之外还有人工评测。在 Z-Image-Turbo 的 VLM-Pointwise 设置里抽 100 个未见过的 prompt,标注者在 64%、71%、90%、61% 的样本上分别更偏好 OPSD,而不是未训练骨干、Flow-GRPO、DiffusionNFT 和 ReFL。

算力账摊开看:

指标(每 100 更新)OPSDDiffusionNFT节省
SD 3.5-M GPU 小时28.247.240%
Z-Image-Turbo GPU 小时149.8405.863%
扩散反向传播调用(SD 3.5-M / Z-Image-Turbo)16 / 12144 / 96约一个数量级

账从哪省出来的?反向传播次数。原因正是前面埋的伏笔:目标造好后 detach,拟合时奖励模型、解码器、采样图全部退出反向。少算的是“穿回去算梯度”的那几趟。但有一笔账要老实交代:省的是算力,不是显存。Z-Image-Turbo 上 OPSD 峰值显存 61.5 GB,反而高于 DiffusionNFT 的 49.9 GB,GPU 小时省在 backward 次数上,显存没有同步降下来 DiffusionOPSD。

同一条线还有个佐证:在少步骨干 Z-Image-Turbo 上,DiffusionNFT 的端点目标把 10 个目标里的 8 个拉到了未训练骨干之下。端点监督在少步时代格外脆弱,中间显式目标的价值在这里显出另一面。

另一个值得注意的横切点是骨干差异。SD 3.5-M 是传统多步模型,Z-Image-Turbo 是少步蒸馏模型,两者的采样调度完全不同,OPSD 在两头都赢了。这说明“中间目标”这个设计不挑骨架。而少步模型恰恰是端点监督最难熬的地方:步数越少,每一步的预测责任越大,终点奖励的空缺就越致命。这也许正是 OPSD 出现在 2026 年、而不是 DDPO 时代的原因之一。

诚实的边界还有三条。三个内部偏好模型没有公开 checkpoint,那三个评估器的结果外部复现不了。论文还专门试了不带 classifier-free guidance(CFG)的训练,结果它并没有让最好成绩更高,论文的措辞是“没有建立 CFG 训练有害”,不夸大。三个失败模式:查询噪声设太高(σ_q=0.90)、信任球半径太小(ρ=0.02)、分支系数太大(β=10),都会把分数打回原型。最后,这是一篇 arXiv Technical Report,不是同行评审论文,19/20 的完整语境在正文表格里。

这一组数字的底气在于它不是 cherry-pick 快照:两个骨干、十个评估器、reward-matched 条件、训练时没见过的 held-out 提示,73 条训练记录全部摆出来可查。任何一个设想要被推翻,都得在同样的条件矩阵里找到一个反例。这本身就是 OPSD 想把“可审计”从口号变成标准的尝试。

把赢面数字放在一边,OPSD 留给扩散后训练这条线的,是两件可以分开拿走的东西:一个把终点奖励翻译成中间显式监督、并且每轮重造目标的训练框架;一把把“目标构造”和“有限实现”分开计量的量尺。62.3% 的反转率说明连最好的目标也可能在一次拟合里翻车,可这恰恰是好消息:问题第一次可以被定位,而不是像以前那样一切都挤在最终的分数里无从下手。下一次有人告诉你“我的目标设计更好”,你可以多问一句:构造增益多少?一次拟合之后,兑现了多少?

想深入可以读原文:On-Policy Self-Distillation in Diffusion Models,arXiv:2608.24646

参考文献

DiffusionOPSD:只给最终图发奖励,中间预测却有了明确目标