损失函数(Loss Function)

它到底干嘛用?

训练模型就像练投篮:你投出的球(预测)要尽量进篮(真实答案)。
损失函数就是用一个数字告诉你这次“投偏了多少”。

  • 数字大 = 偏得多,模型表现差
  • 数字小 = 偏得少,模型更准

训练 = 一遍遍计算损失 → 调整参数 → 再计算 → …,直到损失尽量小。


基本符号介绍

  • yyytruey_{true}:真实答案(标签)。
  • y^\hat yypredy_{pred}:模型给出的预测。
  • nn:样本个数(比如一共有 100 条数据,就 n=100n=100)。
  • max(a,b)\max(a, b):取较大的数。
  • one-hot(独热):把真实类别写成“只有一个 1,其他是 0”的向量,比如三类里“第2类”为真 → [0,1,0][0,1,0]

回归问题常见损失(预测连续数字)

均方误差 MSE(Mean Squared Error)

公式

MSE=1ni=1n(y^iyi)2\text{MSE}=\frac{1}{n}\sum_{i=1}^{n}\big(\hat y_i - y_i\big)^2

翻译:把“预测−真实”的差先平方,再取平均
特点:差得越离谱,平方后惩罚加倍;对“离群值”更敏感。
例子:真实 y=10y=10

  • 预测 y^=8\hat y=8:误差 2-2,平方 44
  • 预测 y^=0\hat y=0:误差 10-10,平方 100100(惩罚特别大)

平均绝对误差 MAE(Mean Absolute Error)

公式

MAE=1ni=1ny^iyi\text{MAE}=\frac{1}{n}\sum_{i=1}^{n}\big|\hat y_i - y_i\big|

翻译:看“偏了几格”的平均值,不放大离群点。
特点:更稳、更抗离群,但在优化时更新步伐可能没 MSE 顺滑。

Huber 损失(MSE 与 MAE 的折中)

公式δ\delta 是阈值,常取 1):

Lδ(r)={12r2,rδδ(r12δ),r>δ其中 r=y^yL_\delta(r)= \begin{cases} \frac{1}{2}r^2, & |r|\le \delta \\ \delta\big(|r|-\frac{1}{2}\delta\big), & |r|>\delta \end{cases} \quad\text{其中 } r=\hat y-y

翻译

  • 偏得不大时,用平方(像 MSE,平滑、好优化);
  • 偏得很大时,改用“绝对值”线性增长(像 MAE,不被离群点拖走)。
    用途:数据里偶有“很离谱”的值时,效果常比 MSE/MAE 更均衡。

如何选(回归)

  • 数据干净、想更平滑:MSE
  • 离群点多:MAE
  • 两者折中:Huber

二分类常见损失(是/不是)

二元交叉熵 / 对数损失(Binary Cross-Entropy, Log Loss)

模型用 sigmoid 把分数挤到 0~1,当作“是”的概率 pp
公式

BCE=[ylog(p)+(1y)log(1p)]\text{BCE} = -\Big[\, y\cdot \log(p) + (1-y)\cdot \log(1-p) \,\Big]

翻译

  • 如果真实 y=1y=1,看 log(p)-\log(p):你对“是”越有把握(pp 越接近 1),损失越小;反之越大。
  • 如果真实 y=0y=0,看 log(1p)-\log(1-p):你对“不是”越有把握(1p1-p 越接近 1),损失越小。

为什么用 log\log?(直观理解)

  • 对错得很自信 → 奖励/惩罚都要“更强烈”
  • log\log 能把“特别自信但错了”拉出很大的损失值,逼模型别乱自信。

小例子(只看量级,不必会算对数):

  • 真实 y=1y=1
    • 预测 p=0.9p=0.9(很有把握是):损失约 0.10(很小)
    • 预测 p=0.1p=0.1(很有把握不是):损失约 2.30(很大)
  • 真实 y=0y=0
    • 预测 p=0.2p=0.2:损失约 0.22
    • 预测 p=0.9p=0.9:损失约 2.30

记住:对数损失“特别惩罚自信的错误”,训练更稳定、结果更靠谱。


多分类常见损失(从多类里选一个)

Softmax + 交叉熵(Cross-Entropy)

先用 softmax 把每一类的分数变成 0~1 的概率,所有类的概率加起来等于 1
softmax 公式(看概念即可):

pk=ezkjezjp_k=\frac{e^{z_k}}{\sum_{j} e^{z_j}}

  • zkz_k:模型给第 kk 类的原始分数;
  • e()e^{(\cdot)}:指数函数,保证概率非负且可比较。

交叉熵公式yy 是 one-hot):

CE=kyklog(pk)\text{CE} = -\sum_{k} y_k \log(p_k)

翻译:只会惩罚真实那一类对应的概率 ptruep_{\text{true}}

  • ptruep_{\text{true}} 越接近 1,log(ptrue)-\log(p_{\text{true}}) 越小 → 损失越小。
  • 若把概率压给了错误类别,损失会变大,且“越自信越惨”。

例子:3 类问题,真实是 第 2 类

  • 预测概率 [0.1,0.8,0.1][0.1, \mathbf{0.8}, 0.1] → 损失约 0.22(不错)
  • 预测概率 [0.9,0.05,0.05][\mathbf{0.9}, 0.05, 0.05](自信押错第1类)→ 损失约 3.00(很糟)

进阶

  • 标签平滑(Label Smoothing):把 one-hot 的 1 稍微分一些给其他类,防止模型“过度自信”,训练更稳。

间隔思想:Hinge 损失(了解即可)

常见于 SVM。先把标签写成 y{1,+1}y\in\{-1, +1\},模型输出一个分数 ss
公式

L=max(0, 1ys)\mathcal{L}=\max(0,\ 1 - y\cdot s)

翻译

  • 预测正确且“有余量”(ys1y\cdot s\ge 1)→ 损失 0;
  • 预测错或余量不够 → 按“差多少”线性惩罚。
    这类损失强调“拉开正确与错误的间隔”。

总损失 = 数据损失 + 正则化

训练时常见:

总损失=数据损失(上面那些)+λ×正则化项\text{总损失} = \text{数据损失(上面那些)} + \lambda\times\text{正则化项}

  • 正则化:限制参数太大,防止过拟合
    • L2(权重平方和):鼓励参数更小更平滑
    • L1(权重绝对值和):鼓励“稀疏”,有些参数变成 0
  • λ\lambda:正则化权重,越大越“保守”,不容易记住训练集里的偶然噪声。

该怎么选损失函数?

  • 回归
    • 数据干净 → MSE
    • 离群点多 → MAE
    • 想稳又好训 → Huber
  • 二分类二元交叉熵(BCE/Log Loss)
  • 多分类Softmax + 交叉熵
  • 在意“间隔/边界”Hinge

把一批样本的损失算平均

无论哪种损失,对一批(batch)样本通常是取平均

BatchLoss=1mi=1mLoss(y^i,yi)\text{BatchLoss}=\frac{1}{m}\sum_{i=1}^{m} \text{Loss}(\hat y_i, y_i)

mm 是这批里的样本数,比如 32、64。这样每一步更新都“看整体”而不是只看一条。