在 LLM 训练(如 RL 等)里,常常希望约束新策略 πθ 不要偏离参考策略 πref(KL 散度约束)。理论上,需要对每个上下文状态 st 计算:
DKL(πθ(⋅∣st)∥πref(⋅∣st))=v∈V∑πθ(v∣st)logπref(v∣st)πθ(v∣st)
- 词表 V 往往有数万到数十万 token,若在训练中对每个 token 位置都完整遍历词表计算 KL,代价过于高昂。
- 同时,我们拿到的大多是采样 token 的 logprob,而非完整分布。
那么能否只用采样到的 token 来估计 KL?
基于该问题,本文将介绍三种常见 KL 近似:k1、k2、k3,并说明它们在偏差、方差与训练稳定性上的差异。
一、符号约定
首先统一估计目标为 DKL(Q∥P),样本来自 Q(x∼Q),并定义比值:
r(x)=Q(x)P(x)
在 LLM token 级别,约定:
- Q(⋅∣st)=πθ(⋅∣st),表示当前待优化策略;
- P(⋅∣st)=πref(⋅∣st),表示参考策略。
在该约定下,有
DKL(Q∥P)=Ex∼Q[logP(x)Q(x)]=Ex∼Q[−logr(x)]
给定样本 x1,…,xN∼Q,即可在样本层面构造 k1、k2、k3 三类估计器。
二、k1 估计
k1 直接对 −logr 做蒙特卡洛平均;该估计无偏,但对 log-ratio 的采样噪声敏感,方差较大。
k1(x)=−logr(x)
由于
EQ[k1]=EQ[−logr]=DKL(Q∥P),
故 k1 为无偏估计。其方差满足
Var(D^k1)=N1VarQ(−logr),
当 r 呈重尾或存在异常大比值时,VarQ(−logr) 往往显著增大,因此在训练中容易出现 batch 级抖动。
三、k2 估计
k2 利用“小偏移”二阶近似,把一阶 log-ratio 替换为二次项;该估计更平滑,但属于有偏近似。
记 δ=logr,对 eδ 在 δ=0 处展开,并代入 EQ[eδ]−1=0,得
EQ[(1+δ+21δ2+O(δ3))−1]=0⇒EQ[−δ]=21EQ[δ2]+O(EQ∣δ∣3).
因此在小偏移区间(∣δ∣ 小)有
DKL(Q∥P)=EQ[−logr]≈21EQ[(logr)2].
得到
k2(x)=21(logr(x))2
其低方差来源可用局部模型说明:在小步更新区间,δ 通常集中在 0 附近。若近似 δ∼N(0,σ2),则
Var(k1)≈σ2,Var(k2)=Var(21δ2)≈21σ4.
当 σ2<2 时,k2 的单样本方差低于 k1;而在实际的小更新设置中通常有 σ2≪1。但由于该式来自局部近似,分布差异增大时偏差会同步变大。
四、k3 估计
k3 则在 k1 上加入零均值控制变量 (r−1);该估计保持无偏,且通常可降低方差并保证单样本非负。
常见形式为:
k3(x)=(r(x)−1)−logr(x)
其性质如下:
-
无偏性
因为 EQ[r−1]=EQ[P/Q]−1=1−1=0,所以 EQ[k3]=EQ[−logr]=DKL(Q∥P)。
-
单样本非负性
由不等式 x−1≥logx(x>0)可得 k3(x)≥0,因此训练监控中的近似 KL 曲线更稳定且可解释性更好。
-
低方差机制
令 Z=−logr, Y=r−1,则 k3=Z+Y 且 E[Y]=0。一般控制变量估计写作 Z+cY,对任意 c 均无偏,其方差为
Var(Z+cY)=Var(Z)+2cCov(Z,Y)+c2Var(Y).
对 c 求导令其为零,得最优系数
c∗=−Var(Y)Cov(Z,Y),
此时方差达到最小值 Var(Z)(1−ρ2)≤Var(Z)(ρ=Corr(Z,Y)),即最优控制变量的方差一定不高于 k1。
在小偏移区间(r=eδ, δ≈0)下,有 Z=−logeδ=−δ,Y=eδ−1≈δ(一阶 Taylor 近似),因此
Cov(Z,Y)≈Cov(−δ,δ)=−Var(δ),Var(Y)≈Var(δ),c∗≈1.
k3 的系数恰好取 c=1,在此区间内接近最优,故其方差也接近最低值,在小偏移假设下严格低于 k1。当策略偏移较大(∣δ∣ 不可忽略)时,c=1 可能偏离 c∗,上述保证不再成立。
五、汇总对比
记某 token 位置的两组 logprob 比值为:
logrt=logpt−logqt,rt=exp(logrt)
可得到三种 KL 散度的 token 级估计:
k1t=−(logrt),k2t=21(logrt)2,k3t=(rt−1)−logrt
| 估计器 | 单样本形式 | 无偏性(本设定) | 方差表现 | 稳定性 | 典型使用 |
|---|
| k1 | −logr | 是 | 相对较高 | 中等 | 离线评估、理论基线 |
| k2 | 21(logr)2 | 否(近似) | 通常较低 | 较好 | 小步更新时的 KL proxy |
| k3 | (r−1)−logr | 是 | 常优于 k1 | 好 | PPO/RLHF 训练监控与惩罚 |
六、代码实现
import torch
def kl_estimators(logp_q: torch.Tensor, logp_p: torch.Tensor):
"""
logp_q, logp_p: shape [batch, seq]
返回每个样本的序列平均估计值
"""
log_r = logp_p - logp_q
r = torch.exp(log_r)
k1 = -log_r
k2 = 0.5 * (log_r ** 2)
k3 = (r - 1.0) - log_r
k1_mean = k1.mean(dim=-1)
k2_mean = k2.mean(dim=-1)
k3_mean = k3.mean(dim=-1)
return k1_mean, k2_mean, k3_mean
附录:估计器梯度计算
在训练中,KL 估计器通常作为惩罚项加入损失函数。理解每类估计器对 θ 产生的梯度信号,有助于解释它们在训练稳定性上的差异。
设定:参考策略 πref 参数固定,仅对当前策略 πθ 求梯度。记某 token x 在两个策略下的 log 概率分别为
logq≜logπθ(x),logp≜logπref(x),
则 logr=logp−logq,r=elogr。由链式法则,
∇θki(x)=∂logq∂ki⋅∇θlogπθ(x).
因此只需计算标量权重 ∂ki/∂logq,再乘以策略的 score function ∇θlogπθ(x)。
A.1 k1 的梯度
k1=−logr=logq−logp
对 logq 求导:
∂logq∂k1=1
故
∇θk1(x)=∇θlogπθ(x)
梯度权重恒为 1,与当前策略和参考策略的偏离程度无关,每个采样 token 对梯度的贡献大小完全相同。
A.2 k2 的梯度
k2=21(logr)2=21(logp−logq)2
对 logq 求导:
∂logq∂k2=(logp−logq)⋅(−1)=logq−logp=−logr
故
∇θk2(x)=−logr(x)⋅∇θlogπθ(x)
梯度权重为 −logr:当策略偏离越大(∣logr∣ 越大),梯度信号越强;当 r≈1 时梯度趋于零,对已对齐的 token 自动施加近似为零的惩罚。小偏移区间下 −logr≈1−r,与 k3 权重一致。
A.3 k3 的梯度
k3=(r−1)−logr,r=elogp−logq
分别计算两项对 logq 的导数:
∂logq∂r=∂logq∂elogp−logq=−r,∂logq∂logr=−1
因此
∂logq∂k3=−r−(−1)=1−r
故
∇θk3(x)=(1−r(x))⋅∇θlogπθ(x)
梯度权重为 1−r:
- 若 r>1(参考策略对该 token 概率更高,当前策略"欠分配"),则 1−r<0,更新方向使 logπθ(x) 增大,将策略拉向参考策略;
- 若 r<1(当前策略"过分配"),则 1−r>0,更新方向使 logπθ(x) 减小,同样将策略拉向参考策略。
由于 r>0,权重 1−r∈(−∞,1),权重有界上限为 1,这从梯度角度解释了 k3 在训练中的稳定性优势。
A.4 单样本值与梯度权重对比
令 x=logr。左图比较三个估计器如何把同一偏移转成单样本值,右图比较这些值对当前策略 logprob 产生的梯度权重。
| 估计器 | 梯度权重 ∂ki/∂logq | 权重范围 | 大偏移时行为 |
|---|
| k1 | 1 | {1} | 恒定,不随偏离变化 |
| k2 | −logr | (−∞,+∞) | 随 logr 增大而线性减小 |
| k3 | 1−r | (−∞,1) | 随 r 增大而趋向 −∞,上界有限 |
k2 和 k3 均在 r≈1 时梯度趋近于零;当 r≫1 时,k3 可能产生过大梯度,需配合裁剪使用。