简介:扩散/流生成模型的采样是近似确定性的ODE过程,天然缺少策略梯度所需的显式对数概率。本文系统讲解扩散模型强化学习微调的底层机制:如何用SDE把采样改造成随机策略、如何逐转移分解对数概率、组相对优势与重要性比率如何构成损失,并深入梯度推导,揭示“速度差项”这一关键陷阱及其修正思路,帮助读者真正理解扩散RL在优化什么。
本文解释“扩散/流生成模型的强化学习微调”(下称扩散RL)的底层运行机制。扩散模型(含流匹配模型)的采样过程是一条近似确定性的常微分方程(ODE)轨迹,模型本身只是逐时刻预测速度或噪声的网络,并不像自回归模型那样天然给出某个完整样本的对数概率;而策略梯度类强化学习方法(如PPO、GRPO)成立的前提,是能对“动作”求对数概率并对其求导。因此,扩散RL的技术要点几乎浓缩在一个问题上:
如何为一张由多步去噪采出的图像,构造一个数学上成立、计算上可行、梯度上干净的对数概率,并弄清它的梯度究竟把模型往哪里推。
围绕这一问题,业界的代表性工作大致沿几条路线展开:在采样过程中注入随机性并结合组相对策略优化(本文的分析主线);引入辅助建模结构以增强轨迹的供给与评估;以及绕开显式似然、以免负样本的方式改写训练目标。这些工作的共同分析工具是一致的:写出等效损失、对梯度做显式推导、检查梯度里究竟有什么。本文沿第一条主线,完整走一遍“采样改造 → 概率构造 → 损失构成 → 梯度推导 → 发现陷阱 → 修正闭环”的全过程。
扩散RL要解决的问题可以归结为“目标错位”与“概率缺席”两层。
第一层是目标错位。预训练阶段的去噪损失或流匹配损失本质上是逐点回归:在给定状态与时刻的条件下,让网络预测的速度场逼近真实速度。这个目标只关心“与数据分布吻合”,不关心“人类更喜欢哪张图”。而微调阶段真正想要的是奖励——审美偏好、图文一致性、指令遵循等,这些信号往往不可微、只对整张图定义,无法直接写进预训练损失。强化学习恰好擅长优化这种“黑盒标量奖励”,于是自然想到用策略梯度:J(θ) = E[R(x)],其梯度为 E[R(x)·∇θ log πθ(x)]。
第二层是概率缺席。要用上面的公式,必须能计算 ∇θ log πθ(x)。但扩散模型有两个先天障碍:
因此,做扩散RL必须先解决两件事:把确定性采样改造成随机策略(获得条件分布),再把整条轨迹的概率显式分解出来(获得对数概率)。这是所有代表性工作的共同起点。
第一步,改造采样方程。 在每一步积分时叠加高斯噪声:
x{t-1} = x_t + vθ(x_t, t)·Δt + σ_t·√Δt·ε_t,其中 ε_t ∼ N(0, I)
第二步,识别每步的转移分布。 上式意味着,给定 x_t,下一状态服从高斯分布:
p(x{t-1} | x_t) = N( x{t-1}; xt + vθ(x_t,t)·Δt, σ_t²·Δt·I )
均值由“一步预测”决定,方差由噪声调度器决定。特别注意:方差与高斯密度的归一化常数都与参数 θ 无关,是常数。
第三步,分解整条轨迹的概率。 整条采样链构成马尔可夫链,起点是固定先验(不含参数),因此轨迹对数概率可按链式法则分解为各步转移对数密度之和。由于“与 θ 无关的常数在每一步都存在”,在新旧策略的比率中它们会逐项抵消——这正是“每一步的常数可以在比率中被约掉”的含义。最终,对数概率之差本质上只剩一个量:各步“预测均值与实际落点的距离”在新旧策略下的差。
这里必须区分两个极易混淆的对象:训练时评估密度用的是“不加噪声的一步预测”(作为高斯均值);采样时实际得到的下一状态是“旧策略的预测 + 噪声”。这个区别是后文关键陷阱的伏笔。
为什么这一步是数学前提而非工程技巧?因为如果没有逐转移的随机性,条件分布会退化成确定性映射,对数概率无从定义(等价于方差趋零的病态高斯);没有逐转移密度,整条轨迹的似然与策略梯度就都失去落脚点。加噪声不是为了“让样本多样一点”这么简单,它是策略梯度在扩散模型上成立的必要改造。
SDE化之后,采样器真正成为一个随机策略,可以对同一提示采出一组样本。处理链路如下:
这套设计有两个现实理由:其一,奖励只对整图定义、且不同提示之间的奖励分布漂移很大,组内标准化天然充当了自适应基线;其二,它免去了价值网络的开销——对图像生成而言,“一个动作就是一整张图”,价值网络的输入输出都非常昂贵。在后续梯度中,优势 A 不参与求导,只充当每个样本梯度的权重系数:正优势样本的逐步密度被推高,负优势样本被压低。
有了对数概率和优势,损失就是标准的组相对策略优化形式(忽略KL正则项):
L(θ) = E[ min( r·A, clip(r, 1−ε, 1+ε)·A ) ],其中 r = exp( log π_θ − log π_old )
两个对数概率都是各步高斯转移密度之和,且使用同一批采出的中间状态 (xt, x{t-1})。于是比率 r 比较的是:同一个实际落点,在“新策略均值”与“旧策略均值”两个高斯下的密度之比。由于方差项与归一化常数逐项抵消,r 完全由“预测均值与落点的距离”决定,计算上只需对新策略做一次逐步前向(不加噪声的预测),再与缓存值作差。
这是全文的核心。对比率项逐层求导,看梯度里到底有什么。
推导第一步: 对 r·A 求梯度,得 ∇(r·A) = r·A·∇log r。前置因子 r > 0 只缩放梯度的长度、不改变方向;而且刚采样完成的第一次迭代里 θ 与 θ_old 完全相同,r 恒等于1;常见设定中每个采样批次只做极少数次迭代(例如一两次),r 始终接近1。因此第一处近似是“去掉 r”——即使不严格成立,也只是缩放梯度大小、不影响方向,基本无害。
推导第二步: 损失里的 min 与 clip 是PPO裁剪,只在 |r−1| 越界时接管、用于限制步长,分析梯度方向时可以省略。于是梯度近似为:
g ≈ A · Σt ∇θ log pθ(x{t-1} | x_t)
推导第三步: 展开单步。单步对数密度对参数的梯度为:
∇θ log pθ(x{t-1}|x_t) = ( x{t-1} − xt − vθ·Δt )ᵀ · ∇θ vθ / (σ_t²·Δt)
把采样关系 x_{t-1} − x_t = v_old·Δt + σ_t·√Δt·ε_t 代入,整理成两项:
∇θ log pθ = [ εtᵀ·∇θ vθ ]·(√Δt/σ_t) + [ (v_old − vθ)ᵀ·∇θ vθ ]·(Δt/σ_t²)
这两项的含义截然不同:
由此可以把推导中用到的两个近似列成一张表:
| 近似 | 内容 | 若不严格成立的影响 |
|---|---|---|
| 近似一 | 去掉比率因子 r(视 r≈1) | 仅缩放梯度长度,不改变方向,基本无害 |
| 近似二 | 忽略速度差项(视 v_θ ≈ v_old) | 直接改变梯度方向,仅在刚采样后严格成立 |
第二个近似就是关键陷阱:它把一个影响梯度方向的项当作零处理。在“每个批次只迭代一两次”的设定下它近似成立,但逻辑上是牵强的——它依赖训练动态(参数还没怎么动),而不是数学恒等。这也解释了为什么同类方法普遍把每个采样批次的数据复用次数压得很低。
同一批作者后来给出的修正工作正是针对这一陷阱:他们重新审视并修改了对数概率的定义方式,使训练时评估的每步转移与采样时实际执行的转移在定义层面一致,从而在梯度表达式中不再出现速度差项;修正之后,原推导中的第二个约等号变成了严格等号。这件事的意义超出“修一个问题”本身:对数概率的定义方式就是方法定义的一部分,不同的定义会导出不同的等效损失与梯度偏置。定义是否干净,直接决定了多步训练、多次数据复用之后,策略改进方向是否仍然指向期望奖励上升的方向。
其余代表性路线则从不同侧面处理同一类难题:有的引入辅助建模结构来扩展与评估轨迹,有的绕开显式似然、以免负样本的加权方式直接改写去噪目标,从源头上回避比率与似然定义的纠葛。它们的细节各异,但检验标准一致——把等效损失求出梯度,看模型实际被推向的方向是否是“高奖励轨迹的逐步转移被增强、低奖励轨迹被抑制”。这正是“求梯度看本质”这一分析方法的价值:它把各种包装还原成同一种语言。
以下伪代码概括主线路线的完整运行流程(仅作机制示意):
# ---- 采样阶段(旧策略 θ_old,不回传梯度)----for prompt in prompts:group = []for i in range(G): # 组内多样本x = sample_prior() # 固定先验出发traj = []for t in [T, ..., 1]:v_old = model(x, t) # 一步预测(不加噪声)x_next = x + v_old*dt + sigma_t*sqrt(dt)*randn() # SDE一步traj.append((x, t, x_next, log_p_step))r = reward_model(decode(x_next), prompt)group.append((traj, r))A = group_normalize([r for _, r in group]) # 组内标准化 → 优势# ---- 训练阶段(新策略 θ,每个批次仅极少次迭代)----for epoch in range(K): # K 通常为 1~2for (traj, A_j) in dataset:logp_new = 0for (x_t, t, x_next, logp_old_step) in traj:v_new = model(x_t, t) # 训练时评估:同样不加噪声logp_new += log_gaussian(x_next,mean = x_t + v_new*dt,std = sigma_t*sqrt(dt))ratio = exp(logp_new - sum(logp_old_step))loss = -min(ratio*A_j, clip(ratio, 1-eps, 1+eps)*A_j)loss.backward(); optimizer.step()
可以对照第七节检查:训练阶段评估均值时用的是“不加噪声的一步预测”,而实际落点 x_next 来自“旧预测+噪声”,两者定义层面的错位正是速度差项的来源。
优势方面:
限制方面:
回到原理本身,扩散RL的完整机制链是:把确定性去噪链SDE化成随机策略;用逐转移高斯密度拼出轨迹对数概率,与参数无关的常数在比率中抵消;用组相对优势加权的裁剪比率损失做极少步的策略梯度;对梯度做显式推导后可以看到,其本质是“带优势加权的逐步预测修正”,其中新旧速度差项的取舍定义了方法的干净程度,后续修正工作通过重新定义对数概率把它彻底移除。对实践者而言,最有价值的启示在方法论层面:面对任何复杂的训练方法,“写出等效损失、再对梯度做显式推导”是最可靠的透视工具——损失函数怎么写、对数概率怎么定义,决定了模型实际被推向的方向。