1. 程式人生 > >深度學習中softmax交叉熵損失函式的理解

深度學習中softmax交叉熵損失函式的理解

1. softmax層的作用

通過神經網路解決多分類問題時,最常用的一種方式就是在最後一層設定n個輸出節點,無論在淺層神經網路還是在CNN中都是如此,比如,在AlexNet中最後的輸出層有1000個節點,即便是ResNet取消了全連線層,但1000個節點的輸出層還在。

一般情況下,最後一個輸出層的節點個數與分類任務的目標數相等。
假設最後的節點數為N,那麼對於每一個樣例,神經網路可以得到一個N維的陣列作為輸出結果,陣列中每一個維度會對應一個類別。在最理想的情況下,如果一個樣本屬於k,那麼這個類別所對應的的輸出節點的輸出值應該為1,而其他節點的輸出都為0,即 [0,0,1,0,.0,0],這個陣列也就是樣本的Label,是神經網路最期望的輸出結果,但實際是這樣的輸出

[0.01,0.01,0.6,....0.02,0.01],這其實是在原始輸出的基礎上加入了softmax的結果,原始的輸出是輸入的數值做了複雜的加權和與非線性處理之後的一個值而已,這個值可以是任意的值,但是經過softmax層後就成了一個概率值,而且概率和為1。
假設神經網路的原始輸出為y_1,y_2,….,y_n,那麼經過Softmax迴歸處理之後的輸出為 :

y=softmax(yi)=eyij=1neyj
以上可以看出:y=1
這也是為什麼softmax層的每個節點的輸出值成為了概率和為1的概率分佈。

2. 交叉熵損失函式的數學原理

上面說過實際的期望輸出,也就是標籤是[0,0,1,0,.0,0]這種形式,而實際的輸出是[0.01,0.01,0.6,....0.02,0.01]這種形式,這時按照常理就需要有一個損失函式來判定實際輸出和期望輸出的差距,交叉熵就是用來判定實際的輸出與期望的輸出的接近程度!下面就簡單介紹下交叉熵的原理。

交叉熵刻畫的是實際輸出(概率)與期望輸出(概率)的距離,也就是交叉熵的值越小,兩個概率分佈就越接近。假設概率分佈p為期望輸出(標籤),概率分佈q為實際輸出,H(p,q)為交叉熵。

  • 第一種交叉熵損失函式的形式:
    H(p,q)=xp(x)logq(x)

舉個例子:
假設N=3,期望輸出為p=(1,0,0),實際輸出q1=(0.5,0.2,0.3)q2=(0.8,0.1,0.1),這裡的q1,q2兩個輸出分別代表在不同的神經網路引數下的實際輸出,通過計算其對應的交叉熵來優化神經網路引數,計算過程:
H(p,q1)=1(1×log0.5+0×log0.2+0×log0.3)
假設結果:H(p,q1)=0.3
H(p,q2)=1(1×log0.8+0×log0.1+0×log0.1)
假設結果:H(p,q2)=0.1
這時得到了q2是相對正確的分類結果。

  • 第二種交叉熵損失函式形式:
    H(p,q)=x(p(x)logq(x)+(1p(x))log(1q(x)))
    下面簡單推到其過程:
    我們知道,在二分類問題模型:例如邏輯迴歸「Logistic Regression」、神經網路「Neural Network」等,真實樣本的標籤為 [0,1],分別表示負類和正類。模型的最後通常會經過一個 Sigmoid 函式,輸出一個概率值,這個概率值反映了預測為正類的可能性:概率越大,可能性越大。
    Sigmoid 函式的表示式和圖形如下所示:g(s)=11+es
    其中 s 是模型上一層的輸出,Sigmoid 函式有這樣的特點:s = 0 時,g(s) = 0.5;s >> 0 時, g ≈ 1,s << 0 時,g ≈ 0。顯然,g(s) 將前一級的線性輸出對映到 [0,1] 之間的數值概率上。
    其中預測輸出即 Sigmoid 函式的輸出g(s)表徵了當前樣本標籤為 1 的概率: