【深度学习】Huber Loss详解
文章目录
- 1. Huber Loss 原理详解
- 2. Pytorch 代码详解
- 3.与 MSELoss、MAELoss 区别及各自优缺点
- 3.1 MSELoss 均方误差损失
- 3.2 MAELoss 平均绝对误差损失
- 3.3 Huber Loss
- 4. 总结
- 4.1 优化平滑
- 4.2 梯度较好
- 4.3 为什么说 MSE 是平滑的
1. Huber Loss 原理详解
Huber Loss 是一种结合了 MSE(均方误差)与 MAE (平均绝对误差)的损失函数,旨在克服两者的缺点。对于小误差使用 MSE,对于大误差使用 MAE,因此在处理回归问题时,既能够平滑训练过程,有能减少异常值的影响
Huber Loss 函数的数学公式定义如下:
L δ ( y , y ^ ) = { 1 2 ( y − y ^ ) 2 , if ∣ y − y ^ ∣ ≤ δ δ ∣ y − y ^ ∣ − 1 2 δ 2 , otherwise L_{\delta}(y, \hat{y}) = \begin{cases} \frac{1}{2} (y - \hat{y})^2, & \text{if } |y - \hat{y}| \leq \delta \\ \delta |y - \hat{y}| - \frac{1}{2} \delta^2, & \text{otherwise} \end{cases} Lδ(y,y^)={21(y−y^)2,δ∣y−y^∣−21δ2,if ∣y−y^∣≤δotherwise
- y y y 为真实值
- y ^ \hat y y^ 为预测值
- δ \delta δ 是一个阈值,控制误差大小的界限,当误差小于 δ \delta δ 时使用 M S E MSE MSE,当误差大于 δ \delta δ 时使用 M A E MAE MAE
Huber Loss 的特点:
- 平滑性:当误差小于 δ \delta δ ,Huber Loss 与 MSE Loss一样,平方误差让梯度变平滑,有助于快速收敛
- 对异常值的鲁棒性:当误差大于 δ \delta δ 时,使用 MAE 来减小异常值对模型的影响,使得 Huber Loss 对大的偏差不那么敏感
- 可调性: δ \delta δ 是一个超参数,可以根据需求调整,平衡 MSE 和 MAE 效果
2. Pytorch 代码详解
torch.nn.HuberLoss 官方文档: https://pytorch.org/docs/stable/generated/torch.nn.HuberLoss.html
Huber Loss 函数定义:
class torch.nn.HuberLoss(reduction='mean', delta=1.0)
创建一个标准,如果逐元素误差的绝对值低于 delta,则使用平方项,否则使用 delta 缩放的 L1 项。此损失结合了 L1Loss 和 MSELoss 的优点。delta 缩放的 L1 区域使损失对异常值的敏感度低于 MSELoss,而 L2 区域在 L1Loss 附近提供了平滑度。
对于大小为 N 的批次,未经约简的损失可以描述为:
l
(
x
,
y
)
=
L
=
{
l
1
,
.
.
.
,
l
N
}
T
l(x,y) = L=\{ l_1,...,l_N\}^T
l(x,y)=L={l1,...,lN}T
其中:
l
n
=
{
0.5
(
x
n
−
y
n
)
2
,
如果
∣
x
n
−
y
n
∣
<
d
e
l
t
a
d
e
l
t
a
(
∣
x
n
−
y
n
∣
−
0.5
∗
d
e
l
t
a
)
,否则
l_n = \begin{cases} 0.5(x_n - y_n)^2 , 如果 |x_n-y_n| < delta \\ delta(|x_n-y_n|-0.5*delta), 否则 \end{cases}
ln={0.5(xn−yn)2,如果∣xn−yn∣<deltadelta(∣xn−yn∣−0.5∗delta),否则
如果reduction不为 none 则:
l ( x , y ) = { m e a n ( L ) , 如果 r e d u c t i o n = m e a n ; s u m ( L ) , 如果 r e d u c t i o n = s u m ; l(x,y) = \begin{cases} mean(L), 如果reduction = mean; \\ sum(L), 如果 reduction = sum; \end{cases} l(x,y)={mean(L),如果reduction=mean;sum(L),如果reduction=sum;
注意:
当 delta 设置为 1 时,此损失等效于 SmoothL1Loss,一般来说,此损失与 SmoothL1Loss 相差 delta 系数(在 Smooth L1 中也称为 beta)
参数:
- reduction (str, 可选) - 指定要应用于输出的归约:‘none’ | ‘mean’ | ‘sum’。 ‘none’:不应用任何归约,‘mean’:输出的总和将除以输出中的元素数量,‘sum’:输出将求和。默认值:‘mean’
- delta (float, 可选) – 指定在 delta 缩放的 L1 和 L2 损失之间切换的阈值。该值必须为正数。默认值:1.0
3.与 MSELoss、MAELoss 区别及各自优缺点
3.1 MSELoss 均方误差损失
MSE损失计算的是真实值与预测值之间差异的平方,适用于误差分布较为均匀且没有异常值的数据。
公式:
M S E = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 MSE = \frac {1}{N} \sum_{i=1}^N(y_i - \hat y_i)^2 MSE=N1i=1∑N(yi−y^i)2
优点:
- 对误差小的样本非常敏感,适用于误差分布均匀的情况
- 优化平滑,梯度较好,有助于模型快速收敛
缺点:
- 对异常值非常敏感。因为平方操作,异常值可能导致损失过大,影响训练过程,导致模型不稳定。
3.2 MAELoss 平均绝对误差损失
MAE损失计算的是真实值和预测值之间的绝对差异,适用于数据中可能存在异常值的情况。
公式:
M
A
E
=
1
N
∑
i
=
1
N
∣
y
i
−
y
^
i
∣
MAE = \frac {1}{N} \sum_{i=1}^N|y_i-\hat y_i|
MAE=N1i=1∑N∣yi−y^i∣
优点:
- 对异常值更为鲁棒,异常值不会像 MSE 那样放大其影响
- 对于中等误差,MAE 提供了更好的稳定性
缺点:
- 梯度不连续:因为MAE是绝对差,导致在误差较大的时候梯度较小,训练过程可能收敛慢
- 在某些情况下可能无法收敛到最优解
3.3 Huber Loss
Huber Loss 结合了 MSE 和 MAE 的优点,适用于大多数回归问题。它在小误差时使用 MSE(平滑),在大误差时使用 MAE(鲁棒)
优点:
- 兼具 MSE 和 MAE 的优点,对异常值不敏感,又能平滑优化
- 可以自定义 δ \delta δ 值,控制从 MSE 到 MAE 的转换点,灵活性较高
- 适用于大多数实际回归问题,具有较好性能
缺点:
- 超参 δ \delta δ 的选择需要调优,可能会影响训练结果
4. 总结
4.1 优化平滑
- 平滑是指损失函数在参数空间内变化的平稳程度。在损失函数的图像中,如果它是光滑的,表示它的值不会出现剧烈的波动。平滑的损失函数对于优化过程有利,因为它减少了优化过程中由于损失函数剧烈波动而导致的难以收敛的情况。
- 在优化中,平滑的损失函数能够帮助优化算法(如梯度下降)稳定地找到全局或局部最小值,而不会被局部的“尖峰”或“坑”困住。
- Huber损失就是一个平滑的损失函数,它在小误差时使用平方损失,避免了大误差的过大惩罚;而在大误差时切换到线性损失,使得对于异常值的影响不至于过大。它结合了均方误差(MSE)和绝对误差(MAE)的优点,使得训练过程更加稳定。
4.2 梯度较好
- 梯度较好意味着损失函数的导数(梯度)在训练过程中变化平滑,且不存在突变或无法计算的情况。好的梯度有助于优化算法(如梯度下降)准确地更新模型参数。
- 不好的梯度可能包括梯度爆炸或梯度消失,导致模型训练变得非常缓慢或者无法进行有效更新。梯度较好的损失函数可以确保每次更新都是有效的,从而加速训练过程。
- Huber损失在误差较小的情况下,梯度是平方的(类似于均方误差),而在误差较大的情况下,梯度是线性的(类似于绝对误差)。这种平滑的梯度变化使得优化过程既不会因剧烈波动而不稳定,也不会在大误差情况下过于惩罚,从而能保持稳定的收敛速度。
4.3 为什么说 MSE 是平滑的
- 连续性:MSE是一个连续的函数,也就是说,它的值随着输入的变化是平滑变化的,不会出现跳跃或断裂。这意味着在模型训练过程中,误差会随着模型预测值的调整而平滑变化,不会突变,避免了不稳定的训练过程。
- 可导性:均方误差的导数是连续且平滑的。对于MSE来说,损失函数的导数是关于模型预测值的线性函数。连续且可导的损失函数能够提供平滑的梯度,帮助优化算法(如梯度下降)顺利地更新模型参数。
MSE损失函数是:
M
S
E
=
1
N
∑
i
=
1
N
(
y
i
−
y
^
i
)
2
MSE = \frac {1}{N} \sum_{i=1}^N(y_i - \hat y_i)^2
MSE=N1i=1∑N(yi−y^i)2
对于每个样本误差
a
=
y
−
y
^
a=y-\hat y
a=y−y^,误差的导数是:
d
d
a
(
a
2
)
=
2
a
\frac {d}{da}(a^2) = 2a
dad(a2)=2a
这个导数是线性的,并且在每个点都有定义。梯度的线性变化意味着,模型在调整参数时,误差随着预测的改进是平滑减少的。这个特性使得梯度下降在优化过程中可以平稳地更新模型权重,而不会遭遇急剧的变化或不连续的情况。