點擊上方,選擇星標或置頂,每天給你送乾貨!
閱讀大概需要7分鐘
跟隨小博主,每天進步一丟丟
機器學習算法與自然語言處理出品
@公衆號原創專欄作者 yyHaker
單位 | 哈工大SCIR實驗室
損失函數用來評價模型的預測值和真實值不一樣的程度,損失函數越好,通常模型的性能越好。不同的模型用的損失函數一般也不一樣。
損失函數分爲經驗風險損失函數和結構風險損失函數。經驗風險損失函數指預測結果和實際結果的差別,結構風險損失函數是指經驗風險損失函數加上正則項。
常見的損失函數以及其優缺點如下:
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作爲激活函數的時候,常用交叉熵損失函數而不用均方誤差損失函數。