KL 散度、Cosine、Sim:大模型训练里的“相近”到底怎么量?一个数值实验告诉你它们有多不同
做 LLM 训练,几乎每天都要和”相近”打交道:蒸馏要让学生分布接近教师分布,RLHF 要约束新策略不能偏离旧策略太远,表征分析要比较不同层的 hidden state 像不像。但”相近”这个模糊的词,落到具体指标上却是完全不同的数学结构——KL 散度是信息论,Cosine 是几何,MSE 是代数。它们对同一份数据的回答可能完全相反,而训练结果就取决于你选对了哪一个。
这篇文章不只是罗列定义,而是用一个具体的数值实验,展示这些指标在真实场景下如何给出互相矛盾的排序,然后回到 LLM 训练的三个核心场景(蒸馏、RLHF、表征分析)讲清楚选型逻辑。
一个会颠覆直觉的数值实验
先造一个最小的场景。假设我们有一个三分类的 softmax 输出,真实分布为:
P = [0.70, 0.20, 0.10] # 真实标签分布 现在有三个候选模型,它们的预测分布分别是:
Q1 = [0.55, 0.25, 0.20] # 模型1:把概率"摊平"了 Q2 = [0.90, 0.05, 0.05] # 模型2:更自信,押注在 P 的主峰上 Q3 = [0.70, 0.15, 0.15] # 模型3:主峰完全正确,只微调了尾部 直觉上,Q3 最接近 P,Q2 方向对但过度自信,Q1 最模糊。现在用五种指标分别给这三个模型排序:
| 指标 | Q1 | Q2 | Q3 | 谁最”接近” P? |
|---|---|---|---|---|
| KL(P‖Q) | 0.140 | 0.152 | 0.031 | Q3 |
| KL(Q‖P)(反向) | 0.118 | 0.186 | 0.023 | Q3 |
| JS 散度 | 0.035 | 0.041 | 0.008 | Q3 |
| Cosine 相似度 | 0.963 | 0.956 | 0.999 | Q3 |
| MSE | 0.0167 | 0.0167 | 0.0017 | Q3 |
| 内积 | 0.455 | 0.665 | 0.545 | Q2 ⚠️ |
这个实验有两点值得注意。
第一,大多数指标都同意 Q3 最好——这符合直觉,因为 Q3 只是微调了尾部。但注意 内积把 Q2 排到了第一。原因很简单:内积 = 方向对齐 × 模长,Q2 的 logit 幅度最大(0.90 的主峰贡献了大内积),所以即使它方向偏了,也被”自信”加分了。这就是为什么在概率比较里几乎不用裸内积。
第二,也是最关键的——Q1 和 Q2 的排序在不同指标下会翻转。 让我们看一个更尖锐的例子,让两个分布的主峰错开:
P = [0.50, 0.50, 0.00] # 真实:两个峰各半 Qa = [0.99, 0.01, 0.00] # 模型A:只押一个峰,另一个完全漏掉 Qb = [0.25, 0.25, 0.50] # 模型B:把概率摊到三个位置 | 指标 | Qa | Qb | 谁更接近 P? |
|---|---|---|---|
| KL(P‖Q)(Forward) | 1.98 | 0.69 | Qb ✅ |
| KL(Q‖P)(Reverse) | 0.15 | 0.69 | Qa ✅ |
| JS 散度 | 0.26 | 0.21 | Qb |
| Cosine 相似度 | 0.895 | 0.707 | Qa |
同一个 P,Forward KL 说 Qb 赢,Reverse KL 和 Cosine 说 Qa 赢。 这不是计算错误——这是这些指标在数学上就”问不同的问题”。
- Forward KL(KL(P‖Q)) 惩罚”P 有概率但 Q 没有”的位置。Qa 把 P 的第二个峰(0.50)完全漏掉了,Q 在那个位置概率≈0,所以惩罚爆炸(1.98)。它要求模型覆盖真实分布的所有峰——这就是 mode covering。
- Reverse KL(KL(Q‖P)) 惩罚”Q 有概率但 P 没有”的位置。Qa 只在 P 的主峰上有概率,没有”幻觉”到 P 认为不可能的地方,所以惩罚很小(0.15)。它奖励模型聚焦在真实分布的高峰上——这就是 mode seeking。
- Cosine 相似度只看方向。Qa 的大峰正好和 P 的大峰对齐,方向一致,所以得分高。它完全无视”Qa 漏掉了 P 的第二个峰”这个事实。
结论:这些指标不是同一件事的近似,它们是在回答完全不同的问题。 选错指标 = 把错误的优化目标写进 loss。
每个指标到底在问什么
KL 散度:信息论视角——”用 Q 编码 P 的数据,平均每条多花多少 bit?”
\[D_{KL}(P \parallel Q) = \sum_i P(i) \log \frac{P(i)}{Q(i)}\]KL 散度不是距离(不满足三角不等式、不对称),它是编码代价的期望差。\(D_{KL}(P \parallel Q) = H(P, Q) - H(P)\),即交叉熵减去熵。因为 \(H(P)\) 对模型参数是常数,最小化 KL 散度 ≡ 最小化交叉熵——这就是为什么大模型预训练和 SFT 的损失函数本质上就是 Forward KL。
它的非对称性 \(D_{KL}(P \parallel Q) \neq D_{KL}(Q \parallel P)\) 不是缺陷,而是结构信息:
- Forward KL:对 \(Q(i)=0\) 而 \(P(i)>0\) 施无穷惩罚 → 模型必须覆盖所有峰 → mode covering。LLM 训练(交叉熵)用它,因为语料里每个 token 序列都不能漏。
- Reverse KL:对 \(Q(i)>0\) 而 \(P(i)=0\) 施重罚 → 模型不允许”幻觉” → mode seeking。RLHF 的 KL 惩罚、变分推理用它。
优势:概率解释性最强、与交叉熵天然等价、梯度正比于概率差 \((P-Q)\) 数值稳定。 劣势:不对称(选型成本高)、无上界(\([0,\infty)\),难做绝对阈值)、对支撑集敏感(\(Q(i)=0\) 时发散)、不满足三角不等式。
Cosine 相似度:几何视角——”两个向量方向一致吗?”
\[\text{cosine}(x,y) = \frac{x \cdot y}{\|x\|\|y\|} = \cos\theta\]Cosine 抛弃了模长,只看角度。优势:尺度不变(LayerNorm 后的向量也能比)、有界 \([-1,1]\)、对称、计算极快。劣势:完全不感知概率分布结构(softmax 的”和为 1”约束它看不见)、丢弃置信度(模长信息)、高维空间所有向量趋向正交(维度灾难)。
皮尔逊相关系数:中心化的 Cosine
\[r(x, y) = \frac{\sum_i (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_i (x_i - \bar{x})^2} \cdot \sqrt{\sum_i (y_i - \bar{y})^2}}\]皮尔逊系数衡量两个变量的线性相关程度,范围 \([-1, 1]\):+1 完全正相关、−1 完全负相关、0 无线性相关。它描述的是”两个变量一起同向/反向变动的趋势”,不是距离,也不是信息损失。
最关键的洞察:皮尔逊系数本质上就是对”去均值后的向量”算 cosine 相似度。
\[r(x, y) = \text{cosine}(x - \bar{x},\, y - \bar{y})\]也就是说,cosine 和皮尔逊的唯一差别,在于是否先减去均值(去中心化 / centering)。这个差别在表征分析里非常关键:
- 原始 cosine 对向量的均值偏移(DC 分量)敏感——如果两个向量都带一个大的公共偏置(比如 LayerNorm 之前、或所有维度整体抬高),cosine 会被这个公共分量主导,掩盖真实的形状差异。
- 皮尔逊先减均值,只比较”围绕各自均值的波动形状”,把公共偏置去掉。所以做表征相似度分析时,很多人实际用的是皮尔逊(中心化 cosine)而不是裸 cosine,就是因为它对偏置更鲁棒。
优势:去偏置、有界、对称、计算快。劣势:只捕捉线性关系(U 型等非线性相关测不出来)、对异常值敏感、同样不感知概率分布(不能当分类或蒸馏的 loss 用)。
JS 散度:对称的 KL 修补版
\[D_{JS}(P \parallel Q) = \frac{1}{2}D_{KL}(P \parallel M) + \frac{1}{2}D_{KL}(Q \parallel M), \quad M = \frac{P+Q}{2}\]优势:对称、有界 \([0, \log 2]\)、对支撑集不敏感。劣势:梯度易饱和(两个分布完全分开时梯度消失,GAN 训练的著名痛点)、需要维护中间分布 M。在 LLM 训练里很少直接当 loss 用。
内积与欧氏距离
内积 = 方向 × 模长,同时编码”对齐”和”自信”。Attention 的 logit、线性层前向全靠它——但作为相似度度量,它对尺度敏感,上面的实验已经展示了它如何被”自信”误导。
欧氏距离 是唯一满足三角不等式的真距离。满足三角不等式意味着可以安全地用于聚类、KNN、检索。但对尺度敏感,且高维下所有距离趋向相等。
综合对比
| 特性 | KL 散度 | Cosine | 皮尔逊 | JS 散度 | 内积 | 欧氏距离 | MSE |
|---|---|---|---|---|---|---|---|
| 数学本质 | 信息损失 | 方向一致 | 去偏置的方向一致 | 对称化 KL | 对齐×模长 | 几何距离 | 平方误差 |
| 取值范围 | \([0,\infty)\) | \([-1,1]\) | \([-1,1]\) | \([0,\log 2]\) | \((-\infty,\infty)\) | \([0,\infty)\) | \([0,\infty)\) |
| 对称 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 三角不等式 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
| 尺度不变 | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| 去偏置(中心化) | — | ❌ | ✅ | — | ❌ | ❌ | ❌ |
| 感知概率结构 | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
| 有界 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| 高维鲁棒 | 一般 | ❌ | ❌ | 一般 | ❌ | ❌ | ❌ |
| LLM 主用途 | 交叉熵/蒸馏/RLHF | 表征相似度 | 表征相似度 | GAN | Attention | 权重更新幅度 | Logit 蒸馏 |
更多度量:三个家族的速查
上面 7 个是主力,但”相近/相关”的度量远不止这些。它们大致分三个家族,各自解决不同的问题。
家族 1:相关系数——衡量”线性/单调相关”
| 指标 | 定义要点 | 适用场景 |
|---|---|---|
| Spearman ρ | 对数据排秩后再算皮尔逊 | 非线性但单调相关、对异常值鲁棒(皮尔逊的稳健替代) |
| Kendall τ | 基于序对一致/不一致比例 | 小样本、序数数据、大量并列值 |
| 点二列相关 | 一个连续 + 一个二分类变量 | 特征与二分类标签的相关性筛选 |
Spearman 最值得记:它只假设单调关系而非线性。当两个变量的关系是 U 型或指数型但单调递增时,皮尔逊可能接近 0,而 Spearman 能测出强相关。代价是它丢弃了数值幅度,只保留排序。
家族 2:表征相似度——衡量”两个表征空间像不像”
| 指标 | 定义要点 | 适用场景 |
|---|---|---|
| CKA | 核矩阵的归一化 HSIC,对仿射变换不变 | 层间/模型间表征相似度 |
| SVCCA / PWCCA | 奇异值分解提取共享子空间再比 | 简化表征、去噪后比较 |
| Procrustes 相似度 | 最优旋转对齐后比距离 | 需要旋转不变性时 |
关键区别:CKA/SVCCA 是空间级比较(整个表征空间),而 cosine/皮尔逊是向量级比较(两个点)。想看”两层学到了多相似的结构”,用空间级;想看”两个具体样本表征像不像”,用向量级。
家族 3:分布距离——衡量”两个分布差多少”
| 指标 | 定义要点 | 适用场景 |
|---|---|---|
| Wasserstein / EMD | 最优传输的最小搬运代价 | 分布距离有几何意义、GAN 里替代 JS 解决梯度饱和 |
| Total Variation(TV) | 概率差绝对值之和的一半 | 有界、对称、简单 |
| Hellinger 距离 | 平方根概率差的 L2 | 对称、有界、对支撑集鲁棒 |
| MMD | 核嵌入空间的距离 | 两样本分布检验、GAN 判别 |
Wasserstein 最值得记:它是真度量(满足三角不等式),而且对不重叠的分布也有意义——KL 在这种情况下会发散到无穷,Wasserstein 仍给出有限、有几何意义的距离。这正是 GAN 从 JS 散度(梯度饱和)转向 Wasserstein 的原因。DMD/DMD2 蒸馏里那个”分布匹配”的梯度,本质上也和最优传输视角相关。
一句话记忆
看相关(单调)→ 皮尔逊 / Spearman 看表征空间 → CKA / SVCCA 看分布距离 → Wasserstein / Hellinger 看概率拟合 → KL(loss 首选) LLM 训练三个核心场景的选型
场景 1:知识蒸馏——Forward KL 是默认,但要看任务
蒸馏的经典损失是”hard label 交叉熵 + soft target 的 KL 散度”(Hinton 2015):
\[\mathcal{L} = (1-\lambda)\,\text{CE}(y, \sigma(z_s)) + \lambda\, T^2 \, D_{KL}(\sigma(z_t/T) \parallel \sigma(z_s/T))\]温度 \(T\) 控制教师分布的平滑程度。这里有个微妙点:学生分布去拟合教师分布,用的是 Reverse KL(学生→教师)。对生成任务(如扩散模型蒸馏、自回归蒸馏)Reverse KL 让学生聚焦教师最确信的模式,质量更高——DMD/DMD2 蒸馏正是靠分布匹配(KL 梯度)超越教师。对分类任务,Forward KL 让学生覆盖教师的所有类别,更稳妥。选对方向比选对指标更重要。
场景 2:RLHF / PPO——Reverse KL 惩罚
PPO 里的 KL 惩罚是 \(D_{KL}(\pi_{\text{new}} \parallel \pi_{\text{ref}})\),即 Reverse KL。它惩罚”新策略产生参考策略认为不可能的 token”——这正是我们想要的:限制策略漂移,防止模型为了奖励而输出参考策略绝不会说的内容。如果换成 Forward KL,新策略会试图覆盖参考策略的所有可能输出,导致策略扩散、塌缩到平庸。
场景 3:表征相似度分析——Cosine 是主力,皮尔逊是去偏置版
分析 hidden state 相似度时,LayerNorm 已经去掉了尺度,再比欧氏距离或内积会引入冗余的模长信息。Cosine 的尺度不变性恰好匹配这个需求。更严格的做法是 CKA(Centered Kernel Alignment),它对仿射变换不变,能反映更深层的表征结构,但计算代价高、只能做离线分析,不能当训练目标。
Cosine 还是皮尔逊? 如果两个表征向量都带一个大的公共均值偏移(例如 LayerNorm 之前、或没做归一化的层输出),裸 cosine 会被这个公共偏置主导,掩盖真实形状差异——这时该用皮尔逊(= 中心化 cosine)。如果向量已经过 LayerNorm 去均值,cosine 和皮尔逊几乎等价。经验法则:不确定有没有偏置时,先做中心化再用皮尔逊更稳。
按 ML 流水线阶段选指标
上面按”数学本质”选了指标,但实际工程里更常见的问题是:我在数据准备、loss 设计、评测、模型分析哪一个环节,该用哪个? 这里按流水线阶段重新组织一份速查表。
阶段 1:数据准备 / 清洗(offline)
用:皮尔逊 / 欧氏距离 / 内积(相关性分析),不用 KL。
| 任务 | 推荐指标 | 为什么 |
|---|---|---|
| 特征共线性分析(去冗余) | 皮尔逊 | 两个特征高度线性相关时冗余,去中心化后能看真实相关性 |
| 找离群样本 | 欧氏距离 / MSE | 距离远 = 异常,有三角不等式可安全聚类 |
| 数据集去重(embedding 层面) | Cosine | 语义去重看方向,不看模长 |
| 数据分布漂移检测(train vs test) | 皮尔逊 | 特征层面比较单调关系是否变化 |
注意:数据准备阶段几乎不用 KL,因为数据样本不是概率分布,KL 没有意义。
阶段 2:模型 loss 设计(training objective)
用:KL(概率输出)+ 内积(logit)/ MSE(回归),这是唯一能当 loss 的阶段。
| 任务 | 推荐指标 | 为什么 |
|---|---|---|
| LM 预训练 / SFT | 交叉熵(=Forward KL) | softmax 输出是概率,KL 是概率空间自然度量 |
| 知识蒸馏 | KL(Forward/Reverse)+ 温度 | 学生拟合教师分布,方向按任务选 |
| RLHF / PPO 策略约束 | Reverse KL | 惩罚”新策略做参考策略认为不可能的事” |
| 回归头 / 连续值预测 | MSE | 数值回归,平方误差可微稳定 |
| 对比学习(SimCLR/CLIP) | Cosine | 拉近方向对齐的样本对 |
关键纪律:只有概率输出的 loss 才用 KL;表征向量当 loss 用 cosine;数值回归用 MSE。 把 cosine 直接当分类 loss、或把 KL 用在非概率向量上,都是常见的错配。
阶段 3:训练监控 / 诊断(during training)
用:皮尔逊 / cosine / 欧氏距离,不用 KL(除非监控分布)。
| 任务 | 推荐指标 | 为什么 |
|---|---|---|
| 梯度方向一致性(gradient alignment) | Cosine | 两个 batch 的梯度方向是否一致,判断 batch 稳定性 |
| 表征塌缩检测(collapse) | 皮尔逊 / 欧氏 | 所有样本的表征挤成一点 → 相关性趋 1、距离趋 0 |
| 层间表征漂移 | 皮尔逊 | 去偏置后看训练前后表征结构是否变化 |
| logit / 输出分布漂移 | KL | 监控模型输出分布 vs 参考分布,这里是概率,可用 KL |
阶段 4:评测 / 模型分析(offline)
用:皮尔逊(指标相关性)+ cosine(表征)+ KL(分布质量)。
| 任务 | 推荐指标 | 为什么 |
|---|---|---|
| 验证”评测指标与人类判断是否一致” | 皮尔逊 | 计算指标分数与人类评分的线性相关 |
| 不同层的表征相似度 | 皮尔逊 / CKA | 中心化后比较结构相似性 |
| 生成质量 / 分布匹配 | KL / FID | 比较生成分布与真实分布 |
| 嵌入检索 / 语义搜索 | Cosine | 向量检索的标准做法 |
一张流水线速查表:
| 流水线阶段 | 数据准备 | Loss 设计 | 训练监控 | 评测分析 |
|---|---|---|---|---|
| 主力指标 | 皮尔逊 / 欧氏 | KL / 内积 / MSE | 皮尔逊 / cosine | 皮尔逊 / cosine / KL |
| 关键约束 | 样本非分布,不用 KL | 概率输出才用 KL | 分布漂移才用 KL | 按对象选 |
一个真实的 show:自回归蒸馏里 Forward vs Reverse 的差别
最后用一个贴近 LLM 的场景收尾。假设教师模型对下一个 token 的分布是:
teacher = [0.40, 0.30, 0.20, 0.10] # 四个候选 token 学生有两个候选输出:
student_cover = [0.25, 0.25, 0.25, 0.25] # 摊平覆盖所有 token student_focus = [0.70, 0.15, 0.10, 0.05] # 聚焦最可能的 token | 指标 | student_cover | student_focus | 谁赢? |
|---|---|---|---|
| Forward KL(teacher‖student) | 0.094 | 0.178 | cover |
| Reverse KL(student‖teacher) | 0.125 | 0.134 | cover(微弱) |
| MSE | 0.0138 | 0.0213 | cover |
| Cosine | 0.977 | 0.957 | cover |
这个例子中所有指标都偏向”摊平”的学生——因为教师本身分布就比较平坦。但注意数值差异的幅度完全不同:Forward KL 的差距(0.094 vs 0.178,近 2×)远大于其他指标。这意味着同一个温度下,用 Forward KL 做损失会施加比 Cosine/MSE 强得多的”覆盖压力”。如果你想让蒸馏出的学生更锐利、更像教师的主峰,用 Forward KL 会过度平滑;这时降低温度 \(T\)(让教师分布更尖锐)或改用 Reverse KL 才是杠杆。
这就是选型落地的核心:指标不只是”打分工具”,它直接决定了梯度方向和强度。
总结
- KL 散度描述的是信息损失——”用 Q 编码 P 多花多少 bit”,本质是信息论,不是距离。它的非对称性(Forward mode-covering / Reverse mode-seeking)是最大的力量也是最大的陷阱。
- Cosine 描述的是方向一致性——本质是几何,尺度不变,在表征分析里不可替代,但在概率空间完全不适用。
- 皮尔逊系数 = 中心化的 cosine——它比裸 cosine 多做了去均值,对公共偏置更鲁棒,是表征相似度分析里更稳的选择;但只捕捉线性关系。
- 大模型训练离不开 KL:交叉熵 ≡ Forward KL,这是 LLM 训练目标的数学本质。
- 选度量要看数据结构的本质(概率 vs 表征),而不是看数学上的便利(有界、对称)。有界性和对称性很好,但内积的例子告诉我们——一个”方便”的指标可能在悄悄奖励你不想奖励的行为。
- 按流水线阶段选:数据准备用皮尔逊/欧氏(样本非分布,不用 KL);loss 设计用 KL/内积/MSE(概率输出才用 KL);训练监控用皮尔逊/cosine;评测分析按对象选。
参考:Cover & Thomas, Elements of Information Theory;Hinton et al., Distilling the Knowledge in a Neural Network (2015);Schulman et al., PPO (2017);Kornblith et al., Similarity of Neural Network Representations (2019)。