如何選擇合適的損失函數(shù),請看......

翻譯 | 張建軍

編輯 | 阿司匹林

出品 | AI科技大本營(微信搜索:rgznai100)

【AI科技大本營導(dǎo)讀】機器學(xué)習(xí)中的所有算法都依賴于最小化或最大化某一個函數(shù),我們稱之為“目標(biāo)函數(shù)”。最小化的這組函數(shù)被稱為“損失函數(shù)”。損失函數(shù)是衡量預(yù)測模型預(yù)測期望結(jié)果表現(xiàn)的指標(biāo)。尋找函數(shù)最小值的最常用方法是“梯度下降”。把損失函數(shù)想象成起伏的山脈,梯度下降就像從山頂滑下,目的是到達山脈的最低點。

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

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

回歸函數(shù)預(yù)測實數(shù)值,分類函數(shù)預(yù)測標(biāo)簽

回歸損失

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

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

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

MSE損失(Y軸)與預(yù)測值(X軸)關(guān)系圖

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

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

MAE損失(Y軸)與預(yù)測值(X軸)關(guān)系圖

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

簡而言之, 使用平方誤差更容易求解,但使用絕對誤差對離群點更加魯棒。但是,知其然更要知其所以然!

每當(dāng)我們訓(xùn)練機器學(xué)習(xí)模型時,我們的目標(biāo)就是找到最小化損失函數(shù)的點。當(dāng)然,當(dāng)預(yù)測值正好等于真實值時,這兩個損失函數(shù)都達到最小值。

下面讓我們快速過一遍兩個損失函數(shù)的Python代碼。我們可以編寫自己的函數(shù)或使用sklearn的內(nèi)置度量函數(shù):

#true:真正的目標(biāo)變量數(shù)組

#pred:預(yù)測數(shù)組

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的數(shù)值范圍相同)。在第一個例子中,預(yù)測值接近真實值,觀測值之間誤差的方差較小。第二個例子中,有一個異常觀測值,誤差很高。

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

我們從中觀察到什么?我們該如何選擇使用哪種損失函數(shù)?

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

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

直觀來說,我們可以像這樣考慮:對所有的觀測數(shù)據(jù),如果我們只給一個預(yù)測結(jié)果來最小化MSE,那么該預(yù)測值應(yīng)該是所有目標(biāo)值的均值。但是如果我們試圖最小化MAE,那么這個預(yù)測就是所有目標(biāo)值的中位數(shù)。我們知道中位數(shù)對于離群點比平均值更魯棒,這使得MAE比MSE更加魯棒。

使用MAE損失(特別是對于神經(jīng)網(wǎng)絡(luò))的一個大問題是它的梯度始終是相同的,這意味著即使對于小的損失值,其梯度也是大的。這對模型的學(xué)習(xí)可不好。為了解決這個問題,我們可以使用隨著接近最小值而減小的動態(tài)學(xué)習(xí)率。MSE在這種情況下的表現(xiàn)很好,即使采用固定的學(xué)習(xí)率也會收斂。MSE損失的梯度在損失值較高時會比較大,隨著損失接近0時而下降,從而使其在訓(xùn)練結(jié)束時更加精確(參見下圖)。

決定使用哪種損失函數(shù)?

如果離群點是會影響業(yè)務(wù)、而且是應(yīng)該被檢測到的異常值,那么我們應(yīng)該使用MSE。另一方面,如果我們認(rèn)為離群點僅僅代表數(shù)據(jù)損壞,那么我們應(yīng)該選擇MAE作為損失。

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

地址:

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

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

兩種損失函數(shù)的問題:可能會出現(xiàn)這樣的情況,即任何一種損失函數(shù)都不能給出理想的預(yù)測。例如,如果我們數(shù)據(jù)中90%的觀測數(shù)據(jù)的真實目標(biāo)值是150,其余10%的真實目標(biāo)值在0-30之間。那么,一個以MAE為損失的模型可能對所有觀測數(shù)據(jù)都預(yù)測為150,而忽略10%的離群情況,因為它會嘗試去接近中值。同樣地,以MSE為損失的模型會給出許多范圍在0到30的預(yù)測,因為它被離群點弄糊涂了。這兩種結(jié)果在許多業(yè)務(wù)中都是不可取的。

在這種情況下怎么做?一個簡單的解決辦法是轉(zhuǎn)換目標(biāo)變量。另一種方法是嘗試不同的損失函數(shù)。這是我們的第三個損失函數(shù)——Huber Loss——被提出的動機。

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

Huber Loss對數(shù)據(jù)離群點的敏感度低于平方誤差損失。它在0處也可導(dǎo)?;旧纤墙^對誤差,當(dāng)誤差很小時,誤差是二次形式的。誤差何時需要變成二次形式取決于一個超參數(shù),(delta),該超參數(shù)可以進行微調(diào)。當(dāng) ??? ~ 0時, Huber Loss接近MAE,當(dāng) ??? ~ ∞(很大的數(shù))時,Huber Loss接近MSE。

Huber Loss(Y軸)與預(yù)測值(X軸)關(guān)系圖。真值= 0

delta的選擇非常重要,因為它決定了你認(rèn)為什么數(shù)據(jù)是離群點。大于delta的殘差用L1最小化(對較大的離群點較不敏感),而小于delta的殘差則可以“很合適地”用L2最小化。

為什么使用Huber Loss?

使用MAE訓(xùn)練神經(jīng)網(wǎng)絡(luò)的一個大問題是經(jīng)常會遇到很大的梯度,使用梯度下降時可能導(dǎo)致訓(xùn)練結(jié)束時錯過最小值。對于MSE,梯度會隨著損失接近最小值而降低,從而使其更加精確。

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

4、Log-Cosh Loss

Log-cosh是用于回歸任務(wù)的另一種損失函數(shù),它比L2更加平滑。Log-cosh是預(yù)測誤差的雙曲余弦的對數(shù)。

Log-cosh Loss(Y軸)與預(yù)測值(X軸)關(guān)系圖。真值= 0

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

為什么我們需要二階導(dǎo)數(shù)?許多機器學(xué)習(xí)模型的實現(xiàn)(如XGBoost)使用牛頓方法來尋找最優(yōu)解,這就是為什么需要二階導(dǎo)數(shù)(Hessian)的原因。對于像XGBoost這樣的機器學(xué)習(xí)框架,二階可導(dǎo)函數(shù)更有利。

XGBoost中使用的目標(biāo)函數(shù)。注意其對一階和二階導(dǎo)數(shù)的依賴性。

但Log-chsh Loss并不完美。它仍然存在梯度和Hessian問題,對于誤差很大的預(yù)測,其梯度和hessian是恒定的。因此會導(dǎo)致XGBoost中沒有分裂。

Huber和Log-cosh損失函數(shù)的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) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))

? ?return np.sum(loss)

def logcosh(true, pred):

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

? ?return np.sum(loss)

5、Quantile Loss(分位數(shù)損失)

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

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

讓我們看一個有效的例子,以更好地理解為什么基于Quantile Loss的回歸模型對異方差數(shù)據(jù)表現(xiàn)良好。

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

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

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

Quantile回歸:虛線表示基于0.05和0.95 分位數(shù)損失函數(shù)的回歸估計

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

地址:

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

了解Quantile Loss函數(shù)

基于Quantile回歸的目的是,在給定預(yù)測變量的某些值時,估計因變量的條件“分位數(shù)”。Quantile Loss實際上只是MAE的擴展形式(當(dāng)分位數(shù)是第50個百分位時,Quantile Loss退化為MAE)。

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

γ?是給定的分位數(shù),其值介于0和1之間。

Quantile Loss(Y軸)與預(yù)測值(X軸)關(guān)系圖。真值為Y= 0

我們也可以使用這個損失函數(shù)來計算神經(jīng)網(wǎng)絡(luò)或基于樹的模型的預(yù)測區(qū)間。下圖是sklearn實現(xiàn)的梯度提升樹回歸。

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

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

比較研究

“Gradient?boosting machines, a tutorial”中提供了一個很好的比較研究。為了演示上述所有的損失函數(shù)的性質(zhì),研究人員創(chuàng)造了一個人工數(shù)據(jù)集,數(shù)據(jù)集從sinc(x)函數(shù)中采樣,其中加入了兩種人造模擬噪聲:高斯噪聲分量和脈沖噪聲分量。脈沖噪聲項是用來展示結(jié)果的魯棒效果的。以下是使用不同損失函數(shù)來擬合GBM(Gradient Boosting Machine, 梯度提升回歸)的結(jié)果。

連續(xù)損失函數(shù):(A)MSE損失函數(shù); (B)MAE損失函數(shù); (C)Huber損失函數(shù); (D)Quantile損失函數(shù)。用有噪聲的sinc(x)數(shù)據(jù)來擬合平滑GBM的示例:(E)原始sinc(x)函數(shù); (F)以MSE和MAE為損失擬合的平滑GBM; (G)以Huber Loss擬合的平滑GBM, = {4,2,1}; (H)以Quantile Loss擬合的平滑GBM。

模擬實驗中的一些觀察結(jié)果:

以MAE為損失的模型預(yù)測較少受到脈沖噪聲的影響,而以MSE為損失的模型的預(yù)測由于脈沖噪聲造成的數(shù)據(jù)偏離而略有偏差。

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

Quantile Loss對相應(yīng)的置信水平給出了很好的估計。

一張圖畫出所有損失函數(shù)

原文鏈接

作者:AI科技大本營

鏈接:http://www.itdecent.cn/p/04081201418d

來源:簡書

簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2016年,毫無疑問是國內(nèi)直播平臺爆發(fā)的一年。無論是幾番獲得高額融資的斗魚,還是以映客為首的個人直播的異軍突起。直...
    Earon閱讀 2,146評論 4 8
  • 餐廳里吃飯??墒?,兩個臥室的燈都大亮。 姥爺對正在玩耍的家寶說:“家寶,去關(guān)一下姥爺臥室的燈?!?家寶理都沒理,就...
    胤寶媽咪閱讀 194評論 0 0
  • 2019年8月4日 星期天 晴 今天我和爺爺奶奶一起回老家了,給老家的妍妍妹妹帶了幾雙你以前穿小的鞋子,有幾雙你基...
    劉芮希爸爸閱讀 282評論 0 0
  • 《公司年夜飯》 蝌蚪 菜也吃了,酒也喝了 一年又過去了 每個人都將心中的秤調(diào)整了一下 向右...
    詩人蝌蚪閱讀 376評論 3 2

友情鏈接更多精彩內(nèi)容