损失函数
损失函数把「模型错了」变成一个可最小化的数。它定义了模型在追求什么——所以要认真选。
先动手,再深入阅读
误差抵消,不等于预测正确 · 5 分钟一次前向传播产出一个结果。要改进它,你得先知道它错得有多离谱——以一个数字,而不是一种感觉。这个数字叫损失(loss),算它的函数叫损失函数。这是训练中后果最严重的一个设计选择,因为它定义了什么叫「好」。模型会去追逐损失奖励的任何东西,所以如果损失量错了东西,一个训练完美的模型会把错事做得完美。
把「错了」变成一个数
训练需要一个可以最小化的目标。损失函数把模型的预测和已知的正确答案做比较,返回一个非负的数:0 表示完美,越大越差。
为什么要一个数?因为梯度下降需要一个量来往下推。如果「错的程度」报成五个分开的数,就没有一个明确的「下」可言了。损失函数把一次预测里的全部误差压缩成一个标量,训练剩下的部分就不停地最小化它。
度量「错」的正确方式取决于任务,所以不同任务用不同的损失。
回归:均方误差
当模型预测一个数字——价格、温度——自然的误差就是预测与真值之差。答案是 200,你预测 180,就差了 20。
均方误差(MSE) 把每个差值平方,再在所有样本上取平均:
loss = average of (prediction - truth)^2平方做了两件有用的事。它让每个误差都变成正数,于是偏大和偏小都算错。而且它对大误差的惩罚不成比例:差 20 的代价是 400,差 40 的代价是 1600——误差翻倍,代价是四倍。这让 MSE 容不下大的偏离,而这通常正是你要的。它的近亲「平均绝对误差」则按比例惩罚,对偶尔的离群点更宽容。选哪个,编码了你有多少怕犯大错。
分类:交叉熵
当模型预测一个类别时,平方误差就是错的工具。模型输出的是一个概率——「80% 是猫」——你要的损失应该奖励自信的正确、惩罚自信的错误。
交叉熵干的就是这个。它看模型分配给正确类别的概率,概率低就罚。如果真实答案是「猫」,模型给了 0.8,损失就小;给了 0.05,损失就大。关键在于,当对正确答案的信心趋近于 0 时,惩罚急剧增大:自信地答错会被狠狠惩罚,这就把模型推向诚实的概率,而不是鲁莽的瞎猜。
基本上每一个 LLM 背后都是这个损失。预测下一个 token 就是在整个词表上做分类——几万个类别——而训练信号就是模型给「真正出现的下一个 token」的那个概率上的交叉熵。语言建模目标正是把这个损失用在数万亿个 token 上。
损失定义了目标
这是最该带走的一点:模型追求的不是你的意图,而是低损失。损失奖励什么,你就得到什么。
你要错的东西,就会得到错的东西。如果一个医疗分类器的损失把漏诊和误报视为同等糟糕,它就会乐于用危险的漏诊去换更少的误报——因为损失告诉它这两者等价。要修好这一点,得改损失、给不同误差不同的权重,而不是去训斥模型。当你读到让模型对齐人类偏好需要一个新的训练目标时,原因就在这:要改行为,就改损失所奖励的东西。
损失不是你的评测指标
有一个值得内化的细节。损失必须足够平滑,梯度下降才能工作——权重小改,损失必须小改且可测量。但你真正在意的东西,比如准确率,往往并不平滑(随着预测翻转,它是一格一格跳的)。所以你用平滑的替代损失(交叉熵)来训练,用你真正在意的指标(准确率)来评测。两者相关但不相同,这就是为什么损失下降并不总是意味着你的真实指标变好了——这个张力在评测这一层里有展开。
要点回顾
- 损失函数把「预测错了多少」压缩成一个训练要去最小化的数;梯度下降需要的就是一个标量。
- 均方误差适合回归,对大误差的惩罚不成比例;交叉熵适合分类,惩罚自信的错误答案。
- LLM 用下一 token 预测上的交叉熵来训练——也就是在整个词表上做分类。
- 模型优化的是损失,不是你的意图,所以损失就是目标——选它的时候,让它奖励你真正想要的东西。
- 用平滑的损失训练,用你真正在意的指标评测;这两者不是一回事。
下一篇: 梯度下降——模型如何用损失来决定往哪个方向调整权重。