6.9 损失函数:衡量模型多差
前向传播给出了预测,但这个预测和标准答案有多大的差距?损失函数(Loss Function)就是量化这个差距的”打分员”。训练神经网络,本质上就是在不断地让这个分数变小。
6.9.1 均方误差(MSE):回归问题的默认选择
均方误差适合连续数值预测(回归问题),比如预测房价、温度、股票价格。公式很简单:
MSE = (预测值 - 真实值)^2 的平均值
例如:预测房价 300 万,真实 310 万,单样本误差 = (300 - 310)^2 = 100。
MSE 有一个重要的特性:它平方惩罚大误差——小误差(差 10 万)平方后是 100,大误差(差 50 万)平方后是 2500,差了 25 倍。这种”放大镜”效应使得 MSE 对大误差异常敏感,训练时会优先修复偏差最大的预测。可以类比考试评分:做错一道简单题扣 1 分,做错一道压轴题也扣 1 分——MSE 的做法是,做错的程度越大,扣分翻倍增长。1
但 MSE 也有一个严重的短板:如果把它和 Sigmoid 激活函数搭配用于分类任务,会出现”梯度消失”——Sigmoid 饱和区(输出接近 0 或 1)的梯度几乎为零,模型学不动。这就是为什么分类任务需要交叉熵。
6.9.2 交叉熵(Cross-Entropy):分类问题的标配
交叉熵衡量两个概率分布之间的”距离”——一个是模型的预测分布,一个是正确答案的分布。LLM 训练用的就是这个。
直觉理解:交叉熵测量的是”模型对正确答案有多惊讶”。如果正确答案是”猫”,而模型说”猫 0.3,狗 0.7”——模型很困惑(交叉熵很大)。如果模型说”猫 0.95,狗 0.05”——模型很自信且正确(交叉熵很小)。训练 LLM 的过程,本质上就是让交叉熵不断变小——让模型对正确答案越来越”不惊讶”。
二分类交叉熵:
Loss = -[y·log(ŷ) + (1-y)·log(1-ŷ)]
其中 y 是真实标签(0 或 1),ŷ 是模型预测的概率。
多分类交叉熵(Softmax 函数 + 交叉熵):
LLM 预测下一个 token 时,候选词可能有 50000 个。交叉熵在这个场景下衡量:模型给正确 token 的概率有多高。概率越高,损失越小。
关键优势:交叉熵搭配 Softmax/Sigmoid 时,梯度公式会自然约掉激活函数的导数项——不会出现 MSE + Sigmoid 那种梯度消失问题。这就是为什么分类任务一律用交叉熵,几乎没有人用 MSE 做分类。2
6.9.3 其他常用损失函数
平均绝对误差(MAE):MAE = |预测值 - 真实值| 的平均值。相比 MSE,MAE 对大误差不敏感(不平方),对异常值更鲁棒。缺点是梯度为常数(+1 或 -1),接近最优点时不会自动放慢脚步,可能导致在最优点附近来回震荡。
Huber 损失:MSE 和 MAE 的混合体。小误差用平方(像 MSE,收敛快),大误差用绝对值(像 MAE,不被异常值带偏)。相当于”MSE 和 MAE 的离婚协议——各取所需”。
以下是损失函数的选择指南:
| 任务类型 | 推荐损失函数 | 输出层激活 |
|---|---|---|
| 回归(连续值) | MSE 或 Huber | 无(线性) |
| 二分类 | 二分类交叉熵 | Sigmoid |
| 多分类 | 交叉熵 | Softmax |
| LLM 训练(下一个 token 预测) | 交叉熵 | Softmax |
| 回归 + 数据有异常值 | MAE 或 Huber | 无(线性) |
总之记住一条核心原则:回归用 MSE,分类用交叉熵。这是神经网络损失函数选择的”黄金法则”,90% 的场景都适用。
损失函数 (Loss Function)在概念文件夹中有更完整的推导和代码示例,梯度下降 (Gradient Descent)会讲损失函数的梯度如何驱动参数更新。
← 上一节:6.8 前向传播:从输入到输出 | 下一节:6.10 反向传播:怎么让模型变好 →