资讯动态

读懂DiffusionNFT核心损失函数:从advantage加权到隐式正负策略优化逐行解析

发布时间:2026/10/15 14:22:54 来源:尧图企业网站定制
【免费下载链接】DiffusionNFT[ICLR 2026 Oral] DiffusionNFT: Online Diffusion Reinforcement with Forward Process项目地址https://gitcode.com/gh_mirrors/di/DiffusionNFT点击查看免费下载DiffusionNFT 是 ICLR 2026 Oral 论文开源的在线扩散强化学习Diffusion RL框架它直接在前向加噪过程上对扩散模型做策略优化。这篇文章带你逐行读懂它的核心损失函数从 advantage 加权、隐式正/负策略的构造到自适应加权 flow-matching 损失与 KL 正则一次看懂这个高效强化学习方案的完整推导路径。1 先看它要解决什么问题 在 DiffusionNFT 之前扩散模型做强化学习的主流做法是 GRPOFlow-GRPO 路线。它有一个硬性前提必须保存完整的采样轨迹$x_T \to x_{T-1} \to \dots \to x_0$然后逐步计算策略概率 $\pi_\theta(x_t|x_{t1})$ 来做策略梯度。这带来两个痛点显存开销大整条轨迹都要存下来采样器被绑定只能用特定的 ODE 求解器换高阶黑盒求解器就做不了策略梯度。DiffusionNFTNFT Negative-aware Finetuning的思路非常直接只保留采样得到的干净图 $x_0$训练时主动给它重新加噪把强化信号写进标准 flow-matching 损失里。正如 README.md 中描述的三步流水线Data Collection用旧策略 $v^\text{old}$ 生成图像奖励模型打分 $r(x_0)$Conceptual Data Split按奖励高低把图像概念上划分为正、负两个子集Forward Process Optimization在加噪图像上优化训练策略 $v_\theta$用一个新损失函数按奖励加权隐式正/负目标。对应到代码采样阶段只存了干净潜变量而没有存轨迹scripts/train_nft_sd3.pylatents_clean: latents[:, -1], # 只保留干净图像而传统 GRPO 需要的latents全轨迹和log_probs在此完全不需要。2 advantage 是怎么算的按提示分组的组内标准化强化学习里这张图比平均好多少由 advantage 表示。DiffusionNFT 对每个 prompt 生成一组图像默认 24 张见 config/nft.py 的num_image_per_prompt 24组内做均值-方差标准化。核心逻辑在 flow_grpo/stat_tracking.py 的PerPromptStatTracker.updatemean np.mean(self.stats[prompt], axis0, keepdimsTrue) std np.std(rewards, axis0, keepdimsTrue) 1e-4 # global_std 时用全局标准差 advantages[prompts prompt] (prompt_rewards - mean) / std含义一目了然reward 高于组内均值的图像 advantage 为正低于均值的为负。训练脚本在 scripts/train_nft_sd3.py 处调用它并把 advantage 按时间步维度广播同一张图在所有噪声时间步共享同一个 advantage。拿到 advantage 后还有一层裁剪与模式选择scripts/train_nft_sd3.pyadvantages_clip torch.clamp(advantages, -adv_clip_max, adv_clip_max) # 默认 ±5配置项adv_mode支持多种信号强度all完整正负、positive_only只留正、negative_only只留负、one_only正负二值化、binary取符号。默认配置为allconfig/nft.py。3 核心构造隐式正策略与隐式负策略这是 DiffusionNFT 最有意思的地方。传统做法是正向采样好图、负向少采样坏图而 NFT 在一次前向预测里同时合成出两个策略# scripts/train_nft_sd3.py L934-L937 positive_prediction beta * forward_prediction (1 - beta) * old_prediction.detach() implicit_negative_prediction (1 beta) * old_prediction.detach() - beta * forward_prediction其中forward_prediction是当前训练参数 $v_\theta$ 的预测old_prediction是旧策略 $v^\text{old}$ 的预测训练时 detach不回传梯度beta是混合系数控制新策略占多大权重默认config.beta 1.0config/nft.py。直觉上隐式策略公式含义正策略 $v^$$\beta v_\theta (1-\beta) v^\text{old}$向当前策略方向改进模仿好样本负策略 $v^-$$(1\beta) v^\text{old} - \beta v_\theta$把 $v_\theta$ 从 $v^\text{old}$ 上反方向推出去远离坏样本也就是说同一组参数、同一次前向既能被拉近好图又能被推离坏图——正负目标被隐式地编码进了参数更新方向里。4 损失函数逐行解析自适应加权的 flow-matching拿到两个隐式策略后先各自从带噪图 $x_t$ 反推干净图预测flow-matching 关系 $x_0 x_t - t \cdot v$# scripts/train_nft_sd3.py L940-L947 x0_prediction xt - t_expanded * positive_prediction weight_factor abs(x0_prediction - x0).mean(...).clip(min1e-5) # 自适应权重 positive_loss ((x0_prediction - x0) ** 2 / weight_factor).mean(...)weight_factor是关键细节它用该样本当前的预测误差均值做分母把困难样本与简单样本的损失拉平难度归一化避免大误差样本主导梯度。负分支完全对称scripts/train_nft_sd3.py。最后advantage 在这里完成加权——这就是标题里advantage 加权的落点scripts/train_nft_sd3.pyr clamp(advantages_clip / adv_clip_max / 2 0.5, 0, 1) # 归一化到 [0,1] ori_policy_loss r * positive_loss / beta (1 - r) * negative_loss / beta policy_loss (ori_policy_loss * adv_clip_max).mean()拆解一下radvantage 5极好→ r 1 →纯正损失全力逼近好图advantage 0平均水平→ r 0.5 → 正负各半advantage -5极差→ r 0 →纯负损失全力远离坏图。1/beta是梯度缩放对 $v_\theta$ 求导时 $\partial v^/\partial\theta \beta$除掉它保证损失尺度稳定* adv_clip_max则把归一化时的除回去保持损失量级合理。5 别忘了 KL 正则防止强化学习把基座模型带崩损失里加了一项与参考模型的 KL 距离用 flow-matching 下的 MSE 近似scripts/train_nft_sd3.pykl_div_loss ((forward_prediction - ref_forward_prediction) ** 2).mean(...) loss policy_loss config.train.beta * torch.mean(kl_div_loss)config.train.beta即 KL 系数默认1e-4config/base.py权重很小但不可或缺。6 训练全流程与关键配置 ️把上面串起来一个 epoch 的完整循环是采样打分 → 算 advantage → 多次内循环重训每次重新随机加噪→ EMA 更新旧策略。旧策略的更新是指数衰减式scripts/train_nft_sd3.pytgt_param.data.copy_(tgt_param * decay src_param * (1.0 - decay))关键超参数一览参数默认值位置beta隐式策略混合系数1.0部分任务 0.1config/nft.pyadv_clip_maxadvantage 裁剪5config/base.pytrain.betaKL 系数1e-4config/base.pynum_image_per_prompt组大小24config/nft.pydecay_type旧策略衰减1 / 2scripts/train_nft_sd3.py本地快速上手git clone https://gitcode.com/gh_mirrors/di/DiffusionNFT cd DiffusionNFT pip install -e . # 8 卡训练 GenEval torchrun --nproc_per_node8 scripts/train_nft_sd3.py --config config/nft.py:sd3_geneval训练入口为 scripts/train_nft_sd3.py多奖励配置见 config/nft.py。7 总结为什么这个损失值得读前向一致性强化信号直接融进标准 flow-matching 目标不需要反向 SDE 轨迹任何黑盒采样器都能用省显存只存干净图 $x_0$不存整条采样轨迹正负一体advantage 归一化成 $r \in [0,1]$ 后在隐式正/负两个目标间连续插值一张前向预测同时完成拉好图 推坏图工程友好损失形式与常规扩散微调一致可直接接入现有训练代码库。从 advantage 组内标准化 → 隐式正负策略构造 → 自适应加权 flow-matching → KL 约束四步环环相扣。读懂这四段代码你就掌握了 DiffusionNFT 的全部核心。赞分享【免费下载链接】DiffusionNFT[ICLR 2026 Oral] DiffusionNFT: Online Diffusion Reinforcement with Forward Process项目地址https://gitcode.com/gh_mirrors/di/DiffusionNFT点击查看免费下载相关推荐OSlash核心原理解析单子定律在Python中的实现OSlash核心原理解析单子定律在Python中的实现 OSlash是一个专注于在Python中实现函数式编程概念的库核心提供了Functors函子、A终极指南一文读懂YOLOv4损失函数从原理到实战的目标检测优化技巧终极指南一文读懂YOLOv4损失函数从原理到实战的目标检测优化技巧 YOLOv4作为当前最流行的目标检测算法之一其损失函数设计直接影响检测精度与速度。本文将人工智能深度学习计算机视觉如何高效理解Monodepth2深度估计模型的损失函数与优化策略全解析如何高效理解Monodepth2深度估计模型的损失函数与优化策略全解析 Monodepth2是一个基于单目图像的深度估计模型通过深度学习技术从单张图像中估计计算机视觉深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑