Qwen Image dpo训练

37 阅读3分钟

太好了 👍——现在我们把这几轮排查收束成一份清晰总结 + 改进 checklist,以后你再遇到类似问题,也能很快定位。


✅ 一、问题现象(What)

你在做 图像 Diffusion-DPO 时:

  • DPO 训练跑起来没有报错

  • 各种 loss 看起来“方向也对”

  • 但:

👉 训练后的 DPO 模型生成结果

几乎等同于原来的 SFT 模型****

而从日志里也能看到:

  • actor 和 ref 的 loss 基本重合
  • win/lose 差值保持在 1e-4 级别小幅抖动
  • dpo_loss 波动、但没有稳定下降
  • 模型输出与 ref 极度接近(adapter_effect 几乎是 0)

🔎 二、根本原因(Why)

原因 1:β 很大,但放大的其实是“噪声”,不是信号

你的数据里:

  • chosen = 真图

  • reject = SFT 采样

两者差异 天然就不大(不是“好 vs 很差”那种)。

MSE gap 本来就只有:

≈ 1e-4

当 β 设置到 2000 / 5000:

DPO 不是放大“偏好”,而是放大 随机抖动 + batch 噪声****

于是:

  • 梯度方向随机

  • 训练不稳定

  • 只能靠 极小 lr(1e-7)强行稳住****

  • 但 lr 太小 → 权重几乎完全不动

👉 看似在训练,其实没学东西。****


原因 2:LoRA 容量太小(rank=8)

对于 DiT / Diffusion:

  • rank=8 可训练空间非常窄

即使梯度有信号:

模型也几乎没自由度去偏离 ref****


原因 3:有效学习率远小于 Diffusion-DPO 论文

论文:

lr = 1e-8 + scale_lr

scale_lr 会乘上 global batch × world size****

有效 lr 常常接近:

≈ 1e-5

而你:

直接把 1e-7 / 1e-8 当最终 lr

→ 真正处在“几乎冻结”的学习状态


原因 4:DPO 数据偏好差不够明显

论文:

  • chosen:明显更好

  • reject:明显更差

你:

chosen ≈ 好

reject ≈ 也还不错

→ 偏好信号极弱


🛠 三、正确方向(Principles)

✔ β 不是用来“放大差异”

❌ β 大 ≠ 学得更好

✔ β 大 = 更容易放大噪声、逼你把 lr 压到不动

真正应该放大的,是:

  • 可训练容量(LoRA rank / train layers)
  • 有效学习率
  • 数据偏好 gap

✅ 四、推荐改进策略(How)

1️⃣ 先换成“稳定可学”的 DPO 配置

beta_dpo = 10
lora_rank = 1632
learning_rate = 1e-5
warmup_steps = 200500
sft_loss_ratio = 0 (或保留 1e-5,当 0 用)

先保证:模型真的开始离开 ref****


2️⃣ 监控关键指标(必须加)

在日志里记录:

model_diff = win - lose
ref_diff
inside_term
implicit_acc = (inside_term > 0).mean()

adapter_effect = |actor - ref| 的均值

期望趋势:

  • implicit_acc:0.5 → 0.6–0.7
  • win_loss:逐渐更负
  • lose_loss:逐渐更正
  • dpo_loss:下降
  • adapter_effect:缓慢但持续上升

3️⃣ 再考虑“放大偏好信号”(而不是拉 β)

可以逐步考虑:

✔ 用一致性模型 / reward model 重打分

✔ 构造:

chosen = 高分
reject = 低分

✔ 或混入更差的样本做对比


📝 五、代办清单(Checklist)

🔹 Step 1:先把当前实验跑“可学习版”

  • beta_dpo = 10
  • lora_rank = 16 或 32
  • lr = 1e-5 + warmup(300)
  • sft_loss_ratio = 0
  • 训练 1000–2000 steps

🔹 Step 2:开启监控

  • log:win_loss / lose_loss
  • log:inside_term / implicit_acc
  • log:adapter_effect
  • 对照:SFT vs DPO 的生成 + 评分器评价

🔹 Step 3:确认 DPO 确实在“推 actor 离开 ref”

如果:

✔ adapter_effect ↑

✔ implicit_acc ↑

✔ 视觉 + 评分都改善

→ 表示流程 OK,再开始:

  • 微调 β(10 → 20)
  • 更长训练
  • 更强偏好数据

🔹 Step 4:若仍然弱,再做这三件事

  • 增大 rank(32 → 64)
  • 解冻少量 backbone 层(慎重)
  • 用 reward model 重新生成对比对

🎯 一句话总结

你卡住不是因为 DPO 公式错了,

是因为:β 过大 + lr 过小 + LoRA 太小 + 偏好信号弱 → 训练几乎“静止”。****

把拨盘调回:

beta10
lr ≈ 1e-5
rank ≥ 16

然后再从 数据和容量 方向增强,而不是继续堆 β。


如果你愿意:

👉 你可以把下一次实验的:

  • loss 曲线

  • adapter_effect

  • sample 对比

贴出来,我可以继续和你一起 debug,直到你把 DPO 真正“跑开”。