1.3 损失函数——标定错得多深


1.3 损失函数——标定"错得多深"

本节摘要:前向传播给出预测后,损失函数负责把"错得多严重"变成一个数值。本节对比回归用的均方误差、分类用的交叉熵,解释为何分类宁可弃 MSE 而选交叉熵,并附上各损失函数的直观比较表。

前两节给了结构(1.1)和非线性(1.2),但现在网络还缺一个"好坏"的量尺——否则它不知道自己错在哪儿。本节填补这个缺口:损失函数把模型的预测和真实标签的差距压成一个标量,这个标量是第2章反向传播的"源头信号"。它有多大、长得平不平坦,直接决定梯度往哪使劲。

训练需要一个能打分又够平滑的标尺

选损失函数有两条硬要求。第一要"可打分":同一份数据上,预测越离谱数值越大,模型才有优化方向。第二要"够平滑":越接近谷底越要渐变,因为梯度下降(1.4)要靠导数往前走,处处尖角的路会把步法带懵。这两点决定了损失函数不能是"对了记 1 分、错了记 0 分"那种阶跃量尺,而必须是一个处处可导、且能反映偏差大小的函数。

回归的地盘:均方误差与平均绝对误差

回归要预测连续值。最经典的均方误差(MSE)把每个样本预测减真实,取平方再求平均。平方的脾气是"放大误差"——离得远的错误被狠狠惩罚,方向感强;缺点是它讨厌离群点,一个异常值能把梯度拽得极猛。平均绝对误差(MAE)改用绝对值,本质上是"计价曼哈顿距离",对离群点更稳,但在零点处不可导,靠梯度下降时会有轻微"锯齿"。实战里两者也常混用。

分类的地盘:为什么要绕开 MSE

分类任务早期的直觉是用 MSE 把输出往"该类的 1、其余类的 0"上拉。但它有个致命伤:配合 Sigmoid 时,越接近正确输出的位置,梯度越平缓,即"越接近答案,进步越慢"。更麻烦的是,MSE 惩罚的是"数值差",不是"置信概率差"——预测概率从 0.9 变到 0.7,和从 0.4 变到 0.2,MSE 看的是同样幅度,但前者在分类语义里其实离正确远多了。

交叉熵直接算"两个分布差多远",采取对数把信心的权重放大:模型对错误类给出的高置信,会被狠狠惩罚;对正确类给出的低置信,同样要付出沉痛代价。这种"越自信越不能错"的记账方式,让交叉熵提供的梯度既大又稳,正是分类任务理想的主心骨。

一张表记住三大家

下面把三类统计任务和配套的损失函数、输出层配型列成一张表:

任务 典型损失 输出层配型 一句话记法
连续值回归 均方误差 MSE 线性输出 放大大误差,方向感强,怕离群点
稳健回归 平均绝对误差 MAE 线性输出 不怕离群,但在零点啃不动
二分类 二元交叉熵 Sigmoid 输出 越自信越不能错
多分类 多分类交叉熵 Softmax 输出 高置信错误重罚,梯度给得足

这张表也是你以后选型的第一查表入口:先看是不是分类,再看几类,最后定损失与输出层配对。

损失值小,不代表模型好

这是本节最想泼的一盆冷水。损失只能衡量"在训练数据上的拟合程度",与"在新数据上的泛化能力"(第2章 2.2 详述)是两码事。一个把训练集背得滚瓜烂熟的模型,损失可以趋近于零,却在新样本上一塌糊涂。所以损失函数是我们优化"怎么学"的目标,而评估"学没学好"还要另外一把尺。把这一层想清楚,才不会迷信训练日志上那条一路下滑的曲线。

动手算两个值,体会两种记账的不同

用一小段代码,看看同一个"错例"在 MSE 和交叉熵下各判多重:

import math import numpy as np true_p = [1.0, 0.0, 0.0] # 真实:样本属于第 0 类 pred_p = [0.60, 0.30, 0.10] # 预测:对第 0 类只给 0.60 的置信 mse = np.mean((np.array(true_p) - np.array(pred_p)) ** 2) def ce(p, t): return -sum(t[i] * math.log(p[i] + 1e-12) for i in range(len(t))) print("MSE =", round(mse, 4)) print("交叉熵 =", round(ce(pred_p, true_p), 4))

把 pred_p 改成更自信的 [0.95, 0.03, 0.02],你会发现 MSE 变化平缓,而交叉熵一路陡降——这个"越接近答案提高越快"的性子,正是分类训练显得效率高的原因。

三种损失喂给梯度的"脾气"各不相同

损失函数不是只给一个数就完事——它生成的梯度方向、大小,直接塑造了训练的性格。把三个主要玩家摊开看:MSE 对离群点极其敏感,一个错误极大的样本,其平方项几乎独占分母,把整批梯度拽向它,模型为了讨好它会牺牲一大批正常样本;MAE 相反,对每个样本一视同仁地计价,鲁棒但收敛慢,且零点的导数不定义;交叉熵的体积感最强,它对"错误类的置信"惩罚是按对数放大的,所以越要犯错时它拉得越狠,这让分类训练前期提升很快,后期精准微调却显得平和。

这层差异落到实践上有三句可落地的话:回归里当你的数据含大量脏点,先考虑 MAE 或 Huber;分类里几乎永远优先交叉熵,别被"MSE 看起来也不差"的早期实验骗走;而当你发现训练损失降不下来,别急着换损失,先确认是不是数据的标签或输出的激活配型出了岔子——损失只负责记账,账本身对不对是另一回事。

一个常被忽略的配对坑

损失与输出层的匹配是新手最爱踩的雷。最常见的错法:多分类任务却在输出层只放一个 Sigmoid 神经元,再配多分类交叉熵,结果要么概率和整不到 1,要么梯度对不上口。正确配型永远是多分类对 Softmax 加多分类交叉熵、二分类对 Sigmoid 加二元交叉熵。这条线捋不顺,后面再怎么调学习率都是隔靴搔痒。

三行可以随身带的口诀

把整节压成三句,之后选型时先过一遍:看任务定损失——连续回归用 MSE 或 MAE,分类一律看交叉熵;看损失配输出——MSE/MAE 配线性,二分类交叉熵配 Sigmoid,多分类交叉熵配 Softmax;看曲线调方法——损失没降先查账(标签、配型),再谈换损失。这三句串起来,就从"背名词"进到了"会分诊"。下一节你会看到损失给出的那个数值,是如何被优化器一步步踩回谷底的。

三行可以随身带的口诀

把整节压成三句,之后选型时先过一遍:看任务定损失——连续回归用 MSE 或 MAE,分类一律看交叉熵;看损失配输出——MSE/MAE 配线性,二分类交叉熵配 Sigmoid,多分类交叉熵配 Softmax;看曲线调方法——损失没降先查账(标签、配型),再谈换损失。这三句串起来,就从"背名词"进到了"会分诊"。下一节你会看到损失给出的那个数值,是如何被优化器一步步踩回谷底的。

本节要点回顾

  • 损失函数要可打分、够平滑,是反向传播误差信号的源头
  • 回归选 MSE 或 MAE,看你在意方向感还是鲁棒性
  • 分类选交叉熵,配合 Sigmoid 或 Softmax,梯度大而稳
  • 输出层与损失要配对,别让多分类的损失配单神经元的输出
  • 损失低不等于泛化好,评价模型是第2章的另一把尺

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U