機器學習之損失函數

 

  0. 前言html

  1. 損失函數算法

  2. Margin網絡

  3. Cross-Entropy vs. Squared Errorapp

  總結機器學習

  參考資料wordpress

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 更小,建議直接用分類偏差評估

參考資料

 

 

 

附:公衆號 

相關文章
相關標籤/搜索