機器學習之路:tensorflow 深度學習中 分類問題的損失函數 交叉熵


 

經典的損失函數----交叉熵

 

1 交叉熵:
  分類問題中使用比較廣泛的一種損失函數, 它刻畫兩個概率分布之間的距離
  給定兩個概率分布p和q, 交叉熵為:  H(p, q) = -∑ p(x) log q(x)

  當事件總數是一定的時候, 概率函數滿足:   任意x  p(X = x) ∈[0, 1] 且 Σ p(X=x) = 1

  也就是說 所有時間發生的概率都是0到1 之間 , 且總有一個時間會發生,概率的和就為1。

 

2 tensorflow中softmax:

  softmax回歸可以作為學習算法來優化分類結果,在tensorflow中,softmax回歸的參數被去掉了,它將神經網絡輸出變成一個概率分布。

  假設原始神經網絡輸出為 y1, y2, y3, ... , yn

  softmax 處理后的輸出為: softmax(y)i = yi' = eyi / Σj=1n eyj

  原始神經網絡的輸出被用作置信度來生成新的輸出,新的輸出滿足概率分布所有要求

  這樣就可以通過交叉熵來衡量預測概率分布和真實概率分布的距離

 

3 從交叉熵的公式可以看出,它表達的是通過概率函數q來表達概率分布p的困難程度。

  交叉熵作為神經網絡的損失函數的時候,q代表預測值, p代表真實值,交叉熵刻畫兩個分布的距離

  也就是交叉熵的值越小,兩個概率分布越近

 

4 舉例:

  假設有一個三分類問題,某個樣例的正確答案是(1, 0, 0)

  

  經過softmax后的預測答案是(0.5, 0.4, 0.1)

  那么它和正確答案的交叉熵為: H( (1,0,0) , (0.5,0.4,0.1) ) = - ( 1*log0.5 + 0*log0.4 + 0*log0.1 ) ≈ 0.3

  

  另一個經過softmax的預測值是(0.8, 0.1, 0.1)

  他和正確答案的交叉熵是 : H( (1, 0, 0), (0.8, 0.1, 0.1) ) = - ( 1*log0.8 + 0*log0.1 + 0*log0.1 ) ≈ 0.1

 

從直觀上看 容易知道第二個優於第一個,通過交叉熵計算結果也是一致的。

 

 

在tensorflow中 使用如下代碼實現計算交叉熵:

  cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))

  其中 y_為真實值

    y 為預測值

    tf.clip_by_value(y, 1e-10, 1.0) 能夠把y的值限定在1e-10和1.0之間, 

      y如果小於1e-10 函數返回1e-10, 如果大於1.0 返回1.0, 如果在這之間就返回y

      這樣做的目的是防止出現log0 的情況

    tf.log 為計算log函數

    * 操作不是矩陣乘法, 是對應位置元素的乘法

    tf.reduce_mean 取平均數。  如果衡量大小,和取和是一樣的。

 

一般交叉熵會和sotmax回歸一起使用,在tensorflow中進行了一起封裝為:

  cross_entropy = tf.nn.sotmax_cross_entropy_with_logits(y, y_)

    其中y為預測值,y_為真實值

 

在只有一個正確答案的情況下,tensorflow提供了 加速計算函數

  tf.nn.sparse_softmax_cross_entropy_with_logits

      

 

 

 


免責聲明!

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



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