跳到正文

MSE vs 交叉熵损失怎么选?

数学定义、梯度特性区别及LLM预训练微调为何用交叉熵

原题:均方误差(MSE)与交叉熵损失函数在数学定义、适用任务和梯度特性上有何本质区别?为什么在大语言模型的预训练和微调中普遍采用交叉熵而非MSE作为损失函数?

模型训练 · 字节真题

回答与解析

数学目标与梯度不同

MSE 定义为 L=(1/n)Σ(ŷ-y)²,适合连续回归,在固定同方差 Gaussian 条件模型下对应最大似然和条件均值。分类若把 sigmoid 概率 p 与标签 y 代入 MSE,则 dL/dp=2(p-y),而 p=σ(z) 时 dL/dz=2(p-y)p(1-p)。不能把对概率和对 logit 的导数混写。

二分类交叉熵为 L=-[y log p+(1-y)log(1-p)],与 sigmoid 合并后 dL/dz=p-y。多分类 softmax 交叉熵对 logit 的梯度同样是 p-y_onehot。交叉熵的优势不是“从不衰减”,正确且高置信样本的梯度本来就会趋近零;关键是自信错误时不会像 MSE 那样再额外乘一个饱和的 p(1-p)。

语言模型的下一个 token 是词表上的离散类别,交叉熵等价于最大化观测 token 的条件对数似然,能够直接训练完整类别分布。把 one-hot token 当连续向量做 MSE 会引入不合适的几何和饱和梯度。蒸馏可使用软目标交叉熵或 KL,回归价值、embedding 或连续属性时仍可使用 MSE。

口语版讲法(30秒速答 + 90秒主答 + 完整展开)

  • 区分回归与分类概率目标
  • 分别推导 dL/dp 和 dL/dz
  • 解释自信错误时的梯度差异
  • 说明多分类 softmax 交叉熵
  • 联系 next-token 条件似然

【30秒速答】 MSE 面向连续目标,公式是预测误差平方;分类时若 p 等于 sigmoid(z),MSE 对概率的导数是 2(p-y),对 logit 的导数还要乘 p(1-p)。二分类交叉熵与 sigmoid 合并后,对 logit 的导数直接是 p-y。交叉熵不是永远没有梯度衰减,正确且高置信时梯度也会变小;它的关键优势是模型自信但预测错误时,不会再被饱和 sigmoid 导数额外压小。语言模型预测离散词表分布,所以用交叉熵最大化真实 token 的条件似然更自然。

【90秒主答】 MSE 的一般形式是对预测值与目标值的平方差取平均。在线性或神经网络回归中,如果假设给定输入后的噪声近似固定方差 Gaussian,那么最小化 MSE 等价于最大化条件似然,最优点预测是条件均值。它会让大误差获得更大惩罚,但也更容易被异常值影响。

分类问题要明确导数变量。设二分类概率 p=σ(z),标签 y 为零或一。若损失写成 (p-y)²,那么对 p 求导得到 2(p-y);继续对 logit z 求导,必须乘 sigmoid 导数 p(1-p),结果是 2(p-y)p(1-p)。当模型给错误类别极高置信度时,p 接近零或一,p(1-p) 很小,MSE 传到 logit 的梯度可能被额外压缩。把这两条公式写成同一条会丢掉链式法则。

【完整展开】 二分类交叉熵是负的 y log p 加 (1-y) log(1-p)。把它和 sigmoid 联合推导,对 z 的导数化简为 p-y。模型若对错误答案非常自信,这个差值仍接近正一或负一,能提供明显纠错信号。模型若已经正确且接近 one-hot,p-y 才趋近零,这是合理收敛,不是“交叉熵从不衰减”。多分类时 softmax 交叉熵对每个 logit 的梯度也是预测概率减目标 one-hot 分量,数值实现通常使用 log-softmax 或 fused cross-entropy,避免先算极小概率再取对数。

大语言模型把下一个 token 看作词表上的 categorical 变量。交叉熵直接对应负条件对数似然,可以比较真实 token 与所有候选 token 的相对概率,并与自回归概率分解一致。若对 one-hot token 向量使用 MSE,类别之间会被当作普通欧氏坐标,且梯度会受输出激活饱和影响,不符合离散似然的自然参数化。边界也要说明:知识蒸馏可以用带温度的软标签交叉熵或 KL;奖励模型的连续分数、价值函数、表示回归仍可能合理使用 MSE、Huber 或其他回归损失。选择取决于目标变量的概率模型,而不是哪个损失名字更常见。

【验证补充】如果类别极不平衡,可以在交叉熵上使用类权重、采样或合适的长尾方法,但仍要校准与分层评测。是否采用这些调整由错误成本和部署先验决定,不能因为 MSE 不合适就自动选择任意加权方案。

关键一句:交叉熵的优势是去掉自信错误样本上的额外 sigmoid 饱和因子,不是承诺所有状态都有大梯度。

核验来源

  1. PyTorch MSELoss Documentation
  2. PyTorch CrossEntropyLoss Documentation
  3. A Fast Learning Algorithm for Deep Belief Nets

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你在做电商的智能客服,需要预测用户下一句会问什么,比如从‘退货流程’里推测‘运费谁出’。你觉得用MSE还是交叉熵来训练这个分类模型?为什么交叉熵更常用?

  2. 问法 2 · 层层追问

    你训练分类模型时一般用什么损失函数?……那为什么不用MSE呢?……对于大语言模型的next token prediction,MSE的梯度有什么问题?……所以交叉熵的优势在哪?

  3. 问法 3 · 直球架构

    请从数学定义、适用任务和梯度特性三个方面,对比MSE和交叉熵的本质区别。并解释为什么大语言模型预训练和微调普遍用交叉熵而不用MSE。

同模块相关题目