迴歸損失函數: L1和L2比較

MSE vs MAE (L2損失 vs L1損失)

簡而言之,使用平方誤差更容易解決問題,但使用絕對誤差對於異常值更魯棒。我們來看一下爲什麼。

不管我們什麼時候訓練機器學習模型,我們的目標都是想找到一個點將損失函數最小化。當然,當預測值正好等於真值時,這兩個函數都會達到最小值。
我們快速瀏覽一下這兩種函數的Python代碼。我們可以自己寫函數,也可以用sklearn的內助度量函數:

代碼:

# true: 真目標變量的數組# pred: 預測值的數組
def mse(true, pred): 
    return np.sum((true - pred)**2)
 
 def mae(true, pred):
  return np.sum(np.abs(true - pred))
 
 # 在 sklearn 中同樣適用
 
 from sklearn.metrics import mean_squared_error
 from sklearn.metrics import mean_absolute_error

我們來看看兩種情況下MAE和均方根誤差(RMSE,和MAE相同尺度下MSE的平方根)。在第一種情況下,預測值和真值非常接近,誤差在衆多觀測值中變化很小。在第二種情況下,出現了一個異常觀測值,誤差就很高。
在這裏插入圖片描述
我們從中可以觀察到什麼?這怎樣能幫我們選擇使用哪種損失函數?
因爲MSE是誤差的平方值(y — y_predicted = e),那麼誤差(e)的值在e > 1時會增加很多。如果我們的數據中有異常值,e的值會非常高,e²會>> |e|。這會讓存在MSE誤差的模型比存在MAE誤差的模型向異常值賦予更多的權重。在上面第2種情況中,存在RMSE誤差的模型爲了能將該單個異常值最小化會犧牲其它常見情況,這降低模型的整體性能。

如果訓練數據被異常值破壞的話(也就是我們在訓練環境中錯誤地接收到巨大的不切實際的正/負值,但在測試環境中卻沒有),MAE會很有用。
我們可以這樣思考:如果我們必須爲所有的觀測值賦予一個預測值,以最小化MSE,那麼該預測值應當爲所有目標值的平均值。但是如果我們想將MAE最小化,那麼預測值應當爲所有觀測值的中間值。我們知道中間值比起平均值,對異常值有更好的魯棒性,這樣就會讓MAE比MSE對異常值更加魯棒。

使用MAE損失(特別是對於神經網絡來說)的一個大問題就是,其梯度始終一樣,這意味着梯度即便是對於很小的損失值來說,也還會非常大。這對於機器學習可不是件好事。爲了修正這一點,我們可以使用動態學習率,它會隨着我們越來越接近最小值而逐漸變小。在這種情況下,MSE會表現的很好,即便學習率固定,也會收斂。MSE損失的梯度對於更大的損失值來說非常高,當損失值趨向於0時會逐漸降低,從而讓它在模型訓練收尾時更加準確(見下圖)。
在這裏插入圖片描述
決定使用哪種損失函數?
如果異常值表示的反常現象對於業務非常重要,且應當被檢測到,那麼我們就應當使用MSE。另一方面,如果我們認爲異常值僅表示損壞數據而已,那麼我們應當選擇MAE作爲損失函數。
注:L1和L2損失分別是MAE和MSE的別名。
L1損失對異常值更魯棒,但它的導數是不連續的,從而讓它無法有效的求解。L2損失對異常值很敏感,但會求出更穩定和更接近的解(通過將導數設爲0)。

這兩者存在的問題: 可能會出現兩種損失函數都無法給出理想預測值的情況。例如,如果我們的數據中90% 的觀測值的目標真值爲150, 剩餘10%的目標值在0-30之間。那麼存在MAE損失的模型可能會預測全部觀測值的目標值爲150,而忽略了那10%的異常情況,因爲它會試圖趨向於中間值。在同一種情況下,使用MSE損失的模型會給出大量值範圍在0到30之間的預測值,因爲它會偏向於異常值。在很多業務情況中,這兩種結果都不夠理想。

摘錄:https://zhuanlan.zhihu.com/p/39239829


注:博衆家之所長,集羣英之薈萃。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章