P2-6.2 损失函数与目标函数¶
Section ID:
P2-6.2Version:v2026.09.15
损失函数(loss function)将预测与真实值的差距转换成用于学习的数字。目标函数(objective function)是训练要最小化或最大化的整体标准,也可以在平均损失上加入表示额外条件的惩罚项。
直线预测与实际分数¶
考虑用学习时间预测分数的直线模型。
| 学生 | 学习时间 x | 实际分数 y |
|---|---|---|
| A | 1 | 55 |
| B | 2 | 65 |
| C | 3 | 80 |
| D | 4 | 90 |
候选直线为 \(\hat{y} = 10x + 45\) 时,预测值为 55, 65, 75, 85。损失函数在这里把这条直线有多不贴合数据转换成数字。
也就是说,模型先做预测,再拿它和真实值比较,把错了多少变成数字,然后朝着让这个数字变小的方向去学习。
误差与平方误差¶
对人来说,说模型的预测错了很自然。但对计算机来说,这句话本身不能直接拿来用。只要计算机要调整数值,错误就必须被表达成数字。
例如,假设实际值是 10,而模型预测是 8。
这个 误差(error) 是 2。但在学习里,我们不会把原始误差直接拿来用。我们会按问题需要对它做变换,例如平方、取绝对值、或对概率套用对数。这个时候使用的函数,就是 损失函数(loss function)。
最容易理解的例子,是 平方误差(squared error)。
这里 \(y\) 是实际值,\(\hat{y}\) 是模型的预测值。
这个数字 4,就是把 错了多少 变成可计算数值后的结果。现在模型就可以沿着让这个数变小的方向去调整自己的值。
异号误差的抵消¶
你可能会想,如果预测错了 2,那直接用误差 2 不就行了吗? 但 误差(error) 是带方向的。比如实际值 10,预测值 8 会得到误差 2;而预测值 12 会得到误差 -2。
这两次预测都离真实值差了 2,但符号不同。如果把多个样本的误差直接加总,它们可能会互相抵消。
明明有两个预测都错了,但总和却变成 0。这不表示模型预测得好。所以损失函数会把误差变成适合拿来学习的数字。
| 方式 | 计算 | 直觉 |
|---|---|---|
| 绝对误差(absolute error) | \(\lvert y - \hat{y}\rvert\) | 看它离得有多远 |
| 平方误差(squared error) | \((y - \hat{y})^2\) | 对大误差惩罚更重 |
| 对数损失(log loss) | 正确类别概率的负对数 | 对“很自信但预测错”的情况强力惩罚 |
分配给正确类别的概率与对数损失¶
分类模型预测各类别的概率。对于正确类别为“垃圾邮件”的邮件,比较模型赋予垃圾邮件概率 0.9 与 0.1 的情况。在只有一个正确类别的分类中,单个样本的对数损失为 −ln(正确类别的预测概率)。ln 表示自然对数;严格介于 0 与 1 之间的概率,其对数为负,因此前面加负号。
| 分配给正确类别“垃圾邮件”的概率 | 单个样本的对数损失 | 含义 |
|---|---|---|
| 0.9 | −ln(0.9) ≈ 0.105 | 正确类别的概率高 |
| 0.5 | −ln(0.5) ≈ 0.693 | 两个类别的概率相同 |
| 0.1 | −ln(0.1) ≈ 2.303 | 正确类别的概率低 |
分配给正确类别的概率趋近 1 时,损失趋近 0;概率趋近 0 时,损失变得很大。准确率只统计判断是否正确,而对数损失还反映给正确类别分配了多高的概率。例如,以 0.5 为垃圾邮件判定阈值时,0.6 和 0.9 都能判断正确,但对数损失不同。
均方误差¶
训练数据通常不只包含一个样本。我们会对很多样本做预测,再分别计算每个样本的损失。
四名学生的预测值与损失如下。
| 学生 | 实际分数 | 预测分数 | 实际值 − 预测值 | 平方误差 |
|---|---|---|---|---|
| A | 55 | 55 | 0 | 0 |
| B | 65 | 65 | 0 | 0 |
| C | 80 | 75 | 5 | 25 |
| D | 90 | 85 | 5 | 25 |
单个损失为 0, 0, 25, 25,均方误差(mean squared error, MSE)为 (0 + 0 + 25 + 25) / 4 = 12.5。使用这个均值,可以在同一组数据上比较其他候选直线。
如果写得更一般一些,就是下面这样。
sigma 压缩了将各样本平方误差相加的计算。这里 n 是样本数,i 是样本编号。将平方误差相加后除以 n,得到每个样本的平均损失。MSE 本身也称为损失函数,因此应根据公式与语境区分单个损失和平均损失。
平均损失与正则化惩罚¶
损失函数(loss function) 和 目标函数(objective function) 常常一起出现。这里可以这样区分:损失函数是计算“预测错了多少”的函数,而目标函数则是训练实际上想要减少或增加的整体标准。
很多时候,目标函数就是平均损失。
但它并不总是这么简单。例如,我们也可能额外加上一个惩罚项,防止模型变得过于复杂。
假设为了抑制过大的斜率 a,在平均损失上加上 0.2a²。本例不对截距 b 施加惩罚。
| 候选直线 | 平均损失 | 惩罚项 0.2a² | 目标函数值 |
|---|---|---|---|
| a = 10, b = 45 | 12.5 | 20 | 32.5 |
| a = 12, b = 40 | 7.5 | 28.8 | 36.3 |
只比较平均损失,第二个候选更好;但加入惩罚后,第一个候选的目标函数值更好。要理解训练在最小化什么,除了损失,还需检查正则化(regularization)项。
将惩罚强度记为 λ(lambda),目标函数就是 平均损失 + λa²。设置值 λ≥0 控制两项的相对权重。λ=0 时只比较平均损失;λ 越大,大斜率对应的代价越高。本例中的 λ 单独设定,与学习得到的参数 a, b 区分。
| λ | 候选 1:a=10, b=45 | 候选 2:a=12, b=40 | 两者中目标函数值较小者 |
|---|---|---|---|
| 0 | 12.5 | 7.5 | 候选 2 |
| 0.1 | 22.5 | 21.9 | 候选 2 |
| 0.2 | 32.5 | 36.3 | 候选 1 |
惩罚不同于禁止 a 超出某个上限的约束。它只是给较大的 a 增加代价进行比较,并不禁止这种取值。λ 越大,也不保证新数据上的表现越好。惩罚过强可能使模型无法充分跟随数据的变化,因此需要在验证数据上检查效果。
图中的平均损失与惩罚是不同的项,两者相加才是本例要最小化的目标函数。
flowchart TD
L["单个样本的平方误差<br/>0, 0, 25, 25"]
M["平均损失<br/>50 / 4 = 12.5"]
R["正则化惩罚<br/>λ = 0.2, a = 10<br/>λa² = 20"]
O["目标函数<br/>12.5 + 20 = 32.5<br/>要最小化的值"]
L --> M
M --> O
R --> O
训练损失与新数据性能¶
损失下降通常是好信号。这说明模型在训练数据这个标准下,预测变得更贴合了。
但不能只因为损失低,就断定模型在现实里也一定好。损失可能只是在训练数据上低;在新数据上可能并不贴合;服务目标和损失函数可能不一致;而像安全性、公平性、成本这样的约束,也未必能被一个损失完整表达。
训练数据上的损失是在现有数据上计算的值,并不能完全保证整个现实世界中的性能。
因此,训练通常会区分训练数据(training data)、验证数据(validation data)与测试数据(test data)。
损失函数与评价指标¶
损失函数(loss function) 是在学习过程中用来调整模型数值的。评价指标(metric) 则是让人去解释和比较模型结果的。
两者有时会相同。例如,训练也用 MSE,评估也用 MSE。
但它们也可能不同。例如,训练时减少的是 对数损失(log loss),而报告里看的是 准确率(accuracy)、精确率(precision)、召回率(recall);到了真实服务里,可能还要同时看成本、延迟、风险。
这种差别在实务中非常重要。如果模型在训练时减少的数字,和人真正关心的数字不是同一个东西,那么模型可能会朝着奇怪的方向“变好”。
即使在学习时间-分数这个例子里,也有同样的区分。学习过程也许会找到平均损失更低的直线,但人还会另外问一些解释问题,比如 它是不是特别容易错高分学生?、它是不是整体上把分数压低了? 损失是学习的指南针,而评价是人来阅读结果的位置。
平均损失与最大配送误差¶
假设三个订单的实际配送时间均为 60 分钟。
| 模型 | 预测配送时间 | 平方误差 | MSE | 最大绝对误差 |
|---|---|---|---|---|
| A | 55, 55, 55 分钟 | 25, 25, 25 | 25 | 5 分钟 |
| B | 60, 60, 52 分钟 | 0, 0, 64 | 约 21.33 | 8 分钟 |
B 的 MSE 更低,但 A 在偏差最大的订单上误差更小。如果服务另外统计 预测偏差超过 6 分钟的订单数,A 为 0 单,B 为 1 单。训练损失改善,并不代表运营中的其他指标也会同时改善。
改变惩罚与评价标准后重新计算¶
- 当
λ=0.05时,计算两条候选直线的目标函数值,选出较小者。 - 给正确类别为垃圾邮件的邮件赋予垃圾邮件概率 0.6,对数损失是多少?与概率 0.9 相比,即使准确率判定相同,损失有何不同?垃圾邮件判定阈值设为 0.5。
- 配送例子中,A 与 B 各有多少订单的绝对误差超过 4 分钟?与 6 分钟标准相比,选择是否改变?
解答: ① 候选 1 为 12.5+0.05×100=17.5,候选 2 为 7.5+0.05×144=14.7,候选 2 较小。② −ln(0.6)≈0.511。两个概率都判断为垃圾邮件且判断正确,但概率 0.9 的损失约为 0.105,更小。③ A 为 3 单,B 为 1 单,最小化该数量时 B 更好。6 分钟标准下,A 为 0 单,B 为 1 单,因此 A 更好。评价标准不仅名称重要,阈值也影响选择。
检查清单¶
- 能把
损失函数(loss function)解释成把预测错误变成数字的函数。 - 能利用实际值 \(y\) 与预测值 \(\hat{y}\) 的差,计算平方误差。
- 能说明均方误差(mean squared error, MSE)是把多个样本损失取平均后的值。
- 能把
目标函数(objective function)解释成训练真正要优化的标准。 - 能说明损失函数与
评价指标(metric)并不总是同一个东西。 - 能说明损失低是好信号,但不会自动保证现实表现。
-
能区分单个误差、多个样本的平均损失、整个学习过程的目标函数。
-
能区分损失低这一事实与模型适合实际运营的判断。
来源与参考资料¶
- Ian Goodfellow, Yoshua Bengio, Aaron Courville, Deep Learning, Chapter 8: Optimization for Training Deep Models, MIT Press, 2016, 确认日期: 2026-07-20。用于确认深度学习训练会最小化训练数据中逐样本损失平均而成的成本函数(cost function)。
- scikit-learn developers, 3.4. Metrics and scoring: quantifying the quality of predictions, scikit-learn User Guide, 确认日期: 2026-07-20。用于确认评价预测质量时 scoring/metric 的选择,以及损失函数与评价指标可能相同也可能不同这一说明。
- scikit-learn developers, mean_squared_error, scikit-learn API Reference, 确认日期: 2026-07-20。用于确认均方误差是实际值
y_true与预测值y_pred之间的回归损失,且最佳值为 0。 - scikit-learn developers, log_loss, scikit-learn API Reference, 确认日期: 2026-09-15。用于确认 log loss 也称 logistic loss 或 cross-entropy loss,并应用于预测概率。