深度学习中softmax交叉熵损失函数的理解
1. softmax層的作用
通過(guò)神經(jīng)網(wǎng)絡(luò)解決多分類(lèi)問(wèn)題時(shí),最常用的一種方式就是在最后一層設(shè)置n個(gè)輸出節(jié)點(diǎn),無(wú)論在淺層神經(jīng)網(wǎng)絡(luò)還是在CNN中都是如此,比如,在AlexNet中最后的輸出層有1000個(gè)節(jié)點(diǎn),即便是ResNet取消了全連接層,但1000個(gè)節(jié)點(diǎn)的輸出層還在。
一般情況下,最后一個(gè)輸出層的節(jié)點(diǎn)個(gè)數(shù)與分類(lèi)任務(wù)的目標(biāo)數(shù)相等。
假設(shè)最后的節(jié)點(diǎn)數(shù)為N,那么對(duì)于每一個(gè)樣例,神經(jīng)網(wǎng)絡(luò)可以得到一個(gè)N維的數(shù)組作為輸出結(jié)果,數(shù)組中每一個(gè)維度會(huì)對(duì)應(yīng)一個(gè)類(lèi)別。在最理想的情況下,如果一個(gè)樣本屬于k,那么這個(gè)類(lèi)別所對(duì)應(yīng)的的輸出節(jié)點(diǎn)的輸出值應(yīng)該為1,而其他節(jié)點(diǎn)的輸出都為0,即 [0,0,1,0,….0,0][0,0,1,0,….0,0],這個(gè)數(shù)組也就是樣本的Label,是神經(jīng)網(wǎng)絡(luò)最期望的輸出結(jié)果,但實(shí)際是這樣的輸出[0.01,0.01,0.6,....0.02,0.01][0.01,0.01,0.6,....0.02,0.01],這其實(shí)是在原始輸出的基礎(chǔ)上加入了softmax的結(jié)果,原始的輸出是輸入的數(shù)值做了復(fù)雜的加權(quán)和與非線性處理之后的一個(gè)值而已,這個(gè)值可以是任意的值,但是經(jīng)過(guò)softmax層后就成了一個(gè)概率值,而且概率和為1。
假設(shè)神經(jīng)網(wǎng)絡(luò)的原始輸出為y_1,y_2,….,y_n,那么經(jīng)過(guò)Softmax回歸處理之后的輸出為 :
以上可以看出: ∑y′=1∑y′=1
這也是為什么softmax層的每個(gè)節(jié)點(diǎn)的輸出值成為了概率和為1的概率分布。
2. 交叉熵?fù)p失函數(shù)的數(shù)學(xué)原理
上面說(shuō)過(guò)實(shí)際的期望輸出,也就是標(biāo)簽是[0,0,1,0,….0,0][0,0,1,0,….0,0]這種形式,而實(shí)際的輸出是[0.01,0.01,0.6,....0.02,0.01][0.01,0.01,0.6,....0.02,0.01]這種形式,這時(shí)按照常理就需要有一個(gè)損失函數(shù)來(lái)判定實(shí)際輸出和期望輸出的差距,交叉熵就是用來(lái)判定實(shí)際的輸出與期望的輸出的接近程度!下面就簡(jiǎn)單介紹下交叉熵的原理。
交叉熵刻畫(huà)的是實(shí)際輸出(概率)與期望輸出(概率)的距離,也就是交叉熵的值越小,兩個(gè)概率分布就越接近。假設(shè)概率分布p為期望輸出(標(biāo)簽),概率分布q為實(shí)際輸出,H(p,q)為交叉熵。
- 第一種交叉熵?fù)p失函數(shù)的形式:
H(p,q)=?∑xp(x)logq(x)H(p,q)=?∑xp(x)logq(x)
舉個(gè)例子:
假設(shè)N=3,期望輸出為p=(1,0,0),實(shí)際輸出q1=(0.5,0.2,0.3),q2=(0.8,0.1,0.1)q1=(0.5,0.2,0.3),q2=(0.8,0.1,0.1),這里的q1,q2兩個(gè)輸出分別代表在不同的神經(jīng)網(wǎng)絡(luò)參數(shù)下的實(shí)際輸出,通過(guò)計(jì)算其對(duì)應(yīng)的交叉熵來(lái)優(yōu)化神經(jīng)網(wǎng)絡(luò)參數(shù),計(jì)算過(guò)程:
H(p,q1)=?1(1×log0.5+0×log0.2+0×log0.3)H(p,q1)=?1(1×log0.5+0×log0.2+0×log0.3)
假設(shè)結(jié)果:H(p,q1)=0.3H(p,q1)=0.3
H(p,q2)=?1(1×log0.8+0×log0.1+0×log0.1)H(p,q2)=?1(1×log0.8+0×log0.1+0×log0.1)
假設(shè)結(jié)果:H(p,q2)=0.1H(p,q2)=0.1
這時(shí)得到了q2q2是相對(duì)正確的分類(lèi)結(jié)果。
- 第二種交叉熵?fù)p失函數(shù)形式:
H(p,q)=?∑x(p(x)logq(x)+(1?p(x))log(1?q(x)))H(p,q)=?∑x(p(x)logq(x)+(1?p(x))log(1?q(x)))
下面簡(jiǎn)單推到其過(guò)程:
我們知道,在二分類(lèi)問(wèn)題模型:例如邏輯回歸「Logistic Regression」、神經(jīng)網(wǎng)絡(luò)「Neural Network」等,真實(shí)樣本的標(biāo)簽為 [0,1],分別表示負(fù)類(lèi)和正類(lèi)。模型的最后通常會(huì)經(jīng)過(guò)一個(gè) Sigmoid 函數(shù),輸出一個(gè)概率值,這個(gè)概率值反映了預(yù)測(cè)為正類(lèi)的可能性:概率越大,可能性越大。
Sigmoid 函數(shù)的表達(dá)式和圖形如下所示:g(s)=11+e?sg(s)=11+e?s
其中 s 是模型上一層的輸出,Sigmoid 函數(shù)有這樣的特點(diǎn):s = 0 時(shí),g(s) = 0.5;s >> 0 時(shí), g ≈ 1,s << 0 時(shí),g ≈ 0。顯然,g(s) 將前一級(jí)的線性輸出映射到 [0,1] 之間的數(shù)值概率上。
其中預(yù)測(cè)輸出即 Sigmoid 函數(shù)的輸出g(s)表征了當(dāng)前樣本標(biāo)簽為 1 的概率:
P(y=1|x)=y??P(y=1|x)=y^
p(y=0|x)=1?y??p(y=0|x)=1?y^
這個(gè)時(shí)候從極大似然性的角度出發(fā),把上面兩種情況整合到一起:
p(y|x)=y??y(1?y??)(1?y)p(y|x)=y^y(1?y^)(1?y)
這個(gè)函數(shù)式表征的是:
當(dāng)真實(shí)樣本標(biāo)簽 y = 1 時(shí),上面式子第二項(xiàng)就為 1,概率等式轉(zhuǎn)化為:
P(y=1|x)=y??P(y=1|x)=y^
當(dāng)真實(shí)樣本標(biāo)簽 y = 0 時(shí),上面式子第一項(xiàng)就為 1,概率等式轉(zhuǎn)化為:
P(y=0|x)=1?y??P(y=0|x)=1?y^
兩種情況下概率表達(dá)式跟之前的完全一致,只不過(guò)我們把兩種情況整合在一起了。那這個(gè)時(shí)候應(yīng)用極大似然估計(jì)應(yīng)該得到的是所有的概率值乘積應(yīng)該最大,即:
L=∑Ni=1y??yii(1?y??i)(1?yi)L=∑i=1Ny^iyi(1?y^i)(1?yi)
引入log函數(shù)后得到:
L′=log(L)=∑Ni=1yilogy??i+(1?yi)log(1?y??i)L′=log(L)=∑i=1Nyilogy^i+(1?yi)log(1?y^i)
這時(shí)令loss=-log(L)=-L',也就是損失函數(shù)越小越好,而此時(shí)也就是 L'越大越好。
而在實(shí)際的使用訓(xùn)練過(guò)程中,數(shù)據(jù)往往是組合成為一個(gè)batch來(lái)使用,所以對(duì)用的神經(jīng)網(wǎng)絡(luò)的輸出應(yīng)該是一個(gè)m*n的二維矩陣,其中m為batch的個(gè)數(shù),n為分類(lèi)數(shù)目,而對(duì)應(yīng)的Label也是一個(gè)二維矩陣,還是拿上面的數(shù)據(jù),組合成一個(gè)batch=2的矩陣
p=[110000]p=[100100]
根據(jù)第一種交叉熵的形式得到:
H(p,q)=[0.30.1]H(p,q)=[0.30.1]
而對(duì)于一個(gè)batch,最后取平均為0.2。
3. 在TensorFlow中實(shí)現(xiàn)交叉熵
在TensorFlow可以采用這種形式:
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))其中y_表示期望的輸出,y表示實(shí)際的輸出(概率值),*為矩陣元素間相乘,而不是矩陣乘。
并且通過(guò)tf.clip_by_value函數(shù)可以將一個(gè)張量中的數(shù)值限制在一個(gè)范圍之內(nèi),這樣可以避免一些運(yùn)算錯(cuò)誤(比如log0是無(wú)效的),tf.clip_by_value函數(shù)是為了限制輸出的大小,為了避免log0為負(fù)無(wú)窮的情況,將輸出的值限定在(1e-10, 1.0)之間,其實(shí)1.0的限制是沒(méi)有意義的,因?yàn)楦怕试趺磿?huì)超過(guò)1呢。比如:
結(jié)果:
[[2.5 2.5 3. ][4. 4.5 4.5]]上述代碼實(shí)現(xiàn)了第一種形式的交叉熵計(jì)算,需要說(shuō)明的是,計(jì)算的過(guò)程其實(shí)和上面提到的公式有些區(qū)別,按照上面的步驟,平均交叉熵應(yīng)該是先計(jì)算batch中每一個(gè)樣本的交叉熵后取平均計(jì)算得到的,而利用tf.reduce_mean函數(shù)其實(shí)計(jì)算的是整個(gè)矩陣的平均值,這樣做的結(jié)果會(huì)有差異,但是并不改變實(shí)際意義。
import tensorflow as tfv=tf.constant([[1.0,2.0,3.0],[4.0,5.0,6.0]]) with tf.Session() as sess:# 輸出3.5print(tf.reduce_mean(v).eval())由于在神經(jīng)網(wǎng)絡(luò)中,交叉熵常常與Sorfmax函數(shù)組合使用,所以TensorFlow對(duì)其進(jìn)行了封裝,即:
cross_entropy = tf.nn.sorfmax_cross_entropy_with_logits(y_ ,y)與第一個(gè)代碼的區(qū)別在于,這里的y用神經(jīng)網(wǎng)絡(luò)最后一層的原始輸出就好了,而不是經(jīng)過(guò)softmax層的概率值。
參考:https://blog.csdn.net/red_stone1/article/details/80735068
https://blog.csdn.net/chaipp0607/article/details/73392175
總結(jié)
以上是生活随笔為你收集整理的深度学习中softmax交叉熵损失函数的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 恒生科技指数在哪里看 恒生科技指数相关问
- 下一篇: 深度学习的一些教程