分類損失函數
一、LogLoss對數損失函數(邏輯回歸,交叉熵損失)
有些人可能覺得邏輯回歸的損失函數就是平方損失,其實並不是。平方損失函數可以通過線性回歸在假設樣本是高斯分布的條件下推導得到,而邏輯回歸得到的並不是平方損失。在邏輯回歸的推導中,它假設樣本服從伯努利分布(0-1分布),然后求得滿足該分布的似然函數,接着取對數求極值等等。而邏輯回歸並沒有求似然函數的極值,而是把極大化當做是一種思想,進而推導出它的經驗風險函數為:最小化負的似然函數(即max F(y, f(x)) —> min -F(y, f(x)))。從損失函數的視角來看,它就成了log損失函數了。
log損失函數的標准形式:
剛剛說到,取對數是為了方便計算極大似然估計,因為在MLE(最大似然估計)中,直接求導比較困難,所以通常都是先取對數再求導找極值點。損失函數L(Y, P(Y|X))表達的是樣本X在分類Y的情況下,使概率P(Y|X)達到最大值(換言之,就是利用已知的樣本分布,找到最有可能(即最大概率)導致這種分布的參數值;或者說什么樣的參數才能使我們觀測到目前這組數據的概率最大)。因為log函數是單調遞增的,所以logP(Y|X)也會達到最大值,因此在前面加上負號之后,最大化P(Y|X)就等價於最小化L了。
邏輯回歸的P(Y=y|x)表達式如下(為了將類別標簽y統一為1和0,下面將表達式分開表示):
將它帶入到上式,通過推導可以得到logistic的損失函數表達式,如下:
邏輯回歸最后得到的目標式子如下:

上面是針對二分類而言的。這里需要解釋一下:之所以有人認為邏輯回歸是平方損失,是因為在使用梯度下降來求最優解的時候,它的迭代式子與平方損失求導后的式子非常相似,從而給人一種直觀上的錯覺。
這里有個PDF可以參考一下:Lecture 6: logistic regression.pdf
注意:softmax使用的即為交叉熵損失函數,binary_cossentropy為二分類交叉熵損失,categorical_crossentropy為多分類交叉熵損失,當使用多分類交叉熵損失函數時,標簽應該為多分類模式,即使用one-hot編碼的向量。
二 指數損失函數(Adaboost)
學過Adaboost算法的人都知道,它是前向分步加法算法的特例,是一個加和模型,損失函數就是指數函數。在Adaboost中,經過m此迭代之后,可以得到fm(x):
Adaboost每次迭代時的目的是為了找到最小化下列式子時的參數α 和G:
而指數損失函數(exp-loss)的標准形式如下
可以看出,Adaboost的目標式子就是指數損失,在給定n個樣本的情況下,Adaboost的損失函數為:
關於Adaboost的推導,可以參考Wikipedia:AdaBoost或者《統計學習方法》P145.
三、Hinge損失函數(SVM)
在機器學習算法中,hinge損失函數和SVM是息息相關的。在線性支持向量機中,最優化問題可以等價於下列式子:
下面來對式子做個變形,令:
於是,原式就變成了:
如若取λ=1/(2C),式子就可以表示成:
可以看出,該式子與下式非常相似:
前半部分中的 l 就是hinge損失函數,而后面相當於L2正則項。
Hinge 損失函數的標准形式

可以看出,當|y|>=1時,L(y)=0。
更多內容,參考Hinge-loss。
補充一下:在libsvm中一共有4中核函數可以選擇,對應的是-t
參數分別是:
- 0-線性核;
- 1-多項式核;
- 2-RBF核;
- 3-sigmoid核。
回歸損失函數
1.均方誤差、平方損失——L2損失:
均方誤差(MSE)是回歸損失函數中最常用的誤差,它是預測值與目標值之間差值的平方和,其公式如下所示:

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

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


平均絕對誤差和均方誤差(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矩陣)。

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

5.分位數損失(Quantile Loss)
在大多數真實世界的預測問題中,我們常常希望看到我們預測結果的不確定性。通過預測出一個取值區間而不是一個個具體的取值點對於具體業務流程中的決策至關重要。
分位數損失函數在我們需要預測結果的取值區間時是一個特別有用的工具。通常情況下我們利用最小二乘回歸來預測取值區間主要基於這樣的假設:取值殘差的方差是常數。但很多時候對於線性模型是不滿足的。這時候就需要分位數損失函數和分位數回歸來拯救回歸模型了。它對於預測的區間十分敏感,即使在非均勻分布的殘差下也能保持良好的性能。下面讓我們用兩個例子看看分位數損失在異方差數據下的回歸表現。

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

上圖中上下兩條虛線基於0.05和0.95的分位數損失得到的取值區間,從圖中可以清晰地看到建模后預測值得取值范圍。
了解分位數損失函數
分位數回歸的目標在於估計給定預測值的條件分位數。實際上分位數回歸就是平均絕對誤差的一種拓展。分位數值得選擇在於我們是否希望讓正的或者負的誤差發揮更大的價值。損失函數會基於分位數γ對過擬合和欠擬合的施加不同的懲罰。例如選取γ為0.25時意味着將要懲罰更多的過擬合而盡量保持稍小於中值的預測值。

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

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

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損耗,δ= {4,2,1};(H)光滑的GBM與α= {0.5,0.1,0.9}的分位數損失相符合。
我們可以看到MAE損失函數的預測值受到沖擊噪聲的影響更小,而MSE則有一定的偏差;Huber損失函數對於超參數的選取不敏感,同時分位數損失在對應的置信區間內給出了較好的估計結果。
希望小伙伴們能從這篇文章中更深入地理解損失函數,並在未來的工作中選擇合適的函數來更好更快地完成工作任務。
將本文中幾種損失函數都放到一個圖中的結果:
