DiffusionNFT
DiffusionNFT: Online Diffusion Reinforcement with Forward Process
作者:Kaiwen Zheng, Huayu Chen, Haotian Ye, Haoxiang Wang, Qinsheng Zhang, Kai Jiang, Hang Su, Stefano Ermon, Jun Zhu, Ming-Yu Liu
机构:清华大学 / NVIDIA / Stanford
会议:ICLR 2026 Oral
arXiv:2509.16117
项目主页:research.nvidia.com/labs/dir/DiffusionNFT
2509.16117_DiffusionNFT
0. TL;DR — 一句话定位
DiffusionNFT(Negative-aware Fine Tuning) 把 diffusion 的在线强化学习从「在反向采样轨迹上做 GRPO」彻底翻转为「在前向加噪过程上做 flow matching 监督」:通过对正样本与负样本分别构造一个隐式正策略与隐式负策略,把 RL 的优化方向「藏进」一个普通的 velocity 回归 loss 里。这一招同时解开了 FlowGRPO 系工作的三个死结——必须用一阶 SDE 采样、forward/reverse 不一致、与 CFG 难以协同——并在 SD3.5-Medium 上把 GenEval 从 0.24 推到 0.98,速度比 FlowGRPO 快 3–25×。
它最值得记住的洞察是:diffusion RL 不必显式估计似然,也不必跟着反向轨迹走;只要能把"奖励高的样本"和"奖励低的样本"分别投影到 flow matching 的目标向量场上,正负样本的差异本身就构成了策略改进的方向。 这本质上把 RL 退化成了"带正负标签的有监督微调"。

- DiffusionNFT的优化速度明显快于Flow-GRPO
1. 研究背景:为什么 diffusion RL 这么难
1.1 LLM 的 RL 公式为何无法直接搬过来
- LLM 的 RLHF / GRPO 之所以好做,是因为自回归模型的 token-level 似然 \(\pi_\theta(y|x) = \prod_t \pi_\theta(y_t|x,y_{<t})\) 天然可计算。PPO 的 importance ratio、KL 正则、价值函数都建立在「能算出当前策略下的样本概率」之上。
- 但 diffusion 模型给出的是一个边际似然
它是一个 \(T\) 维高斯链上的边际化积分,没有闭式解,且不能像 LLM 那样按 token 累乘。这意味着所有依赖 \(\log \pi_\theta(\mathbf{x}_0)\) 的策略梯度方法都得另想办法。
- 对于LLM,每个词的概率密度算完直接就是最终输出的该词的pdf,但是对于扩散模型,需要经过多步去噪之后,才能得到最终的输出,而需要用来进行reward计算的pdf是最终输出pdf
- diffusion的中间去噪状态是隐变量,而 LLM token 是显式输出
- 在 LLM 中:token \(y_t\) 既是动作,也是最终回答的一部分,每个动作的概率可以精确保存和重新计算。
- 在扩散模型中,最终用户只看到 \(x_0\),而\(x_T,x_{T-1},\dots,x_1\)都是采样器产生的中间隐状态,同一张最终图像可能对应许多随机去噪轨迹。
- 因此,已有方法如 DDPO、FlowGRPO 通常不计算真正的最终图像概率,而是把一次具体采样轨迹的概率当作策略概率:\[\]\[\]
1.2 FlowGRPO 路线的妥协与三个隐患
flow_grpo 等工作选择了一条迂回:把反向 ODE (采样过程)改写成反向 SDE,然后 Euler 离散化得到 Gaussian 转移核
这样每一个反向步就像 LLM 的一个 token,可以套 GRPO。代价是:
| 隐患 | 表现 |
|---|---|
| Forward inconsistency | 训练时只优化反向链,前向加噪分布会与训练好的反向链不再一致,作者描述为"模型退化成级联高斯" |
| Solver restriction | 必须用一阶 SDE 采样以匹配训练时的离散化,排除 ODE 与高阶求解器 |
| CFG 集成繁琐 | CFG 需要条件 / 无条件两份模型,反向轨迹上的概率比要在两份模型上分别算 |
| 更细节的一个隐患:反向链上的"轨迹存储"开销巨大——每个 prompt 要保存 \(T\) 个 \(\mathbf{x}_t\) 才能反向传梯度。 |
1.3 论文要回答的核心问题
Can diffusion reinforcement be performed on the forward process instead of the reverse?
把视角从「沿着反向轨迹爬梯度」翻转为「在前向加噪的有监督目标上做 RL」,如果可行,以上三个隐患同时消失:前向加噪是闭式 Gaussian、与求解器无关、与 CFG 解耦。

2. Background:Flow Matching 与"奖励即最优性"
2.1 Flow / Diffusion 前向过程的统一形式
flow matching 用 velocity 参数化:
rectified flow: \(\alpha_t=1-t,\ \sigma_t=t,\ \mathbf{v}=\mathbf{\epsilon}-\mathbf{x}_0\)。
关键点:这是一个有监督目标——每条样本有一个明确的回归目标 \(\mathbf{v}\)。如果 RL 能塞进这种形式,就可以摆脱所有概率链。
2.2 奖励的"最优性概率"解释
将标量奖励 \(r \in [0,1]\) 定义为最优性概率:\(r(\mathbf{x}_0, \mathbf{c}) = p(\mathbf{o}=1 | \mathbf{x}_0, \mathbf{c})\),其中\(\mathbf{o}=1\)表示样本\(\mathbf{x}_0\)在prompt \(\mathbf{c}\)下达到最优,该式将reward表示为:给定 prompt \(c\) 和生成图片 \(x0\),它属于正样本的概率;对于prompt下的K张图像 \(x_0^{1:K}\),可以被划分为正样本集合\(D^+\)和负样本集合\(D^-\)。
基于贝叶斯定理,旧策略 \(\pi^{\text{old}}(\mathbf{x}_0|\mathbf{c})\) ——表示给定prompt \(c\)下生成样本\(x_0\)的概率,生成的样本可按最优性拆分为两个纯条件分布:
其中 \(p_{\pi^{\text{old}}}(\mathbf{o}=1|\mathbf{c}) = \int r(\mathbf{x}_0,\mathbf{c}) \pi^{\text{old}}(\mathbf{x}_0|\mathbf{c}) d\mathbf{x}_0\) 表示旧策略下生成最优样本的总概率(平均reward),用于归一化分布。上式表示正策略\(\pi^+({x}_0|{c})\)就是:
把旧策略中的每个样本概率乘上它的 reward,然后重新归一化。高 reward 样本被放大,低 reward 样本被压低。
由全概率公式直接可得 Lemma A.1,推导过程见附录A3:
显然在奖励指标下 \(\pi^+ \succ \pi^{\text{old}} \succ \pi^-\),因此RL的核心目标就是将策略往\(\pi^+\)的方向推动——即提升高最优性概率样本的生成比例,降低低质量样本的占比。
这是一个旧观点的复述,但作者用它做了一个非常巧的事情:既然 \(\pi^{\text{old}}\) 是 \(\pi^+\) 和 \(\pi^-\) 的混合,那么 \(\pi^+\) 就是 \(\pi^{\text{old}}\) 偏离 \(\pi^-\) 的"反方向"。正负样本之差,本身就是改进方向。
3. 方法核心:DiffusionNFT 的构造
- 基础flow-matching -> 正负样本构造 -> 速度场分解 -> 隐式参数化 -> 最终训练目标
3.1 第一步:把"奖励梯度"变成"velocity 之差"
先假设 RL 的目标 velocity 为旧策略 velocity 加上一个改进方向:
这个形式与 CFG 完全同构——CFG 就是"无条件 velocity + 一个引导方向"。论文把它叫做 reinforcement guidance,从命名就能看出这种类比是有意的:把 RL 看成 inference-time guidance 的"训练时版本"。
velocity差 \(\Delta\)表示优化后策略与原始策略的优化方向,对优化方向进行以下定义,详细证明过程见附录:
Theorem 3.1:
其中 \(\alpha(x_t)\in(0, 1)\),为系数标量:
这个等式的几何含义:改进方向 \(\Delta\) 可以从两个互补视角等价表达——「正方向」(\(\mathbf{v}^+ - \mathbf{v}^{\text{old}}\),鼓励向好样本靠近)与「反方向」(\(\mathbf{v}^{\text{old}} - \mathbf{v}^-\),鼓励远离坏样本),如下图所示:

基于上述定义,可以进一步构造目标函数,详细证明过程见附录:
Theorem 3.2(DiffusionNFT损失函数):
其中:
直观理解:
- 用最优性概率\(r\)加权正分支flow matching损失,鼓励模型向好样本靠近
- 用\(1-r\)加权负分支flow matching损失,鼓励模型远离坏样本
当\(r=1\)时仅正分支生效,将\(\mathbf{v}_\theta^+\)拟合到真实速度场(以好样本为监督目标);当\(r=0\)时仅负分支生效,推动模型远离坏样本。

Theorem A.4 通过代数化简(合并平方项)可得(详细证明过程见附录):
最优解为 \(\mathbf{v}_{\theta^*} = \mathbf{v}^{\text{old}} + \frac{2}{\beta}\Delta\),与reinforcement guidance形式完全一致(系数因子可通过调整\(\beta\)吸收)。
核心总结:将"沿\(\Delta\)方向改进策略"重新参数化为"正样本拟合 + 负样本反向拟合",通过奖励权重\(r\)与\(1-r\)实现混合控制——既保留RL的方向性指导,又完全转化为标准supervised flow matching训练形式。
3.4 该构造的优势对比
| 传统扩散RL方法需完成 | DiffusionNFT实现方式 |
|---|---|
| 估计 \(\log \pi_\theta(\mathbf{x}_0)\) | 无需,损失函数不包含似然项 |
| 存储完整反向轨迹 \(\mathbf{x}_{T:0}\) | 正向过程损失,仅需单步样本对 \((\mathbf{x}_0, \mathbf{x}_t, \mathbf{v})\) |
| 限制特定solver | 无限制,采样器可作为黑盒,训练与采样解耦 |
| 额外训练CFG模型 | 无需,\(\mathbf{v}^{\text{old}}\)为冻结的条件模型 |
唯一代价:\(\mathbf{v}_{\theta^*}\) 收敛到 \(\mathbf{v}^{\text{old}} + \frac{2}{\beta}\Delta\) 而非严格的\(\mathbf{v}^+\),通过EMA软更新\(\mathbf{v}^{\text{old}} \leftarrow \mathbf{v}_\theta\)逐步累积逼近\(\pi^+\)。这正是PPO/TRPO思想在扩散模型上的延伸——每一步仅在旧策略邻域内进行有界改进。
4. 具体实现细节
理论很漂亮,但要在 SD3.5 这种规模上跑通,论文做了几个工程化优化:
4.1 奖励的最优性化
原始奖励 \(r^{\text{raw}}\) 是任意 reward model 的输出,不在 \([0,1]\)。作者用组内归一化 + clipping 将其映射:
其中 \(\bar r\) 与 \(Z_{\mathbf{c}}\) 是同一 prompt 下 \(G\) 个 rollouts 的均值与标准差。这等价于 GRPO 风格的 group advantage normalization,让"好"与"坏"的定义在每个 prompt 上都是相对的——不会因为某 prompt 的奖励整体偏低就把所有样本都当成负样本。
4.2 软 EMA 更新(\(\theta^{\text{old}}\) 的节奏)
\(\pi_{old}\)更新策略如下:
- 严格 on-policy (\(\eta=0\),每步重采):训练崩溃,因为每步策略变动太大导致 reinforcement guidance 的局部线性假设失效。
- 接近 off-policy (\(\eta \to 1\)):收敛太慢,等同于反复在过时的样本上训。
- 最终方案:\(\eta\) 随训练递增,前期快速跟踪以拿到信,后期慢慢稳定。这是与 TRPO 的「trust region 自适应」类似的工程经验。
4.3 自适应 loss 加权(借鉴 DMD)
原始 flow matching 的 \(w(t)\|\mathbf{v}_\theta-\mathbf{v}\|^2\) 在 RL 设定下不稳。作者改成
其中 sg 是 stop-gradient。这是 DMD (Distribution Matching Distillation) 的归一化技巧——让损失的大小不被噪声水平的尺度差异主导。消融显示用 \(w(t)=1-t\) 直接崩溃,自适应权重是关键的稳定剂。
4.4 CFG-free
CFG 在论文里被重新解释为"离线的 reinforcement guidance":无条件模型扮演 \(\mathbf{v}^-\) 的角色,条件模型扮演 \(\mathbf{v}^{\text{old}}\) 的角色,推理时的引导方向 \(\mathbf{v}^c + s(\mathbf{v}^c - \mathbf{v}^u)\) 与训练时的 reinforcement guidance 同构。
既然在线 RL 已经在每一步把 guidance 烧进了单一策略,就没必要在推理时再做一次 CFG——这同时省了一半推理算力,也避免了 CFG 与 RL 训练目标互相干扰的耦合问题。
4.5 采样器选择
- 数据采用用 ODE 优于 SDE:SDE 的额外噪声会让某些噪声敏感的 reward(如 PickScore)的奖励信号被稀释。
- 2 阶 ODE 略优于 1 阶:GenEval 上有小幅提升,但收益边际。
- 关键:由于训练 loss 与采样器解耦,可以自由切换最适合的采样器,这是相对 FlowGRPO 的一个结构性优势。
整体优化流程如下:

5. 实验结果
5.1 多奖励实验
实验配置:
- reward model包括:
- 基于规则的reward(GenEval、OCR)
- 基于模型的reward(PickScore、ClipScore、HPS、Aesthetics、ImageReward、UnifiedReward)等
- prompt数据集:采用GenEval、OCR、pick-a-Pic
- 训练配置:基于SD3.5-Medium,分辨率为512x512,采用LoRA(\(\alpha=64, r=32\)),每个epoch包含48个epoch,每个group size=24,采样步数为10、40
| Model | GenEval | OCR | PickScore | ClipScore | HPSv2.1 | Aesthetic | ImgRwd | UniRwd |
|---|---|---|---|---|---|---|---|---|
| SD3.5-M (w/o CFG) | 0.24 | 0.12 | 20.51 | 0.237 | 0.204 | 5.13 | −0.58 | 2.02 |
| SD3.5-M + CFG | 0.63 | 0.59 | 22.34 | 0.285 | 0.279 | 5.36 | 0.85 | 3.03 |
| SD3.5-M + FlowGRPO (>5k) | 0.95 | 0.66 | 22.51 | 0.293 | 0.274 | 5.32 | 1.06 | 3.18 |
| SD3.5-L (CFG, 8B) | 0.71 | 0.68 | 22.91 | 0.289 | 0.288 | 5.50 | 0.96 | 3.25 |
| FLUX.1-Dev (12B) | 0.66 | 0.59 | 22.84 | 0.295 | 0.274 | 5.71 | 0.96 | 3.27 |
| Ours (1.7k it, CFG-free) | 0.94 | 0.91 | 23.80 | 0.293 | 0.331 | 6.01 | 1.49 | 3.49 |
| 观察: |
- 本文CFG-free 的模型在大多数 reward 上同时超过 8B 的 SD3.5-L 与 12B 的 FLUX.1-Dev——尤其是 HPS、Aesthetic、UnifiedReward 这类 OOD 指标,说明并非单纯过拟合训练奖励。
- OCR 从 0.12 → 0.91 是质变,说明前向过程的 supervised flow matching 能够把奖励信号高效地"塞进"模型权重。
- 仅 1.7k iterations 就追平 FlowGRPO 5k+ 步的效果——这才是论文真正的卖点。
![_attachments/DiffusionNFT/file-20260721110246948.png]()
5.2 消融实验
- 负分支不能去掉:LLM 里只用 rejection fine-tuning (RFT,只学正样本) 也常常有效,但 diffusion 里只学正样本会"几乎立刻崩溃"。作者把它归因于 diffusion 的分布是连续高维的,丢弃 \(1-r\) 加权的负梯度会让 \(\mathbf{v}^{\text{old}}\) 与 \(\mathbf{v}_\theta\) 的镜像约束失效。这是一个非平凡的实证发现——它解释了为什么 diffusion RL 的设计原则不能简单地从 LLM 经验外推。
- 采样器:ODE > SDE,2 阶 > 1 阶(边际)。
- 加权:DMD 风格自适应 > \(w(t)=1-t\),后者直接 collapse。
- EMA \(\eta\):0 不稳、0.9 太慢,递增式 \(\eta\) 最佳。
- \(\beta\):\(\beta \approx 1\) 稳,\(\beta = 0.1\) 早期 reward 上升更快但有 overshoot 风险。
5.3 实验设计的盲区
- 没有显式的 reward hacking 测试(例如让 reward 故意有 bug,看 DiffusionNFT 是否比 FlowGRPO 更容易钻空子)。
- 仅在 SD3.5-Medium 上训练,未涉及视频 diffusion 或 12B+ 模型的 full fine-tune(主实验是 LoRA r=32)。
- 没有对 \(\beta\) 与 \(\eta\) 调度的理论分析,只有经验性 schedule。
- 缺失"在严格 on-policy 设定下与 FlowGRPO 公平比"的实验——DiffusionNFT 的 off-policy 性是结构性优势,但也意味着两者并不是在完全相同的实验条件下比较。
6. 创新与定位
6.1 创新点
- 范式转换:把 diffusion RL 从"反向轨迹上的概率论问题"翻转为"前向加噪上的回归问题"。这是叙事层面的最大贡献。
- 隐式策略参数化:用 \(\mathbf{v}_\theta^\pm\) 的镜像参数化把不可计算的密度比 \(\alpha(\mathbf{x}_t)\) 消掉,这是技术层面最关键的一步。
- CFG 的统一视角:把 CFG 解释为离线 reinforcement guidance,从而自然推出"CFG-free"作为副产品。
- 效率的实证证明:25× 不是小数字,意味着 diffusion RL 从"实验室级别"开始走向"工业级别"。
6.2 与相邻工作的本质差异
| 路线 | 代表 | 与 DiffusionNFT 的差异 |
|---|---|---|
| 反向 SDE GRPO | FlowGRPO / DanceGRPO / MixGRPO / DSPO | 仍在反向链上做策略梯度,绑死求解器 |
| Diffusion DPO | Wallace 2024 | 仍需 likelihood 近似;且是 pairwise 不是 reward-aware |
| Reward backprop | DRaFT, DPOK | 需要可微 reward 且 backprop 经过长 chain,易梯度爆炸 |
| RWR / RFT | 各种 reward-weighted regression | 只学正样本,在 diffusion 上崩溃 |
| Policy guidance | classifier guidance 类 | 需额外引导模型,推理开销翻倍 |
| DiffusionNFT 的位置是唯一一个同时做到 likelihood-free、solver-agnostic、CFG-free、off-policy、且使用监督式 loss 的方法。 |
6.3 未来价值
- diffusion 监督训练与 RL 训练的统一框架——若 \(r=1\),DiffusionNFT 退化为标准 flow matching;若 \(r\) 是连续奖励,则是 RL。pretraining 与 post-training 不再需要换 codebase。
- 视频 diffusion / 3D 生成的 RL 化——这些场景下反向轨迹更长,FlowGRPO 路线的轨迹存储开销几乎不可承受,而 DiffusionNFT 只要采样到 \(\mathbf{x}_0\) 即可。
- reward model 设计空间扩展——既然不要求 reward 可微,任何 black-box reward(包括 LLM-as-a-judge)都可以直接接入。
- diffusion world model 的 RL 训练——把 DiffusionNFT 当成 world model 的 fine-tune 工具,可能是一个潜在的下游应用。
7. 一句话回顾
DiffusionNFT 的核心是发现:在 flow matching 这种"有监督回归"框架下,RL 的策略改进方向可以被 \(r\) 与 \(1-r\) 加权的正负样本对完全编码进 loss 本身。这让 diffusion RL 第一次可以脱离反向链的概率论框架,变成一个"带正负标签的有监督微调"问题,从而同时获得求解器自由、CFG 自由、似然自由与轨迹存储自由——并把 RL 训练效率推进一个数量级。
附:速查公式表
| 量 | 形式 |
|---|---|
| 前向核 | \(\mathbf{x}_t = \alpha_t\mathbf{x}_0 + \sigma_t\mathbf{\epsilon}\) |
| Flow matching loss | \(\mathbb{E}|\mathbf{v}_\theta - \mathbf{v}|^2\) |
| Reinforcement guidance | \(\mathbf{v}^* = \mathbf{v}^{\text{old}} + \tfrac{1}{\beta}\Delta\) |
| 隐式正策略 | \(\mathbf{v}_\theta^+ = (1-\beta)\mathbf{v}^{\text{old}} + \beta\mathbf{v}_\theta\) |
| 隐式负策略 | \(\mathbf{v}_\theta^- = (1+\beta)\mathbf{v}^{\text{old}} - \beta\mathbf{v}_\theta\) |
| DiffusionNFT loss | \(\mathbb{E}\big[r|\mathbf{v}_\theta^+ - \mathbf{v}|^2 + (1-r)|\mathbf{v}_\theta^- - \mathbf{v}|^2\big]\) |
| 最优收敛点 | \(\mathbf{v}_{\theta^*} = \mathbf{v}^{\text{old}} + \tfrac{2}{\beta}\Delta\) |
| 奖励最优性归一化 | \(r = \tfrac{1}{2} + \tfrac{1}{2}\operatorname{clip}\!\big[(r^{\text{raw}} - \bar r)/Z_{\mathbf{c}}, -1, 1\big]\) |
| EMA 更新 | \(\theta^{\text{old}} \leftarrow \eta_i \theta^{\text{old}} + (1-\eta_i)\theta\) |
附录:公式推导
A. DiffusionNFT 公式推导过程解析
下面按论文逻辑,将 DiffusionNFT 从基础 flow matching 推导至最终训练目标,主线为:
论文正式版本为 ICLR 2026,核心推导位于第3节和附录A。
A1. 从标准 flow matching 开始
给定干净图像:
前向加噪过程写成:
沿时间求导,条件轨迹的瞬时速度为:
标准 flow-matching 损失是:
其中 \(v_\theta\) 是模型预测的边缘速度场,采样 ODE 为:
对于 rectified flow:
所以:
这是 DiffusionNFT 最终仍然使用的监督学习基础。
A1.1 为什么 MSE 最优解是条件平均速度
对固定的 \((x_t,c,t)\),最小化:
的最优解是:
这是标准平方误差回归的条件均值性质。
为了把它写成关于 \(x_0\) 后验均值的形式,由:
代入 \(u_t\):
定义:
则任意数据分布 \(\pi\) 的最优速度场为:
这条“速度场是 \(x_0\) 后验均值的仿射函数”的性质,是后面正负速度场分解成立的关键。
A2. 将奖励解释为 optimality probability
DiffusionNFT 引入二元随机变量:
其中:
表示样本是“optimal”的。
将归一化后的奖励定义为:
注意,这并不意味着真的要随机把每张图划成正负样本。它是一个概念上的概率分解:
- 以概率 \(r(x_0,c)\) 属于正分布;
- 以概率 \(1-r(x_0,c)\) 属于负分布。
设当前用于 rollout 的策略为:
定义当前策略的平均 optimality:
论文据此构造正、负策略分布。
A3. 正分布和负分布
根据贝叶斯公式:
同理:
因此:
两式相加:
即旧策略是正、负策略的混合分布。
A4. 为什么正策略的期望奖励更高
论文给出:
这个结论可以直接推导。
记:
正策略下的期望奖励:
与旧策略比较:
同理,负策略下:
所以:
因此:
当奖励不是常数且 \(0<Z<1\) 时,两个不等式严格成立。
所以,单纯让模型拟合 \(\pi^+\) 已经能够带来策略改进,这对应 rejection fine-tuning;DiffusionNFT 的目的则是同时利用负分布。
A5. 从干净分布混合推到 noisy marginal 混合
所有三个分布使用相同的前向核:
定义其 noisy marginal:
其中:
由于前向扩散是一个线性积分算子,对:
两边同时加噪,可得:
也就是说,干净数据分布的混合关系在每个噪声时刻都保持成立。
A6. 推导 noisy state 下的后验分解
接下来研究:
定义:
论文把这个量记作 \(\alpha(x_t)\)。这里改用 \(\gamma_t\),避免和噪声调度中的 \(\alpha_t\) 混淆。
由贝叶斯公式:
它表示:
只观察 noisy latent \(x_t\) 时,该 latent 最终来自正样本的后验概率。
相应地:
于是旧策略的 clean posterior 可以写成:
这是附录 Lemma A.2。
A6.1 一个重要等式
从定义还可得到:
以及:
这两个式子稍后用于把“reward-weighted 旧策略损失”变成“正负分布上的 flow-matching 损失”。
A7. 从后验分解推到速度场分解
根据第 1 节:
而后验分解给出:
代入速度表达式:
所以:
这是 DiffusionNFT 最关键的速度场混合公式。
A8. 推导 reinforcement guidance 方向
由:
可以得到:
以及:
因此:
论文将共同的向量定义为:
等价地:
这说明两个看似不同的操作:
和:
实际上方向完全一致,只是尺度不同。论文称 \(\Delta\) 为 reinforcement guidance。
A8.1 几何直觉
速度场在某个固定的 \((x_t,c,t)\) 上都是高维向量:
由于:
旧速度场必然位于正、负速度场之间的线段上:
因此:
这不是经验假设,而是正负分布混合和 MSE 条件均值性质共同推出的。
A9. 概念上的策略改进目标
DiffusionNFT 首先提出:
其中:
是 guidance strength。
由于:
若理论上选择:
则:
而前面已经证明:
所以达到 \(v^+\) 就对应一个奖励更高的策略。这里的 \(\beta=\gamma_t(x_t)\)主要用于理论说明;实践中论文把 \(\beta\) 作为超参数。
问题在于:
- 我们没有独立训练好的 \(v^+\);
- 也没有独立训练好的 \(v^-\);
- 不希望维护三个模型。
所以论文接下来引入隐式参数化。
A10. 隐式正策略和隐式负策略
定义待训练模型:
以旧模型为中心,构造两个对称分支:
以及:
令:
则上述两式可以写成:
所以两个隐式分支关于旧策略对称:
直观上:
- 增大 \(v_\theta\) 向某个方向移动,会令隐式正策略沿该方向移动;
- 同时令隐式负策略沿相反方向移动。
这使一个参数模型同时承担“拟合正策略”和“排斥负策略”的作用。
A11. DiffusionNFT 的最终损失
对 rollout 图像:
重新进行前向加噪:
并计算真实条件速度:
定义损失:
这里:
- 高奖励样本主要训练隐式正分支;
- 低奖励样本主要训练隐式负分支;
- \(r=0.5\) 时两个分支贡献相同。
这是论文公式(5)。
A12. 将 reward-weighted loss 改写为正负分布损失
对固定的 \((x_t,c,t)\),根据前面的关系:
因此:
同理:
于是损失等价于:
也就是说,虽然代码只从旧策略样本训练,但奖励加权使它在期望意义上等价于分别对正分布和负分布做 flow matching。
A13. 利用 MSE 偏差—方差分解
对于任意随机变量 \(U\) 和确定向量 \(a\):
第二项与 \(a\) 无关。
正分布下:
负分布下:
所以忽略与 \(\theta\) 无关的常数 \(C\):
这一步表明,DiffusionNFT 的实际损失确实在隐式地要求:
A14. 求这个二次目标的闭式最优解
记:
隐式参数化为:
而由 \(\Delta\) 的定义:
所以:
同理:
所以:
A14.1 正分支误差
A14.2 负分支误差
代回损失:
A15. 对 \(d_\theta\) 求最优解
对于固定的 \((x_t,c,t)\),对 \(d_\theta\) 求导:
展开:
因为:
所以:
得到:
由于:
最终:
这就是论文 Theorem 3.2 / Theorem A.4 的结论。
A16. 为什么最后是 \(2/\beta\),而不是 \(1/\beta\)
这是阅读论文时最容易困惑的地方。
论文公式(3)首先提出概念上的 guidance target:
但完整的双分支损失最终得到:
这个因子 2 来自两个分支:
正分支的加权贡献是:
负分支的加权贡献是:
相加得到:
也就是说:
这不是代数错误。由于 \(\beta\) 本身是可调超参数,该常数因子也可以吸收到 \(\beta\) 的定义中。
A17. 用一个简单的一维例子理解
假设某个位置:
并且:
那么:
guidance 为:
从负策略一侧计算:
两者完全一致。
若:
双分支目标的最优模型输出为:
它从旧速度 \(4\) 向正速度 \(10\) 明显移动,但没有必然等于 \(10\)。因此,实践中的实际移动程度由:
- \(\beta\);
- 优化步数;
- 学习率;
- 有限模型容量;
- EMA 旧策略;
共同决定。
A18. 实践中的奖励归一化
实际 reward model 输出通常不是 \([0,1]\) 概率。论文先对每个 prompt 的 group reward 去均值:
再映射成:
因此:
- 高于组均值的样本:\(r>0.5\);
- 低于组均值的样本:\(r<0.5\);
- 等于组均值:\(r=0.5\)。
这个 \(r\) 被当作 optimality probability,而不需要真的进行 Bernoulli 抽样。
A19. 完整训练流程
一次在线迭代可以写成:
Rollout
使用:
生成 \(K\) 张图:
计算并归一化奖励:
只保存:
Forward training
重新采样:
构造:
前向计算:
构造:
优化:
更新 rollout policy
论文使用 EMA:
从而让采样策略与训练策略软更新,而不是每轮完全同步。
A20. 整个推导最核心的三条等式
真正需要抓住的是以下三条。
第一,正负分布分解:
第二,速度场分解:
第三,最终隐式优化结果:
因此 DiffusionNFT 本质上是在做:
A21. 推导依赖的假设
论文的闭式结论需要注意几个理想假设:
- 无限数据:reward-weighted 样本分布能够精确表示 \(\pi^+\) 和 \(\pi^-\)。
- 无限模型容量:网络可以在每个 \((x_t,c,t)\) 上达到条件 MSE 最优解。
- 共同的前向核:\(\pi^+,\pi^-,\pi^{\mathrm{old}}\) 都通过相同的 \(q_t(x_t\mid x_0)\) 加噪。
- 奖励是合法概率:
- 优化阶段固定旧策略:推导 \(v_\theta^*\) 时,\(v^{\mathrm{old}}\) 被视为固定函数。
因此,该定理严格证明的是理想条件下的目标速度场。它没有直接证明在有限 batch、LoRA、固定学习率和常数 \(\beta\) 下,每一次实际梯度更新都会单调提高奖励。
草稿推导






代码解析
DiffusionNFT 训练过程与三大预测分析
对应命令:
torchrun --nproc_per_node=8 scripts/train_nft_sd3.py --config config/nft.py:sd3_multi_reward
1. 整体流程概览
用 8 卡 DDP + fp16,在 SD3.5-medium 上挂两个 LoRA 适配器,以「PickScore + HPSv2 + CLIPScore」三项加权为奖励,执行 DiffusionNFT 的在线强化学习。每个 outer epoch 分两大阶段:
- 采样(数据采集):
old策略 + dpm2 高阶求解器生成图像,异步计算多奖励。 - 训练(前向过程优化):在 clean latent 上做前向加噪,用 NFT 损失(自适应加权的正/负预测 + KL)更新
default策略。
核心创新:训练阶段丢弃了采样轨迹(
all_log_probs被_丢弃,见 train_nft_sd3.py:643),直接在 forward process 上做策略优化——这是其"求解器无关、内存高效"的关键。
2. 双 LoRA 适配器设计
模型上挂了两个 LoRA 适配器(train_nft_sd3.py:419-445):
| 适配器 | 含义 | 是否训练 |
|---|---|---|
default |
当前训练策略 \(v_\theta\) | 是(AdamW 优化) |
old |
行为/采样策略 \(v^{\text{old}}\) | 否(每 epoch 末衰减追踪 default) |
初始时 old ← default(:576-580);每个 outer epoch 结束后(:1034-1039):
其中 decay = return_decay(global_step, decay_type=1)(:169)线性增长 step*0.001,上限 0.5。即 old 缓慢追踪 default,使行为策略既稳定又逐步改进。
3. 前向过程训练核心
对每个(样本,时间步 \(j\))(train_nft_sd3.py:854-988):
3.1 前向加噪(Forward Process)
其中 \(x_0 =\) latents_clean(采样得到的干净 latent)。这是与 GRPO 的根本区别——直接在干净图上前向加噪,而非依赖整条采样轨迹。
3.2 三次前向预测
三次前向输入完全相同(xt, timestep, embeds, pooled_embeds),区别只在于激活哪个 LoRA 状态、是否带梯度。
| 预测 | 适配器状态 | 梯度 | 数学含义 | 损失中的角色 |
|---|---|---|---|---|
old_prediction |
set_adapter("old") |
no_grad + .detach() |
\(v^{\text{old}}\) 行为策略 | 构造正/负预测的锚点 |
forward_prediction |
set_adapter("default") |
有梯度 | \(v_\theta\) 当前训练策略 | 唯一被优化的量,出现在策略损失 + KL |
ref_forward_prediction |
disable_adapter()(基模型) |
no_grad | \(v_{\text{ref}}\) 预训练冻结模型 | 仅用于 KL 正则 |
transformer_ddp.module.set_adapter("old")
with torch.no_grad():
old_prediction = transformer_ddp(...)[0].detach() # v^old,行为策略
transformer_ddp.module.set_adapter("default")
forward_prediction = transformer_ddp(...)[0] # v_theta,带梯度(唯一)
with torch.no_grad(): # Reference model
with transformer_ddp.module.disable_adapter(): # 关闭所有 LoRA = 基座
ref_forward_prediction = transformer_ddp(...)[0] # v_ref,预训练冻结
old_prediction = \(v^{\text{old}}\)(行为/采样策略)
"old"是一个独立的 LoRA 适配器,就是阶段 A 采样生成这批 clean 图像的那个策略。- 训练时冻结,每个 outer epoch 末尾通过衰减更新缓慢追踪
default。 - 它的预测代表"产生这批(已打分)样本的策略本身会怎么预测",是构造正/负目标的参考锚点。
forward_prediction = \(v_\theta\)(当前训练策略)
"default"适配器,保留梯度——唯一requires_grad的预测。- 所有梯度都从这里回流到
"default"的 LoRA 参数。 - 同时进入策略损失(经 positive/negative)和 KL 损失。
ref_forward_prediction = \(v_{\text{ref}}\)(预训练参考模型)
disable_adapter()临时关闭所有 LoRA,即纯基座 SD3.5-medium(预训练权重,从不更新)。- 只出现在 KL 项:
kl = (forward - ref)^2(:966),loss += train.beta · kl。
3.3 损失构造
模型预测的是流匹配速度 \(v\),满足 \(x_0 = x_t - t\cdot v\)。策略损失部分(:934-960):
positive_prediction = β·forward + (1-β)·old # β = config.beta = 0.1
implicit_negative_prediction = (1+β)·old - β·forward
x0_pos = xt - t·positive_prediction # 正目标:逼近 clean 图 x0
x0_neg = xt - t·implicit_negative_prediction # 负目标:隐式远离 x0
policy_loss = r·(positive_loss/β) + (1-r)·(negative_loss/β) # r∈[0,1] 是归一化优势
loss = policy_loss + train.β · KL(forward, ref)
- 高奖励样本(\(r\to1\)):最小化
positive_loss,把forward推向使 \(x_0^{\text{pos}}\to x_0\) 的方向(即强化好样本); - 低奖励样本(\(r\to0\)):最小化
negative_loss,把forward推向使 \(x_0^{\text{neg}}\) 远离 \(x_0\) 的方向(即抑制差样本)。
forward同时出现在正负两个目标里且都带梯度,所以同一预测同时承担"靠近好样本"和"远离差样本"两个信号;old仅作为构造这两个目标的(冻结)基底。"implicit negative"(隐式负)之名正源于此:不需要显式的负样本/负模型,直接用old和forward的线性组合隐式构造负目标。
4. 关键区别:old vs ref
两者都是"冻结、no_grad"的预测,但用途和本质完全不同:
old |
ref |
|
|---|---|---|
| 是什么 | 一个会缓慢更新的 LoRA 适配器 | 基座模型(无 LoRA,永不更新) |
| 角色 | 行为策略:构造正/负预测的局部 RL 锚点 | 预训练锚点:KL 正则的全局基准 |
| 出现在 | 策略损失(positive/negative) | 仅 KL 损失 |
| 为何不能互换 | 用 old 构造目标,因为数据是 old 采的(带 off-policy / 重要性采样的含义) |
old 会向 forward 收敛,KL(forward, old) 最终 →0,无法提供正则;只有冻结的 ref 才能持续约束不漂移 |
一句话总结三者分工:
KL(forward, ref)= "别离预训练模型太远"(防奖励 hacking / 模式坍塌的全局约束);- 正/负目标用
old= "在当前行为策略采到的这批数据上,按奖励改进"(局部 RL 信号); forward= 唯一被优化的对象,同时接受上述两类梯度。
old 提供局部改进基线,forward 是被优化的对象,ref 提供全局防漂移约束。
5. 关键超参(sd3_multi_reward)
| 参数 | 值 | 含义 | 来源 |
|---|---|---|---|
pretrained.model |
stabilityai/stable-diffusion-3.5-medium |
基座 | nft.py:19 |
sample.num_steps |
25 | 采样步数(被覆盖) | nft.py:136 |
sample.guidance_scale |
1.0 | 关闭 CFG | nft.py:64 |
sample.solver |
dpm2 |
高阶 ODE 采样器 | nft.py:66 |
config.beta |
0.1 | 正/负预测混合系数 β | nft.py:137 |
train.beta |
1e-4 | KL 权重 | base.py:89 |
train.adv_clip_max |
5 | 优势裁剪范围 | base.py:84 |
train.timestep_fraction |
0.99 | 训练时间步子集比例 | base.py:87 |
num_image_per_prompt |
24 | 每 prompt 采样数 | nft.py:28 |
reward_fn |
{pickscore, hpsv2, clipscore} 各权重 1 |
多奖励加权 | nft.py:123-127 |
派生量:
num_train_timesteps = int(25 × 0.99) = 24train_batch_size = 9,num_batches_per_epoch = 16→ 每 epoch 全局9×8×16 = 1152张样本(= 48 prompt × 24 张/prompt)gradient_accumulation_steps = 16effective_grad_accum_steps = 16 × 24 = 384(每 384 次反向做一次 optimizer.step)- 每 inner epoch 约 9 次梯度更新(
3456 / 384)


浙公网安备 33010602011771号