Post

KL 散度、Cosine、Sim:大模型训练里的“相近”到底怎么量?一个数值实验告诉你它们有多不同

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 最模糊。现在用五种指标分别给这三个模型排序:

指标Q1Q2Q3谁最”接近” P?
KL(P‖Q)0.1400.1520.031Q3
KL(Q‖P)(反向)0.1180.1860.023Q3
JS 散度0.0350.0410.008Q3
Cosine 相似度0.9630.9560.999Q3
MSE0.01670.01670.0017Q3
内积0.4550.6650.545Q2 ⚠️

这个实验有两点值得注意。

第一,大多数指标都同意 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:把概率摊到三个位置
指标QaQb谁更接近 P?
KL(P‖Q)(Forward)1.980.69Qb
KL(Q‖P)(Reverse)0.150.69Qa
JS 散度0.260.21Qb
Cosine 相似度0.8950.707Qa

同一个 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表征相似度表征相似度GANAttention权重更新幅度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_coverstudent_focus谁赢?
Forward KL(teacher‖student)0.0940.178cover
Reverse KL(student‖teacher)0.1250.134cover(微弱)
MSE0.01380.0213cover
Cosine0.9770.957cover

这个例子中所有指标都偏向”摊平”的学生——因为教师本身分布就比较平坦。但注意数值差异的幅度完全不同: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)。

This post is licensed under CC BY 4.0 by the author.