交叉熵(cross_entropy)作为损失函数在神经网络中的作用
交叉熵的作用
通過神經(jīng)網(wǎng)絡(luò)解決多分類問題時,最常用的一種方式就是在最后一層設(shè)置n個輸出節(jié)點
神經(jīng)網(wǎng)絡(luò)解決多分類問題最常用的方法是設(shè)置n個輸出節(jié)點,其中n為類別的個數(shù)。對于每一個樣例,神經(jīng)網(wǎng)絡(luò)可以得到的一個n維數(shù)組作為輸出結(jié)果。數(shù)組中的每一個維度(也就是每一個輸出節(jié)點)對應(yīng)一個類別。在理想情況下,如果一個樣本屬于類別k,那么這個類別所對應(yīng)的輸出節(jié)點的輸出值應(yīng)該為1,而其他節(jié)點的輸出都為0。
無論在淺層神經(jīng)網(wǎng)絡(luò)還是在CNN中都是如此,比如,在AlexNet中最后的輸出層有1000個節(jié)點:
而即便是ResNet取消了全連接層,也會在最后有一個1000個節(jié)點的輸出層:
一般情況下,最后一個輸出層的節(jié)點個數(shù)與分類任務(wù)的目標數(shù)相等。假設(shè)最后的節(jié)點數(shù)為N,那么對于每一個樣例,神經(jīng)網(wǎng)絡(luò)可以得到一個N維的數(shù)組作為輸出結(jié)果,數(shù)組中每一個維度會對應(yīng)一個類別。在最理想的情況下,如果一個樣本屬于k,那么這個類別所對應(yīng)的的輸出節(jié)點的輸出值應(yīng)該為1,而其他節(jié)點的輸出都為0,即[0,0,1,0,….0,0],這個數(shù)組也就是樣本的Label,是神經(jīng)網(wǎng)絡(luò)最期望的輸出結(jié)果,交叉熵就是用來判定實際的輸出與期望的輸出的接近程度!
Softmax回歸處理
神經(jīng)網(wǎng)絡(luò)的原始輸出不是一個概率值,實質(zhì)上只是輸入的數(shù)值做了復(fù)雜的加權(quán)和與非線性處理之后的一個值而已,那么如何將這個輸出變?yōu)楦怕史植?#xff1f;
這就是Softmax層的作用,假設(shè)神經(jīng)網(wǎng)絡(luò)的原始輸出為y1,y2,….,yn,那么經(jīng)過Softmax回歸處理之后的輸出為:
很顯然的是:
而單個節(jié)點的輸出變成的一個概率值,經(jīng)過Softmax處理后結(jié)果作為神經(jīng)網(wǎng)絡(luò)最后的輸出。
交叉熵的原理
交叉熵刻畫的是實際輸出(概率)與期望輸出(概率)的距離,也就是交叉熵的值越小,兩個概率分布就越接近。假設(shè)概率分布p為期望輸出,概率分布q為實際輸出,H(p,q)為交叉熵,則:
這個公式如何表征距離呢,舉個例子:
假設(shè)N=3,期望輸出為p=(1,0,0),實際輸出q1=(0.5,0.2,0.3),q2=(0.8,0.1,0.1),那么:
很顯然,q2與p更為接近,它的交叉熵也更小。
除此之外,交叉熵還有另一種表達形式,還是使用上面的假設(shè)條件:
其結(jié)果為:
以上的所有說明針對的都是單個樣例的情況,而在實際的使用訓(xùn)練過程中,數(shù)據(jù)往往是組合成為一個batch來使用,所以對用的神經(jīng)網(wǎng)絡(luò)的輸出應(yīng)該是一個m*n的二維矩陣,其中m為batch的個數(shù),n為分類數(shù)目,而對應(yīng)的Label也是一個二維矩陣,還是拿上面的數(shù)據(jù),組合成一個batch=2的矩陣:
所以交叉熵的結(jié)果應(yīng)該是一個列向量(根據(jù)第一種方法):
而對于一個batch,最后取平均為0.2。
在TensorFlow中實現(xiàn)交叉熵
tensorflow交叉熵計算函數(shù)輸入中的logits都不是softmax或sigmoid的輸出,而是softmax或sigmoid函數(shù)的輸入,因為它在函數(shù)內(nèi)部進行sigmoid或softmax操作
TensorFlow針對分類問題,實現(xiàn)了四個交叉熵函數(shù),分別是
- tf.nn.sigmoid_cross_entropy_with_logits
- tf.nn.softmax_cross_entropy_with_logits
- tf.nn.sparse_softmax_cross_entropy_with_logits
- tf.nn.weighted_cross_entropy_with_logits
sigmoid_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits(logits=logits, labels=labels)- 計算方式:對輸入的logits先通過sigmoid函數(shù)計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優(yōu)化,使得的結(jié)果不至于溢出。
- 適用:每個類別相互獨立但互不排斥的情況:例如一幅圖可以同時包含一條狗和一只大象。
- output不是一個數(shù),而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mean(loss)使用。
-
計算公式:
??
softmax_cross_entropy_with_logits
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)- labels:和logits具有相同type和shape的張量(tensor),,是一個有效的概率,sum(labels)=1, one_hot=True(向量中只有一個值為1.0,其他值為0.0)。
- 計算方式:對輸入的logits先通過softmax函數(shù)計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優(yōu)化,使得結(jié)果不至于溢出。
- 適用:每個類別相互獨立且排斥的情況,一幅圖只能屬于一類,而不能同時包含一條狗和一只大象。
- output:不是一個數(shù),而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mean(loss)使用。
-
計算公式:
??
sparse_softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None, name=None)- labels:shape為[batch_size],labels[i]是{0,1,2,……,num_classes-1}的一個索引, type為int32或int64
- 計算方式:對輸入的logits先通過softmax函數(shù)計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優(yōu)化,使得結(jié)果不至于溢出。
- 適用:每個類別相互獨立且排斥的情況,一幅圖只能屬于一類,而不能同時包含一條狗和一只大象 。
- output不是一個數(shù),而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mean(loss)使用。
- 計算公式:
和tf.nn.softmax_cross_entropy_with_logits()的計算公式一樣,只是要將labels轉(zhuǎn)換成tf.nn.softmax_cross_entropy_with_logits()中l(wèi)abels的形式
?
weighted_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits(labels,logits, pos_weight, name=None)- 計算具有權(quán)重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()
-
計算公式:
?
?
?
https://www.jianshu.com/p/cf235861311b
總結(jié)
以上是生活随笔為你收集整理的交叉熵(cross_entropy)作为损失函数在神经网络中的作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10重装系统_win10系统重装
- 下一篇: 资源 | 普通程序员如何自学机器学习