Identity-GRPO: Optimizing Multi-Human Identity-preserving Video Generation via Reinforcement Learning

Paper: arXiv:2510.14256 Code: alibaba/identity-grpo Code reference: main @ c46b2c09 (2026-03-04)

1. 论文试图解决什么问题

Identity-GRPO 讨论的是 MH-IPV(multi-human identity-preserving video generation,多人身份保持视频生成):给定多个人的参考图像和一个文本场景提示,视频模型不仅要生成语义正确、画面质量好的动态视频,还要在整段视频中让每个角色都持续像自己的参考身份,并且不要在多人互动、遮挡、表情变化、角度变化时发生串脸、身份互换或“复制粘贴式”的僵硬保真。

这篇论文的核心判断是:VACE、Phantom 等个性化视频生成模型已经可以把“参考人物 + 文本动作”组合成视频,但它们的训练目标主要覆盖重建、文本对齐、视觉质量或单人身份相似度;当输入同时包含多个人时,模型必须同时处理人物之间的关系、各自的外观细节、时序一致性和场景动态。简单地用 ArcFace 这类静态人脸相似度或通用 VLM 打分做奖励,会把问题压扁成“某一帧像不像”,很难覆盖整段视频里多个主体的身份稳定性。因此作者把问题改写成人类偏好驱动的后训练:先训练一个面向多人身份一致性的 video reward model,再用 GRPO 把该奖励直接反馈给视频生成策略。

一句话贡献:Identity-GRPO 用“多人身份偏好数据 → 带 tie 建模的 Qwen2.5-VL 奖励模型 → 面向参考图和视频采样方差重新设计的 GRPO 稳定训练”来对齐多人人物视频生成,使 VACE-1.3B 和 Phantom-1.3B 在身份一致性指标上分别获得 18.9% 和 6.5% 左右的提升,同时维持或略微提升美学与文本相关性指标。

上图是 arXiv 源包中的数据/参考图示例,直观说明作者为什么强调“不要只复制一张参考脸”。同一个人物需要在不同表情、不同转头角度和不同局部形变下仍然可识别;如果奖励模型只看静态正脸,它会鼓励模型保守地复现参考图,而不是学习可泛化的身份表示。论文的数据构造因此有两个关键目标:一是过滤掉主体数量过多、脸部不清晰或身份不明确的样本,二是主动制造不同视角和表情的参考图,让后续奖励模型能识别“同一身份在运动中保持一致”而不是“逐帧复制”。

2. 方法:从偏好数据到 Identity-GRPO

2.1 多人身份偏好数据集

作者从 OpenHumanVid 出发构造偏好数据。第一步是过滤:用 Qwen3 解析 caption,把视频限制在最多三个人物;再用 Qwen2.5-VL 保留脸部清晰、正面信息充足的样本;之后用 GroundingDINO 和 SAM2 分割并提取所有人物,减少背景和非人物区域对参考图的干扰。这个过滤链条的意义在于,MH-IPV 的奖励如果混入“文本描述不清”“人太多无法分辨”“脸太小”这类噪声,会让偏好标签不再主要反映身份保持。

第二步是参考图增强。论文特别指出多人身份生成里常见的 copy-and-paste 问题:模型可能把参考图中的脸或姿势机械贴到视频里,短期看相似,但运动不自然、表情无法变化。为缓解这个问题,作者用 Flux.1 Kontext 从多个视角和表情编辑出同一人物的参考图,编辑成功率超过 80%。这相当于把身份从“单张图像模板”提升为“跨姿态的外观分布”,为后续奖励模型提供更稳健的监督。

第三步是构造两类偏好对。自动标注部分使用 VACE-1.3B、VACE-14B、Phantom-1.3B、Phantom-14B 和 MAGREF 这五类个性化视频模型生成候选视频。偏好对分两种:其一是“原始视频 vs 生成视频”,原始视频默认更优,因为生成视频可以视为身份信息受损后的版本;其二是“生成视频 1 vs 生成视频 2”,二者在相同参考图和 prompt 条件下生成,由多个 VLM 推理结果多数投票确定偏好。为了避免标签被文本相关性或语义偏差污染,作者还用 GME 计算文本-视频相似度,剔除两侧语义相似度差异过大的 pair。最终得到 10,000 个 Auto-labeled preference pairs。

人工标注部分采用 pairwise annotation,而不是给单个视频打绝对分。标注员看到参考图、文本 prompt 和两个候选视频,需要按“脸部与参考图的一致性、整段视频视觉质量、与文本 prompt 的对齐”来选择 A better、Ties 或 B better。每个 pair 由 3 名标注员评估,多数投票得到最终标签;参考图来自 CelebA-HQ 和过滤后的 OpenHumanVid,prompt 来自 OpenHumanVid,同样用 GME 做质量过滤。最终得到 5,000 个 Human-labeled preference pairs。这里的 tie 标签很重要,因为多人身份视频经常出现“两个结果都差不多”或“身份保真与画质互相抵消”的情况,强迫标注者二选一会给 reward model 注入噪声。

2.2 身份一致性奖励模型

奖励模型以 Qwen2.5-VL-3B 为基座,输入是参考图、文本 prompt 和视频,输出一个用于比较身份一致性的标量 reward。论文使用 Bradley-Terry-with-Ties(BTT)而不是普通 BT。给定相同条件 ((x,t)) 下的两个视频 (y^A,y^B),模型学习一个奖励函数 (r(x,t,y)),并分别建模 A 更好、B 更好、二者 tie 的概率。tie 倾向参数设置为 (\gamma=5),训练目标是对应偏好标签的负对数似然。

这种设计的作用是把奖励模型从“视频质量分类器”约束为“同条件下的相对身份偏好判断器”。在 MH-IPV 中,不同 prompt、不同参考人和不同场景之间的绝对 reward 标尺很难一致;pairwise + BTT 让模型主要学习“在同一个任务条件下哪个视频更保持身份”。tie 建模进一步允许奖励模型表达不确定性,避免把难分样本硬推向某一边。

自动标签并不是直接和人工标签混在一起训练。作者先只用 Human-labeled data 训练一个教师奖励模型 RM_teacher,再让它重新评估 Auto-labeled data,只保留教师预测与原自动标签一致的 pair,得到 Filtered auto-labeled dataset,规模约为原自动集的 48%。随后联合训练 Human-labeled 与 Filtered auto-labeled 两部分,并使用平滑采样策略:训练早期更多依赖人工数据,随后通过余弦调度逐步提高 filtered auto 数据占比。直觉上,这避免了训练初期被自动标签噪声带偏,同时让后期仍能利用自动数据的规模。

奖励模型训练配置也体现了“细粒度身份”取向:作者用 LoRA 更新奖励模型,同时优化 vision encoder;学习率为 2e-6,global batch size 为 32;视频以 2 fps 采样,分辨率约 832×480,即 VACE 和 Phantom 的默认评估分辨率。论文的 reward learning benchmark 有 500 个人工标注视频样本,最终奖励模型准确率为 0.890,高于 ArcFace 的 0.772、Qwen2.5VL-3B 的 0.430、Qwen2.5VL-72B 的 0.657 和 InternVL3.5-38B 的 0.685。这说明通用视觉语言模型即使很大,也未必自然掌握“多主体身份一致性”这一偏好维度;专门的偏好数据和 BTT 目标是必要的。

2.3 GRPO:把视频去噪过程当作策略优化

论文沿用 DDPO/Flow-GRPO 的思路,把 rectified flow 的去噪过程看成 MDP。状态包含条件 (c)、时间步 (t) 和当前 latent (z_t),动作是生成下一个 latent (z_{t-1}),奖励只在最终生成视频 (z_0) 后由 reward model 给出。对同一条件,策略模型一次采样 (G) 个视频,reward model 给每个视频打分,然后用组内标准化计算 advantage:

A_i = (r_i - mean({r_1 ... r_G})) / (std({r_1 ... r_G}) + eps)

随后对每个 denoising timestep 使用 PPO/GRPO 风格的 clipped objective。实现里保存旧策略的 log-prob,更新时重新计算当前策略在同一步的 log-prob,令 ratio = exp(log_prob_new - log_prob_old),再用 clip_range=1e-3 限制策略更新幅度;如果 beta>0,还会加入与 reference model 的 KL loss。这个目标适合视频扩散/flow 模型的原因是:奖励只在最终视频层面可得,但 log-prob 可以分解到采样轨迹的每个去噪步,因此可以把同一个视频级 advantage 回传到多个时间步。

上图对应论文中的训练曲线。VACE-1.3B 的 ID-Consistency 从 2.606 提升到 3.099,Phantom-1.3B 从 3.809 提升到 4.056。曲线不是单调平滑,但总体上升,符合 GRPO 在高方差视频奖励上的典型现象:单轮采样的 reward 会抖动,但只要组内比较稳定且 clip/KL 足够保守,长期趋势可以向奖励模型偏好方向移动。

源包中还包含另一版曲线渲染,数值与主曲线一致,主要用于更清晰地标注 baseline 和 Identity-GRPO 的最终点。笔记保留它是因为 arXiv source-first 抽取得到该资源,且它可以辅助核对 VACE/Phantom 的最终 ID-Consistency 数字。

2.4 为 MH-IPV 稳定训练做的三处调整

第一是 prompt finetuning。VACE 与 Phantom 对 prompt 和参考图的依赖不同:VACE 更容易跟随 prompt,Phantom 更倾向保持参考图内容。如果 prompt 对人物外观描述不充分,reward model 可能把“文本不完整”误判为“身份不一致”。作者用 Qwen2.5-VL-7B 生成包含参考人物外观描述的 prompt,让奖励模型和生成模型看到的条件更明确。

第二是 initial noise differentiation。多人身份生成受参考图强约束,如果同组样本的初始噪声太接近,生成结果之间差异不足,组内 reward 标准差很小,advantage 会不稳定甚至退化。通过不同初始噪声,GRPO 的组内比较能覆盖更丰富的身份保持失败模式,reward model 更容易区分好坏样本。

第三是更大的组/批规模。MH-IPV 的输入包含多张参考图、文本、视频 latent 等多模态信息,比纯 T2V 的采样方差更大。论文将 sampling groups 设为 16,group size (G=8)。消融显示:group number=4 且不区分初始噪声时 ID-Consistency 为 2.588;加入不同初始噪声升至 2.749;group number=16 但不区分初始噪声为 2.718;group number=16 且区分初始噪声达到 3.099。也就是说,噪声多样性和更大的组规模是互补的稳定性来源。

3. 实验结果与消融

3.1 奖励模型是否真的学到了人类偏好

奖励模型主表的结论很明确:专门训练的 identity-consistent reward model 在 500 个人工 benchmark 上达到 0.890 accuracy。相比之下,ArcFace 为 0.772,说明静态人脸相似度和人类对视频身份一致性的偏好并不完全一致;Qwen2.5VL-3B 只有 0.430,即使 few-shot 后也只提升 4.4%;Qwen2.5VL-72B 为 0.657;InternVL3.5-38B 为 0.685。这个结果支持论文的前提:MH-IPV 不能直接依赖通用 VLM 或静态 face recognition 分数作为 RL 奖励。

数据消融显示,Human-labeled only 的 accuracy 是 0.853;Auto-labeled only 只有 0.664;Human + Auto 随机混合反而降到 0.812。这说明原始自动标签噪声很大,不能靠规模直接弥补。Filtered auto-labeled only 是 0.785;Human + Filtered auto random 是 0.877;最终的 Human + Filtered auto + Smooth Sampling 达到 0.890,而 staged sampling 只有 0.824。这里最重要的经验是:自动数据必须经过教师一致性过滤,并且混合比例需要平滑调度;粗暴拼接会破坏人类偏好的信号。

3.2 GRPO 后训练对 VACE 和 Phantom 的影响

主结果表如下:

MethodID-Consistency ↑Aesthetics ↑GmeScore ↑Winning Rate ↑
VACE-1.3B2.60645.58%67.98%24%
VACE-1.3B + Identity-GRPO3.09947.56%68.35%76%
Phantom-1.3B3.80944.13%67.56%37%
Phantom-1.3B + Identity-GRPO4.05647.03%68.47%63%

VACE 的身份一致性提升幅度最大:((3.099-2.606)/2.606 \approx 18.9%)。Phantom 的 baseline 已经更高,提升到 4.056,约为 6.5%。两者的 Aesthetics 和 GmeScore 也略有上升,至少说明 reward 没有明显牺牲画质或文本相关性。用户研究的 winning rate 从 baseline 侧的 24%/37% 变为 Identity-GRPO 侧的 76%/63%,说明该 reward 对齐的人类偏好不仅体现在 reward model 自评上,也被用户选择支持。

定性图中每组上排是 baseline、下排是 Identity-GRPO。改进主要体现在两类失败的减少:一是多个人物在不同帧中脸部特征漂移,尤其是发型、肤色、年龄感和五官比例;二是人物之间身份串扰,例如两个人的脸逐渐变得相似,或某个人的参考身份被另一人的视频区域吸收。Identity-GRPO 后,模型更倾向保留每个角色的独立外观,同时允许身体姿态和场景动作变化。

3.3 与 SFT 的差别

论文还比较了 supervised fine-tuning。VACE-1.3B baseline 的 ArcFace similarity 为 0.235,SFT 为 0.261,Identity-GRPO 为 0.298;ID-Consistency 分别为 2.606、2.774、3.099。这个对比说明,简单监督微调确实能改善身份相似度,但它优化的是数据分布模仿;GRPO 直接优化“同条件下哪个视频更保持身份”的偏好奖励,因此在目标指标上更有效。对于视频生成这种多解任务,偏好优化比单一 target 的 SFT 更适合表达“允许多种动作,但身份必须稳定”的要求。

3.4 这篇论文给视频 RL 的经验

第一,奖励模型必须和任务失败模式同构。MH-IPV 的失败不是普通文本不对齐或画质差,而是多主体身份随时间和交互漂移,所以 reward model 需要看参考图、prompt 和整段视频,并在多人条件下训练。第二,自动标注可以扩大规模,但需要教师过滤和采样调度;否则自动标签会把通用 VLM 的偏差传给策略。第三,GRPO 的组内比较依赖足够的样本差异。对于参考图强约束的视频生成,同一 prompt 下如果不主动扩大初始噪声差异,组内 reward 标准差过低,advantage 变得不可靠。

4. 代码实现映射与伪代码

Code reference: main @ c46b2c09 (2026-03-04)

代码搜索确认公开实现位于 https://github.com/alibaba/identity-grpo。当前仓库主要释放 VACE 路径的训练/测试脚本、Qwen2.5-VL 奖励模型推理与训练组件、LoRA 权重下载说明,以及 Identity-GRPO/VACE 的配置。README 指向的权重包括 outputs/identity_grpo/ckpt/vace/ 下的 Identity-GRPO LoRA,以及 outputs/identity_reward/ 下的奖励模型。仓库没有同等完整的 Phantom 训练入口,因此 Phantom 结果更像是论文实验/权重侧结论,而不是当前代码中可一键复现的路径。

Paper ConceptSource FileKey Class/Function
VACE 训练入口与 GRPO 主循环train_wan2_1_vace.pymain, compute_log_prob, save_ckpt, sampling loop, inner update loop
同 prompt 组采样train_wan2_1_vace.pyDistributedKRepeatSampler(dataset, batch_size, k, ...),其中 k=config.sample.num_image_per_prompt
实际 VACE GRPO 配置config/dgx.pyvace():25 train steps、50 eval steps、33 frames、416×240 train、832×480 eval、group size 8、clip range 1e-3、beta 0.004
reward 组合flow_grpo/rewards.pyvace_score, multi_scorereward_fn={"vace":1.0} 时直接调用 identity reward
per-prompt advantage 标准化flow_grpo/stat_tracking.pyPerPromptStatTracker.update 按 prompt 维护历史 reward 均值/方差
VACE 采样 log-prob patchflow_grpo/diffusers_patch/wan_vace_pipeline_with_logprob.pywan_pipeline_with_logprob, sde_step_with_logprob
奖励模型结构vace_reward/trainer.pyQwen2_5_VLRewardModelBT 在 Qwen2.5-VL hidden states 上接 reward head
奖励模型推理vace_reward/inference.pyVideoVLMRewardInference.prepare_batch, __call__:参考图 + 视频 + prompt → reward logits
奖励模型训练入口vace_reward/train_reward.pycreate_model_and_processor, LoRA target module discovery
数据与 tie 标签flow_grpo/data.py, vace_reward/data.pychosen_label: A=1, B=-1, tie=0;collator 输出 return_loss=True

4.1 代码中的 VACE-GRPO 配置

config/dgx.py:vace() 是当前仓库最具体的训练配置,不应从 config/base.py 的默认值推断论文设置。关键值包括:config.pretrained.reward_model="outputs/identity_reward"config.pretrained.model="Wan-AI/Wan2.1-VACE-1.3B-diffusers",训练采样步数 25、评估采样步数 50、CFG guidance scale 4.5;训练视频为 33 帧、416×240,评估视频为 81 帧、832×480;每卡采样 batch size 为 4,num_image_per_prompt=8 对应组内候选数 (G=8),num_batches_per_epoch=8,训练学习率 1e-4,clip_range=1e-3beta=0.004,LoRA rank/alpha 在训练脚本中为 32/32,mixed precision 为 bf16,并启用 EMA。

4.2 训练主循环伪代码

# based on train_wan2_1_vace.py + config/dgx.py
load WanVACEPipeline(pretrained_model)
freeze VAE and text_encoder
attach LoRA to transformer attention/projection modules
load identity reward model via VideoVLMRewardInference(outputs/identity_reward)
reward_fn = multi_score(scorer, {"vace": 1.0})
 
for epoch in range(num_epochs):
    for batch in num_batches_per_epoch:
        # DistributedKRepeatSampler repeats each prompt k=8 times
        prompts, reference_image_paths = next(train_dataloader)
        prompt_embeds = encode_prompt(prompts)
        videos, latents, log_probs, timesteps, kl = wan_pipeline_with_logprob(
            prompt_embeds, reference_images, num_steps=25,
            height=240, width=416, frames=33
        )
        rewards = reward_fn(reference_image_paths, saved_video_paths, prompts)
        rewards_avg = rewards["avg"] - kl_reward * kl
        advantages = PerPromptStatTracker(global_std=False).update(prompts, rewards_avg)
        samples = pack(latents, log_probs, timesteps, advantages, prompt_embeds)
 
    for inner_epoch in range(num_inner_epochs):
        for timestep j in reversed(sampled_timesteps):
            log_prob_new, mean_new, std_t = compute_log_prob(current_transformer, sample, j)
            with reference_transformer:
                mean_ref = compute_reference_mean(sample, j)
            ratio = exp(log_prob_new - log_prob_old[j])
            policy_loss = mean(max(-A * ratio, -A * clamp(ratio, 1-eps, 1+eps)))
            kl_loss = mean((mean_new - mean_ref)^2 / (2 * (std_t * dt)^2))
            loss = policy_loss + beta * kl_loss
            accelerator.backward(loss)
            optimizer.step(); optimizer.zero_grad()

这段实现和论文公式的对应关系比较直接:wan_pipeline_with_logprob 负责把视频生成轨迹中的每个 denoising step 变成可计算 log-prob 的动作;VideoVLMRewardInference 只在最终视频上打 reward;PerPromptStatTracker 把同 prompt 下的 reward 标准化为 advantage;内层循环按 timestep 计算 ratio 和 clipped policy loss,并可加 KL loss。值得注意的是,代码中 sample.kl_reward=0,主要使用 train.beta=0.004 的 KL loss,而不是把 KL 直接加到 reward 中。

4.3 奖励模型推理路径

vace_reward/inference.pyVideoVLMRewardInference 读取 outputs/identity_reward/model_config.json 与 checkpoint,调用 create_model_and_processor 构建 Qwen2_5_VLRewardModelBT。推理时,prepare_batch 将多张 reference images、生成视频路径和 prompt 组织成 Qwen2.5-VL chat 模板:content 中既有 image 类型的参考图,也有 video 类型的视频和文本 prompt。模型前向返回 logits,代码取每个样本的第一个 reward logit 作为标量分数。这与论文“参考图 + prompt + 视频 → identity-consistent reward”的描述一致。

4.4 代码与论文之间的复现缝隙

当前仓库能很好定位 VACE-1.3B 的 Identity-GRPO 路径,但并没有完全公开论文中所有数据生产细节:OpenHumanVid 过滤、Flux.1 Kontext 参考图增强、VLM 多数投票、GME 过滤和 5,000 人工标注界面都主要在论文中描述,仓库只提供生成后训练所需的 dataset/generated_img/train.csv/test.csv 形式。奖励模型的训练组件存在,但公开权重下载路径比从零复现实验更明确。Phantom 结果在论文中完整报告,当前代码树则没有对称的 Phantom training script/config。复现时应把仓库视为“VACE-GRPO + reward inference/training skeleton + release weights”,而不是完整数据工厂。

5. 局限性、适用边界与可借鉴点

5.1 方法局限

第一,Identity-GRPO 的上限受 reward model 约束。如果奖励模型没有见过某类身份变化,例如极端遮挡、非正面脸、多人快速交互、儿童/老人分布偏差或非真实人物风格,那么 RL 会把策略推向奖励模型偏好的局部区域,而不一定符合真实人类偏好。论文用人工 benchmark 和用户研究缓解了这个问题,但没有证明 reward model 在所有人群和场景上都公平、稳健。

第二,数据构造成本仍然高。虽然作者用自动标注扩展到 10,000 pair,但高质量核心仍依赖 5,000 人工 pair、复杂的 OpenHumanVid 过滤、Flux.1 Kontext 编辑、多个生成模型候选和 GME 过滤。这个 pipeline 对研究团队是可行的,对一般复现者并不轻量。尤其是“自动标签经教师过滤后只剩约 48%”说明原始自动标注噪声不可忽略。

第三,优化目标偏向身份一致性,可能没有覆盖所有视频质量维度。主表显示 Aesthetics 和 GmeScore 没下降,但它们只是两个摘要指标;在更长视频、更复杂镜头语言或更强动作控制任务中,身份 reward 可能和动作多样性、叙事一致性、身体运动自然性发生冲突。论文没有系统讨论 reward hacking,例如模型是否会通过减少头部运动、保持脸部静止来提高身份分数。

第四,当前代码公开的可复现路径偏 VACE。论文声称方法同时增强 VACE 和 Phantom,但 GitHub 仓库主要围绕 train_wan2_1_vace.pyconfig/dgx.py:vace 和 VACE 权重组织。若要复现 Phantom,需要额外找到内部脚本或自行适配相同 reward/GRPO 逻辑。

5.2 适合借鉴到其他视频 RL 任务的部分

最值得复用的是“任务专用 reward model + 组内相对优化 + 稳定采样策略”的组合。对于 audio-video sync、动作一致性、角色交互、物理合理性等视频生成奖励,直接用通用 VLM 打分通常不够。Identity-GRPO 的经验表明,应先构造贴近失败模式的 pairwise preference benchmark,再评估 reward model 是否真的超过静态指标和通用 VLM;只有 reward model 可靠,GRPO 的提升才有意义。

第二个可借鉴点是自动数据的使用方式。论文没有把自动标注当成免费真值,而是用人工数据训练教师,再用一致性过滤保留可信自动样本,并通过平滑采样逐步引入。这种设计适合所有“人工偏好昂贵、自动打标有偏”的后训练场景。

第三个可借鉴点是针对视频采样方差做组设计。纯文本或图像 GRPO 中,同 prompt 多样性相对容易获得;但参考图条件视频生成会把输出压向同一身份模板,组内差异不足。Identity-GRPO 通过不同初始噪声、更大 group number 和 per-prompt reward normalization 来保证 advantage 有信号,这一点对任何 image/video conditional generation RL 都很关键。

5.3 我的读后判断

这篇论文的价值不在于提出全新的 RL 公式,而在于把“多人身份保持”拆成了可训练、可评估、可优化的闭环。它证明了一个朴素但重要的结论:个性化视频生成里的身份问题不能靠单帧人脸相似度解决,也不能假设通用 VLM 已经理解人类对身份稳定性的偏好;必须把数据、奖励和策略优化都围绕同一个失败模式设计。对于想做视频生成 RL 的工作,这篇论文更像一份工程路线图:先定义任务偏好,再验证 reward,再做小步稳定的 GRPO,而不是先套 RL 算法。