經典的損失函數----交叉熵
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
