从最大似然估计到 KL 散度,聊聊大模型拟合的统计学底层逻辑
很多开发者在读 LLM 相关论文时,经常会被各种损失函数的推导搞晕,其实大部分的“数学魔法”都建立在统计学的基础之上。最近我在深度复盘模型拟合的逻辑,发现如果把最大似然估计(MLE)和 KL 散度(Kullback-Leibler Divergence)串起来看,很多原本晦涩的公式其实在描述同一件事:模型是如何在概率分布的维度上,一步步逼近真实数据的。
首先聊聊 MLE。最大似然估计的核心逻辑非常直观——既然我们已经观测到了这组数据,那么最合理的参数,就是那些能让这组数据出现概率最大化的参数。在机器学习中,当我们定义一个模型 $P(x|\theta)$ 时,我们的目标就是寻找一个 $\theta$,使得似然函数 $L(\theta) = \prod P(x_i|\theta)$ 达到最大值。
但在实际操作中,直接对乘积求导非常痛苦,所以我们通常会取对数,将其转化为最大化对数似然(Log-Likelihood)。这就是为什么几乎所有的损失函数里都带着个 $\log$。比如在处理二项分布的参数估计时,你会发现最大化对数似然的结果恰好就是样本的经验频率。如果你尝试用 Python 的 scipy.stats 模块去拟合一个正态分布,你会发现 norm.fit(data) 返回的均值和标准差,本质上就是通过 MLE 推导出来的解析解。
那么,这和 KL 散度有什么关系?KL 散度衡量的是两个概率分布 $P$ 和 $Q$ 之间的“距离”(虽然严格来说它不是距离,因为不满足对称性)。当我们用一个模型分布 $Q$ 去拟合真实分布 $P$ 时,KL 散度越大,说明模型对真实分布的模拟越差。
这里有一个非常关键的数学联系:最小化 KL 散度,在数学上等同于最大化对数似然。
当我们写下 $\text{KL}(P || Q) = \sum P(x) \log \frac{P(x)}{Q(x)}$ 时,可以将其拆解为 $\sum P(x) \log P(x) - \sum P(x) \log Q(x)$。第一项是真实分布的熵,在训练过程中是常数;第二项则是交叉熵(Cross-Entropy)。这意味着,当我们使用交叉熵损失函数(Cross-Entropy Loss)来训练模型时,我们本质上就是在通过最小化 KL 散度,让模型分布 $Q$ 尽可能地向真实分布 $P$ 靠拢。
对于开发者来说,理解这个链路能帮你快速看穿很多复杂的损失函数。比如在 RLHF(基于人类反馈的强化学习)阶段,PPO 算法中经常会加入一个 KL 散度惩罚项,目的就是为了防止模型在优化奖励函数时,由于更新步长过大,导致当前策略分布与原始模型分布偏差太远,从而引发模型崩溃或出现严重的幻觉。
如果你在实践中遇到 Loss 不下降或者梯度爆炸,建议回头检查一下数据的分布特性。很多时候,问题不在于模型层数不够,而在于你所假设的分布与实际数据的 KL 散度过大,导致模型在优化空间中陷入了局部最优。建议尝试用代码模拟简单的分布,观察在不同参数 $\theta$ 下,似然函数值的波动情况,这样比死磕公式要直观得多。
直接把交叉熵和KL散度放在一起比对,这下终于把那个该死的公式看懂了!