@公衆号原創專欄作者 yyhaker
損失函數用來評價模型的預測值和真實值不一樣的程度,損失函數越好,通常模型的性能越好。不同的模型用的損失函數一般也不一樣。
損失函數分為經驗風險損失函數和結構風險損失函數。經驗風險損失函數指預測結果和實際結果的差别,結構風險損失函數是指經驗風險損失函數加上正則項。
常見的損失函數以及其優缺點如下:
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作為激活函數的時候,常用交叉熵損失函數而不用均方誤差損失函數。