只会乘法,真能读懂 KL?
向 LLM 问一百次煮蛋,答案不会一模一样。Dongxi 东锡 NLP 用五个回答比例,把 KL 拆成比值、log、加权平均三步,还解释了 RLHF 为什么肯为模型移动收费。
只会乘法,真能读懂 KL?
向 LLM 问一百次 How long should I boil an egg?,答案不会一百次都一样。模型每个词都在采样,回答会散开。Dongxi 东锡 NLP 在 post training 系列第 6 篇里,用煮鸡蛋这个例子把 KL divergence 拆成三步:比值、log、按新模型的比例求平均。文章开头给的承诺很直接,只需要会乘法。评论区有人看到标题说,只会乘法就能懂 KL?这个我要认真看。
五个回答,一组概率
Dongxi 给出的起点分布是这样的:含糊回答 Boil it until it's done. 占 40%;About 10 minutes. 占 25%;先说一长段鸡蛋知识、最后才给 10 分钟的占 15%;给出软煮 6 到 7 分钟、硬煮 10 到 12 分钟,再过冷水的回答占 12%;说 2 分钟就能煮成 hard-boiled egg 的错误回答占 8%。比例加起来 100%。这组比例就是 probability distribution,描述模型此刻的习惯。起点模型叫 reference,参考模型。
训练一小会儿之后,含糊回答从 40% 降到 30%,最好的回答从 12% 升到 22%,另外三个回答不变。模型变了多少?需要一个数:没变时为 0,变得越多越大。KL 就是常用度量,来自 Solomon Kullback 和 Richard Leibler 1951 年的工作。后训练离不开它,因为 reward model 只在训练时见过的回答附近可靠,RL 训练要让模型偏离参考模型付出代价。
第一步:比值
对每个回答,用新比例除以旧比例。含糊回答是 0.30 / 0.40 = 0.75,最好的回答是 0.22 / 0.12 = 1.83,没变的三个回答都是 1。比值表示这个回答出现的可能性变成原来的几倍。大于 1 上升,小于 1 下降,等于 1 没变。
这里不用减法。含糊回答和最好回答都挪了 0.10,减法看不出区别。含糊回答少了四分之一,最好的回答几乎翻倍,比值能看出这个差异。
第二步:取 log
比值有个不方便的地方。翻倍是 2,减半是 0.5,变化大小相等、方向相反,可是 2 比 1 高 1,0.5 只比 1 低 0.5。没变化对应 1,也不够顺手。log 把这几件事理顺:没变化是 0,上升是正数,下降是负数,翻倍是 +0.693,减半是 -0.693。变成 10 倍是 +2.303,变成十分之一是 -2.303。
log 还把乘法变加法。翻倍两次等于乘以 4,log(4) = 1.386,正好是 0.693 + 0.693。比值靠近 0 时,log 一直下降,没有下限。log(0) 没有定义。
第三步:按新模型的比例求平均
每个回答现在有一个 log ratio,要把它们合成一个数。办法是加权平均,权重用新模型说这个回答的比例。含糊回答这一项是 0.30 × (-0.288) = -0.086,最好的回答是 0.22 × (+0.606) = +0.133,另外三个回答是 0。加起来 0.047。这就是新模型相对参考模型的 KL,单位叫 nat。
公式写成:
KL(π ‖ π_ref) = Σ π(y) log(π(y) / π_ref(y))
π 是正在训练的模型,π_ref 是参考模型。比值、log、按新模型比例加权、相加,公式里的每一块都在前面出现过。权重用新模型的比例,因为关心的是新模型现在的行为。它常说的回答多算,很少说的回答少算。
这个数在说什么
log ratio 有具体含义。给你看一条回答,让你猜它来自哪个模型。如果这是最好的回答,比值 1.83,新模型写出它的频率是参考模型的 1.83 倍,这条回答就是新模型的证据。如果这是含糊回答,比值 0.75,它更像参考模型的证据。log ratio 就是证据大小。看多条回答时,证据可以累加。KL 可以理解成:如果回答确实来自新模型,平均每条回答能提供多少指向新模型的证据。
KL 为 0,两个模型完全相同。KL 为 0.047,每条回答提供的证据很少,要达到 20 比 1 的把握,需要 log(20) = 3.0 的证据,平均大约看 64 条回答。一个永远给最好回答的模型,KL 是 2.12,只看一条回答就有 8.33 比 1 的把握。
KL 为什么不会是负数
单个 log ratio 可以是负数,KL 不会。一个回答减少的比例,就是另一个回答增加的比例,变化量加起来是 0。KL 的每一项都不小于这个回答的变化量。含糊回答变化量是 -0.10,这一项是 -0.086,减掉的比它失去的少;最好的回答变化量是 +0.10,这一项是 +0.133,加上的比它得到的多。变化量总和为 0,每一项又不小于对应变化量,所以 KL 不会小于 0。这个性质来自 log 曲线的形状,log 曲线始终在直线 x - 1 下方,只在 x = 1 处碰到它。
权重也要用对。把 log ratio 直接相加,不加权,会得到负数。权重换成参考模型的比例,也会得到负数。只有按新模型比例加权的 KL 给出可用读数。模型变了,距离却是负数,这没有意义。
KL 只管距离,方向看 reward
刚才那次变化让模型变好了,KL 仍然是正数。KL 不读回答内容,不知道哪个回答好。朝最好的回答移动 0.10,代价是 0.047;背离它移动 0.10,代价是 0.076。两种移动都要付费。方向来自 reward。
RL 训练给模型打的总分,是平均 reward 减去 KL 的价格:
总分 = 平均 reward - β × KL
β 是一个单位 KL 的价格,由训练的人决定。reward 决定移动方向,β × KL 限制移动距离。价格越高,模型越不敢离开参考模型。
同样的移动,不同的价格
再加第六个回答:Boil it 20 minutes, always, for food safety. Experts agree. 它是错的,语气却很肯定。参考模型几乎不写它,只有 0.5%。假设 reward model 很少见到这类回答,给了它过高分数。
比较两次变化,都从含糊回答拿走 0.10。给 About 10 minutes,25% 变成 35%,比值 1.4,KL 是 0.031。给那个语气肯定的错误回答,0.5% 变成 10.5%,比值 21,KL 是 0.233。挪动的比例都是 0.10,KL 对第二次的收费约是第一次的 7.4 倍。因为进入公式的是比值。
这正是训练需要的。参考模型几乎不写的回答,reward model 也很少见到,它的分数在那里最不可靠。KL 恰好在 reward 信号最弱的地方收费最高。
KL 不对称
把公式里的两个模型对调,权重改用参考模型的比例,得到 KL(π_ref ‖ π)。这次小变化算出来是 0.042,原来的方向是 0.047。KL 不对称,所以叫 divergence,不叫距离。
顺序决定哪种变化代价高。新模型不再说 2 分钟那个错误回答,它的 0.08 给了最好的回答,按 RLHF 的顺序,KL 只有 0.102。对调之后,参考模型仍有 8% 的时候说这个回答,新模型一次也不说,比值无穷大,KL 也是无穷大。新增回答则相反。RLHF 用 KL(π ‖ π_ref),模型可以放心丢掉坏回答,而新增参考模型几乎不说的回答代价很高。预训练里的 cross-entropy 等于数据 entropy 加 KL(数据 ‖ 模型),放在上面的是数据,所以模型必须给数据里出现的内容都留一点概率。
真实模型:样本和 token
真实模型可能写出的回答多到列不完。KL 是新模型所有回答上的平均,平均可以用样本估计。让新模型写一批回答,算每条 log ratio,再求平均。鸡蛋例子里模拟一次,10 条回答得到 0.096,100 条得到 0.061,10000 条得到 0.048,精确值是 0.047。样本必须来自新模型本身。调低 temperature 或者加 top-p,估计的就不再是这个 KL。
一条回答的概率,是每个 token 概率连乘。log 把连乘变求和,所以一条回答的 log ratio,就是每个 token 的 log ratio 之和。三个 token 的 log ratio 可以是 0.223、0、0.182,加起来 0.405。KL 可以逐个 token 计算,只需让冻结的参考模型多做一次前向计算。InstructGPT 的 PPO 在每个 token 上从 reward 里减去 β × log ratio,β = 0.02。DeepSeekMath 的 GRPO 把 KL 加进损失,β = 0.04,对每个 token 的估计是 x - log x - 1,其中 x = π_ref / π。
训练日志里怎么读 KL
第 0 步必须是 0。模型和参考模型权重相同,读数非 0 就说明有 bug。批次平均明显为负,通常也是 bug。单个 token 可以是负数,平均值一直低于 0,常见原因是采样设置和计算概率设置不一致,或者 mask 把 prompt、填充 token 算了进去。单位要看清。按 token 算的 KL 和按回答算的 KL 相差一个回答长度,只有单位相同、prompt 相同的运行才能比较。
KL 没有所谓的好数值。它只说模型移动了多少。这次移动值不值,要看训练从未见过的信号:留出数据上的人工比较、benchmark,或者可检验任务上的 verifier。这个独立信号叫 gold signal。Dongxi 的玩具例子里,KL 增大时 reward 一路上升,gold 在 KL 0.81 处到顶 1.10 后下降。KL 3.61 时 reward 很高,gold 已经到 -0.76。Gao、Schulman 和 Hilton 在 2022 年用真实 reward model 报告过这个规律。KL 要和 reward、gold signal 放在一起读,留下的 checkpoint 是 gold 到顶的那个。
log ratio 也是一种 reward
log ratio 说的是模型把每个回答抬高或压低了多少。模型抬高某个回答,看起来就像它看重这个回答。在鸡蛋例子里,折中点的每个 log ratio 都等于 reward 减去同一个常数 0.808。比较两个回答时,这个常数会消掉。最好的回答对 About 10 minutes,用 reward 算差值是 2 - 1 = 1,用 log ratio 算也是 1.192 - 0.192 = 1,Bradley-Terry 给出同样的概率。
这就是 DPO 的想法。省掉单独的 reward model,对人选出的每一对回答,用 β × log ratio 当分数,代入 Bradley-Terry 损失。起点模型的 log ratio 都是 0,分差是 0,损失是 0.693;折中点的分差是 1,损失是 0.313。KL 里的 log ratio 衡量一个回答移动了多少,也可以当作这个回答的 reward。
小结
KL 用一个数比较两个回答分布。算法只有三步:比例相除,取 log,按新模型比例求平均。它不会为负,只有没变化时才是 0。它没有方向,方向来自 reward,距离由 β × KL 定价。它对抬高参考模型很少写的回答收费最高。它不对称,RLHF 的顺序允许模型丢掉回答,新增回答则代价很高。真实模型上用采样估计,可以逐个 token 计算。训练时别只看 KL,要和 reward、gold signal 一起读。
原文和视频来自 Dongxi 东锡 NLP:Post training 系列第 6 篇,文章链接。
发布时间: 2026-11-05 22:29