機器學習之損失函數


 

0. 前言

  • “盡管新技術新算法層出不窮,但是掌握好基礎算法就能解決手頭 90% 的機器學習問題。”

“觀察到的一個有意思的細節:一些喜好機器學習或者數據科學的初學工程師和有機器學習或者數據科學背景的科學家,在工作上的主要區別在於如何對待負面的實驗(包括線下和線上)結果。初學者往往就開始琢磨如何改模型,加Feature,調參數;思考如何從簡單模型轉換到復雜模型。有經驗的人往往更加去了解實驗的設置有沒有問題;實驗的Metrics的Comparison是到底怎么計算的;到真需要去思考模型的問題的時候,有經驗的人往往會先反思訓練數據的收集情況,測試數據和測試評測的真實度問題。初學者有點類似程咬金的三板斧,有那么幾個技能,用完了,要是還沒有效果,也就完了。而有經驗的數據科學家,往往是從問題出發,去看是不是對問題本質的把握(比如優化的目標是不是對;有沒有Counterfactual的情況)出現了偏差,最后再討論模型。”

—— by @洪亮劼

1. 損失函數

前面一篇討論了PRC、ROC、AUC等評測模型的不同側重點,另外一方面,模型損失函數(目標函數)是機器學習里另外一個較為本質的問題,由於機器學習的損失函數根據任務、模型的不同,演化出各種形式,下面只談談分類模型里常見的情形。

假設一個二分類問題,樣本空間是 y={-1,1},一個分類模型對其進行預測,輸出值是f(x),f > 0 判定為1,f < 0判定為 -1。計算模型預測准確率的時候,樣本真實分類 y 如果和 f 符號相同,則表示分類正確,符號相反,則模型分類錯誤。表示成分類誤差,可記為 if y * f(x) > 0 then error = 0 else error = 1。

實際情況中,極少看到直接用分類誤差作為模型的目標函數,原因主要有幾點,其一,loss = 0 or 1 是平行於 x 軸的射線,求導為 0(原點除外),沒法用梯度下降法來優化模型,而實際上這是個NP-Hard離散的非凸優化問題。其二,要訓練一個好的模型還要讓模型感知到,某個樣本盡管分類正確了,但是到底有多“正確”,如果確信度低了還需要繼續優化。舉個例子:有三種水果,兩種模型都進行了訓練,在測試集上概率分布表現如下:

模型A

預測概率 真實概率 分類誤差
0.3 0.3 0.4 0 0 1 (蘋果) 0
0.3 0.4 0.3 0 1 0 (梨子) 0
0.1 0.2 0.7 1 0 0 (桃子) 1

模型B

預測概率 真實概率 分類誤差
0.1 0.2 0.7 0 0 1 (蘋果) 0
0.1 0.8 0.1 0 1 0 (梨子) 0
0.4 0.5 0.1 1 0 0 (桃子) 1

目測可以看出,模型A和模型B分類誤差都是0.333,但是模型B更“靠譜”一些。問題來了,這個靠譜”如何衡量?

2. Margin

margin 是衡量某次預測到底有多“准確”的一個指標,定義為 y*f(x)。簡單說,希望正樣本預測值為正盡量大,負樣本預測值為負盡量小,就需要模型 max margin。

以margin作為橫軸,黑色表示分類loss,紅色表示log loss,藍色表示 hinge loss,綠色表示 square error,可以看到隨着 margin 變大,loss 總體是單調遞減的,但是 squared error 超過1后會遞增:

從上圖可以看到,hinge loss 在margin達到一定閾值后(很確信分類正確的樣本),loss降為0,對整個模型訓練其實已經沒有影響了。log loss 不管margin多大,loss永遠不會降為0,會一直對模型有影響。squared error 里,如果f(x) 輸出絕對值可以大於1,那么margin太大的點,對模型反而有不好的影響:

中場休息時間。。。喝口茶~ 歡迎關注公眾號:kaggle實戰,或博客:http://www.cnblogs.com/daniel-D/

3. Cross-Entropy vs. Squared Error

cross-entropy 可以簡單理解為上面的 log loss,在深度學習里面,最后一層往往是通過 softmax 計算出概率分布margin區間為[0,1]。squared error 並不存在上述 margin 太大的點對模型反而有負面影響的情況,這時候該采用 Cross-Entropy or Squared Error?

結論是如果你使用的是神經網絡的分類模型,建議使用 Cross-entropy。

做分類任務的深度神經網絡,最后一層一般為softmax,softmax 計算公式如下:

 

一般采用反向傳播的梯度下降方法優化,下面先把 softmax 的計算過程逐步剖析開來:(糾正圖中一個錯誤:P=A * V

上圖中O1,O2,O3 表示softmax的輸入節點,每個節點先經過指數化得到 A,然后求和得到 S 即分母,倒數得到 V,再各自和指數相乘,得到該節點輸出的概率 P。為了圖片結構稍微美觀點,這里 P2 就沒畫出來了。對於上圖的 O1 來說,導數來源於虛線的鏈路,箭頭上的文字表示局部導數,它的導數實際來自兩部分,一是直接相連的 P1,以及無直接鏈接的P2、P3……對應輸入層的某個節點 O應用鏈式法則,P節點對其偏導如下

如果 i = j,即圖中 O1 到 P1,導數由兩條鏈路組成:

 

如果 i ≠ j,即圖中 O到 P3,導數由一條鏈路組成:

 

 

如果模型訓練得很好,Pj 和Pi都接近0或者其中一個接近於1,可以看到兩種情況梯度都是接近於0,符合預期;如果模型很差,把某個錯誤的類別的概率也計算成1,那么 Pj 和 Pi 都接近0者其中一個接近於1,梯度也很小,不太符合預期,看看 Cross-entropy 是如何解決這個問題的。

對於Cross-entropy(Logloss)誤差,計算公式為:

 

可以看到 Cross-entropy 只關注正確label上的概率大小,上圖中 ,只有連到到 P1 的鏈路才是對梯度計算有效的,對 i = j 也就是上圖中的 O1 來說:

對 i ≠ j 也就是 O2 到 L1 鏈路來說:

--備注:x 應該是 - 1/p_i,上面梯度應該多個負號,截圖太累

如果模型很差,正確 label 上的概率 Pi 接近0,實際上不會影響梯度大小。

但是如果是 Squared Error,上圖 P 到 L 連接上的 x 並不包含 logLoss 的倒數形式。由於正確類別和錯誤類別的損失函數都會影響 Oi 的偏導,整體公式比較復雜,這里就不做詳細的推導了,但是整體上是先相乘,然后求和,梯度會很小,給優化帶來阻礙。

 

總結

  • softmax部分在完全分類正確或者分類完全錯誤的情況下,該部分偏導都接近於0
  • logLoss 偏導中有倒數,可以“中和”softmax這個缺點,Squared Error 如果初始化不好很難克服這個問題,使用softmax分類模型的 Loss 推薦使用 cross entropy 而不是 classification error 或 squared error
  • logLoss 對完全錯誤分類的懲罰極大,但是其實偏導不會超過1
  • 對於上述 logLoss 這種“虛張聲勢”的做法,直接看logLoss可能無法這種體現模型的准確性,比如把1個樣本分得很錯的模型 vs. 把多個樣本分得不那么錯的模型,可能后者的 logLoss 更小,建議直接用分類誤差評估

參考資料

 

 

 

附:公眾號 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM