散度
KL (Kullback-Leibler) Divergence
KL 散度又称相对熵,为信息散度(增益),是两个概率分布 P 和 Q 之间差别的非对称的度量,即度量使用基于 Q 的编码方式对 P 进行编码所需的额外 bits 数,P 表示数据的真实分布,则 Q 表示 P 的近似分布。
KL 散度性质:
- 不对称性;
- 为非负值,因为对数函数为凸函数;
- 不满足三角不等式。
KL 散度局限性:
当两个分布距离很远,完全没有重叠时,KL 散度值失去意义。
单变量高斯分布概率密度:
多变量高斯分布概率密度,其中 Σ 为协方差矩阵:
JS (Jensen-Shannon) Divergence
JS 散度是基于 KL 散度的变形,度量两个概率分布的相似度,解决了 KL 散度非对称的问题,一般是对称的,取值在 0 到 1 之间。
JS 散度性质:
- 对称性
JS 散度局限性:
当两个分布距离很远,完全没有重叠时,JS 散度为一个常数,在学习算法中也就意味着这一点的梯度为 0,即梯度消失。
TV(Total Variation)Divergence
TV 散度是另一种用于衡量概率分布之间差异的指标,定义为:
TV 散度的特点包括:
- 对称性
- 取值范围:其值在 0 到 1 之间,0 表示完全相同,1 表示完全不同。
TV 散度与 KL 散度的比较
| 特性 | KL 散度 | TV 散度 |
|---|---|---|
| 对称性 | 非对称 | 对称 |
| 取值范围 | 从 0 到无穷大 | 从 0 到 1 |
| 性质 | 不满足三角不等式 | 满足三角不等式 |
| 适用场景 | 适用于信息理论和统计推断 | 适用于概率分布的相似性评估 |
熵 KL 散度与交叉熵
首先用一句话进行总结:KL 散度可以被用于计算代价,而在特定情况下最小化 KL 散度等价于最小化交叉熵。而交叉熵的运算更简单,所以用交叉熵来当做代价。
KL 散度
KL 散度,有时候也叫 KL 距离,主要用来衡量两个事件或者分布之间的不同。
举个不恰当的例子:
- 事件 A:张三今天买了 2 个土鸡蛋
- 事件 B:李四今天买了 6 个土鸡蛋
我们定义随机变量 x:买土鸡蛋,那么事件 A 和 B 的区别是什么?
有人可能说,那就是李四多买了 4 个土鸡蛋?这个答案只能得 50 分,因为忘记了”坐标系”的问题。
换句话说,对于张三来说,李四多买 了 4 个土鸡蛋。对于李四来说,张三少买了 4 个土鸡蛋。
选取的参照物不同,那么得到的结果也不同。
更严谨的说,应该是说我们对于张三和李四买土鸡蛋的期望不同,可能张三天天买 2 个土鸡蛋,而李四可能因为孩子满月昨天才买了 6 个土鸡蛋,而平时从来不买。
因此对于离散事件,我们定义 KL 散度为:
观察公式我们可以得出:
- 如果 ,既两个事件的分布完全相同,那么 KL 散度为 0。
- 上式减号左边部分就是事件 A 的熵。
- 如果颠倒一下顺序(求 ),那么结果就不一样了,因此 KL 散度不具有对称性。
交叉熵
现在我们已经有 KL 散度来衡量两个分布之间的不同了,那么交叉熵是用来做什么的呢?
事实上交叉熵和 KL 散度的公式非常相近,其实就是 KL 散度的后半部分:A 和 B 的交叉熵 = A 与 B 的 KL 散度 – A 的熵。
既:
因此,交叉熵的公式为:
可以观察到,当 S(A)为常量时,交叉熵等价于 KL 散度。因此我们可以有两个发现:
- 交叉熵和 KL 散度一样,不具有对称性。
- 对同一件事求交叉熵实际上就是求该事件的熵
那么为什么使用交叉熵来当作代价函数呢?
首选我们定义训练模型分布 P(model) [下称为 ] 以及训练数据分布 P(training) [下称为 ]。我们需要最小化两个 和 两个分布之间的 KL 散度。既:
但是,当给定数据集时, 一定,KL 散度等价于交叉熵,因此问题转换为了 。因此,交叉熵可以用于计算训练模型分布与训练模型分布之间的不同。当交叉熵最低时(等于训练数据分布的熵),我们学到了“最好的模型”。
当然,完美的拟合训练数据往往意味着过拟合
从 KL 的方向看 SFT 与 RL
最近在看 RL 相关的几篇论文,发现和 KL 关联紧密,然后就深入看了下 KL,Reverse KL 与 SFT,RL 的对应关系 ,结合与 ChatGPT 的交互思考,整理文章如下。
如果只看公式, KL 散度很容易让人困惑。它明明长得像两个分布之间的距离, 却又不满足对称性:
方向一换, 训练行为就完全不同。
这件事放到大模型后训练里尤其关键。SFT 为什么常被理解成 Forward KL?RL / RLHF 为什么又更接近 Reverse KL?on-policy distillation 为什么和传统蒸馏不一样? 这些问题背后, 其实都在问同一件事:
期望到底是在谁的分布上取的?
也就是: 样本从哪里来?轨迹由谁产生?模型是在解释别人的答案, 还是在修正自己生成出来的答案?

先理解 KL: 方向来自”期望在哪个分布上取 ”
KL 散度的基本形式是:
离散情况下展开就是:
这里最容易被忽略的是 。
它的意思不是随便比较 和 , 而是:
从 这个分布里采样 , 然后计算 的平均值。
所以 会出现在求和式前面, 成为每个位置的权重。
这不是因为 额外被赋予了权重身份, 而是因为样本本来就是从 中来的。某个 在 里越常出现, 它在长期采 样平均中出现得就越多, 对最终 KL 的影响也就越大。
换句话说:
谁在期望符号下面, 谁就是权重来源。
如果写的是 , 那就是在 上取期望, 重点关注 会采样到的地方。
如果写的是 , 那就是在 上取期望, 重点关注 会采样到的地方。
这就是 KL 非对称性的根源。
差异不在 本身, 而在样本来自哪个分布。

Forward KL: 目标有的, 模型别漏掉
如果我们把 看成目标分布, 把 看成模型分布, 那么: