文章目錄
- 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=N1?i=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=N1?i=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=N1?i=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
這個導數是線性的,并且在每個點都有定義。梯度的線性變化意味著,模型在調整參數時,誤差隨著預測的改進是平滑減少的。這個特性使得梯度下降在優化過程中可以平穩地更新模型權重,而不會遭遇急劇的變化或不連續的情況。