什么是损失函数?
损失函数(Loss Function)
它到底干嘛用?
训练模型就像练投篮:你投出的球(预测)要尽量进篮(真实答案)。
损失函数就是用一个数字告诉你这次“投偏了多少”。
- 数字大 = 偏得多,模型表现差
- 数字小 = 偏得少,模型更准
训练 = 一遍遍计算损失 → 调整参数 → 再计算 → …,直到损失尽量小。
基本符号介绍
- 或 :真实答案(标签)。
- 或 :模型给出的预测。
- :样本个数(比如一共有 100 条数据,就 )。
- :取较大的数。
- one-hot(独热):把真实类别写成“只有一个 1,其他是 0”的向量,比如三类里“第2类”为真 → 。
回归问题常见损失(预测连续数字)
均方误差 MSE(Mean Squared Error)
公式:
翻译:把“预测−真实”的差先平方,再取平均。
特点:差得越离谱,平方后惩罚加倍;对“离群值”更敏感。
例子:真实
- 预测 :误差 ,平方
- 预测 :误差 ,平方 (惩罚特别大)
平均绝对误差 MAE(Mean Absolute Error)
公式:
翻译:看“偏了几格”的平均值,不放大离群点。
特点:更稳、更抗离群,但在优化时更新步伐可能没 MSE 顺滑。
Huber 损失(MSE 与 MAE 的折中)
公式( 是阈值,常取 1):
翻译:
- 偏得不大时,用平方(像 MSE,平滑、好优化);
- 偏得很大时,改用“绝对值”线性增长(像 MAE,不被离群点拖走)。
用途:数据里偶有“很离谱”的值时,效果常比 MSE/MAE 更均衡。
如何选(回归)
- 数据干净、想更平滑:MSE
- 离群点多:MAE
- 两者折中:Huber
二分类常见损失(是/不是)
二元交叉熵 / 对数损失(Binary Cross-Entropy, Log Loss)
模型用 sigmoid 把分数挤到 0~1,当作“是”的概率 。
公式:
翻译:
- 如果真实 ,看 :你对“是”越有把握( 越接近 1),损失越小;反之越大。
- 如果真实 ,看 :你对“不是”越有把握( 越接近 1),损失越小。
为什么用 ?(直观理解)
- 对错得很自信 → 奖励/惩罚都要“更强烈”
- 能把“特别自信但错了”拉出很大的损失值,逼模型别乱自信。
小例子(只看量级,不必会算对数):
- 真实
- 预测 (很有把握是):损失约 0.10(很小)
- 预测 (很有把握不是):损失约 2.30(很大)
- 真实
- 预测 :损失约 0.22
- 预测 :损失约 2.30
记住:对数损失“特别惩罚自信的错误”,训练更稳定、结果更靠谱。
多分类常见损失(从多类里选一个)
Softmax + 交叉熵(Cross-Entropy)
先用 softmax 把每一类的分数变成 0~1 的概率,所有类的概率加起来等于 1。
softmax 公式(看概念即可):
- :模型给第 类的原始分数;
- :指数函数,保证概率非负且可比较。
交叉熵公式( 是 one-hot):
翻译:只会惩罚真实那一类对应的概率 :
- 越接近 1, 越小 → 损失越小。
- 若把概率压给了错误类别,损失会变大,且“越自信越惨”。
例子:3 类问题,真实是 第 2 类
- 预测概率 → 损失约 0.22(不错)
- 预测概率 (自信押错第1类)→ 损失约 3.00(很糟)
进阶:
- 标签平滑(Label Smoothing):把 one-hot 的 1 稍微分一些给其他类,防止模型“过度自信”,训练更稳。
间隔思想:Hinge 损失(了解即可)
常见于 SVM。先把标签写成 ,模型输出一个分数 。
公式:
翻译:
- 预测正确且“有余量”()→ 损失 0;
- 预测错或余量不够 → 按“差多少”线性惩罚。
这类损失强调“拉开正确与错误的间隔”。
总损失 = 数据损失 + 正则化
训练时常见:
- 正则化:限制参数太大,防止过拟合
- L2(权重平方和):鼓励参数更小更平滑
- L1(权重绝对值和):鼓励“稀疏”,有些参数变成 0
- :正则化权重,越大越“保守”,不容易记住训练集里的偶然噪声。
该怎么选损失函数?
- 回归:
- 数据干净 → MSE
- 离群点多 → MAE
- 想稳又好训 → Huber
- 二分类:二元交叉熵(BCE/Log Loss)
- 多分类:Softmax + 交叉熵
- 在意“间隔/边界”:Hinge
把一批样本的损失算平均
无论哪种损失,对一批(batch)样本通常是取平均:
是这批里的样本数,比如 32、64。这样每一步更新都“看整体”而不是只看一条。