损失函数:衡量预测的代价
从预测概率到损失分数,区分 MSE、交叉熵、准确率与不同求导对象。
同样是「预测错了」——错误程度一样吗?
先玩个你小时候一定玩过的游戏——猜数字。我心里想一个 1~100 的整数,你来猜; 你每报一个数,我只回三个字:「大了」或「小了」。就靠这一句反馈,你几次就能逼到正确答案: 猜 50,「小了」,就往大里猜;猜 88,「大了」,就往小里收……范围一步步夹紧。
这条反馈虽然简单,却恰好给了你最关键的东西——方向:大了就往小调,小了就往大调。 正是这一点「往哪边改」的信息,把「瞎猜」变成了「有方向地逼近」。
第 13 课说过,训练就是不断微调参数、让网络越猜越准。可神经网络的局面比猜数字难得多: 它一次要调成千上万个参数,输出的还是一组概率而不是一个数—— 它怎么知道自己这次是「大了」还是「小了」、每个参数又该往哪个方向挪?
上一课已经得到预测概率。损失把预测与真实答案的差距压成一个标量;下一课反向传播对它求参数梯度,再交给优化器更新。损失、梯度与学习率各有职责。
可要把「差」变成这样一个能算、能求导的数字,并没有随手一减那么简单。 先用一个比分类更简单的场景找找感觉——预测数值。一个预测房价的网络,真实价格是 300 万,网络给出两个不同的预测:
- 预测 A:299 万(差了 1 万)
- 预测 B:100 万(差了 200 万)
显然 B 错得更离谱。但梯度下降想要知道的不只是「哪个更离谱」, 还要知道离谱多少——因为它需要算出一个梯度来更新权重。「错误」必须是一个可以计算导数的数字。
取平方:均方误差 MSE
取平方消除符号,再对所有样本平均——这就是均方误差(MSE):
是预测值, 是真实值。检验一下:
差 200 万,惩罚是差 1 万的 40000 倍——平方让大错的惩罚重得多,这一步好懂。 但真正要补一句的是:梯度下降用来调参数的,并不是损失这个值本身,而是它的「导数」。
第 08 课认识了导数与梯度。梯度给出当前位置的敏感度,更新大小还取决于学习率和优化器,不能由一个导数数值单独决定。
那 MSE 的导数长什么样?把单个样本的损失看成预测值 的函数,对 求导 (套第 08 课的法则:平方求导,把指数 2 挪到前面、次数减一,再乘括号里那项的导数 1):
念一遍就懂:导数 = 2 ×(预测 − 真实)。预测大了()导数为正,提示「再调大只会更糟」,于是往小收; 预测小了导数为负,于是往大调。而且预测离真实越远,这个值的绝对值越大、推得越狠。形式简单、又处处可微,梯度下降拿来就能用。
MSE 适合预测连续数值(回归问题)。但如果要做分类—— 比如我们那台机器判断「是不是苹果」——直接用 MSE 会出现意想不到的问题。
平方误差接上 Sigmoid:要看完整计算链
那台机器最后输出一个 0~1 的概率(通过 Sigmoid)。手上这个水果真实答案:是苹果(标签 = 1)。 比较两种预测:
预测 B 错得那么厉害,损失是预测 A 的 98 倍——看着够狠了吧?可别急。 上一站说过:真正推动训练的是导数,不是损失值本身。所以得盯着导数看。
这里真实标签 ,损失就是 , 导数和上一站一模一样:。把两个「极度猜错」的情况代进去:
对概率 q 求导时,平方误差在 q 接近 0、真实标签为 1 的区域斜率接近 −2。但模型先输出 logit z,再经 Sigmoid 变成 q。真正影响 z 的导数还要乘 q(1−q)。
Sigmoid 饱和时 q(1−q) 很小。平方误差对 z 的导数为 2(q−y)q(1−q),自信猜错时也可能接近零。问题不是「对概率的斜率封顶」本身,而是整个计算链的梯度可能变弱。
分类损失应同时考虑概率解释与可优化性。二元交叉熵与 Sigmoid 配合时,对 logit z 的导数简化为 q−y;自信猜错时它仍能提供非零信号,而不是无限大的权重更新。
图中的横轴是预测概率,不是 logits 或模型权重。对 q 求导与沿计算图对参数求导是不同的问题,后者还需要链式法则。此外,更新幅度同时受学习率影响,不由导数大小单独决定。
对数损失:交叉熵
这个 −log(p),名字你应该会觉得眼熟。第 10 课《信息量、熵与交叉熵》里,我们从信息论推过它: 交叉熵衡量「用模型分布 q 去解读真实答案 p,平均有多意外」,当真实答案确定时塌缩成 −log(模型给正确答案的概率)。 当时它还是个抽象的信息论量;现在我们仅仅凭「损失函数该有的脾气」(猜对趋于 0、自信猜错趋于 ∞), 竟然又把同一个公式找了回来。两条完全不同的路——信息论、和工程直觉——殊途同归。
对正确类别的预测概率 p 取负对数,就是交叉熵损失:
对正确类概率 q,−ln(q) 的导数是 −1/q;q=0.01 和 q=0.001 时分别为 −100、−1000。这是对概率的斜率,不是参数梯度。经过 Softmax 后,对 logits 的梯度是 q−y;参数梯度还需要下一课的链式法则。
把这条曲线接到我们那台机器上,你就能亲手感受损失在衡量「猜得有多差」。 先选定这个水果的真实答案,再转旋钮改变机器的预测,看黑点沿 曲线滑动、损失实时变化:
当有 个类别时(比如在苹果、香蕉、西瓜、柠檬里猜),完整的交叉熵是:
是真实标签(正确类为 1,其余为 0),所以只有正确类别那一项不为 0, 公式实际上就是 −log(正确类别的预测概率)。越有把握地猜对,损失越低;越自信地猜错,损失越高。
互斥多分类常用上一课的 Softmax 与多类交叉熵,二分类和多标签常用二元交叉熵。实际训练优先使用直接接收 logits 的稳定实现。
一个 batch 的分数,和「答对几题」不是一回事
前一课把 logits 转成概率,本课给每个样本的预测打分。训练时通常把一个 batch 中各样本的损失求平均,得到用于反向传播的标量。
准确率只问最高概率的类别是不是正确,交叉熵还问给正确类别分了多少概率。两次都把苹果排第一,正确类概率从 0.55 升到 0.90,准确率不变,但负对数损失变小。损失是优化目标,准确率是评价指标;两者可能不同步变化。
对单样本、未加权的 Softmax 交叉熵:对正确类概率 q 的导数为 −1/q;对每个 logit 的导数为 qᵢ−yᵢ;对参数的导数还要沿网络应用链式法则。batch 取平均时还带有 1/B。不能把 −1/q 直接当成更新权重的力度。
总结
回归常用 MSE,分类常用交叉熵。损失衡量代价,梯度描述敏感度;对概率、logits、参数求导是不同问题。batch 损失可以求平均,准确率则只统计类别是否选对。
💡 用大白话梳理:这一课的核心直觉
- 损失函数:把预测误差变成一个可微的数,让梯度下降有方向走。
- MSE:(ŷ−y)² 的平均,消除符号,惩罚大误差;适合回归任务。
- MSE 的边界:在 Sigmoid 分类中,对 logits 的梯度包含 q(1−q),饱和时可能变弱;不能只比较对概率的导数。
- 交叉熵:正确类概率的负对数;Softmax 配合后的 logit 梯度为 q−y,不会因 −1/q 发散就使参数梯度必然发散。
学习小测验
动动脑筋:核心直觉小测验(选出你的答案后点击「提交」,即可查看生动通俗的详细解析)
16 反向传播:梯度如何传回来
沿计算图应用链式法则,高效算出梯度;更新参数则留给优化器。