機器學習者都應該知道的五種損失函式!

2021-09-11 09:20:51 字數 4750 閱讀 4827

摘要:

還不知道這五種損失函式?你怎麼在機器學習這個圈子裡面混?

在機器學習中,所有的機器學習演算法都或多或少的依賴於對目標函式最大化或者最小化的過程,我們常常把最小化的函式稱為損失函式,它主要用於衡量機器學習模型的**能力。在尋找最小值的過程中,我們最常用的方法是梯度下降法。

雖然損失函式可以讓我們看到模型的優劣,並且為我們提供了優化的方向,但是我們必須知道沒有任何一種損失函式適用於所有的模型。損失函式的選取依賴於引數的數量、異常值、機器學習演算法、梯度下降的效率、導數求取的難易和**的置信度等若干方面。這篇文章將介紹各種不同的損失函式,並幫助我們理解每種損失函式的優劣和適用範圍。

由於機器學習的任務不同,損失函式一般分為分類和回歸兩類,回歸會**給出乙個數值結果而分類則會給出乙個標籤。這篇文章主要集中於回歸損失函式的分析。本文中所有的**和都可以在這個地方找到!

回歸函式**數量,分類函式**標籤

回歸損失函式

1.均方誤差、平方損失——l2損失:

均方誤差(mse)是回歸損失函式中最常用的誤差,它是**值與目標值之間差值的平方和,其公式如下所示:

下圖是均方根誤差值的曲線分布,其中最小值為**值為目標值的位置。我們可以看到隨著誤差的增加損失函式增加的更為迅猛。

mse損失(y軸)與**(x軸)的關係圖

2.平均絕對誤差——l1損失函式:

平均絕對誤差(mae)是另一種常用的回歸損失函式,它是目標值與**值之差絕對值的和,表示了**值的平均誤差幅度,而不需要考慮誤差的方向(注:平均偏差誤差mbe則是考慮的方向的誤差,是殘差的和),範圍是0到∞,其公式如下所示:

mae損失(y軸)與**(x軸)的關係圖

平均絕對誤差和均方誤差(l1&l2)比較:

通常來說,利用均方差更容易求解,但平方絕對誤差則對於異常值更穩健,下面讓我們對這兩種損失函式進行具體的分析。

無論哪一種機器學習模型,目標都是找到能使目標函式最小的點。在最小值處每一種損失函式都會得到最小值。但哪種是更好的指標呢?你可以上述筆記本位址自行執行**,檢查它們的各項指標。

讓我們用具體例子看一下,下圖是均方根誤差和平均絕對誤差的比較(其中均方根誤差的目的是與平均絕對誤差在量級上統一):

左邊的圖中**值與目標值很接近,誤差與方差都很小,而右邊的圖中由於異常值的存在使得誤差變得很大。

由於均方誤差(mse)在誤差較大點時的損失遠大於平均絕對誤差(mae),它會給異常值賦予更大的權重,模型會全力減小異常值造成的誤差,從而使得模型的整體表現下降。

所以當訓練資料中含有較多的異常值時,平均絕對誤差(mae)更為有效。當我們對所有觀測值進行處理時,如果利用mse進行優化則我們會得到所有觀測的均值,而使用mae則能得到所有觀測的中值。與均值相比,中值對於異常值的魯棒性更好,這就意味著平均絕對誤差對於異常值有著比均方誤差更好的魯棒性。

但mae也存在乙個問題,特別是對於神經網路來說,它的梯度在極值點處會有很大的躍變,及時很小的損失值也會長生很大的誤差,這很不利於學習過程。為了解決這個問題,需要在解決極值點的過程中動態減小學習率。mse在極值點卻有著良好的特性,及時在固定學習率下也能收斂。mse的梯度隨著損失函式的減小而減小,這一特性使得它在最後的訓練過程中能得到更精確的結果(如下圖)。

在實際訓練過程中,如果異常值對於實際業務十分重要需要進行檢測,mse是更好的選擇,而如果在異常值極有可能是壞點的情況下mae則會帶來更好的結果。

總結:l1損失對於異常值更魯棒,但它的導數不連續使得尋找最優解的過程低效;l2損失對於異常值敏感,但在優化過程中更為穩定和準確。更詳細的l1和l2不同比較可以參考這篇文章。

但現實中還存在兩種損失都很難處理的問題。例如某個任務中90%的資料都符合目標值——150,而其餘的10%資料取值則在0-30之間。那麼利用mae優化的模型將會得到150的**值而忽略的剩下的10%(傾向於中值);而對於mse來說由於異常值會帶來很大的損失,將使得模型傾向於在0-30的方向取值。這兩種結果在實際的業務場景中都是我們不希望看到的。

3.huber損失——平滑平均絕對誤差

huber損失相比於平方損失來說對於異常值不敏感,但它同樣保持了可微的特性。它基於絕對誤差但在誤差很小的時候變成了平方誤差。我們可以使用超引數δ來調節這一誤差的閾值。當δ趨向於0時它就退化成了mae,而當δ趨向於無窮時則退化為了mse,其表示式如下,是乙個連續可微的分段函式:

對於huber損失來說,δ的選擇十分重要,它決定了模型處理異常值的行為。當殘差大於δ時使用l1損失,很小時則使用更為合適的l2損失來進行優化。

huber損失函式克服了mae和mse的缺點,不僅可以保持損失函式具有連續的導數,同時可以利用mse梯度隨誤差減小的特性來得到更精確的最小值,也對異常值具有更好的魯棒性。

而huber損失函式的良好表現得益於精心訓練的超引數δ。

4.log-cosh損失函式

log-cosh損失函式是一種比l2更為平滑的損失函式,利用雙曲余弦來計算**誤差:

它的優點在於對於很小的誤差來說log(cosh(x))與(x**2)/2很相近,而對於很大的誤差則與abs(x)-log2很相近。這意味著log cosh損失函式可以在擁有mse優點的同時也不會受到異常值的太多影響。它擁有huber的所有優點,並且在每乙個點都是二次可導的。二次可導在很多機器學習模型中是十分必要的,例如使用牛頓法的xgboost優化模型(hessian矩陣)。

xgboost中使用的目標函式,注意對一階和二階導數的依賴性

但是log-cosh損失並不是完美無缺的,它還是會在很大誤差的情況下梯度和hessian變成了常數。

huber和log-cosh損失函式的python**:

# huber loss

def huber(true, pred, delta):

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)

# log cosh loss

def logcosh(true, pred):

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

return np.sum(loss)

複製**

5.分位數損失(quantile loss)

在大多數真實世界的**問題中,我們常常希望看到我們**結果的不確定性。通過**出乙個取值區間而不是乙個個具體的取值點對於具體業務流程中的決策至關重要。

分位數損失函式在我們需要**結果的取值區間時是乙個特別有用的工具。通常情況下我們利用最小二乘回歸來**取值區間主要基於這樣的假設:取值殘差的方差是常數。但很多時候對於線性模型是不滿足的。這時候就需要分位數損失函式和分位數回歸來拯救回歸模型了。它對於**的區間十分敏感,即使在非均勻分布的殘差下也能保持良好的效能。下面讓我們用兩個例子看看分位數損失在異方差資料下的回歸表現。

左:線性關係b / w x1和y.具有恆定的殘差方差。右:線性關係b / w x2和y,但y的方差隨著x2增加。

上圖是兩種不同的資料分布,其中左圖是殘差的方差為常數的情況,而右圖則是殘差的方差變化的情況。我們利用正常的最小二乘對上述兩種情況進行了估計,其中橙色線為建模的結果。但是我們卻無法得到取值的區間範圍,這時候就需要分位數損失函式來提供。

上圖中上下兩條虛線基於0.05和0.95的分位數損失得到的取值區間,從圖中可以清晰地看到建模後**值得取值範圍。

了解分位數損失函式

分位數回歸的目標在於估計給定**值的條件分位數。實際上分位數回歸就是平均絕對誤差的一種拓展。分位數值得選擇在於我們是否希望讓正的或者負的誤差發揮更大的價值。損失函式會基於分位數γ對過擬合和欠擬合的施加不同的懲罰。例如選取γ為0.25時意味著將要懲罰更多的過擬合而盡量保持稍小於中值的**值。

γ的取值通常在0-1之間,圖中描述了不同分位數下的損失函式情況,明顯可以看到對於正負誤差不平衡的狀態。

分位數損失(y軸)與**(x軸)的關係圖。

我們可以利用分位數損失函式來計算出神經網路或者樹狀模型的區間。下圖是計算出基於梯度提公升樹回歸器的取值區間:

使用分位數損失的**區間(梯度提公升回歸器)

90%的**值起上下邊界分別是用γ值為0.95和0.05計算得到的。

比較研究:

在文章的最後,我們利用sinc(x)模擬的資料來對不同損失函式的效能進行了比較。在原始資料的基礎上加入而高斯雜訊和脈衝雜訊(為了描述魯棒性)。下圖是gbm回歸器利用不同的損失函式得到的結果,其中abcd圖分別是mse, mae, huber, quantile損失函式的結果:

將乙個平滑的gbm擬合成有雜訊的sinc(x)資料的示例:e原始sinc(x)函式;f符合mse和mae損失的平滑gbm;g平滑gbm,其具有huber損耗,δ= ;h光滑的gbm與α= 的分位數損失相符合。

我們可以看到mae損失函式的**值受到衝擊雜訊的影響更小,而mse則有一定的偏差;huber損失函式對於超引數的選取不敏感,同時分位數損失在對應的置信區間內給出了較好的估計結果。

希望小夥伴們能從這篇文章中更深入地理解損失函式,並在未來的工作中選擇合適的函式來更好更快地完成工作任務。

文章原標題《5 regression loss functions all machine learners should know》

PHP程式設計師都應該知道的五個工具

php程式設計師都應該知道的五個工具 在參與了幾個大型php專案,寫了很多php 以後,我發現很多任務具可以提高 質量,簡化發布,使得做為php開發人員的生涯變得輕鬆許多。許多這樣 的工具可能已經為大家所用。但是,由於一些人甚至沒有注意到這些工具的存在,我會從此開始,好了,不說廢話,下面是我認為所有...

PHP程式設計師都應該知道的五個工具

在參與了幾個大型php專案,寫了很多php 以後,我發現很多任務具可以提高 質量,簡化發布,使得做為php開發人員的生涯變得輕鬆許多。許多這樣的工具可能已經為大家所用。但是,由於一些人甚至沒有注意到這些工具的存在,我會從此開始,好了,不說廢話,下面是我認為所有php程式設計師應該知道的工具列表。ph...

所有PHP程式設計師都應該知道的五個工具

3529個讀者翻譯 子非魚 09 10 2007原文引用雙語對照及眉批 在參與了幾個大型php專案,寫了很多php 以後,我發現很多任務具可以提高 質量,簡化發布,使得做為php開發人員的生涯變得輕鬆許多。許多這樣 的工具可能已經為大家所用。但是,由於一些人甚至沒有注意到這些工具的存在,我會從此開始...