轉(zhuǎn)自https://blog.csdn.net/yuanjunliang/article/details/79394805
交叉熵代價函數(shù)(Cross-entropy cost function)是用來衡量人工神經(jīng)網(wǎng)絡(luò)(ANN)的預(yù)測值與實(shí)際值的一種方式。與二次代價函數(shù)相比,它能更有效地促進(jìn)ANN的訓(xùn)練。在介紹交叉熵代價函數(shù)之前,本文先簡要介紹二次代價函數(shù),以及其存在的不足。
1. 二次代價函數(shù)的不足
ANN的設(shè)計(jì)目的之一是為了使機(jī)器可以像人一樣學(xué)習(xí)知識。人在學(xué)習(xí)分析新事物時,當(dāng)發(fā)現(xiàn)自己犯的錯誤越大時,改正的力度就越大。比如投籃:當(dāng)運(yùn)動員發(fā)現(xiàn)自己的投籃方向離正確方向越遠(yuǎn),那么他調(diào)整的投籃角度就應(yīng)該越大,籃球就更容易投進(jìn)籃筐。同理,我們希望:ANN在訓(xùn)練時,如果預(yù)測值與實(shí)際值的誤差越大,那么在反向傳播訓(xùn)練的過程中,各種參數(shù)調(diào)整的幅度就要更大,從而使訓(xùn)練更快收斂。然而,如果使用二次代價函數(shù)訓(xùn)練ANN,看到的實(shí)際效果是,如果誤差越大,參數(shù)調(diào)整的幅度可能更小,訓(xùn)練更緩慢。
以一個神經(jīng)元的二類分類訓(xùn)練為例,進(jìn)行兩次實(shí)驗(yàn)(ANN常用的激活函數(shù)為sigmoid函數(shù),該實(shí)驗(yàn)也采用該函數(shù)):輸入一個相同的樣本數(shù)據(jù)x=1.0(該樣本對應(yīng)的實(shí)際分類y=0);兩次實(shí)驗(yàn)各自隨機(jī)初始化參數(shù),從而在各自的第一次前向傳播后得到不同的輸出值,形成不同的代價(誤差):
實(shí)驗(yàn)1:第一次輸出值為0.82
實(shí)驗(yàn)2:第一次輸出值為0.98
在實(shí)驗(yàn)1中,隨機(jī)初始化參數(shù),使得第一次輸出值為0.82(該樣本對應(yīng)的實(shí)際值為0);經(jīng)過300次迭代訓(xùn)練后,輸出值由0.82降到0.09,逼近實(shí)際值。而在實(shí)驗(yàn)2中,第一次輸出值為0.98,同樣經(jīng)過300迭代訓(xùn)練,輸出值只降到了0.20。
從兩次實(shí)驗(yàn)的代價曲線中可以看出:實(shí)驗(yàn)1的代價隨著訓(xùn)練次數(shù)增加而快速降低,但實(shí)驗(yàn)2的代價在一開始下降得非常緩慢;直觀上看,初始的誤差越大,收斂得越緩慢。
其實(shí),誤差大導(dǎo)致訓(xùn)練緩慢的原因在于使用了二次代價函數(shù)。二次代價函數(shù)的公式如下:
其中,C表示代價,x表示樣本,y表示實(shí)際值,a表示輸出值,n表示樣本的總數(shù)。為簡單起見,同樣一個樣本為例進(jìn)行說明,此時二次代價函數(shù)為:
目前訓(xùn)練ANN最有效的算法是反向傳播算法。簡而言之,訓(xùn)練ANN就是通過反向傳播代價,以減少代價為導(dǎo)向,調(diào)整參數(shù)。參數(shù)主要有:神經(jīng)元之間的連接權(quán)重w,以及每個神經(jīng)元本身的偏置b。調(diào)參的方式是采用梯度下降算法(Gradient descent),沿著梯度方向調(diào)整參數(shù)大小。w和b的梯度推導(dǎo)如下:
表示激活函數(shù)。從以上公式可以看出,w和b的梯度跟激活函數(shù)的梯度成正比,激活函數(shù)的梯度越大,w和b的大小調(diào)整得越快,訓(xùn)練收斂得就越快。而神經(jīng)網(wǎng)絡(luò)常用的激活函數(shù)為sigmoid函數(shù),該函數(shù)的曲線如下所示:
如圖所示,實(shí)驗(yàn)2的初始輸出值(0.98)對應(yīng)的梯度明顯小于實(shí)驗(yàn)1的輸出值(0.82),因此實(shí)驗(yàn)2的參數(shù)梯度下降得比實(shí)驗(yàn)1慢。這就是初始的代價(誤差)越大,導(dǎo)致訓(xùn)練越慢的原因。與我們的期望不符,即:不能像人一樣,錯誤越大,改正的幅度越大,從而學(xué)習(xí)得越快。
可能有人會說,那就選擇一個梯度不變化或變化不明顯的激活函數(shù)不就解決問題了嗎?圖樣圖森破,那樣雖然簡單粗暴地解決了這個問題,但可能會引起其他更多更麻煩的問題。而且,類似sigmoid這樣的函數(shù)(比如tanh函數(shù))有很多優(yōu)點(diǎn),非常適合用來做激活函數(shù),具體請自行g(shù)oogle之。
2. 交叉熵代價函數(shù)
換個思路,我們不換激活函數(shù),而是換掉二次代價函數(shù),改用交叉熵代價函數(shù):
其中,x表示樣本,n表示樣本的總數(shù)。那么,重新計(jì)算參數(shù)w的梯度:
其中(具體證明見附錄):
表示輸出值與實(shí)際值之間的誤差。所以,當(dāng)誤差越大,梯度就越大,參數(shù)w調(diào)整得越快,訓(xùn)練速度也就越快。同理可得,b的梯度為:
實(shí)際情況證明,交叉熵代價函數(shù)帶來的訓(xùn)練效果往往比二次代價函數(shù)要好。
3. 交叉熵代價函數(shù)是如何產(chǎn)生的?
以偏置b的梯度計(jì)算為例,推導(dǎo)出交叉熵代價函數(shù):
在第1小節(jié)中,由二次代價函數(shù)推導(dǎo)出來的b的梯度公式為:
,我們想找到一個代價函數(shù)使得:
即:
對兩側(cè)求積分,可得:
而這就是前面介紹的交叉熵代價函數(shù)。
附錄:
sigmoid函數(shù)為:
可證: