當前位置:
首頁 > 最新 > 如何選擇合適的損失函數,請看……

如何選擇合適的損失函數,請看……

翻譯 | 張建軍

編輯 | 阿司匹林

出品 | AI科技大本營

【AI科技大本營導讀】機器學習中的所有演算法都依賴於最小化或最大化某一個函數,我們稱之為「目標函數」。最小化的這組函數被稱為「損失函數」。損失函數是衡量預測模型預測期望結果表現的指標。尋找函數最小值的最常用方法是「梯度下降」。把損失函數想像成起伏的山脈,梯度下降就像從山頂滑下,目的是到達山脈的最低點。

沒有一個損失函數可以適用於所有類型的數據。損失函數的選擇取決於許多因素,包括是否有離群點,機器學習演算法的選擇,運行梯度下降的時間效率,是否易於找到函數的導數,以及預測結果的置信度。這個博客的目的是幫助你了解不同的損失函數。

損失函數可以大致分為兩類:分類損失(Classification Loss)和回歸損失(Regression Loss)。下面這篇博文,就將重點介紹5種回歸損失。

回歸函數預測實數值,分類函數預測標籤


1、均方誤差,二次損失,L2損失(Mean Square Error, Quadratic Loss, L2 Loss)

均方誤差(MSE)是最常用的回歸損失函數。MSE是目標變數與預測值之間距離平方之和。

下面是一個MSE函數的圖,其中真實目標值為100,預測值在-10,000至10,000之間。預測值(X軸)= 100時,MSE損失(Y軸)達到其最小值。損失範圍為0至∞。

MSE損失(Y軸)與預測值(X軸)關係圖

2、平均絕對誤差,L1損失(Mean Absolute Error, L1 Loss)

平均絕對誤差(MAE)是另一種用於回歸模型的損失函數。MAE是目標變數和預測變數之間差異絕對值之和。因此,它在一組預測中衡量誤差的平均大小,而不考慮誤差的方向。(如果我們也考慮方向,那將被稱為平均偏差(Mean Bias Error, MBE),它是殘差或誤差之和)。損失範圍也是0到∞。

MAE損失(Y軸)與預測值(X軸)關係圖

3、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值(RMSE,Root Mean Square Error,均方根誤差,它只是MSE的平方根,使其與MAE的數值範圍相同)。在第一個例子中,預測值接近真實值,觀測值之間誤差的方差較小。第二個例子中,有一個異常觀測值,誤差很高。

左:誤差彼此接近 右:有一個誤差和其他誤差相差很遠

我們從中觀察到什麼?我們該如何選擇使用哪種損失函數?

由於MSE對誤差(e)進行平方操作(y - y_predicted = e),如果e> 1,誤差的值會增加很多。如果我們的數據中有一個離群點,e的值將會很高,將會遠遠大於|e|。這將使得和以MAE為損失的模型相比,以MSE為損失的模型會賦予更高的權重給離群點。在上面的第二個例子中,以RMSE為損失的模型將被調整以最小化這個離群數據點,但是卻是以犧牲其他正常數據點的預測效果為代價,這最終會降低模型的整體性能。

MAE損失適用於訓練數據被離群點損壞的時候(即,在訓練數據而非測試數據中,我們錯誤地獲得了不切實際的過大正值或負值)。

直觀來說,我們可以像這樣考慮:對所有的觀測數據,如果我們只給一個預測結果來最小化MSE,那麼該預測值應該是所有目標值的均值。但是如果我們試圖最小化MAE,那麼這個預測就是所有目標值的中位數。我們知道中位數對於離群點比平均值更魯棒,這使得MAE比MSE更加魯棒。

使用MAE損失(特別是對於神經網路)的一個大問題是它的梯度始終是相同的,這意味著即使對於小的損失值,其梯度也是大的。這對模型的學習可不好。為了解決這個問題,我們可以使用隨著接近最小值而減小的動態學習率。MSE在這種情況下的表現很好,即使採用固定的學習率也會收斂。MSE損失的梯度在損失值較高時會比較大,隨著損失接近0時而下降,從而使其在訓練結束時更加精確(參見下圖)。

決定使用哪種損失函數?

如果離群點是會影響業務、而且是應該被檢測到的異常值,那麼我們應該使用MSE。另一方面,如果我們認為離群點僅僅代表數據損壞,那麼我們應該選擇MAE作為損失。

我建議閱讀下面這篇文章,其中有一項很好的研究,比較了在存在和不存在離群點的情況下使用L1損失和L2損失的回歸模型的性能。請記住,L1和L2損失分別是MAE和MSE的另一個名稱而已。

地址:

http://rishy.github.io/ml/2015/07/28/l1-vs-l2-loss/

L1損失對異常值更加穩健,但其導數並不連續,因此求解效率很低。L2損失對異常值敏感,但給出了更穩定的閉式解(closed form solution)(通過將其導數設置為0)

兩種損失函數的問題:可能會出現這樣的情況,即任何一種損失函數都不能給出理想的預測。例如,如果我們數據中90%的觀測數據的真實目標值是150,其餘10%的真實目標值在0-30之間。那麼,一個以MAE為損失的模型可能對所有觀測數據都預測為150,而忽略10%的離群情況,因為它會嘗試去接近中值。同樣地,以MSE為損失的模型會給出許多範圍在0到30的預測,因為它被離群點弄糊塗了。這兩種結果在許多業務中都是不可取的。

在這種情況下怎麼做?一個簡單的解決辦法是轉換目標變數。另一種方法是嘗試不同的損失函數。這是我們的第三個損失函數——Huber Loss——被提出的動機。

3、Huber Loss,平滑的平均絕對誤差

Huber Loss對數據離群點的敏感度低於平方誤差損失。它在0處也可導。基本上它是絕對誤差,當誤差很小時,誤差是二次形式的。誤差何時需要變成二次形式取決於一個超參數,(delta),該超參數可以進行微調。當 ~ 0時, Huber Loss接近MAE,當 ~ ∞(很大的數)時,Huber Loss接近MSE。

Huber Loss(Y軸)與預測值(X軸)關係圖。真值= 0

delta的選擇非常重要,因為它決定了你認為什麼數據是離群點。大於delta的殘差用L1最小化(對較大的離群點較不敏感),而小於delta的殘差則可以「很合適地」用L2最小化。

為什麼使用Huber Loss?

使用MAE訓練神經網路的一個大問題是經常會遇到很大的梯度,使用梯度下降時可能導致訓練結束時錯過最小值。對於MSE,梯度會隨著損失接近最小值而降低,從而使其更加精確。

在這種情況下,Huber Loss可能會非常有用,因為它會使最小值附近彎曲,從而降低梯度。另外它比MSE對異常值更魯棒。因此,它結合了MSE和MAE的優良特性。但是,Huber Loss的問題是我們可能需要迭代地訓練超參數delta。

4、Log-Cosh Loss

Log-cosh是用於回歸任務的另一種損失函數,它比L2更加平滑。Log-cosh是預測誤差的雙曲餘弦的對數。

Log-cosh Loss(Y軸)與預測值(X軸)關係圖。真值= 0

優點: log(cosh(x))對於小的x來說,其大約等於 (x ** 2) / 2,而對於大的x來說,其大約等於 abs(x) - log(2)。這意味著"logcosh"的作用大部分與均方誤差一樣,但不會受到偶爾出現的極端不正確預測的強烈影響。它具有Huber Loss的所有優點,和Huber Loss不同之處在於,其處處二次可導。

為什麼我們需要二階導數?許多機器學習模型的實現(如XGBoost)使用牛頓方法來尋找最優解,這就是為什麼需要二階導數(Hessian)的原因。對於像XGBoost這樣的機器學習框架,二階可導函數更有利。

XGBoost中使用的目標函數。注意其對一階和二階導數的依賴性。

但Log-chsh Loss並不完美。它仍然存在梯度和Hessian問題,對於誤差很大的預測,其梯度和hessian是恆定的。因此會導致XGBoost中沒有分裂。

Huber和Log-cosh損失函數的Python代碼:

def sm_mae(true, pred, delta):

"""

true: array of true values

pred: array of predicted values

returns: smoothed mean absolute error loss

"""

loss = np.where(np.abs(true-pred)

return np.sum(loss)

def logcosh(true, pred):

loss = np.log(np.cosh(pred - true))

return np.sum(loss)

5、Quantile Loss(分位數損失)

在大多數真實預測問題中,我們通常想了解我們預測的不確定性。了解預測值的範圍而不僅僅是單一的預測點可以顯著改善許多業務問題的決策過程。

當我們有興趣預測一個區間而不僅僅是預測一個點時,Quantile Loss函數就很有用。最小二乘回歸的預測區間是基於這樣一個假設:殘差(y - y_hat)在獨立變數的值之間具有不變的方差。我們不能相信線性回歸模型,因為它違反了這一假設。當然,我們也不能僅僅認為這種情況一般使用非線性函數或基於樹的模型就可以更好地建模,而簡單地拋棄擬合線性回歸模型作為基線的想法。這時,Quantile Loss就派上用場了。因為基於Quantile Loss的回歸模型可以提供合理的預測區間,即使是對於具有非常數方差或非正態分布的殘差亦是如此。

讓我們看一個有效的例子,以更好地理解為什麼基於Quantile Loss的回歸模型對異方差數據表現良好。

Quantile 回歸 vs 普通最小二乘(Ordinary Least Square, OLS)回歸

左:線性關係b/w X1和Y,殘差的方差恆定。右:線性關係b/w X2和Y,但Y的方差隨著X2增加而變大(異方差)。

橙線表示兩種情況下的OLS估計

Quantile回歸:虛線表示基於0.05和0.95 分位數損失函數的回歸估計

如上所示的Quantile回歸代碼在下面這個notebook中。

地址:

https://github.com/groverpr/Machine-Learning/blob/master/notebooks/09_Quantile_Regression.ipynb

了解Quantile Loss函數

基於Quantile回歸的目的是,在給定預測變數的某些值時,估計因變數的條件「分位數」。Quantile Loss實際上只是MAE的擴展形式(當分位數是第50個百分位時,Quantile Loss退化為MAE)。

Quantile Loss的思想是根據我們是打算給正誤差還是負誤差更多的值來選擇分位數數值。損失函數根據所選quantile (γ)的值對高估和低估的預測值給予不同的懲罰值。舉個例子,γ= 0.25的Quantile Loss函數給高估的預測值更多的懲罰,並試圖使預測值略低於中位數。

γ 是給定的分位數,其值介於0和1之間。

Quantile Loss(Y軸)與預測值(X軸)關係圖。真值為Y= 0

我們也可以使用這個損失函數來計算神經網路或基於樹的模型的預測區間。下圖是sklearn實現的梯度提升樹回歸。

使用Quantile Loss的預測區間(梯度提升回歸)

上圖顯示的是sklearn庫的GradientBoostingRegression中的quantile loss函數計算的90%預測區間。上限的計算使用了γ = 0.95,下限則是使用了γ = 0.05。


「Gradientboosting machines, a tutorial」中提供了一個很好的比較研究。為了演示上述所有的損失函數的性質,研究人員創造了一個人工數據集,數據集從sinc(x)函數中採樣,其中加入了兩種人造模擬雜訊:高斯雜訊分量和脈衝雜訊分量。脈衝雜訊項是用來展示結果的魯棒效果的。以下是使用不同損失函數來擬合GBM(Gradient Boosting Machine, 梯度提升回歸)的結果。

連續損失函數:(A)MSE損失函數; (B)MAE損失函數; (C)Huber損失函數; (D)Quantile損失函數。用有雜訊的sinc(x)數據來擬合平滑GBM的示例:(E)原始sinc(x)函數; (F)以MSE和MAE為損失擬合的平滑GBM; (G)以Huber Loss擬合的平滑GBM, = ; (H)以Quantile Loss擬合的平滑GBM。

模擬實驗中的一些觀察結果:

以MAE為損失的模型預測較少受到脈衝雜訊的影響,而以MSE為損失的模型的預測由於脈衝雜訊造成的數據偏離而略有偏差。

以Huber Loss為損失函數的模型,其預測對所選的超參數不太敏感。

Quantile Loss對相應的置信水平給出了很好的估計。

一張圖畫出所有損失函數

精彩預告

最新消息

時間:6月21日 20:00-21:00

掃描海報二維碼,免費報名


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI科技大本營 的精彩文章:

同樣是AI技術,為什麼只有一加6稱得上「全速」旗艦?
專訪天數智芯李雲鵬:兩年時間一定要做出自主可控、國際一流的AI晶元

TAG:AI科技大本營 |