损失函数
「错得有多离谱」怎么变成一个可以比较的数?
同样是「预测错了」——错误程度一样吗?
先玩个你小时候一定玩过的游戏——猜数字。我心里想一个 1~100 的整数,你来猜; 你每报一个数,我只回三个字:「大了」或「小了」。就靠这一句反馈,你几次就能逼到正确答案: 猜 50,「小了」,就往大里猜;猜 88,「大了」,就往小里收……范围一步步夹紧。
这条反馈虽然简单,却恰好给了你最关键的东西——方向:大了就往小调,小了就往大调。 正是这一点「往哪边改」的信息,把「瞎猜」变成了「有方向地逼近」。
第 9 课说过,训练就是不断微调参数、让网络越猜越准。可神经网络的局面比猜数字难得多: 它一次要调成千上万个参数,输出的还是一组概率而不是一个数—— 它怎么知道自己这次是「大了」还是「小了」、每个参数又该往哪个方向挪?
这正是这一课要造的东西。我们给网络配一个损失(loss):先把「这一次猜得有多差」压成一个数。 有了这个数,梯度下降就能求出它对每个参数的导数,从而同时知道「大了还是小了」(方向)和「差多少」(步子)—— 比猜数字那句「大了 / 小了」,信息还更丰富。
可要把「差」变成这样一个能算、能求导的数字,并没有随手一减那么简单。 先用一个比分类更简单的场景找找感觉——预测数值。一个预测房价的网络,真实价格是 300 万,网络给出两个不同的预测:
- 预测 A:299 万(差了 1 万)
- 预测 B:100 万(差了 200 万)
显然 B 错得更离谱。但梯度下降想要知道的不只是「哪个更离谱」, 还要知道离谱多少——因为它需要算出一个梯度来更新权重。「错误」必须是一个可以计算导数的数字。
取平方:均方误差 MSE
取平方消除符号,再对所有样本平均——这就是均方误差(MSE):
是预测值, 是真实值。检验一下:
差 200 万,惩罚是差 1 万的 40000 倍——平方让大错的惩罚重得多,这一步好懂。 但真正要补一句的是:梯度下降用来调参数的,并不是损失这个值本身,而是它的「导数」。
回忆第 5 课:导数就是「自变量动一点点,函数跟着变多少」的变化率,也就是曲线的斜率。 梯度下降的法则是「朝损失下降最快的方向迈一步」,而这个方向、这一步迈多大,全由导数给出。 说白了,导数就是上一站猜数字那句反馈的升级版——它的正负告诉你「大了还是小了」,它的大小告诉你「该使多大劲」。
那 MSE 的导数长什么样?把单个样本的损失看成预测值 的函数,对 求导 (套第 5 课的法则:平方求导,把指数 2 挪到前面、次数减一,再乘括号里那项的导数 1):
念一遍就懂:导数 = 2 ×(预测 − 真实)。预测大了()导数为正,提示「再调大只会更糟」,于是往小收; 预测小了导数为负,于是往大调。而且预测离真实越远,这个值的绝对值越大、推得越狠。形式简单、又处处可微,梯度下降拿来就能用。
MSE 适合预测连续数值(回归问题)。但如果要做分类—— 比如我们那台机器判断「是不是苹果」——直接用 MSE 会出现意想不到的问题。
MSE 用在分类上:信号太弱
那台机器最后输出一个 0~1 的概率(通过 Sigmoid)。手上这个水果真实答案:是苹果(标签 = 1)。 比较两种预测:
预测 B 错得那么厉害,损失是预测 A 的 98 倍——看着够狠了吧?可别急。 上一站说过:真正推动训练的是导数,不是损失值本身。所以得盯着导数看。
这里真实标签 ,损失就是 , 导数和上一站一模一样:。把两个「极度猜错」的情况代进去:
蹊跷就在这儿:网络从「1% 把握」掉到「0.1% 把握」,明明错得更离谱了, 导数却几乎纹丝不动(−1.98 → −1.998)。换句话说——不管错得多狠,MSE 给的「推力」都差不多大。
网络已经烂到家了(),本该被狠狠推一把;可 MSE 的导数最多也就到 −2 附近、再也不涨。 结果是:越离谱的错误,越得不到更强的纠正信号,训练拖拖拉拉、甚至原地打转。
我们想要的,是一个「越错,导数越大、推得越狠」的损失——当 趋近 0,损失该飙向无穷,它的导数也跟着飙起来。
对数损失:交叉熵
这个 −log(p),名字你应该会觉得眼熟。第 6 课《概率与信息》里,我们从信息论推过它: 交叉熵衡量「用模型分布 q 去解读真实答案 p,平均有多意外」,当真实答案确定时塌缩成 −log(模型给正确答案的概率)。 当时它还是个抽象的信息论量;现在我们仅仅凭「损失函数该有的脾气」(猜对趋于 0、自信猜错趋于 ∞), 竟然又把同一个公式找了回来。两条完全不同的路——信息论、和工程直觉——殊途同归。
对正确类别的预测概率 p 取负对数,就是交叉熵损失:
再用刚才那把尺子量量它的导数: 对 求导是 。 代入和上面完全一样的两个点: 时导数 , 时导数 —— 错得越狠,推力越大、还成倍地大。和 MSE 那「封顶在 −2」一对比,差距一目了然:这正好补上了「最该用力时却使不上劲」的短板。
把这条曲线接到我们那台机器上,你就能亲手感受损失在衡量「猜得有多差」。 先选定这个水果的真实答案,再转旋钮改变机器的预测,看黑点沿 曲线滑动、损失实时变化:
当有 个类别时(比如在苹果、香蕉、西瓜、柠檬里猜),完整的交叉熵是:
是真实标签(正确类为 1,其余为 0),所以只有正确类别那一项不为 0, 公式实际上就是 −log(正确类别的预测概率)。越有把握地猜对,损失越低;越自信地猜错,损失越高。
交叉熵几乎是所有分类任务的默认损失函数,配合下一课的 Softmax 输出效果最好。
总结
损失函数是梯度下降的「方向标」——它把「猜得有多差」变成一个可微的数,那台猜水果的机器才知道每一步该往哪调。 回归用 MSE(平方差),分类用交叉熵(−log 概率)。 MSE 对误差线性敏感;交叉熵对「极度自信的错误」指数级惩罚,梯度信号更强,分类任务收敛更快。
这一课你亲手推导了
- 损失函数:把预测误差变成一个可微的数,让梯度下降有方向走。
- MSE:(ŷ−y)² 的平均,消除符号,惩罚大误差;适合回归任务。
- MSE 的弱点:分类时对「极度错误」的梯度信号随 p 的变化很小。
- 交叉熵:−log(正确类别概率),p→0 时损失趋向无穷,梯度信号更强。
学习小测验
做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。
Softmax
交叉熵需要「概率」,但网络输出的是任意大小的分数——怎么把分数变成概率?