YAOTU INSIGHTS

深入HY-SOAR源码:单步rollout与辅助监督点是如何生成的?

深入HY-SOAR源码:单步rollout与辅助监督点是如何生成的?
【免费下载链接】HY-SOARHY-SOAR:Self-Correction for Optimal Alignment and Refinement in Diffusion Models项目地址https://gitcode.com/gh_mirrors/hy/HY-SOAR点击查看免费下载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附加高斯噪声的欧拉-马鲁耀、sdediffusers 风格随机采样、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_paths1rollout 路径数1 为纯 ODE1 增加随机路径--trajectory_length6每条路径生成的辅助监督点数--num_sampling_steps40决定 rollout 的单步步长1/40--sde_rollout_typeflow_sde随机 rollout 模式simple/sde/flow_sde/cps--sde_noise_scale0.5随机 rollout 的噪声强度--cfg_scale_sampling4.5rollout 使用的 CFG 引导强度--lambda_aux1.0辅助 SOAR 损失权重--sigma_upper_ratio1.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.78OCR 从 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-SOARHY-SOAR:Self-Correction for Optimal Alignment and Refinement in Diffusion Models项目地址https://gitcode.com/gh_mirrors/hy/HY-SOAR点击查看免费下载相关推荐Hugo Annotation处理器编译期如何生成辅助代码Hugo Annotation处理器编译期如何生成辅助代码 你是否还在为调试时手动编写日志代码而烦恼是否希望有一种方式能自动记录方法调用参数、返回值和执行时开发工具移动开发深入qutebrowser源码一QtWebEngine后端与JavaScript注入是如何工作的深入qutebrowser源码一QtWebEngine后端与JavaScript注入是如何工作的 qutebrowser 是一个基于 Python 和 Q桌面应用突破性能瓶颈Ultralytics YOLOv9辅助监督机制深度解析突破性能瓶颈Ultralytics YOLOv9辅助监督机制深度解析 你是否还在为目标检测模型的训练效率和精度平衡而困扰当模型陷入局部最优解无法提升时是否人工智能计算机视觉深度学习机器学习预训练模型推理服务上一篇快速入门指南用wxauto轻松构建你的微信自动化助手下一篇Qwen3.5-122B-A10B-singprobe源码解析上SingProbeAttnModel与SingProbeMlpModel两种探针架构全拆解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考