1. 程式人生 > >利用cross-entropy cost代替quadratic cost來獲得更好的收斂

利用cross-entropy cost代替quadratic cost來獲得更好的收斂

log func layer lcx 激活 sim 期望 兩個 交叉熵

1.從方差代價函數說起(Quadratic cost)

代價函數經常用方差代價函數(即采用均方誤差MSE),比如對於一個神經元(單輸入單輸出,sigmoid函數),定義其代價函數為:

技術分享圖片

其中y是我們期望的輸出,a為神經元的實際輸出【 a=σ(z), where z=wx+b 】。

在訓練神經網絡過程中,我們通過梯度下降算法來更新w和b,因此需要計算代價函數對w和b的導數:

技術分享圖片

然後更新w、b:

w <—— w - η* ?C/?w = w - η * a *σ′(z)

b <—— b - η* ?C/?b = b - η * a * σ′(z)

因為sigmoid函數的性質,導致σ′(z)在z取大部分值時會很小(如下圖標出來的兩端,幾近於平坦),這樣會使得w和b更新非常慢(因為η * a * σ′(z)這一項接近於0)。

技術分享圖片

2.交叉熵代價函數(cross-entropy cost function)

為了克服這個缺點,引入了交叉熵代價函數(下面的公式對應一個神經元,多輸入單輸出):

技術分享圖片

其中y為期望的輸出,a為神經元實際輸出【a=σ(z), where z=∑Wj*Xj+b】

與方差代價函數一樣,交叉熵代價函數同樣有兩個性質:

  • 非負性。(所以我們的目標就是最小化代價函數)
  • 當真實輸出a與期望輸出y接近的時候,代價函數接近於0.(比如y=0,a~0;y=1,a~1時,代價函數都接近0)。

另外,它可以克服方差代價函數更新權重過慢的問題。我們同樣看看它的導數:

技術分享圖片

技術分享圖片

可以看到,導數中沒有σ′(z)這一項,權重的更新是受σ(z)?y這一項影響,即受誤差的影響。所以當誤差大的時候,權重更新就快,當誤差小的時候,權重的更新就慢。這是一個很好的性質。

以上說的是單層的,如果多層:

技術分享圖片

3.總結

  • cross-entropy cost幾乎總是比quadratic cost函數好

  • 如果神經元的方程式現行的,用哪個quadratic函數(不會有學習慢的問題)
  • 當我們用sigmoid函數作為神經元的激活函數時,最好使用交叉熵代價函數來替代方差代價函數,以避免訓練過程太慢。
  • 不過,你也許會問,為什麽是交叉熵函數?導數中不帶σ′(z)項的函數有無數種,怎麽就想到用交叉熵函數?這自然是有來頭的,更深入的討論就不寫了,少年請自行了解。

  • 另外,交叉熵函數的形式是?[ylna+(1?y)ln(1?a)]而不是 ?[alny+(1?a)ln(1?y)],為什麽?因為當期望輸出的y=0時,lny沒有意義;當期望y=1時,ln(1-y)沒有意義。而因為a是sigmoid函數的實際輸出,永遠不會等於0或1,只會無限接近於0或者1,因此不存在這個問題。

4.還要說說:log-likelihood cost

對數似然函數也常用來作為softmax回歸的代價函數,在上面的討論中,我們最後一層(也就是輸出)是通過sigmoid函數,因此采用了交叉熵代價函數。而深度學習中更普遍的做法是將softmax作為最後一層,此時常用的是代價函數是log-likelihood cost。

In fact, it’s useful to think of a softmax output layer with log-likelihood cost as being quite similar to a sigmoid output layer with cross-entropy cost。

其實這兩者是一致的,logistic回歸用的就是sigmoid函數,softmax回歸是logistic回歸的多類別推廣。log-likelihood代價函數在二類別時就可以化簡為交叉熵代價函數的形式。

利用cross-entropy cost代替quadratic cost來獲得更好的收斂