交叉熵代價函數(Cross-entropy cost function)是用來衡量人工神經網絡(ANN)的預測值與實際值的一種方式。與二次代價函數相比,它能更有效地促進ANN的訓練。在介紹交叉熵代價函數以前,本文先簡要介紹二次代價函數,以及其存在的不足。算法
ANN的設計目的之一是爲了使機器能夠像人同樣學習知識。人在學習分析新事物時,當發現本身犯的錯誤越大時,改正的力度就越大。好比投籃:當運動員發現本身的投籃方向離正確方向越遠,那麼他調整的投籃角度就應該越大,籃球就更容易投進籃筐。同理,咱們但願:ANN在訓練時,若是預測值與實際值的偏差越大,那麼在反向傳播訓練的過程當中,各類參數調整的幅度就要更大,從而使訓練更快收斂。然而,若是使用二次代價函數訓練ANN,看到的實際效果是,若是偏差越大,參數調整的幅度可能更小,訓練更緩慢。網絡
以一個神經元的二類分類訓練爲例,進行兩次實驗(ANN經常使用的激活函數爲sigmoid函數,該實驗也採用該函數):輸入一個相同的樣本數據x=1.0(該樣本對應的實際分類y=0);兩次實驗各自隨機初始化參數,從而在各自的第一次前向傳播後獲得不一樣的輸出值,造成不一樣的代價(偏差):函數
實驗1:第一次輸出值爲0.82學習
實驗2:第一次輸出值爲0.98google
在實驗1中,隨機初始化參數,使得第一次輸出值爲0.82(該樣本對應的實際值爲0);通過300次迭代訓練後,輸出值由0.82降到0.09,逼近實際值。而在實驗2中,第一次輸出值爲0.98,一樣通過300迭代訓練,輸出值只降到了0.20。.net
從兩次實驗的代價曲線中能夠看出:實驗1的代價隨着訓練次數增長而快速下降,但實驗2的代價在一開始降低得很是緩慢;直觀上看,初始的偏差越大,收斂得越緩慢。設計
其實,偏差大致使訓練緩慢的緣由在於使用了二次代價函數。二次代價函數的公式以下:3d
其中,C表示代價,x表示樣本,y表示實際值,a表示輸出值,n表示樣本的總數。爲簡單起見,一樣一個樣本爲例進行說明,此時二次代價函數爲:blog
目前訓練ANN最有效的算法是反向傳播算法。簡而言之,訓練ANN就是經過反向傳播代價,以減小代價爲導向,調整參數。參數主要有:神經元之間的鏈接權重w,以及每一個神經元自己的偏置b。調參的方式是採用梯度降低算法(Gradient descent),沿着梯度方向調整參數大小。w和b的梯度推導以下:token
其中,z表示神經元的輸入,表示激活函數。從以上公式能夠看出,w和b的梯度跟激活函數的梯度成正比,激活函數的梯度越大,w和b的大小調整得越快,訓練收斂得就越快。而神經網絡經常使用的激活函數爲sigmoid函數,該函數的曲線以下所示:
如圖所示,實驗2的初始輸出值(0.98)對應的梯度明顯小於實驗1的輸出值(0.82),所以實驗2的參數梯度降低得比實驗1慢。這就是初始的代價(偏差)越大,致使訓練越慢的緣由。與咱們的指望不符,即:不能像人同樣,錯誤越大,改正的幅度越大,從而學習得越快。
可能有人會說,那就選擇一個梯度不變化或變化不明顯的激活函數不就解決問題了嗎?圖樣圖森破,那樣雖然簡單粗暴地解決了這個問題,但可能會引發其餘更多更麻煩的問題。並且,相似sigmoid這樣的函數(好比tanh函數)有不少優勢,很是適合用來作激活函數,具體請自行google之。
換個思路,咱們不換激活函數,而是換掉二次代價函數,改用交叉熵代價函數:
其中,x表示樣本,n表示樣本的總數。那麼,從新計算參數w的梯度:
其中(具體證實見附錄):
所以,w的梯度公式中原來的被消掉了;另外,該梯度公式中的表示輸出值與實際值之間的偏差。因此,當偏差越大,梯度就越大,參數w調整得越快,訓練速度也就越快。同理可得,b的梯度爲:
實際狀況證實,交叉熵代價函數帶來的訓練效果每每比二次代價函數要好。
以偏置b的梯度計算爲例,推導出交叉熵代價函數:
在第1小節中,由二次代價函數推導出來的b的梯度公式爲:
爲了消掉該公式中的,咱們想找到一個代價函數使得:
即:
對兩側求積分,可得:
而這就是前面介紹的交叉熵代價函數。
sigmoid函數爲:
可證: