【損失函數】常見的損失函數(loss function)總結

點擊上方,選擇星標置頂,每天給你送乾貨

閱讀大概需要7分鐘

跟隨小博主,每天進步一丟丟

機器學習算法與自然語言處理出品

@公衆號原創專欄作者 yyHaker

單位 | 哈工大SCIR實驗室

損失函數用來評價模型的預測值真實值不一樣的程度,損失函數越好,通常模型的性能越好。不同的模型用的損失函數一般也不一樣。

損失函數分爲經驗風險損失函數結構風險損失函數。經驗風險損失函數指預測結果和實際結果的差別,結構風險損失函數是指經驗風險損失函數加上正則項。

常見的損失函數以及其優缺點如下:

  1. 0-1損失函數(zero-one loss)

0-1損失是指預測值和目標值不相等爲1, 否則爲0:

特點:

(1)0-1損失函數直接對應分類判斷錯誤的個數,但是它是一個非凸函數,不太適用.

(2)感知機就是用的這種損失函數。但是相等這個條件太過嚴格,因此可以放寬條件,即滿足  時認爲相等,

2. 絕對值損失函數

絕對值損失函數是計算預測值與目標值的差的絕對值:

3. log對數損失函數

log對數損失函數的標準形式如下:

特點:

(1) log對數損失函數能非常好的表徵概率分佈,在很多場景尤其是多分類,如果需要知道結果屬於每個類別的置信度,那它非常適合。

(2)健壯性不強,相比於hinge loss對噪聲更敏感。

(3)邏輯迴歸的損失函數就是log對數損失函數。

4. 平方損失函數

平方損失函數標準形式如下:

特點:

(1)經常應用與迴歸問題

5. 指數損失函數(exponential loss)

指數損失函數的標準形式如下:

特點:

(1)對離羣點、噪聲非常敏感。經常用在AdaBoost算法中。

6. Hinge 損失函數

Hinge損失函數標準形式如下:

特點:

(1)hinge損失函數表示如果被分類正確,損失爲0,否則損失就爲  。SVM就是使用這個損失函數。

(2)一般的  是預測值,在-1到1之間,  是目標值(-1或1)。其含義是,  的值在-1和+1之間就可以了,並不鼓勵  ,即並不鼓勵分類器過度自信,讓某個正確分類的樣本距離分割線超過1並不會有任何獎勵,從而使分類器可以更專注於整體的誤差。

(3) 健壯性相對較高,對異常點、噪聲不敏感,但它沒太好的概率解釋。

7. 感知損失(perceptron loss)函數

感知損失函數的標準形式如下:

特點:

(1)是Hinge損失函數的一個變種,Hinge loss對判定邊界附近的點(正確端)懲罰力度很高。而perceptron loss只要樣本的判定類別正確的話,它就滿意,不管其判定邊界的距離。它比Hinge loss簡單,因爲不是max-margin boundary,所以模型的泛化能力沒 hinge loss強

8. 交叉熵損失函數 (Cross-entropy loss function)

交叉熵損失函數的標準形式如下:

注意公式中  表示樣本,  表示實際的標籤,  表示預測的輸出,  表示樣本總數量。

特點:

(1)本質上也是一種對數似然函數,可用於二分類和多分類任務中。

二分類問題中的loss函數(輸入數據是softmax或者sigmoid函數的輸出):

多分類問題中的loss函數(輸入數據是softmax或者sigmoid函數的輸出):

(2)當使用sigmoid作爲激活函數的時候,常用交叉熵損失函數而不用均方誤差損失函數,因爲它可以完美解決平方損失函數權重更新過慢的問題,具有“誤差大的時候,權重更新快;誤差小的時候,權重更新慢”的良好性質。

最後奉獻上交叉熵損失函數的實現代碼:cross_entropy.


這裏需要更正一點,對數損失函數和交叉熵損失函數應該是等價的!!!(此處感謝 

@Areshyy

 的指正,下面說明也是由他提供)

下面來具體說明:


相關高頻問題:

1.交叉熵函數最大似然函數的聯繫和區別?

區別:交叉熵函數使用來描述模型預測值和真實值的差距大小,越大代表越不相近;似然函數的本質就是衡量在某個參數下,整體的估計和真實的情況一樣的概率,越大代表越相近。

聯繫:交叉熵函數可以由最大似然函數在伯努利分佈的條件下推導出來,或者說最小化交叉熵函數的本質就是對數似然函數的最大化

怎麼推導的呢?我們具體來看一下。

設一個隨機變量  滿足伯努利分佈,

則  的概率密度函數爲:

因爲我們只有一組採樣數據  ,我們可以統計得到  和  的值,但是  的概率是未知的,接下來我們就用極大似然估計的方法來估計這個  值。

對於採樣數據  ,其對數似然函數爲:

可以看到上式和交叉熵函數的形式幾乎相同,極大似然估計就是要求這個式子的最大值。而由於上面函數的值總是小於0,一般像神經網絡等對於損失函數會用最小化的方法進行優化,所以一般會在前面加一個負號,得到交叉熵函數(或交叉熵損失函數):

這個式子揭示了交叉熵函數極大似然估計的聯繫,最小化交叉熵函數的本質就是對數似然函數的最大化。

現在我們可以用求導得到極大值點的方法來求其極大似然估計,首先將對數似然函數對  進行求導,並令導數爲0,得到

消去分母,得:

所以:

這就是伯努利分佈下最大似然估計求出的概率  。

2. 在用sigmoid作爲激活函數的時候,爲什麼要用交叉熵損失函數,而不用均方誤差損失函數

其實這個問題求個導,分析一下兩個誤差函數的參數更新過程就會發現原因了。

對於均方誤差損失函數,常常定義爲:

其中  是我們期望的輸出,  爲神經元的實際輸出(  )。在訓練神經網絡的時候我們使用梯度下降的方法來更新  和  ,因此需要計算代價函數對  和  的導數:

然後更新參數  和  :

因爲sigmoid的性質,導致  在  取大部分值時會很小(如下圖標出來的兩端,幾乎接近於平坦),這樣會使得  很小,導致參數  和  更新非常慢。

那麼爲什麼交叉熵損失函數就會比較好了呢?同樣的對於交叉熵損失函數,計算一下參數更新的梯度公式就會發現原因。交叉熵損失函數一般定義爲:

其中  是我們期望的輸出,  爲神經元的實際輸出(  )。同樣可以看看它的導數:

另外,

所以有:

所以參數更新公式爲:

可以看到參數更新公式中沒有  這一項,權重的更新受  影響,受到誤差的影響,所以當誤差大的時候,權重更新快;當誤差小的時候,權重更新慢。這是一個很好的性質。

所以當使用sigmoid作爲激活函數的時候,常用交叉熵損失函數而不用均方誤差損失函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章