AI Post Traning: DanceGRPO
导言
DanceGRPO是25年5月发表的论文,把GRPO的方法引入到了生成领域。(类似的有flowGRPO)。字节客户基于此魔改,故学习。
背景知识:¶
Diffusion Model¶
去噪(Denoising)的本质不是“修改”,而是“根据模糊的线索,重新生成一个全新的清晰样本”。
第一步:前向加噪¶
(理解数据是怎么毁掉的)
- \(z_t\):时间 \(t\) 时刻的图片(它既不是纯图,也不是纯噪,是两者的混合体)。
- \(x\):原始的清晰图片(比如一只猫)。
- \(\epsilon\):纯随机噪声(电视屏幕的雪花点)。
- \(\alpha_t, \sigma_t\):两个控制比例的阀门。
直观理解:
这就像是在调鸡尾酒:
- 杯子里原本有 80% 的猫(\(x\)) 和 20% 的雪花噪点(\(\epsilon\))。
- 随着时间 \(t\) 增加,\(\alpha_t\) 变小(猫的味道变淡),\(\sigma_t\) 变大(油漆味变浓)。
- 到最后(\(t=1\)),杯子里 0% 是猫,100% 是油漆。
第二步:反向去噪¶
(AI 怎么把猫变回来)公式 (2) 看起来很奇怪,它其实分两步走:
目的:我们要算出 \(z_{s}\)(一个比 \(z_t\) 更清晰一点的图片)。
过程:
- AI 的工作(预测噪声): 模型 \(\epsilon_\theta\) 看着满是油漆的图片 \(z_t\),猜这里面有多少是噪声。 它猜的结果叫 \(\hat{\epsilon}\)。
- 人类的工作(重新配比): 我们拿到 AI 猜的噪声 \(\hat{\epsilon}\),然后利用公式 (2) 强行配出一杯新酒: $$ z_s = \alpha_s \mathbf{\hat{x}} + \sigma_s \mathbf{\hat{\epsilon}} $$
关键点解析: * \(\hat{x}\)(x-hat):这是根据公式 (1) 倒推出来的“假原图”。 * 既然 \(z_t = \alpha_t x + \sigma_t \epsilon\), * 那么 \(x\) 应该等于 \((z_t - \sigma_t \epsilon) / \alpha_t\)。 * 但是我们不知道真实的 \(\epsilon\),所以我们用 AI 猜的 \(\hat{\epsilon}\) 来代替。 * \(\hat{\epsilon}\)(epsilon-hat):这是 AI 预测的噪声。
所以,整个过程是:
- 拆解:AI 看着模糊图 \(z_t\),说:“我觉得这里面大概有 80% 是噪声,20% 是图。”(它输出了 \(\hat{\epsilon}\))。
- 重组:我们根据 AI 的判断,把噪声去掉,然后利用公式 (2) 重新混合一个清晰度高一点的图 \(z_s\)。
3. 乘以 \(\sigma_s\) 和 \(\alpha_s\)¶
为什么公式里还要乘以 \(\sigma_s\) 和 \(\alpha_s\)? 这其实是在模拟“时间的流逝”。
- 假设 \(s\) 是第 99 步(非常接近原始图片了)。
- 这时候 \(\alpha_s\) 接近 1(全是图),\(\sigma_s\) 接近 0(几乎没有噪)。
- 公式变成:\(z_s \approx 1 \times \text{AI猜的图} + 0 \times \text{AI猜的噪}\)。
- 结果:输出就是 AI 猜的图,非常清晰。
- 假设 \(s\) 是第 1 步(刚开始生成)。
- 这时候 \(\alpha_s\) 接近 0,\(\sigma_s\) 接近 1。
- 公式变成:\(z_s \approx 0 \times \text{AI猜的图} + 1 \times \text{AI猜的噪}\)。
- 结果:输出就是一堆随机噪声(从 \(z_1\) 开始)。
4. 去噪过程¶
如果你要画一张图来解释这个过程,请按以下步骤:
- 起点:手里拿着一个全是噪点的球(\(z_1\))。
- 循环 50 次:
- 看一眼:把球给 AI 看,问:“这里面大概是什么图案的噪声?”(模型输出 \(\hat{\epsilon}\))。
- 捏造型:根据 AI 的回答,你手里的泥巴(参数)开始变形。
- 你不是在“擦除”噪点,你是在根据 AI 的描述,重新捏一个新球。
- 捏的时候,你遵循公式 (2) 的比例:刚开始捏的时候,主要听噪声的(因为 \(\sigma\) 大);越往后捏,越听 AI 描述的图案(因为 \(\alpha\) 大)。
- 更新:把手里的球换成新捏的球(\(z_s\))。
- 终点:最后一步,\(\sigma\) 变成了 0,你完全不听噪声了,只听 AI 描述的图案。于是你手里出现了一只完美的猫。
一句话总结: 去噪过程就是利用 AI 对噪声的预测 (\(\hat{\epsilon}\)),通过公式 (2) 不断重新混合样本,逐渐把“全是噪点的液体”变成“全是数据的固体”的过程。
修正流(Rectified Flow)¶
1. 前向过程(Forward Process)¶
在修正流中,前向过程被视为数据(\(x\))与噪声(\(\epsilon\))之间的线性插值。
- \(z_t\):时刻 \(t\) 的状态(混合了数据和噪声的中间态)。
- \(x\):原始清晰数据。
- \(\epsilon\):高斯噪声(Gaussian noise),作为生成过程的起点。
- \(t\):时间步,取值范围通常为 。
- 当 \(t=0\) 时,\(z_0 = x\)(纯数据)。
- 当 \(t=1\) 时,\(z_1 = \epsilon\)(纯噪声)。
2. 速度场定义(Velocity)¶
定义 \(u = \epsilon - x\) 为“速度”或“向量场”。
- 通俗理解:这代表了数据点需要以多大的“速度”和方向移动,才能从当前位置变形为噪声(或反之)。
3. 采样/去噪过程(Reverse/Sampling)¶
类似于扩散模型,给定去噪模型在时间步 \(t\) 的输出预测值 \(\hat{u}\),我们可以计算更低噪声水平 \(s\)(即 \(s < t\))的状态:
- \(\hat{u}\):模型预测的“速度”。
- \((s - t)\):时间差(负值,因为 \(s < t\))。
- 逻辑:根据预测的速度,回溯到前一个时间步的状态。这相当于在向量场中进行了一次“反向跳跃”。
这段文字揭示了扩散模型(Diffusion Models)和修正流模型(Rectified Flow Models)在数学形式上的统一性。虽然原文中提到的公式(5)没有直接显示,但根据文字描述,核心在于两者都可以归纳为一种线性的预测形式。
以下是针对该段落的易懂且干练的翻译:
扩散模型与修正流的统一性¶
虽然扩散模型和修正流拥有不同的理论基础,但在实践中,它们本质上是同一事物的两面(一体两面),其通用公式如下:
具体的映射关系如下表所示:
| 模型类型 | 隐变量变换 (\(\tilde{z}\)) | 时间尺度 (\(\eta\)) | 备注 |
|---|---|---|---|
| 扩散模型 (\(\epsilon\)-prediction) | \(\tilde{z} = z / \alpha\) | \(\eta = \sigma / \alpha\) | 基于公式 (2) 推导 |
| 修正流 (Rectified Flows) | \(\tilde{z} = z\) | \(\eta = t\) | 基于公式 (4) 推导 |
💡 核心解读::无论你是用扩散模型还是修正流,其实都是在计算“当前状态 + 网络预测值 × 时间变化量”。两者的区别仅在于是否对数据进行了缩放处理(即是否除以 \(\alpha\) 系数)。
设计¶
将去噪视为马尔可夫决策过程 (MDP)¶
本文参考 DDPO ,将扩散模型和修正流的去噪过程形式化为一个强化学习的 MDP 问题:
1. 核心要素定义¶
- 状态 (\(s_t\)):当前的环境状态,包含三部分信息:
c:输入的提示词(Prompt)。t:当前的时间步(代表噪声水平)。- \(z_t\):当前带噪声的隐变量(Latent)。
- 动作 (\(a_t\)):智能体采取的动作,即生成下一个时间步的去噪结果 (\(z_{t-1}\))。
- 奖励 (\(R\)):仅在去噪结束时(\(t=0\),即得到最终清晰图像 \(z_0\) 时)根据提示词 \(c\) 计算奖励;过程中无奖励。
2. 数学公式详解¶
$$ s_t \triangleq (\mathbf{c}, t, z_t) \tag{State} $$
* 状态由提示词 c、当前步数 t 和当前噪声数据 \(z_t\) 组成。
$$ \pi(a_t | s_t) \triangleq p(z_{t-1} | z_t, c) \tag{Policy} $$
* 策略:在给定当前状态(当前噪声 \(z_t\) + 提示词 c)下,模型预测下一个状态(去噪一步 \(z_{t-1}\))的概率。
$$ a_t \triangleq z_{t-1} \tag{Action} $$ * 动作:直接等于去噪后的结果 \(z_{t-1}\)。
$$ R(s_t, a_t) \triangleq \begin{cases} r(z_0, c), & \text{if } t = 0 \ 0, & \text{otherwise} \end{cases} \tag{Reward} $$
* 奖励函数:
* 如果是最后一步(\(t=0\)),奖励等于奖励模型 \(r\) 的打分(基于生成的图像 \(z_0\) 和提示词 c)。
* 如果是中间步骤,奖励为 0。
$$ \rho_0(s_0) \triangleq (p(c), \delta_T, \mathcal{N}(0, I)) \tag{Initial} $$ * 初始状态分布: * 提示词来自分布 \(p(c)\)。 * 初始步数为 \(T\)(最大噪声步数)。 * 初始隐变量 \(z_T\) 是纯高斯噪声 \(\mathcal{N}(0, I)\)。
通俗理解¶
这段话的意思是:把生成图片的过程当成玩一个“猜图”游戏。
- 状态 (State):你现在的手里的草稿(\(z_t\))、题目要求(\(c\))和当前是第几步(\(t\))。
- 动作 (Action):你擦掉一部分噪点,画出一个新草稿(\(z_{t-1}\))。
- 奖励 (Reward):在整个游戏结束前,你都看不到分数。只有当你画出最终结果(\(t=0\))并交给裁判(Reward Model,如 CLIP)看时,才会根据“画得像不像题目”给出最终分数。
公式¶
将生成模型的采样过程改写为随机微分方程(SDE),以便适配强化学习算法(GRPO)的需求。
🎯 采样 SDE 的公式化 (Formulation of Sampling SDEs)¶
为了适配 GRPO 算法对随机探索(Stochastic Exploration)的需求(即策略更新依赖于轨迹的概率分布),我们将扩散模型和修正流的采样过程统一改写为 SDE 形式。
1. 扩散模型 (Diffusion Models)¶
前向¶
- 形式:这是一个 SDE(随机微分方程)。
- 公式:\(dz_t = f_t z_t dt + g_t dw\)
- 含义:它天生带有随机性(\(dw\) 代表布朗运动/噪声)。这是为了模拟数据逐渐变成噪声的过程。
反向去噪(Reverse Process - ODE)¶
- 逻辑:通常情况下,生成模型(如扩散模型或修正流)在生成图片时,往往追求确定性(Deterministic)。
- 形式:通常被写成 ODE(常微分方程)。
- 特点:给定一个输入,永远得到同一个输出(像按固定轨道运行的卫星)。
反向 SDE(Reverse SDE)¶
改写表达式如下:
公式中各符号的直观含义
- \(dz_t\):下一步状态的变化量。
- \((f_t z_t ... ) dt\):“确定性部分”。这部分是基于模型预测的方向(比如去噪的方向),是主要的移动趋势。
- \(- \frac{1 + \varepsilon_{t}^{2}}{2} g_{t}^{2} \nabla \log p_{t} ( z_{t} )\):“修正项”。这是为了让生成的分布符合真实数据分布而做的数学修正(Score-based 项)。
- \(\varepsilon_t g_t dw\):“随机性部分”(关键点)。
- \(\varepsilon_t\):控制随机程度的系数。
- \(dw\):随机噪声(来自布朗运动)。
- 作用:这就是为了让 AI 在画图时能“随机发挥”,从而满足强化学习需要试错的需求。
2. 修正流 (Rectified Flows)¶
修正流的前向过程通常是确定性的 ODE(\(dz_t = u_t dt\)),但这无法满足 GRPO 所需的随机性。受启发,我们在其反向过程中引入 SDE:
3. 核心变量说明¶
- \(\varepsilon_t\) (Epsilon):引入采样过程中的随机性(Stochasticity),这是连接确定性模型与强化学习探索需求的关键桥梁。
- \(\nabla \log p_t(z_t)\):得分函数(Score Function)。若给定正态分布 \(p_t(z_t) = N(z_t | \alpha_t x, \sigma_t^2 I)\),则有 \(\nabla \log p_{t} ( \mathbf{z}_{t} ) = -(\mathbf{z}_{t} - \alpha_{t} \mathbf{x}) / \sigma_{t}^{2}\)。
- \(dw\):布朗运动(Brownian motion),代表随机噪声。
通过将上述公式代入,我们可以推导出策略概率 \(\pi(a_t | s_t)\)。
DanceGRPO 目标函数¶
🎯 DanceGRPO 优化目标 (Objective Function)¶
受 DeepSeek-R1 启发,该算法通过最大化以下目标函数来更新策略模型(\(\pi_\theta\)):
1. 核心逻辑:PPO 风格的剪切目标 (Clipped Surrogate Objective)¶
给定一个提示词 \(c\),模型生成一组样本(Group of outputs),通过比较新旧策略的差异来更新模型,防止更新幅度过大。
- \(\rho_{t,i}\) (概率比率 Probability Ratio):
$$ \rho_{t,i} = \frac{\pi_\theta(a_{t,i}|s_{t,i})}{\pi_{\theta_{old}}(a_{t,i}|s_{t,i})} $$
- 衡量新策略 \(\pi_\theta\) 与旧策略 \(\pi_{\theta_{old}}\) 在状态 \(s\) 下采取动作 \(a\) 的概率差异。
- \(\epsilon\) (超参数): 一个很小的数(如 0.2),用于限制更新的步长,确保训练稳定。
- \(\text{clip}(\cdot)\): 剪切函数,将比率限制在 \([1-\epsilon, 1+\epsilon]\) 范围内。
2. 优势函数 (Advantage Function) \(A_i\)¶
用于衡量第 \(i\) 个样本在组内的表现优劣,通过组内标准化计算:
- \(r_i\): 第 \(i\) 个样本获得的奖励分数。
- 逻辑: 如果样本的奖励高于组内平均水平(\(r_i > \text{mean}\)),则 \(A_i\) 为正,模型会增加该样本生成的概率;反之则降低。
💡 通俗总结¶
这段公式的意思是: 1. 分组打分:给一个题目(Prompt),让模型做 \(G\) 道题(生成 \(G\) 个样本)。 2. 相对评价:算出每道题的分数后,看谁比平均分高,谁比平均分低。 3. 安全改进:表扬那些分数高于平均的样本(增加生成概率),批评低于平均的样本(减少概率),但表扬和批评的幅度不能太激进(由 \(\epsilon\) 控制),以免把模型改“坏”了。
没有kl loss
虽然传统的GRPO公式使用kl正则化来防止奖励过度优化,但我们从经验上观察到,当忽略这一组件时,性能差异最小。因此,我们在默认情况下省略了KLregularization项。
开CFG会不稳定
背景: CFG 是条件生成建模中生成高质量样本的常用技术。
存在问题: 在当前的训练设置中,将 CFG 集成到训练流水线(Training pipelines)中会导致优化过程不稳定。
解决方案: 基于实证研究,建议对高保真度模型(如 HunyuanVideo 和 FLUX)在采样阶段禁用 CFG。
- 目的:减少梯度震荡(Gradient oscillation)。
- 效果:在保持输出质量的同时,确保训练稳定性。
这是一段关于 CFG(无分类器引导)模型训练不稳定性 的技术分析。为了让你更直观地理解,我将其翻译并整理为结构清晰的 Markdown 格式。
针对依赖 CFG 来保证生成质量的模型(如 SkyReels-I2V 和 Stable Diffusion),我们发现了一个关键问题及应对策略:
-
核心问题:优化轨迹发散
-
现象:如果仅针对“条件输出”(Conditional Objective)进行训练,会导致优化过程失控(发散)。
- 原因:必须同时对“条件输出”和“无条件输出”(Unconditional outputs)进行联合优化。
-
代价:这需要同时运行两个网络进行计算,导致 显存(VRAM)消耗直接翻倍。
-
解决方案:降低参数更新频率
-
策略:建议降低每个训练迭代中的参数更新频率。
- 实证效果:经验证,将每次迭代的更新次数限制为 1 次,能显著提升 SkyReels-I2V 模型的训练稳定性。
- 副作用:对模型的收敛速度影响极小。
优化Trick¶
时间步选择 (Ablation on Timestep Selection)¶
实验目的: 探究不同时间步(Timestep)选择策略对 HunyuanVideo-T2I 模型训练效果的影响。
五种实验条件:
- 仅前 30%:仅使用从噪声开始的前 30% 时间步进行训练。
- 随机 30%:随机采样 30% 的时间步进行训练。
- 仅后 40%:仅使用输出前的最后 40% 时间步进行训练。
- 随机 60%:随机采样 60% 的时间步进行训练。
- 全量 100%:使用所有时间步进行训练(基准)。
核心发现:
- 初期步数至关重要:前 30% 的时间步对学习基础生成模式(Foundational generative patterns)至关重要,对模型性能贡献最大。
- 单一区间有缺陷:如果训练仅局限于前 30% 的时间步,模型性能反而会下降。这是因为模型缺乏对“后期精细化动态”(Late-stage refinement)的学习。
最终策略:随机时间步丢弃 (Stochastic Timestep Dropout) 为了在计算效率和模型保真度之间取得平衡,作者采用了 40% 的随机时间步丢弃策略: * 做法:在训练过程中,随机屏蔽(Mask)40% 的时间步。 * 优势: * 减少了计算量(提升了效率)。 * 保留了潜在扩散过程的时间连续性。 * 证明了通过策略性地减少时间步采样,可以在基于流的生成框架中优化资源利用。