Euphonium: Steering Video Flow Matching via Process Reward Gradient Guided Stochastic Dynamics

Authors: Ruizhe Zhong, Jiesong Lian, Xiaoyue Mi, Zixiang Zhou, Yuan Zhou, Qinglin Lu, Junchi Yan Affiliations: Shanghai Jiao Tong University, Huazhong University of Science and Technology, University of Chinese Academy of Sciences, Tencent Hunyuan arXiv: 2602.04928 GitHub: zerzerzerz/Euphonium

1. Motivation (研究动机)

现有方法的问题:

流匹配(Flow Matching)模型已成为高质量视频生成的主流范式(Sora、Veo、Wan、Kling 等均基于此)。为了让这些模型与人类偏好对齐,研究者将强化学习(RL)引入后训练阶段。然而,将在线 RL 算法(如 GRPO)适配到流匹配模型面临核心困难:流匹配的采样过程本质上是一个确定性的概率流 ODE,需要人为注入随机性才能进行策略探索。

现有方案(Flow-GRPO、DanceGRPO)的根本缺陷:

  • 依赖无向随机性(undirected stochasticity):通过随机扰动隐空间来探索,噪声方向完全随机,无法保证探索方向朝向高奖励区域。
  • 奖励信号稀疏:只在完整视频生成后才能获得反馈(结果级奖励),难以为中间去噪步骤提供密集信号。
  • 探索效率低下:随机游走很难找到高质量样本,导致正向监督信号稀少,训练数据效率差、收敛慢。

本文要解决的问题:

如何让流匹配模型的采样过程本身就具有目标导向性——而不是靠随机噪声碰巧找到高奖励区域——从而实现高效、数据友好的对齐训练?

为什么值得研究:

视频生成的后训练对齐是产品落地的关键环节,而现有方法的低效探索严重制约了训练速度和最终效果。一个能在每一步采样中主动引导方向的框架,可以将训练收敛速度提升 1.66 倍,对工业实践具有重要意义。


2. Idea (核心思想)

核心洞见:

将流匹配的采样过程重新诠释为一个随机微分方程(SDE),并在 SDE 的漂移项(drift)中显式注入过程奖励模型(PRM)的梯度。这样,采样轨迹在每一步都被主动引导向奖励更高的方向,而不是依赖随机噪声的被动探索。

1-3 句话概括关键创新:

Euphonium(Exploration Utilizing Process Heuristics Over Non-equilibrium Sampling)将采样过程建模为非平衡传输采样(NETS)框架下的 SDE,通过将 PRM 梯度注入漂移项实现**奖励梯度引导(Reward Gradient Guidance, RGG)**的有向探索;同时引入双奖励 GRPO(过程奖励 + 结果奖励)提供密集的信用分配;最后通过策略蒸馏将引导信号内化到流网络权重中,使推理时无需外部奖励模型。

与现有方法的根本区别:

对比维度Flow-GRPO / DanceGRPOEuphonium
探索机制无向随机噪声PRM 梯度引导的有向探索
奖励信号仅结果奖励(稀疏)过程奖励 + 结果奖励(密集)
推理依赖无额外开销训练后蒸馏,推理时无 PRM
理论基础启发式 SDE 注入NETS 框架,严格推导

3. Method (方法)

3.1 整体框架

Figure 1 解读: 该图展示了 Euphonium 的完整 pipeline。左侧是训练奖励对比曲线,显示 Euphonium 以 1.66× 的速度收敛至更高奖励。右侧展示了系统架构:SDE 采样阶段将 PRM 梯度注入漂移项进行有向探索;双奖励模型(Latent Reward Model + RGB Reward Model)分别在隐空间和像素空间提供密集奖励信号;GRPO 优化阶段通过带 PRM 优势的 Group Relative Policy Optimization 更新模型参数。

整体框架分为两个交替阶段:

  1. Phase 1 - 有向探索(Guided Exploration):使用 SDE + RGG 生成多条轨迹
  2. Phase 2 - 优化(Optimization):使用双奖励 GRPO 更新模型参数

3.2 理论基础:流匹配与 NETS

流匹配(Flow Matching)基础:

设数据分布 ,源分布 。线性最优传输路径定义为:

流匹配训练向量场 来近似最优速度场 ,满足 ODE:

关键命题(Score-Velocity 关系):在线性 OT 路径下,边际密度 的分数函数与最优速度场满足:

非平衡传输采样(NETS)

将采样问题建模为从目标密度 采样,NETS 控制的 SDE 为:

其中 提供基础速度, 为保守力引导粒子远离低势能区域, 为时间相关扩散系数。

3.3 奖励梯度引导(Reward Gradient Guidance, RGG)

从 KL 约束优化到 SDE:

在 KL 散度约束下最大化期望奖励的目标为:

最优解为 Boltzmann 分布:

在时步 处,将参考策略 与流边际 对应,奖励与 PRM 对应,目标密度为:

代入 NETS 框架,势能函数为:

关键 SDE 方程(Euphonium 核心)

漂移项分为两部分:

  • 参考动力学:恢复流模型的内在随机动力学(当无外部奖励时退化为 DanceGRPO/Flow-GRPO)
  • 奖励梯度引导(RGG):主动将采样轨迹推向高奖励区域

实践中引入标量系数 (对应 )控制引导强度:

Euler-Maruyama 离散化

总漂移:

3.4 过程奖励模型(Process Reward Model, PRM)

设计动机: PRM 需要在中间噪声状态 (隐空间)直接估计质量,而不是等到完整视频生成。传统做法在像素空间做 PRM 需要通过 VAE 解码器反向传播,内存代价极高(零阶梯度估计方差也大),因此 Euphonium 在隐空间设计 PRM。

架构:

  • 输入:噪声视频隐变量 、时间步 、文本嵌入
  • 初始化自 HunyuanVideo DiT 的预训练层(取子集以减少计算开销,仅 8 层)
  • 轻量 MLP head 将隐状态投影为标量奖励分数
  • VAE 和文本编码器冻结

噪声扰动训练策略:

给定干净视频隐变量 ,随机采样时间步 ,按线性 OT 路径(公式 2)构造带噪声隐变量 。这确保 PRM 在整个概率路径上的奖励面 都有良好定义,可在任意噪声水平可靠估计梯度。

训练目标(Bradley-Terry 偏好学习):

给定偏好对 ),采样共享时间步 和噪声 构造 ,用配对排序损失训练:

3.5 双奖励 GRPO 优化

双奖励设计:

同时使用两个独立奖励信号:

  • 过程奖励(PRM):每一步的隐空间质量评分(密集信号,高效信用分配)
  • 结果奖励(ORM):完整视频的像素级视觉质量评分(稀疏信号,保证视觉保真度)

优势函数计算:

对于第 个样本在步骤 处,总优势为过程优势与结果优势之和:

其中 为组内样本的均值和标准差。

GRPO 目标函数:

重要性权重 ,GRPO 目标:

对数概率计算(策略蒸馏关键):

在计算 时,无论是行为策略还是目标策略,均用不含 RGG 的纯流动力学评估:

由于 是由含 RGG 的动力学生成的,残差 隐式编码了奖励信号——最小化该残差等价于让学生速度场 内化引导,实现无 PRM 推理的策略蒸馏。

3.6 完整训练算法

# Algorithm 1: RGG Sampling & Distillation Training
# Input: pre-trained u_theta, PRM r_p, ORM r_o
 
def euphonium_training(u_theta, r_p, r_o, prompts, G, M, T):
    for iteration in range(1, M + 1):
        theta_old = copy(u_theta.params)
 
        # === Phase 1: Guided Exploration ===
        trajectories = []
        for prompt_c in prompts:
            for sample_i in range(G):
                X = sample_noise()   # X_0 ~ N(0, I)
                traj = []
                log_probs_old = []
                process_rewards = []
 
                for k in range(T):
                    t_k = timestep_schedule[k]
 
                    # 1. Compute base flow drift
                    D_flow = flow_drift(X, t_k, theta_old)
 
                    # 2. Compute PRM gradient for RGG
                    r_val, grad_rp = r_p.compute_with_grad(X, t_k, prompt_c)
 
                    # 3. Total drift = flow + reward gradient guidance
                    D_total = D_flow + (epsilon_t / beta) * grad_rp
 
                    # 4. Euler-Maruyama step with RGG
                    Z = sample_normal()
                    X_next = X + D_total * dt + sqrt(2 * epsilon_t * dt) * Z
 
                    # 5. Log prob uses flow-only dynamics (for distillation)
                    mu_old = X + D_flow * dt
                    log_pi_old = gaussian_log_prob(X_next, mu_old, 2 * epsilon_t * dt)
 
                    traj.append((X, X_next, t_k))
                    log_probs_old.append(log_pi_old)
                    process_rewards.append(r_val)
                    X = X_next
 
                # 6. Compute outcome reward on final frame
                r_outcome = r_o.compute(X, prompt_c)
 
                # 7. Compute dual advantage (process + outcome, group-normalized)
                A = compute_dual_advantage(process_rewards, r_outcome, group_stats)
                trajectories.append((traj, log_probs_old, A))
 
        # === Phase 2: Optimization via GRPO ===
        for minibatch in batch_sampler(trajectories):
            total_loss = 0.0
            for (X_k, X_k1, t_k), log_pi_old, A_ki in minibatch:
                # Recompute log prob with current policy (flow-only)
                D_flow_theta = flow_drift(X_k, t_k, u_theta.params)
                mu_theta = X_k + D_flow_theta * dt
                log_pi_theta = gaussian_log_prob(X_k1, mu_theta, 2 * epsilon_t * dt)
 
                # Importance weight
                omega = exp(log_pi_theta - log_pi_old)
 
                # Clipped PPO loss
                loss_unclipped = -A_ki * omega
                loss_clipped = -A_ki * clamp(omega, 1 - eps_clip, 1 + eps_clip)
                total_loss += mean(max(loss_unclipped, loss_clipped))
 
            # Optional KL regularization
            total_loss += kl_coef * kl_divergence(u_theta, ref_model, minibatch)
 
            total_loss.backward()
            optimizer.step()
 
    return u_theta

PRM 训练伪代码:

# Process Reward Model Training (Bradley-Terry)
def train_prm(r_phi, preference_dataset, epochs):
    for epoch in range(epochs):
        for (video_win, video_lose, caption) in preference_dataset:
            # Encode to latent space (VAE frozen)
            X1_w = vae.encode(video_win)
            X1_l = vae.encode(video_lose)
 
            # Sample shared timestep and noise
            t = uniform(0, 1)
            epsilon = normal(0, I)
 
            # Construct noisy latents via Linear OT path
            Xt_w = (1 - t) * noise + t * X1_w
            Xt_l = (1 - t) * noise + t * X1_l
 
            # Pairwise ranking loss (Bradley-Terry)
            score_w = r_phi(Xt_w, t, caption)
            score_l = r_phi(Xt_l, t, caption)
            loss = -log(sigmoid(score_w - score_l))
 
            loss.backward()
            optimizer.step()

双奖励优势计算伪代码:

# Dual Reward Advantage Computation
def compute_dual_advantage(process_rewards, outcome_reward, G, mode='both'):
    # process_rewards: [T] per-step PRM scores for this sample
    # outcome_reward: scalar ORM score for this sample
    # G: group of samples from same prompt
 
    # Group-normalize outcome rewards
    group_outcomes = [sample.outcome_reward for sample in prompt_group]
    mu_o = mean(group_outcomes)
    sigma_o = std(group_outcomes)
    outcome_adv = (outcome_reward - mu_o) / (sigma_o + 1e-8)
 
    advantages = []
    for k, rp_k in enumerate(process_rewards):
        # Group-normalize process reward at step k
        group_step_rewards = [s.process_rewards[k] for s in prompt_group]
        mu_p = mean(group_step_rewards)
        sigma_p = std(group_step_rewards)
        process_adv = (rp_k - mu_p) / (sigma_p + 1e-8)
 
        if mode == 'both':
            A_k = process_adv_coef * process_adv + outcome_adv_coef * outcome_adv
        elif mode == 'only':
            A_k = process_adv
        else:  # 'none'
            A_k = outcome_adv
 
        advantages.append(A_k)
    return advantages

3.7 代码与论文对应表

论文概念对应代码文件关键函数/类
SDE 采样 + RGGeuphonium/grpo/grpo_sampling/sampling.pyrun_sample_step()
GRPO 训练步euphonium/grpo/grpo_training/grpo_step.pygrpo_one_step()
训练主循环euphonium/grpo/grpo_training/trainer.py主 training loop
双优势计算euphonium/grpo/grpo_training/trainer.pyprocess_reward_advantage_mode 分支
KL 散度euphonium/grpo/grpo_training/kl_divergence.pyKL 计算
PRM(隐空间)euphonium/reward_models/trl_reward/latent_sub_reward.pycompute_process_reward()
ORM(像素空间)euphonium/reward_models/trl_reward/video_align_sub_reward.pycompute()
总奖励聚合euphonium/reward_models/trl_reward/trl_core_reward.pycompute()
HunyuanVideo 主模型euphonium/models/hunyuan/modules/models.pyDiT 主干
调度器euphonium/models/hunyuan/diffusion/schedulers/scheduling_flow_match_discrete.py离散 Flow Match 调度
GRPO 超参数euphonium/grpo/grpo_config/grpo_args.pyGRPOArgs
奖励梯度配置euphonium/grpo/grpo_config/reward_args.pyPROCESS_LATENT_REWARD_* 环境变量

4. Experimental Setup (实验设置)

后训练骨干模型:

  • HunyuanVideo(Kong et al., 2024),14B 参数,开源视频生成模型
  • 所有对比方法在相同骨干上实现,确保公平对比

对比基线:

  • Base Model(HunyuanVideo,无后训练)
  • Flow-GRPO(Liu et al., 2025b)
  • DanceGRPO(Xue et al., 2025)

奖励模型训练数据:

  • 策划数据集:200,000 个视频样本,来自 20,000 个独特提示词
  • 标注协议:基于视觉质量和运动保真度的逐点二元标注(正/负)
  • 偏好对构建:对比正负实例对,用于偏好学习

PRM 训练设置:

  • 初始化自 HunyuanVideo DiT 预训练层子集(仅 8 层 DiT 层,相比 14B 参数主模型)
  • 在隐空间直接预测质量分数
  • 固定 VAE 和文本编码器

ORM 训练设置:

  • 基于 InternVL3-1B(Zhu et al., 2025)微调的评分模型
  • Bradley-Terry 目标在配对偏好标注上优化

GRPO 训练数据:

  • 10,000 条提示词,来自 DanceGRPO 及内部人像相关源
  • 严格与奖励模型训练集隔离

评估指标:

  • VBench2(Zheng et al., 2025b)总分及全部 5 个子维度:
    • Creativity(创造性)
    • Commonsense(常识性)
    • Controllability(可控性)
    • Human Fidelity(人像保真度)
    • Physics(物理一致性)

计算环境:

  • 单节点/多节点训练,使用 H800 GPU
  • CUDA 12.4

时序激活窗口:

  • RGG 激活于后半段时间步(,即步骤 ,共 16 步)

5. Experimental Results (实验结果)

5.1 主要结果(VBench2)

Table 1: VBench2 定量对比

方法Total ScoreCreativityCommonsenseControllabilityHuman FidelityPhysics
Base Model51.0940.1862.8723.9583.3045.15
Flow-GRPO51.5242.4262.8624.4185.4142.48
DanceGRPO51.8540.9361.9925.0888.1043.14
Euphonium (Ours)54.2441.4267.1726.8888.9146.84
  • Euphonium 在 Total Score 上超越第二名 DanceGRPO 2.39 分
  • 在 5 个维度中的 4 个(Commonsense、Controllability、Human Fidelity、Physics)均排名第一
  • Creativity 维度略低于 Flow-GRPO(41.42 vs 42.42),但仍排名第二

5.2 训练效率(收敛速度)

Figure 1 Left 解读: 训练奖励随步骤的对比曲线。Euphonium(红色)在约 250 步达到 DanceGRPO(绿色)约 400 步才达到的奖励水平,收敛速度提升 1.66×。这验证了 PRM 梯度引导的有向探索相比无向随机探索的效率优势。

5.3 计算开销(Table 2: RGG 开销分析)

指标基线w/ RGG开销
Latency (ms/step)1005.61030.1+2.4%
Peak VRAM (GB)32.935.7+8.5%

轻量级隐空间 PRM 设计(8 层 DiT vs 主模型 14B 参数)将额外开销控制在极低水平:每步仅多 2.4% 延迟、8.5% 显存占用,验证了 RGG 的实用性。

5.4 消融实验(Table 3)

消融设置VBench2 Total Score
Euphonium(完整)54.24
w/o Active Steering(去除 RGG 梯度引导)53.61
w/o PRM Advantage(去除过程奖励优势)53.95
w/o ORM Advantage(去除结果奖励优势)53.59

关键发现:

  • 去除 RGG(Active Steering):分数从 54.24 降至 53.61(-0.63),证明有向探索对导航高质量样本稀疏流形的必要性
  • 去除 PRM Advantage:分数降至 53.95(-0.29),说明密集步骤级反馈带来细粒度信用分配
  • 去除 ORM Advantage:分数降至 53.59(-0.65),这一降幅与去除整个 RGG 相当,说明像素级评估对感知质量至关重要,隐空间 PRM 无法完全替代
  • ORM 消融的影响与 Active Steering 消融相当,两者共同构成系统的关键支柱

5.5 RGG 超参数敏感性(Table 4 & 5)

引导系数 (Table 4):

VBench2 Total
0.0153.61
0.154.24
1.052.86

中等引导强度()最优:过弱则引导不足,过强()会过度修正,扭曲流动力学,降低多样性。

时序激活窗口(Table 5):

引导窗口步骤范围VBench2 Total
None(基线)-53.61
Full Trajectory53.64
Latter Half54.24
Late Stage54.14

后半段激活最优:早期步骤()建立全局结构,激进引导会引起时序不一致;后期步骤具备足够的优化空间用于精细调整。

5.6 PRM 准确性分析

Figure 3 解读: 隐空间 PRM 在不同噪声时间步(0-49)和像素空间 ORM 的配对比较准确率。PRM 在所有噪声水平上保持 >70% 的准确率(ORM 为 0.783,PRM 最高为 0.725),验证了隐空间 PRM 在中间噪声状态下的可靠评估能力,证明其可作为视觉质量的有效代理。

5.7 定性结果

Figure 2 解读: 四种方法(Baseline、Flow-GRPO、DanceGRPO、Ours)在两个测试提示词上的视频帧对比。左列(“A group of people eat pizza at a table”)中,基线和对比方法出现人脸形变、画面不一致等伪影,Euphonium 生成的人脸更真实、画面更连贯。右列(“A woman walks through a field of sunflowers”)中,Euphonium 的人物与背景交互更自然,运动物理更合理。

5.8 局限性与未来工作

  1. PRM 泛化性:隐空间 PRM 与特定 VAE 的隐空间耦合,限制了跨不同视频生成架构的迁移能力
  2. PRM 鲁棒性:相比基于像素的模型,隐空间 PRM 的鲁棒性仍需进一步研究
  3. 未来方向:探索使用 Representation Autoencoders(RAE)定义通用共享隐空间,实现骨干无关的 PRM,可跨不同视频生成模型推广

总体结论:

Euphonium 通过将 PRM 梯度显式注入流匹配采样的 SDE 漂移项,从理论上严格推导出有向探索框架,结合双奖励 GRPO(密集过程奖励 + 稀疏结果奖励)和策略蒸馏,实现了:在 VBench2 上达到 54.24 总分(超越当前最优 DanceGRPO 的 51.85),训练收敛速度提升 1.66×,且推理时无额外计算开销。