DanceGRPO: Unleashing GRPO on Visual Generation

Authors: Zeyue Xue, Jie Wu, Yu Gao, Fangyuan Kong, Lingting Zhu, Mengzhao Chen, Zhiheng Liu, Wei Liu, Qiushan Guo, Weilin Huang, Ping Luo Affiliations: ByteDance Seed, The University of Hong Kong arXiv: 2505.07818 Project Page: dancegrpo.github.io GitHub: XueZeyue/DanceGRPO Year: 2025

1. Motivation(研究动机)

视觉内容生成领域已取得巨大进展,但将模型输出与人类偏好对齐仍是核心挑战。现有的基于强化学习的对齐方法(如 DDPO、DPOK)存在三个根本性障碍:

  1. ODE 采样与 MDP 表述的冲突:Rectified Flow(FLUX、HunyuanVideo 等)采用常微分方程(ODE)进行确定性采样,缺乏 GRPO 所需的随机性探索,无法定义轨迹概率分布,导致 policy gradient 方法无法直接应用。

  2. 大规模数据集下的训练不稳定性:DDPO / DPOK 等 policy gradient 方法在扩展到大规模、多样化 prompt 数据集(>100 条 prompt)时出现严重的优化不稳定,无法用于生产级别的模型训练。

  3. 方法的局限性与任务覆盖不足:ReFL 依赖可微奖励模型,引入大量显存消耗;DPO 系列方法(Diffusion-DPO、Flow-DPO、OnlineVPO)只能带来边际质量提升;且现有方法均未被验证可用于视频生成任务。

核心洞察:GRPO(Group Relative Policy Optimization,来自 DeepSeek-R1)内置的稳定性机制——组内归一化优势、PPO 风格的 clipped 目标、共享初始化噪声——恰好能够解决上述优化不稳定性问题。但要将 GRPO 应用于视觉生成,关键在于将扩散模型和 rectified flow 的采样过程统一重新表述为随机微分方程(SDE),使其满足 MDP 框架的要求。


2. Idea(核心思想)

DanceGRPO 的核心思想是建立 GRPO 与视觉生成任务之间的”和谐舞蹈”(harmonious dance),通过以下关键设计实现:

统一 SDE 表述:将扩散模型(DDPM 系列)和 rectified flow(FLUX、HunyuanVideo 系列)的采样过程统一改写为 SDE 形式,引入可控随机性 ,使采样轨迹具有概率分布,从而支持 GRPO 的 policy gradient 更新。

共享初始化噪声:同一 prompt 组内的所有样本使用相同的初始噪声向量 ,防止不同噪声导致的 reward hacking(视频生成中尤为关键)。

组内优势归一化:在同一 prompt 生成的 个样本之间计算相对优势,而非全局归一化,使奖励信号更具区分性且数值稳定。

时间步子采样(Timestep Selection):在训练时仅使用 比例的时间步(默认 ,即 60%),降低计算成本,且实验证明初始 30% 的时间步对模型学习最为关键。

多奖励模型融合:将多个奖励信号(图像美学、文图对齐、视频运动质量等)通过各自归一化后的优势函数加权融合,避免不同量纲奖励的直接相加。

Best-of-N 推理扩展:训练时从更大的样本池(16、64、256 样本)中选取 top-k 和 bottom-k 样本,加速收敛,实现推理时的计算换质量。


3. Method(方法)

3.1 整体框架

DanceGRPO 建立了一个统一框架,覆盖两种生成范式(扩散模型 / rectified flow)和三类任务(文生图 / 文生视频 / 图生视频),使用四个基础模型(Stable Diffusion v1.4、FLUX.1-dev、HunyuanVideo、SkyReels-I2V)进行验证。

Figure 1 解读:此表对比了 DanceGRPO 与 DDPO/DPOK、ReFL、DPO 在五个维度上的能力:RL-based(基于强化学习)、VideoGen(视频生成泛化)、Scalability(大规模 prompt 可扩展性)、Reward↑(显著奖励提升)、RFs(Rectified Flow 兼容)、No Diff-Reward(无需可微奖励)。只有 DanceGRPO 在所有维度全部满足,是首个同时满足这六项要求的方法。

3.2 理论预备:扩散模型与 Rectified Flow

扩散模型(Diffusion Model)

扩散模型的前向过程将观测数据 在时间步 逐渐加噪:

其中 为噪声调度参数, 接近干净数据, 接近高斯噪声。给定去噪模型在时间步 的输出 ,DDIM 采样器将样本从噪声等级 推进到更低噪声等级

其中 由公式 (1) 反推得出。

Rectified Flow

Rectified flow 将前向过程视为数据 与噪声项 之间的线性插值:

其中 始终为高斯噪声,“速度场”(velocity)定义为 。给定去噪模型在时间步 的输出 ,从时间步 推进到更低噪声等级

统一分析

论文证明,扩散模型和 rectified flow 在实践中是同一枚硬币的两面,可用如下统一公式描述:

对于 -prediction(扩散模型):。对于 rectified flow:

3.3 DanceGRPO 核心方法

去噪过程作为马尔可夫决策过程(MDP)

遵循 DDPO,将去噪过程定义为 MDP:

其中 为 prompt, 为奖励函数(由 CLIP、VLM 等 Vision-Language 模型参数化), 为 Dirac delta 分布,轨迹共 步。

采样 SDE 的表述

关键动机:GRPO 需要通过多条轨迹样本进行随机探索,policy 更新依赖轨迹的概率分布。因此需将确定性的 ODE 采样改写为随机的 SDE 形式。

扩散模型的逆向 SDE(前向 SDE:):

其中 为布朗运动, 控制采样过程中的随机性程度。

Rectified flow 的逆向 SDE(前向 ODE:,确定性,不满足 GRPO 需求)。受随机插值理论启发,引入 SDE 形式:

其中 同样引入采样随机性。对于正态分布 ,有 ,可将 score 函数代入上述两个 SDE 从而得到可计算的

GRPO 目标函数

受 DeepSeek-R1 启发,给定 prompt ,从旧策略 采样 个输出 ,优化以下目标函数:

其中 为重要性权重比, 为组内归一化优势函数,由同组奖励 计算:

重要设计决策:由于奖励稀疏性,在实践中将同一奖励信号应用于优化过程的所有时间步。实验发现省略 KL 正则化项不影响性能,因此默认不使用 KL 项。

多奖励模型融合

当使用 个奖励模型时,多奖励优势函数为:

其中 分别为第 个奖励模型的均值和标准差(per-reward 统计量),避免不同量纲的直接相加。

初始化噪声共享

不同于 DDPO 使用不同噪声向量初始化训练样本,DanceGRPO 对同一 prompt 的所有 个样本使用相同初始化噪声 。这一设计防止了视频生成中的 reward hacking 现象——使用不同噪声时,模型会通过对噪声的选择(而非真正提升生成质量)来提高奖励。

Figure 8 解读:左侧展示了使用不同初始噪声导致的 reward hacking 现象——HunyuanVideo 生成的”水在玻璃杯中飞溅”画面几乎没有任何动作,模型学会了通过选择”静态”噪声来欺骗奖励模型。右侧使用相同初始化噪声后,reward hacking 消失,生成的画面具有真实的水波动态。

时间步选择(Timestep Selection)

训练时从 中随机采样 个时间步作为子集 ,仅在这些时间步上进行 policy 更新( 为默认值)。消融实验表明初始 30% 的时间步对学习生成模式最关键,但单独使用会性能下降,随机采样 60% 是效率与效果的最优平衡点。

Classifier-Free Guidance(CFG)训练

对于高度依赖 CFG 的模型(如 SkyReels-I2V、Stable Diffusion),需同时优化条件和无条件输出,导致显存消耗翻倍。实践建议:对于 HunyuanVideo 和 FLUX 等高保真模型,在采样阶段禁用 CFG 以减少梯度震荡;对于 SkyReels-I2V,限制每次训练迭代的梯度更新次数为 1 次以增强稳定性。

3.4 完整训练算法

# DanceGRPO training loop
for step in range(num_updates):
    prompt_batch = sample_batch(dataset)
    old_policy = copy_policy(policy)
 
    for prompt in prompt_batch:
        outputs = rollout_group(old_policy, prompt, num_generations=G, shared_noise=True)
        rewards = [compute_multi_reward(output, reward_models) for output in outputs]
        advantages = normalize_group_rewards(rewards)
 
        sampled_steps = sample_timesteps(total_steps=T, ratio=tau)
        for t in sampled_steps:
            loss = grpo_objective(
                policy=policy,
                old_policy=old_policy,
                prompt=prompt,
                outputs=outputs,
                advantages=advantages,
                timestep=t,
            )
            optimize(loss, params=theta, ascent=True)

3.5 SDE 重新表述的伪代码

扩散模型(Stable Diffusion)的 SDE 步骤与 log-prob 计算

基于 fastvideo/models/stable_diffusion/ddim_with_logprob.pypipeline_with_logprob.py

def ddim_step_with_logprob(scheduler, model_output, timestep, sample, eta, prev_sample=None):
    """
    扩散模型 DDIM 步骤(带随机性 eta),计算 SDE 转移概率的 log-prob。
    对应论文公式 (2) 和逆向 SDE 公式 (7)。
    """
    # 1. 获取前一个时间步
    prev_timestep = timestep - scheduler.config.num_train_timesteps // scheduler.num_inference_steps
    alpha_prod_t = scheduler.alphas_cumprod[timestep]
    alpha_prod_t_prev = scheduler.alphas_cumprod[prev_timestep] if prev_timestep >= 0 else scheduler.final_alpha_cumprod
    beta_prod_t = 1 - alpha_prod_t
 
    # 2. 预测干净样本 x̂ (ε-prediction → x-prediction)
    pred_original_sample = (sample - beta_prod_t.sqrt() * model_output) / alpha_prod_t.sqrt()
    pred_original_sample = pred_original_sample.clamp(-1, 1)
 
    # 3. 计算 DDIM 确定性方向和标准差(eta 控制随机性)
    std_dev_t = eta * ((1 - alpha_prod_t_prev) / (1 - alpha_prod_t)).sqrt()
                    * (1 - alpha_prod_t / alpha_prod_t_prev).sqrt()
    pred_sample_direction = (1 - alpha_prod_t_prev - std_dev_t**2).sqrt() * model_output
 
    # 4. 计算均值(确定性部分)
    prev_sample_mean = alpha_prod_t_prev.sqrt() * pred_original_sample + pred_sample_direction
 
    # 5. 若未给定 prev_sample,则采样(加随机噪声)
    if prev_sample is None:
        noise = torch.randn_like(model_output)
        prev_sample = prev_sample_mean + std_dev_t * noise
 
    # 6. 计算 log-prob(高斯分布的对数概率)
    # log p(z_s | z_t) = -||z_s - μ||² / (2σ²) - log(σ) - 0.5 * log(2π)
    log_prob = (-((prev_sample.detach() - prev_sample_mean)**2) / (2 * std_dev_t**2)
                - torch.log(std_dev_t)
                - torch.log(torch.sqrt(2 * torch.tensor(math.pi))))
    log_prob = log_prob.mean(dim=tuple(range(1, log_prob.ndim)))
 
    return prev_sample, log_prob

Rectified Flow(FLUX / HunyuanVideo)的 SDE 步骤与 log-prob 计算

基于 fastvideo/train_grpo_flux.pyfastvideo/train_grpo_hunyuan.py 中的 flux_step 函数:

def flux_step(model_output, latents, eta, sigmas, index, prev_sample, grpo, sde_solver):
    """
    Rectified flow SDE 步骤,对应论文公式 (4) 和 SDE 公式 (8)。
    FLUX 和 HunyuanVideo 共用此逻辑。
    """
    sigma = sigmas[index]
    dsigma = sigmas[index + 1] - sigma          # 负值(sigma 递减)
    delta_t = sigma - sigmas[index + 1]         # 正值
 
    # 1. 预测干净样本 x̂
    pred_original_sample = latents - sigma * model_output
 
    # 2. 确定性均值(ODE 步骤,对应公式 4)
    # z_s = z_t + û · (s - t) = latents + model_output * dsigma
    prev_sample_mean = latents + dsigma * model_output
 
    # 3. 若启用 SDE solver,加入 score 修正项(对应公式 8)
    if sde_solver:
        # ∇log p_t(z_t) = -(z_t - α_t·x) / σ_t²
        # 简化:score_estimate ≈ -(latents - pred_original_sample*(1-sigma)) / sigma²
        score_estimate = -(latents - pred_original_sample * (1 - sigma)) / sigma**2
        log_term = -0.5 * eta**2 * score_estimate
        prev_sample_mean = prev_sample_mean + log_term * dsigma
 
    # 4. 计算标准差(随机项强度)
    std_dev_t = eta * math.sqrt(delta_t)
 
    # 5. 采样(若未给定 prev_sample)
    if prev_sample is None:
        noise = torch.randn_like(latents)
        prev_sample = prev_sample_mean + std_dev_t * noise
 
    if not grpo:
        return prev_sample, pred_original_sample
 
    # 6. 计算 log-prob(高斯分布对数概率,对应 π(a_t | s_t) 的计算)
    log_prob = (
        -((prev_sample.detach().to(torch.float32) - prev_sample_mean.to(torch.float32))**2)
        / (2 * (std_dev_t**2))
        - math.log(std_dev_t)
        - torch.log(torch.sqrt(2 * torch.as_tensor(math.pi)))
    )
    log_prob = log_prob.mean(dim=tuple(range(1, log_prob.ndim)))
 
    return prev_sample, pred_original_sample, log_prob

GRPO 优势计算

def compute_advantages(rewards, num_generations, use_group=True):
    """
    计算 GRPO 组内归一化优势,对应论文公式 (10)。
    rewards: shape [B],B = n * num_generations
    """
    n = len(rewards) // num_generations
    advantages = torch.zeros_like(rewards)
 
    if use_group:
        # 组内归一化(DanceGRPO 默认方式)
        for i in range(n):
            start_idx = i * num_generations
            end_idx = (i + 1) * num_generations
            group_rewards = rewards[start_idx:end_idx]
            group_mean = group_rewards.mean()
            group_std = group_rewards.std() + 1e-8
            advantages[start_idx:end_idx] = (group_rewards - group_mean) / group_std
    else:
        # 全局归一化(备选)
        global_mean = rewards.mean()
        global_std = rewards.std() + 1e-8
        advantages = (rewards - global_mean) / global_std
 
    return advantages
 
 
def compute_multi_reward_advantages(rewards_dict, num_generations):
    """
    多奖励模型融合优势,对应 Algorithm 1 第 8 行。
    rewards_dict: {reward_name: reward_tensor}
    """
    total_advantages = None
    for reward_name, rewards in rewards_dict.items():
        n = len(rewards) // num_generations
        adv = torch.zeros_like(rewards)
        for i in range(n):
            start_idx = i * num_generations
            end_idx = (i + 1) * num_generations
            group_rewards = rewards[start_idx:end_idx]
            mu = group_rewards.mean()
            sigma = group_rewards.std() + 1e-8
            adv[start_idx:end_idx] = (group_rewards - mu) / sigma
        total_advantages = adv if total_advantages is None else total_advantages + adv
    return total_advantages

Policy 更新循环

def policy_update_loop(args, samples, transformer, optimizer, noise_scheduler):
    """
    PPO 风格 clipped 目标的 policy 更新,对应论文公式 (9)。
    适用于 FLUX / HunyuanVideo(rectified flow)版本。
    """
    clip_range = args.clip_range                     # 默认 1e-4
 
    for sample in samples_batched:
        for j in range(train_timesteps):             # 遍历 T_sub 中的时间步
            # 1. 前向传播,计算当前策略的 log-prob
            new_log_probs = grpo_one_step(
                transformer, sample["latents"][:, j],
                sample["timesteps"][:, j], ...
            )
 
            # 2. 计算重要性权重比 ρ = π_θ / π_θ_old
            ratio = torch.exp(new_log_probs - sample["log_probs"][:, j])
 
            # 3. 取出优势(已 clip 到 [-adv_clip_max, adv_clip_max])
            advantages = sample["advantages"]
 
            # 4. PPO clipped 目标(最大化,即最小化负值)
            unclipped_loss = -advantages * ratio
            clipped_loss = -advantages * torch.clamp(
                ratio, 1.0 - clip_range, 1.0 + clip_range
            )
            loss = torch.mean(torch.maximum(unclipped_loss, clipped_loss))
            loss = loss / (args.gradient_accumulation_steps * train_timesteps)
 
            # 5. 反向传播
            loss.backward()
 
        # 6. 梯度裁剪 + 参数更新
        torch.nn.utils.clip_grad_norm_(transformer.parameters(), args.max_grad_norm)
        optimizer.step()
        optimizer.zero_grad()

3.6 代码与论文映射表

论文概念代码文件关键函数/变量
扩散模型 SDE 步骤(公式 7)models/stable_diffusion/ddim_with_logprob.pyddim_step_with_logprob()
Rectified flow SDE 步骤(公式 8)train_grpo_flux.py, train_grpo_hunyuan.pyflux_step(..., sde_solver=True)
扩散模型 log-prob models/stable_diffusion/ddim_with_logprob.pylog_prob 计算,高斯对数概率
Rectified flow log-probtrain_grpo_flux.pyflux_step()grpo=True 分支
GRPO 优势函数(公式 10)train_grpo_sd.py, train_grpo_flux.pycompute advantages 循环,use_group=True
多奖励融合train_grpo_hunyuan.pyvq_advantages + mq_advantages
PPO clipped 目标(公式 9)train_grpo_sd.py, train_grpo_flux.pyunclipped_loss / clipped_loss
共享初始化噪声train_grpo_flux.pyinput_latents 复用同一噪声
时间步子采样(τ)train_grpo_sd.pytimestep_fractionT_sub 采样
Best-of-N 采样train_grpo_sd.pynum_samples_per_epoch,top-k/bottom-k 选择
CFG 训练train_grpo_skyreels_i2v.py条件 + 无条件前向,guidance_scale

3.7 实验结果图表

Figure 1 解读:三个子图分别展示 Stable Diffusion(左)、FLUX.1-dev(中)、HunyuanVideo-T2I(右)在训练过程中的奖励曲线(HPS score 和 HPS+CLIP 组合)。三个模型均呈现稳定上升趋势,无振荡或发散现象,验证了 DanceGRPO 跨范式(扩散模型/rectified flow)的训练稳定性。加入 CLIP score 后 HPS 略有下降,但生成图像更自然(CLIP 起到正则化作用)。

Figure 2 解读:展示 HunyuanVideo(文生视频)和 SkyReels-I2V(图生视频)的训练曲线。(a) HunyuanVideo 运动质量奖励(VideoAlign MQ)稳定提升;(b) HunyuanVideo 视觉美学质量(VideoAlign VQ)提升 56%;(c) SkyReels-I2V 运动质量提升 118%。图生视频任务中由于视觉保真度由参考图像约束,运动质量成为唯一可优化的维度。

Figure 4 解读:三个消融实验子图:(a) Best-of-N 推理扩展——从 16/64/256 样本池中选取样本均能加速收敛,但会降低采样效率,作为可选扩展;(b) 时间步选择消融——仅使用初始 30% 效果最好但性能有损,随机 60% 是最优平衡(默认设置);(c) 噪声水平 消融——减小 导致显著性能下降,噪声水平 > 0.3 时训练后图像有时会变得噪声过大,0.1 最优。

Figure 3b 解读:人类评估结果(水平条形图)。横轴表示评估者偏好比例(负值=基线更好,正值=RLHF更好)。T2I(FLUX):41% 偏好 RLHF,19% 偏好基线,40% 相同;T2V(HunyuanVideo):36% 偏好 RLHF,10% 偏好基线,54% 相同;I2V(SkyReel):18% 偏好 RLHF,7% 偏好基线,75% 相同。人类评估与自动指标一致,RLHF 优化版本在所有任务上均获得更多人类偏好。

Figure 5 解读:将 DDPO 目标函数应用于 rectified flow SDE 时,训练曲线始终发散(橙线大幅波动),而 DanceGRPO(蓝线)在两个任务上均保持稳定上升。此实验直接证明了 GRPO 相对于 DDPO 在 rectified flow 场景下的核心优势:DDPO 的 policy gradient 目标与 ODE 采样的 MDP 表述存在根本冲突,而 GRPO 的 clipped 目标和组内归一化提供了充分的稳定性。


4. Experimental Setup(实验设置)

基础模型与任务

任务基础模型范式奖励模型
文生图(T2I)Stable Diffusion v1.4扩散模型HPS-v2.1、CLIP Score、Binary
文生图(T2I)FLUX.1-devRectified FlowHPS-v2.1、CLIP Score
文生图(T2I)HunyuanVideo-T2I(单帧模式)Rectified FlowHPS-v2.1
文生视频(T2V)HunyuanVideoRectified FlowVideoAlign(VQ+MQ)
图生视频(I2V)SkyReels-I2VRectified FlowVideoAlign(MQ)

计算资源

  • 流式文生图(FLUX、HunyuanVideo-T2I):32 块 H800 GPU
  • Stable Diffusion:8 块 H800 GPU
  • 文生视频(HunyuanVideo):64 块 H800 GPU
  • 图生视频(SkyReels-I2V):32 块 H800 GPU

超参数设置(Table 6)

参数
学习率1e-5
优化器AdamW
梯度裁剪 norm1.0
每次迭代 prompt 数32
每 prompt 图像数 12
每次迭代梯度更新次数4
Clip 范围 1e-4
噪声水平 0.3
时间步选择比例 0.6

训练时采样步数:SD 使用 50 步,FLUX 和 HunyuanVideo 使用 25 步。所有模型使用超过 10,000 条 prompt 进行训练。评估使用 ODE-based 采样器(确定性推理)。

五类奖励模型

  1. 图像美学质量(Image Aesthetics):使用 HPS-v2.1(在人类评分数据上微调的预训练模型)量化视觉吸引力
  2. 文图对齐(Text-image Alignment):使用 CLIP Score 最大化文本与输出的跨模态一致性
  3. 视频美学质量(Video Aesthetics Quality):使用 VLM(VideoAlign、Qwen-VL)将图像评估扩展到时序域
  4. 视频运动质量(Video Motion Quality):使用 physics-aware VLM(VideoAlign)分析轨迹与形变的运动真实感
  5. 阈值二值奖励(Thresholding Binary Reward):将连续奖励(HPS 阈值 0.28,CLIP 阈值 0.39)二值化为 0/1,学习稀疏、阈值化反馈

5. Experimental Results(实验结果)

Table 2:Stable Diffusion v1.4 结果

模型HPS-v2.1CLIP ScorePick-a-PicGenEval
Stable Diffusion(基线)0.2390.3630.2020.421
SD with HPS-v2.10.3650.3800.2170.521
SD with HPS-v2.1 & CLIP Score0.3350.3950.2150.522

HPS 分数从 0.239 → 0.365(+53%),CLIP Score 从 0.363 → 0.395(+9%),GenEval 从 0.421 → 0.522。

Table 3:FLUX 结果

模型HPS-v2.1CLIP ScorePick-a-PicGenEval
FLUX(基线)0.3040.4050.2240.659
FLUX with HPS-v2.10.3720.3760.2300.561
FLUX with HPS-v2.1 & CLIP Score0.3430.4270.2280.687

HPS 从 0.304 → 0.372(+22%),CLIP 从 0.405 → 0.427(+5%),GenEval 从 0.659 → 0.687(+4.3%)。

Table 4:Stable Diffusion 与其他方法对比

方法HPS-v2.1CLIP Score
Baseline0.2390.363
Ours0.3650.421
DDPO0.2970.381
ReFL0.3570.418
DPO0.2410.367

DanceGRPO 在 HPS 和 CLIP 两个指标上均优于所有基线方法,比 DDPO 高出约 23%(HPS),比 DPO 高约 52%。

Table 5:HunyuanVideo 文生视频结果(VideoAlign 指标)

方法VQ(视觉质量)MQ(运动质量)TA(文本对齐)VisionReward
Baseline4.511.371.750.124
Ours7.03(+56%)3.85(+181%)1.590.128

视觉质量提升 56%,运动质量提升高达 181%,是论文中最显著的单项指标改进。文本对齐略微下降(1.75→1.59),这与 HPS 优化可能使图像风格化的现象一致。

SkyReels-I2V 图生视频结果

运动质量指标通过 VideoAlign 测量,实现 118% 的相对提升。需要启用 CFG 训练以确保采样质量。

人类评估结果

在 240 条 FLUX T2I prompt、200 条 HunyuanVideo T2V prompt、200 条 SkyReels-I2V I2V prompt 上进行人类评估:

  • T2I(FLUX):41% 偏好 RLHF,19% 偏好基线
  • T2V(HunyuanVideo):36% 偏好 RLHF,10% 偏好基线
  • I2V(SkyReel):18% 偏好 RLHF,7% 偏好基线

所有任务人类一致偏好 DanceGRPO 优化后的输出。

二值奖励实验

通过阈值化(HPS > 0.28 → 1,否则 → 0;CLIP > 0.39 → 1,否则 → 0)构造二值奖励,训练曲线仍然收敛,证明 DanceGRPO 能有效学习稀疏的、基于规则的奖励分布,为未来基于 VLM 判断的奖励模型奠定基础。

关键实践洞见总结

洞见具体发现
共享噪声防止 reward hacking不同噪声初始化导致视频模型学会”选择静态噪声”而非提升质量
Best-of-N 加速收敛256 样本池 > 64 > 16 原始样本,但降低采样效率
时间步选择的最优比例初始 30% 步骤学习最快;随机 60% 是效率/效果最优平衡
噪声水平 0.1 最优;过大(>0.3)导致噪声伪像;不同衰减调度无显著差异
多奖励融合需要独立归一化不同奖励模型量纲不同,直接相加不稳定,需分别归一化再求和
CLIP 对 HPS 起正则化作用单独 HPS 优化产生”油腻”风格;加入 CLIP 保留自然图像特征
CFG 训练策略高保真模型(FLUX/HunyuanVideo)禁用 CFG 减少震荡;低保真需启用 CFG