从数据分布角度理解:为什么不同任务要用不同的损失函数?
一、先说清楚:损失函数到底是什么?
在机器学习里,我们可以先把模型想象成一个“会猜答案的机器”。
给它一个输入,比如一张图片、一段文字、一个学生的学习时长,它会输出一个预测结果。
比如:
输入:学习时间
输出:预测考试分数输入:一张动物图片
输出:预测是猫、狗、兔子的概率输入:一个用户的历史行为
输出:预测他会不会点击广告
模型一开始猜得很差。我们需要告诉它:
你猜得有多离谱?
这个“离谱程度”就是损失函数。
损失函数越大,说明模型错得越严重;损失函数越小,说明模型越接近正确答案。
所以,训练模型的目标就是:
让损失函数尽可能小 \text{让损失函数尽可能小}让损失函数尽可能小
但是问题来了:
为什么回归任务常用均方误差?
为什么分类任务常用交叉熵?
为什么有些任务用绝对误差、Poisson 损失、Huber 损失、KL 散度?
答案是:
不同任务的答案yyy本身来自不同的数据分布。
损失函数其实是从“这个数据更像哪种分布”推导出来的。
二、最核心的思想:先假设数据怎么产生,再推出损失函数
我们先不管神经网络,也不管算法。
假设世界上有一个真实规律:
x→y x \rightarrow yx→y
比如:
学习时间→考试分数 \text{学习时间} \rightarrow \text{考试分数}学习时间→考试分数
但是现实世界有噪声。
同样学习555小时,有人考808080分,有人考858585分,有人考787878分。
所以我们不应该认为模型输出的是一个绝对确定的答案,而应该认为:
模型输出的是一个概率分布。
也就是说,给定输入xxx,答案yyy不是一个完全固定的数,而是从某个分布里“抽出来”的。
我们写成:
p(y∣x) p(y|x)p(y∣x)
读作:
在给定xxx的情况下,出现yyy的概率。
模型训练的目标就是:
让真实答案出现的概率尽可能大。
这叫做最大似然估计。
1. 什么是“似然”?
假设我们有nnn个样本:
(x1,y1),(x2,y2),…,(xn,yn) (x_1,y_1),(x_2,y_2),\dots,(x_n,y_n)(x1,y1),(x2,y2),…,(xn,yn)
模型认为第iii个真实答案出现的概率是:
p(yi∣xi) p(y_i|x_i)p(yi∣xi)
那么整批数据同时出现的概率就是:
p(y1∣x1)p(y2∣x2)⋯p(yn∣xn) p(y_1|x_1)p(y_2|x_2)\cdots p(y_n|x_n)p(y1∣x1)p(y2∣x2)⋯p(yn∣xn)
可以写成:
∏i=1np(yi∣xi) \prod_{i=1}^{n} p(y_i|x_i)i=1∏np(yi∣xi)
这个东西叫做似然。
最大似然估计的意思就是:
max∏i=1np(yi∣xi) \max \prod_{i=1}^{n} p(y_i|x_i)maxi=1∏np(yi∣xi)
也就是让真实数据出现的概率最大。
2. 为什么要取对数?
乘法很麻烦,而且很多小概率相乘会变得极小。
比如:
0.1×0.2×0.3=0.006 0.1 \times 0.2 \times 0.3 = 0.0060.1×0.2×0.3=0.006
样本一多,数字会越来越小。
所以我们取对数。
对数有一个重要性质:
log(ab)=loga+logb \log(ab)=\log a+\log blog(ab)=loga+logb
于是:
$$
\log \prod_{i=1}^{n} p(y_i|x_i)
\sum_{i=1}^{n} \log p(y_i|x_i)
$$
最大化似然等价于最大化对数似然:
max∑i=1nlogp(yi∣xi) \max \sum_{i=1}^{n} \log p(y_i|x_i)maxi=1∑nlogp(yi∣xi)
但是机器学习里通常习惯做“最小化损失”,所以我们在前面加一个负号:
$$
L
-\sum_{i=1}^{n} \log p(y_i|x_i)
$$
这个东西叫做负对数似然损失。
它是所有常见损失函数的“母公式”。
核心公式就是:
$$
\boxed{
L
-\sum_{i=1}^{n} \log p(y_i|x_i)
}
$$
意思是:
如果模型给真实答案的概率越大,损失越小;
如果模型给真实答案的概率越小,损失越大。
接下来,不同任务只是在问:
p(y∣x)p(y|x)p(y∣x)应该选成什么分布?
选高斯分布,就推出均方误差。
选伯努利分布,就推出二分类交叉熵。
选类别分布,就推出多分类交叉熵。
选拉普拉斯分布,就推出绝对误差。
选 Poisson 分布,就推出计数损失。
三、回归任务:为什么常用均方误差?
1. 回归任务是什么?
回归任务就是预测一个连续数值。
比如:
- 预测房价
- 预测考试分数
- 预测温度
- 预测身高
- 预测股票价格
这些答案都是连续的数字。
例如模型预测:
y^=80 \hat{y}=80y^=80
真实答案是:
y=83 y=83y=83
误差就是:
y−y^=3 y-\hat{y}=3y−y^=3
2. 回归任务的常见假设:误差服从高斯分布
很多自然现象的误差会集中在000附近,小误差多,大误差少。
比如老师估计学生成绩:
- 误差111分很常见
- 误差555分也可能
- 误差303030分很少见
这种“中间多、两边少”的形状很像高斯分布,也叫正态分布。
我们假设:
y=y^+ϵ y = \hat{y} + \epsilony=y^+ϵ
其中ϵ\epsilonϵ是误差。
假设误差服从高斯分布:
ϵ∼N(0,σ2) \epsilon \sim \mathcal{N}(0,\sigma^2)ϵ∼N(0,σ2)
这表示误差大多数在000附近。
那么真实值yyy在预测值y^\hat{y}y^附近波动:
y∣x∼N(y^,σ2) y|x \sim \mathcal{N}(\hat{y},\sigma^2)y∣x∼N(y^,σ2)
对应的概率密度函数是:
$$
p(y|x)
\frac{1}{\sqrt{2\pi\sigma^2}}
\exp
\left(
-\frac{(y-\hat{y})2}{2\sigma2}
\right)
$$
3. 代入负对数似然
单个样本的损失是:
$$
L
-\log p(y|x)
$$
代入高斯分布:
$$
L
-\log
\left[
\frac{1}{\sqrt{2\pi\sigma^2}}
\exp
\left(
-\frac{(y-\hat{y})2}{2\sigma2}
\right)
\right]
$$
利用:
log(ab)=loga+logb \log(ab)=\log a+\log blog(ab)=loga+logb
得到: