通过 TRL 使用 DDPO 微调 Stable Diffusion

Hugging Face 已通过 DDPOTrainer 将去噪扩散策略优化 (Denoising Diffusion Policy Optimization, DDPO) 集成到了 trl 库中,允许使用强化学习 (RL) 对 Stable Diffusion 模型进行微调,从而更好地符合人类偏好和审美标准。

DDPO vs. Reward-Weighted Regression

DDPO 通过减少计算开销和消除近似误差,改进了以往的扩散模型强化学习方法,例如奖励加权回归 (Reward-weighted regression, RWR)。RWR 复用去噪损失函数并根据最终样本的奖励进行加权——实际上忽略了中间步骤——而 DDPO 将整个去噪过程视为一个多步马尔可夫决策过程 (MDP)。

通过将该过程构建为 MDP 并使用固定采样器,DDPO 允许智能体策略为各向同性高斯分布。这使得计算每个去噪步骤的精确似然成为可能,而不是依赖于最终样本的近似似然,从而带来更好的性能并能够处理更复杂的目标。

DDPO 算法与 RLHF 工作流

DDPO 利用策略梯度方法,特别是近端策略优化 (Proximal Policy Optimization, PPO) 来解决优化问题。DDPO 实现中的主要定制部分是 PPO 算法的轨迹收集部分。

当集成到人类反馈强化学习 (RLHF) 工作流中时,对齐扩散模型的流程被简化为三个步骤:

  1. 预训练模型:从预训练的扩散模型(例如 Stable Diffusion)开始。
  2. 奖励模型:收集偏好数据并训练一个奖励模型作为信号。
  3. DDPO 微调:使用 DDPO 并以奖励模型作为信号来微调模型。

在提高图像美感的情况下,Hugging Face 使用了一个冻结的 CLIP 模型,并配有一个在 Aesthetic Visual Analysis (AVA) 数据集上训练的可训练回归头,作为奖励信号器。

实现与训练指南

使用 DDPO 训练 Stable Diffusion 需要大量的硬件资源;为了避免显存溢出 (OOM) 错误,最低配置要求是 NVIDIA A100 GPU。实现是通过 trl 库中的 DDPOTrainerDDPOConfig 类来完成的。

推荐超参数

对于单 GPU 训练,建议使用以下超参数:

参数 推荐值
num_epochs 200
train_batch_size 3
sample_batch_size 6
gradient_accumulation_steps 1
sample_num_steps 50
sample_num_batches_per_epoch 4
per_prompt_stat_tracking True
per_prompt_stat_tracking_buffer_size 32
mixed_precision True
train_learning_rate 3e-4

主要发现与经验教训

来自 Hugging Face 的实验结果表明,即使训练提示词集规模很小,经过 DDPO 微调的模型也能在广泛的提示词上表现出良好的泛化能力。

LoRA vs. 全量微调

  • LoRA:推荐使用,并在多次测试中被证明是稳定的。
  • 全量微调 (non-LoRA):可以产生比 LoRA 更复杂的图像,但稳定性的挑战要大得多。对于非 LoRA 运行,建议设置较低的学习率(约 1e-5)并将 mixed_precision 设置为 None

当前局限性

目前 trl 库中 DDPOTrainer 的实现仅限于微调原生的 Stable Diffusion 模型。虽然 LoRA 是主要关注点且效果良好,但全量训练是可能的,只是需要更精确的超参数调优。

Sources