第 4 章 · 训练

损失函数:给错误定价

前三章我们造出了网络这个「函数机器」,但它还不知道自己错得有多离谱。这一章给错误定一个价——价格越高,说明错得越狠——然后让机器做的唯一一件事,就是拼命把价格压下去。

4.1 学习 = 把「错多少」变成数字,再最小化

回想第 1 章的感知机:它分错一个点,就机械地挪一下权重。但「分错了」是个粗糙的二值信号——错一点点和错到十万八千里,在它眼里没有区别。真正的深度学习需要一把更精细的尺子:损失函数(loss function)。

损失函数做的事只有一件:给定预测值 ŷ 和真实值 y,吐出一个非负数字,表示这次预测值多少钱——错了要付钱,错得越狠付得越多,完全正确则为零(或接近零)。于是「训练网络」这件听起来很玄的事,被翻译成了一个纯粹的数学问题:

找到一组权重 w,让损失 L(w) 尽可能小

这就是深度学习的全部「目标感」来源。后面两章的反向传播和梯度下降,讲的都是「怎么找到这组权重」;而这一章要回答的是更根本的问题:这个价格该怎么定?定价方式不同,网络学到的东西就完全不同。

💡 一句话直觉

损失函数是教练手里的记分牌。球员(网络)看不见世界,只能看见记分牌——记分牌怎么记分,球员就怎么打球。所以设计损失函数,本质上是设计「奖惩制度」。

4.2 回归任务:均方误差 MSE

先看回归问题——预测一个连续数值,比如房价、气温。最直观的错误度量是「差了多少」:yi − ŷi,叫做残差(residual)。把一批样本的残差平方后取平均,就是大名鼎鼎的均方误差(Mean Squared Error):

MSE = (1/n) · Σi ( yi − ŷi )2

为什么要平方?三个原因:消除正负号(高估和低估都算错);让函数处处光滑可导(|x| 在 0 点有尖角,x² 没有);以及——这是本章的重点——平方会放大惩罚:误差翻 10 倍,惩罚翻 100 倍。作为对比,我们也可以直接对残差绝对值取平均,得到 MAE(平均绝对误差):

MAE = (1/n) · Σi | yi − ŷi |

下面这个演示把 MSE 画了出来:每个散点到直线的竖直线段是残差,而以残差为边长的半透明方块的面积,正是这个点的平方误差。MSE 就是所有这些方块的平均面积。

演示 1 · 残差与 MSE:方块面积就是代价

拖滑块

先把斜率和截距调到「看起来最贴」,记下 MSE。然后点「加入离群点」:MSE 会暴涨(那个巨大的方块),而 MAE 只挪了一点。再点「自动拟合」,看直线被离群点硬生生拽歪。

MSE MAE

你在演示里看到的就是 MSE 最著名的性格:对离群点(outlier)极度敏感。一个录入错误的数据点,因为惩罚被平方放大,能把整条直线往自己这边拽。MAE 则「淡定」得多——它对所有误差一视同仁地线性计费。所以实践中:数据干净、相信每个样本时用 MSE;数据里可能混有脏数据时,MAE(或它的光滑亲戚 Huber 损失)往往更稳。

4.3 分类任务:交叉熵

再看分类问题。以二分类为例:网络经过 sigmoid(第 2 章)输出一个概率 p ∈ (0, 1),表示「是类别 1 的把握」;真实标签 t 是 0 或 1。这时的定价哲学和回归完全不同——我们关心的是:你给正确答案标了多大的概率?

交叉熵(Cross Entropy)的定价方式,只看正确类别的那个概率:

L = − [ t · ln(p) + (1 − t) · ln(1 − p) ]

别被公式吓到,它其实是个「二选一」的开关:t = 1 时只有 −ln(p) 生效,t = 0 时只有 −ln(1 − p) 生效。而 −ln 这条曲线有个暴脾气:当正确类别的概率接近 1,损失接近 0;概率越低,损失越高;当概率趋近 0——也就是「自信地错」——损失直接冲向无穷大

💡 一句话直觉

交叉熵像在考场上逼你「押注」:光选对答案还不够,你押的把握越大、收益越高;但如果押 99% 的把握还押错了,就罚到你倾家荡产。它奖励「自信的准」,严惩「自信的错」。

4.4 为什么分类不能用 MSE?

一个自然的问题:p 和 t 也都是数字,直接用 (t − p)² 当损失不行吗?能算,但会出大事。问题不在损失值本身,而在它传回给网络的梯度(第 5、6 章的主角,这里先剧透一点)。

sigmoid 有个天性:输出接近 0 或 1 时会「躺平」,斜率 σ′(z) = p(1 − p) 趋近于 0。MSE 的梯度要乘上这个斜率:

MSE 路线:∂L/∂z = (p − t) · p · (1 − p) ,   交叉熵路线:∂L/∂z = p − t

想象最糟糕的开局:t = 1,网络却输出 p = 0.01——错得离谱,最需要大力纠正。可 MSE 路线里那个 p(1 − p) ≈ 0.01 的因子,把梯度也压到了接近零:错得越狠,学得越慢,这就是「饱和」。而交叉熵与 sigmoid 搭配时,log 曲线和 sigmoid 的指数恰好相互抵消,梯度干干净净地等于 p − t——错多少,纠多少,绝不让「躺平」发生。

演示 2 · 交叉熵的暴脾气 vs MSE 的躺平

拖滑块

把 p 拖到 0.05:这是「自信地错」。交叉熵的损失冲到 3 左右、梯度巨大(曲线左侧几乎垂直);而 MSE 的损失不过 0.9 出头,梯度更是早早躺平。这就是分类任务选择交叉熵的全部理由。

交叉熵损失 |dL/dp|(交叉熵)
MSE 损失 |dL/dp|(MSE)

4.5 多分类:softmax + 交叉熵

类别不止两个时(比如手写数字 0~9),网络最后一层会为每个类别输出一个原始分数 zi,叫做 logits。这些分数可正可负、大小不一,不是概率。softmax 负责把它们变成一组「和为 1 的概率」:

pi = ezi / Σj ezj

指数 ez 保证每个数都为正,除以总和保证加起来等于 1——一个合法的概率分布就出来了。而且 softmax 有「赢家通吃」的倾向:最大的 logit 会被指数放大,拿走概率的大头。

接下来的交叉熵简单到只有一句话:取正确类别对应的那个概率,取负对数

L = − ln( p正确类 )

其他类别的概率根本不用单独出现——它们已经被 softmax 的「总和为 1」约束自动惩罚了:给错误类别分多了,正确类别自然就少了。softmax + 交叉熵,是今天几乎所有分类网络的标准出厂配置。

⚠ 常见误区

损失低 ≠ 业务好。损失函数只是真实目标的代理(proxy):考试里交叉熵很低的模型,可能把所有「罕见但关键」的样本都分错;推荐系统里误差最小的模型,可能只会推最保险的老面孔。损失压不下去是问题,但损失压下去了,别忘了回头看看它到底是不是你真正想要的东西。

✓ 本章小结

训练 = 最小化损失函数这个「错误的价格」。回归常用 MSE,代价是对离群点敏感(MAE 更稳健)。分类用交叉熵:只看正确类别的概率,−ln 曲线严惩「自信地错」,并且与 sigmoid/softmax 搭配时梯度为 p − t,不会在错误最大时躺平——MSE 恰恰会。多分类 = softmax 把 logits 变概率 + 对正确类别取 −ln。记住:损失只是代理目标,低损失不必然等于好模型。