天天看點

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

@公衆号原創專欄作者 yyhaker

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

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

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

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

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

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

特點:

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

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

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

 時認為相等,

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

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

下面來具體說明:

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

相關高頻問題:

1.交叉熵函數與最大似然函數的聯系和差別?

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

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

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

設一個随機變量  滿足伯努利分布,

則  的機率密度函數為:

因為我們隻有一組采樣資料  ,我們可以統計得到  和  的值,但是  的機率是未知的,接下來我們就用極大似然估計的方法來估計這個  值。

對于采樣資料  ,其對數似然函數為:

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

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

現在我們可以用求導得到極大值點的方法來求其極大似然估計,首先将對數似然函數對 

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

 進行求導,并令導數為0,得到

消去分母,得:

是以:

這就是伯努利分布下最大似然估計求出的機率 

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

 。

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

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

對于均方誤差損失函數,常常定義為:

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

然後更新參數  和  :

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

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

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

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

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

另外,

是以有:

是以參數更新公式為:

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

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