【免费下载链接】HY-SOAR
HY-SOAR:Self-Correction for Optimal Alignment and Refinement in Diffusion Models
HY-SOAR 是一个面向扩散模型(SD3.5-Medium)的免奖励(reward-free)后训练方法,核心思想是让模型在去噪过程中"自我纠错"。它不依赖奖励模型、偏好标签或负样本,而是通过单步 rollout 生成离轨状态,再沿噪声端点方向插值出辅助监督点,用解析解作为修正目标去监督模型。本文将带你深入 soar/train_soar_sd3_5m.py 与 soar/utils/algorithm.py,看懂这套训练信号是如何一步步构造出来的。
SOAR 训练流程总览
先看整体流程图:从干净图像编码出的 latent $z_0$ 出发,模型先做一步 ODE rollout 到达离轨点 $z_{off}$,再沿着"re-noise ray"把离轨点逐步加噪回纯噪声 $z_1$,得到一系列 re-noised latents;每个点都配有解析修正速度 $v_{corr}$ 作为监督目标。
整个训练循环可以概括为四步:
- 构造噪声状态:VAE 编码图像得到 $z_0$,采样噪声 $z_1$ 与时间步 $t_0$,按 $z_{\sigma} = (1-\sigma)z_0 + \sigma z_1$ 混合;
- 主损失:标准的 flow-matching 损失,目标为 $v_{gt} = z_1 - z_0$;
- 单步 rollout:用当前模型(CFG 组合后)从噪声状态走一步,得到离轨点 $z_{t'}$;
- 辅助损失:在离轨点与 $z_1$ 之间插值出多个辅助监督点,逐一用修正速度监督。
单步 rollout:让模型"先走错一步"
rollout 的目的不是生成图片,而是制造模型自己会遇到的错误状态。SFT 训练时模型看到的是"理想噪声状态",而推理时它看到的是自己上一步预测出来的状态——这种分布错配(exposure bias)正是 SOAR 要修正的。
第一步:CFG 组合速度
在 soar/train_soar_sd3_5m.py 中,训练循环先把无条件与条件文本 embedding 拼接成一次 batch 送入 transformer,一次前向同时拿到 $v_{uncond}$ 和 $v_{cond}$,再组合出 CFG 速度:
v_cfg = (v_uncond + cfg_scale_sampling * (v_cond - v_uncond)).detach()注意.detach():rollout 过程不回传梯度,只用来"造数据"。cfg_scale_sampling默认 4.5,模拟真实推理时的引导强度。
第二步:走一步 ODE(或随机路径)
核心函数 single_step_aux_points 的第一步是推进一个采样步长:
t1 = t0 - 1 / num_sampling_steps # 默认 40 步,即前进一步ODE 路径在 algorithm.py 第187-190行 中实现,就是一次欧拉积分:
z_t1_prime_ode = z_t0 + v_cfg * (sigma_t1 - sigma_t0)当--num_rollout_paths > 1时,还会额外生成随机路径。stochastic_rollout_step 支持四种模式:simple(附加高斯噪声的欧拉-马鲁耀)、sde(diffusers 风格随机采样)、flow_sde(反向 SDE 步)和cps(系数保持采样)。随机路径只在未触底($t_1 > 0$)的样本上启用——已经走到干净端的样本只保留 ODE 路径,这在 algorithm.py 第193-215行 中有明确的hit_clean_boundary判断。
下图直观展示了 on-trajectory 与 off-trajectory 的区别:红色虚线是模型 rollout 走出轨道后的修正过程,黑色实线是理想轨迹。
辅助监督点:从离轨点插值回噪声端点
拿到离轨点 $z_{t'}$ 后,SOAR 并不直接丢弃它,而是把它"重新加噪"回同一个噪声端点$z_1$。插值逻辑在内部函数_append_interpolated中(algorithm.py 第159-185行):
- 在 sigma 区间 $[\sigma_{t1},\ \min(\sigma_{upper} \cdot \sigma_{t0},\ 1)]$ 内,对每条路径均匀采样
points_per_path个随机分数(默认 6 个); - 按分数 $\alpha$ 在离轨点与纯噪声之间线性插值:
z_interp = (1 - alpha) * z_t1_prime + alpha * z_1这样每条 rollout 路径都会产出--trajectory_length(默认 6)个辅助监督点,每个点自带 sigma 和对应 timestep,打包成{"sample_indices", "latents", "sigmas", "timesteps"}返回。
修正目标:一个干净的解析解
回到 训练主循环第570-601行,对每个辅助点计算修正目标:
v_corr = (z_t_prime - z_0) / sigma_t_prime因为 $z_{t'}$ 本身就是 $(1-\sigma_{t'})z_{t1'} + \sigma_{t'} z_1$ 的插值,所以 $\frac{z_{t'} - z_0}{\sigma_{t'}}$ 恰好是"从这个离轨状态回到真值方向"的精确速度——不需要额外的标签数据。随后让模型在 $z_{t'}$ 上预测速度,与 $v_{corr}$ 做加权 MSE,累加进loss_aux。
损失合并与分布式归一化
SOAR 的总损失把主损失和辅助损失按样本数统一归一化(train_soar_sd3_5m.py 第604-616行):各 rank 先all_reduce汇总主/辅样本计数,再计算
loss_total = (loss_main + loss_aux) / (主样本数 + λ·辅助点数)其中--lambda_aux(默认 1.0)控制辅助损失的权重。这种设计让辅助点的数量变化(比如不同路径数)不会悄悄改变梯度尺度,多卡训练也保持稳定。
关键超参数速查表
| 参数 | 默认值 | 作用 |
|---|---|---|
--num_rollout_paths | 1 | rollout 路径数,1 为纯 ODE,>1 增加随机路径 |
--trajectory_length | 6 | 每条路径生成的辅助监督点数 |
--num_sampling_steps | 40 | 决定 rollout 的单步步长(1/40) |
--sde_rollout_type | flow_sde | 随机 rollout 模式(simple/sde/flow_sde/cps) |
--sde_noise_scale | 0.5 | 随机 rollout 的噪声强度 |
--cfg_scale_sampling | 4.5 | rollout 使用的 CFG 引导强度 |
--lambda_aux | 1.0 | 辅助 SOAR 损失权重 |
--sigma_upper_ratio | 1.5 | 辅助点 sigma 上限(防止插值过远) |
数据侧则很简单:每行 JSONL 提供md5、caption_en、bw、bh字段,多分辨率分桶采样由 soar/utils/data.py 中的build_bucket_dataloader完成,图像在训练时经 VAE 实时编码,无需预缓存 latent。
训练效果:免奖励仍胜过基于奖励的方法
SOAR 在 DrawBench 上将 SD3.5-Medium 的 GenEval 从 0.70 提升到 0.78,OCR 从 0.64 提升到 0.67,且训练全程未使用任何奖励模型。在与 Flow-GRPO 的正面对比中(后者显式用 Aesthetic/ClipScore 作为奖励信号),SOAR 的终值同样更高,如下方曲线所示。
在 WebUI 与版式设计类生成任务中,SOAR 训练的模型展现出准确的布局、字体与视觉层次,说明"单步 rollout + 辅助监督点"这套稠密信号确实改善了对齐质量。
小结
HY-SOAR 的巧妙之处在于"三免":免奖励模型、免偏好标签、免负样本。它的实现也极简——核心逻辑集中在两个文件里:soar/train_soar_sd3_5m.py 负责训练循环与损失合并,soar/utils/algorithm.py 封装单步 rollout 与辅助监督点生成。理解了"走一步 → 插值回 $z_1$ → 用解析解监督"这条主线,你就能轻松复现并扩展这一免奖励的自纠错后训练范式。
【免费下载链接】HY-SOAR
HY-SOAR:Self-Correction for Optimal Alignment and Refinement in Diffusion Models
相关推荐
Hugo Annotation处理器:编译期如何生成辅助代码
Hugo Annotation处理器:编译期如何生成辅助代码 你是否还在为调试时手动编写日志代码而烦恼?是否希望有一种方式能自动记录方法调用参数、返回值和执行时
开发工具移动开发深入qutebrowser源码(一):QtWebEngine后端与JavaScript注入是如何工作的
深入qutebrowser源码(一):QtWebEngine后端与JavaScript注入是如何工作的 qutebrowser 是一个基于 Python 和 Q
桌面应用突破性能瓶颈:Ultralytics YOLOv9辅助监督机制深度解析
突破性能瓶颈:Ultralytics YOLOv9辅助监督机制深度解析 你是否还在为目标检测模型的训练效率和精度平衡而困扰?当模型陷入局部最优解无法提升时,是否
人工智能计算机视觉深度学习机器学习预训练模型推理服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考