以下文章來源于Datawhale ,作者Michael
高爾夫球員剛開始學習打高爾夫球時,通常會花很長時間練習揮桿。慢慢地,他們才會在此基礎上練習其他擊球方式,學習削球、左曲球和右曲球。本章仍著重介紹反向傳播算法,這就是我們的“揮桿基本功”——神經網絡中大部分工作、學習和研究的基礎。
本文將著重講解利用交叉熵代價函數改進神經網絡的學習方法。

一、交叉熵代價函數
大多數人不喜歡被他人指出錯誤。我以前剛學習彈鋼琴不久,就在聽眾前做了一次首秀。我很緊張,開始時錯將八度音階的曲段演奏得很低。我不知所措,因為演奏無法繼續下去了,直到有人指出了其中的錯誤。我當時非常尷尬。不過,盡管不愉快,我們卻能因為明顯的錯誤而快速地學到正確的知識。下次我肯定能演奏正確!然而當錯誤不明確的時候,學習會變得非常緩慢。學習速度下降的原因實際上也是一般的神經網絡學習緩慢的原因,并不僅僅是特有的。
引入交叉熵代價函數
如何解決這個問題呢?研究表明,可以使用交叉熵代價函數來替換二次代價函數。
將交叉熵看作代價函數有兩點原因。第一,它是非負的,C > 0。可以看出(57)的求和中的所有單獨項都是負數,因為對數函數的定義域是(0, 1)。求和前面有一個負號。
第二,如果對于所有的訓練輸入x,神經元實際的輸出都接近目標值,那么交叉熵將接近0。假設在本例中,y = 0而a ≈ 0,這是我們想要的結果。方程(57)中的第一個項會消去,因為y = 0,而第二項實際上就是−ln(1 − a) ≈ 0;反之,y = 1而a ≈ 1。所以實際輸出和目標輸出之間的差距越小,最終交叉熵的值就越小。
綜上所述,交叉熵是非負的,在神經元達到較高的正確率時接近0。我們希望代價函數具備這些特性。其實二次代價函數也擁有這些特性,所以交叉熵是很好的選擇。然而交叉熵代價函數有一個比二次代價函數更好的特性:它避免了學習速度下降的問題。
代價函數曲線要比二次代價函數訓練開始部分陡峭很多。這個交叉熵導致的陡度正是我們期望的,當神經元開始出現嚴重錯誤時能以最快的速度學習。
二、改進神經網絡的應用實踐
使用交叉熵來對MNIST數字進行分類
如果程序使用梯度下降算法和反向傳播算法進行學習,那么交叉熵作為其中一部分易于實現。我們會使用一個包含30個隱藏神經元的網絡,小批量的大小也設置為10,將學習率設置為η,訓練30輪。network2.py的接口和network.py的略有區別,但用法還是很好懂的。可以在Python shell中使用help(network2.Network.SGD)這樣的命令來查看network2.py的接口文檔。
>>> import mnist_loader
>>> training_data, validation_data, test_data =
... mnist_loader.load_data_wrApper()
>>> import network2
>>> net = network2.Network([784, 30, 10], cost=network2.CrossEntropyCost)
>>> net.large_weight_initializer()
>>> net.SGD(training_data, 30, 10, 0.5, evaluation_data=test_data,
... monitor_evaluation_accuracy=True)
注意,net.large_weight_initializer()命令使用第1章介紹的方式來初始化權重和偏置。這里需要執行該命令,因為后面才會改變默認的權重初始化命令。運行上面的代碼,神經網絡的準確率可以達到95.49%,這跟第1章中使用二次代價函數得到的結果(95.42%)相當接近了。
對于使用100個隱藏神經元,而交叉熵及其他參數保持不變的情況,準確率達到了96.82%。相比第1章使用二次代價函數的結果(96.59%)有一定提升。看起來是很小的變化,但考慮到誤差率已經從3.41%下降到3.18%了,消除了原誤差的1/14,這其實是可觀的改進。
跟二次代價相比,交叉熵代價函數能提供類似的甚至更好的結果,然而這些結果不能證明交叉熵是更好的選擇,原因是在選擇學習率、小批量大小等超參數上花了一些心思。為了讓提升更有說服力,需要對超參數進行深度優化。然而,這些結果仍然是令人鼓舞的,它們鞏固了先前關于交叉熵優于二次代價的理論推斷。
轉自:Datawhale ; Michael Nielsen,計算機科學家;
本文內容節選自《深入淺出神經網絡與深度學習》一書,由Michael Nielsen所著,李航等推薦。本書深入了講解神經網絡和深度學習技術,作者以技術原理為導向,輔以貫穿全書的 MNIST 手寫數字識別項目示例,講解了如何利用所學知識改進深度學習項目,值得學習。