Huber 损失是一种“前面像平方误差(更平滑)、后面像绝对误差(不怕离群点)”的误差函数。它用来衡量预测值和真实值的差距,比纯平方误差更不容易被极端错误样本“带偏”。
1) 先定义“误差”
设真实值是y yy,预测值是y ^ \hat yy^,那么误差(残差)是
e = y ^ − y e = \hat y - ye=y^−y
我们关心的是误差的大小∣ e ∣ |e|∣e∣。
2) Huber 损失公式
Huber 损失有一个阈值参数δ > 0 \delta>0δ>0(读作 delta),表示“误差多大算大”。
L δ ( e ) = { 1 2 e 2 , ∣ e ∣ ≤ δ δ ( ∣ e ∣ − 1 2 δ ) , ∣ e ∣ > δ L_\delta(e)= \begin{cases} \frac{1}{2}e^2, & |e|\le \delta \\ \delta\left(|e|-\frac{1}{2}\delta\right), & |e|>\delta \end{cases}Lδ(e)={21e2,δ(∣e∣−21δ),∣e∣≤δ∣e∣>δ
3) 高中生直觉理解
把它想成“两段式惩罚”:
当误差不大(∣ e ∣ ≤ δ |e|\le\delta∣e∣≤δ)
用平方惩罚:
L = 1 2 e 2 L=\frac{1}{2}e^2L=21e2
- 小误差时,平方误差能给出更细腻的惩罚(误差从 1 变 2,损失从 0.5 变 2,增加很多),促使模型把小误差继续磨小。
- 曲线是圆滑的抛物线,训练更稳定。
当误差很大(∣ e ∣ > δ |e|>\delta∣e∣>δ)
改用“近似绝对值”的线性惩罚:
L = δ ( ∣ e ∣ − 1 2 δ ) L=\delta\left(|e|-\frac{1}{2}\delta\right)L=δ(∣e∣−21δ)
- 这时损失随误差大小线性增长,不像平方那样爆炸。
- 所以遇到“离群点/标注错误/极端样本”,不会把模型拉得太狠。
4) 为什么要这样“拼接”?
对比两种常见损失:
平方误差(MSE):1 2 e 2 \frac{1}{2}e^221e2
大误差会被放大得非常厉害(例如误差 10,损失 50),容易被少数离群点主导。绝对误差(MAE):∣ e ∣ |e|∣e∣
不怕离群点,但在误差接近 0 的地方“尖”,优化时不如平方那样平滑。
Huber就是把两者优点合在一起:
- 小误差:用平方(平滑、好优化)
- 大误差:用线性(抗离群点)
5) 一个简单数值例子(取δ = 1 \delta=1δ=1)
假设误差e = 0.5 e=0.5e=0.5(小误差):
L = 1 2 × 0.5 2 = 0.125 L=\frac{1}{2}\times 0.5^2=0.125L=21×0.52=0.125
假设误差e = 3 e=3e=3(大误差):
L = 1 × ( 3 − 1 2 × 1 ) = 2.5 L=1\times\left(3-\frac{1}{2}\times1\right)=2.5L=1×(3−21×1)=2.5
如果用平方误差,1 2 × 3 2 = 4.5 \frac{1}{2}\times 3^2=4.521×32=4.5,会惩罚更猛;Huber 就“温和”很多。
如果你告诉我你的任务里误差是“距离(米)”还是“像素/栅格”,我也可以顺便解释δ \deltaδ一般怎么选(比如和栅格分辨率、噪声尺度对应)。