Huber 损失是一种“前面像平方误差更平滑、后面像绝对误差不怕离群点”的误差函数。它用来衡量预测值和真实值的差距比纯平方误差更不容易被极端错误样本“带偏”。1) 先定义“误差”设真实值是y yy预测值是y ^ \hat yy^那么误差残差是e y ^ − y e \hat y - yey^−y我们关心的是误差的大小∣ e ∣ |e|∣e∣。2) Huber 损失公式Huber 损失有一个阈值参数δ 0 \delta0δ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^2L21e2小误差时平方误差能给出更细腻的惩罚误差从 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) 为什么要这样“拼接”对比两种常见损失平方误差MSE1 2 e 2 \frac{1}{2}e^221e2大误差会被放大得非常厉害例如误差 10损失 50容易被少数离群点主导。绝对误差MAE∣ e ∣ |e|∣e∣不怕离群点但在误差接近 0 的地方“尖”优化时不如平方那样平滑。Huber就是把两者优点合在一起小误差用平方平滑、好优化大误差用线性抗离群点5) 一个简单数值例子取δ 1 \delta1δ1假设误差e 0.5 e0.5e0.5小误差L 1 2 × 0.5 2 0.125 L\frac{1}{2}\times 0.5^20.125L21×0.520.125假设误差e 3 e3e3大误差L 1 × ( 3 − 1 2 × 1 ) 2.5 L1\times\left(3-\frac{1}{2}\times1\right)2.5L1×(3−21×1)2.5如果用平方误差1 2 × 3 2 4.5 \frac{1}{2}\times 3^24.521×324.5会惩罚更猛Huber 就“温和”很多。如果你告诉我你的任务里误差是“距离米”还是“像素/栅格”我也可以顺便解释δ \deltaδ一般怎么选比如和栅格分辨率、噪声尺度对应。