今天开始学Pattern Recognition and Machine Learning (PRML),章节5.2-5.3,Neural Networks神经网络训练(BP算法)
這一篇是整個第五章的精華了,會重點介紹一下Neural Networks的訓(xùn)練方法——反向傳播算法(backpropagation,BP),這個算法提出到現(xiàn)在近30年時間都沒什么變化,可謂極其經(jīng)典。也是deep learning的基石之一。還是老樣子,下文基本是閱讀筆記(句子翻譯+自己理解),把書里的內(nèi)容梳理一遍,也不為什么目的,記下來以后自己可以翻閱用。
?
5.2 Network Training
我們可以把NN看做一種通用的非線性函數(shù),把輸入向量x變換成輸出向量y,可以類比于第一章中的多項式曲線擬合問題。給定輸入集合,目標(biāo)集合,sum-of-squares error function定義為:
?
這一節(jié)主要主要是想說明error function也可以從最大似然估計的角度推導(dǎo)出來的。見(5.12-14)。這一部分從簡了,有時間完善。
(case 1)上面的y可以是identity,即
?
(case 2)當(dāng)然也可以是二分類問題邏輯回歸模型(可以參考第4章邏輯回歸的內(nèi)容),處理單一的2分類問題。
針對一個樣本的類別的條件概率是一個伯努利分布Bernoulli distribution:
定義在數(shù)據(jù)集上的error function是cross-entropy:
有人證明,采用cross-entropy作為分類問題的目標(biāo)函數(shù)可以比最小均方差泛化能力更強,以及訓(xùn)練更快。
(case 3)如果我們要做的分類是K個獨立二分類分體,那么上面的條件分布修改為:
error funciton:
?
這里講一講參數(shù)共享,第一層的神經(jīng)網(wǎng)絡(luò)的參數(shù)實際上被output層所有神經(jīng)元所貢獻(xiàn),這樣的貢獻(xiàn)可以減少了一定的計算量同時提高了泛化能力。
(case 4)當(dāng)我們考慮不是獨立二分類,而是1-of-K的分類問題,也就是說每一個結(jié)果是互斥的,我們需要采用softmax分類:
在數(shù)據(jù)集上error function定義:
其中,softmax的激勵函數(shù)定義為
?
上面這一段說明了softmax的一個平移不變性的特性,但是會在regularization框架下消失。
?
總結(jié)一下:
?
?
下面講一講優(yōu)化的方法:
5.2.4 Gradient descent optimization
梯度下降(GD)的公式是這樣的:
?
這個也叫做batch model,梯度是定義在整個數(shù)據(jù)集上的,也就是是每一步迭代需要整個數(shù)據(jù)集。參數(shù)優(yōu)化過程中每一步都是朝著error function下降最快的方向前進(jìn)的,這樣的方法就稱為梯度下降算法,或者最速梯度下降。但是這樣的方法比較容易找到局部最優(yōu)(local optima),比如下面的圖示,來自leftnoteasy
初始的時候我們在一個隨機的位置,希望找到目標(biāo)值最低的谷底,但是事實上我們并不知道我們找到的是不是global optima。上述batch model的優(yōu)化方法,還有更快捷的方法,如conjugate gradients和quasi-Newton methods。如果要得到足夠好的最小值,就需要多進(jìn)行幾輪GD,每次都選用不同的隨即初始點,并在validation set中驗證結(jié)果的有效性。
還有一種on-line版本的gradient descent(或者稱為sequential gradient descent或者stochastic gradient descent),在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時候被證明非常有效。定義在數(shù)據(jù)集上的error function是每個獨立樣本的error function之和:
那么,on-line GD的更新公式是:
每次更新一個樣本,方式是每次sequential取一個樣本,或者有放回的random取。在onlineGD和GD之間還存在著中間形態(tài),基于一個batch的數(shù)據(jù)。onlineGD的好處有:計算量小,同時更容易從有些local optima中逃出。
?
5.3 Error Backpropagation誤差反向傳導(dǎo)
在這一節(jié)中,我們會討論一種快速計算前向網(wǎng)絡(luò)誤差函數(shù)E(w)梯度的方法——也就是著名的Error backpropagation算法,或者簡稱 backprop。
值得一提的是,backpropagation在其他地方也有類似的名稱,比如在multilayer perceptron(MLP)經(jīng)常也叫做backpropagation network。backpropagation在其中的意思是通過梯度下降的方法來訓(xùn)練MLP。事實上,大部分算法(訓(xùn)練)涉及一個迭代過程來最小化目標(biāo)函數(shù),在這個過程中基本上有兩個階段:一是計算error function的對于參數(shù)的導(dǎo)數(shù),BP正是提供了一種計算所有參數(shù)導(dǎo)數(shù)的快速、有效方法;二是通過求出的導(dǎo)數(shù)來更新原來的參數(shù),最常見的方法就是梯度下降方法。這兩個階段是相互獨立的,這意味著BP算法的思想并不是只能用于MLP這樣的網(wǎng)絡(luò),也不是只能用于均方誤差這樣的error function,BP可以被用于很多其他算法。
?
5.3.1 Evaluation of error-function derivatives
接下來我們來推導(dǎo)一下BP算法,條件是在一個任意拓?fù)浣Y(jié)構(gòu)的前向網(wǎng)絡(luò)中,任意的可導(dǎo)的非線性激勵函數(shù),以及支持一系列error function(基本是很通用的了)。推導(dǎo)過程會用一個具有一個隱層的神經(jīng)網(wǎng)絡(luò),以及均方誤差的error function來說明。
常見的error function,定義在一個i.i.d(獨立同分布)數(shù)據(jù)集上,有如下的形式:
下面我們會考慮針對error function其中的一項來求梯度,。這個結(jié)果可以直接用于序列優(yōu)化(sequential optimization),或者把結(jié)果累加起來用于batch優(yōu)化。(注:其實這個所謂序列優(yōu)化就是現(xiàn)在廣為人知的隨機梯度下降。)
?
首先,我們先來考慮最為簡單的線性output函數(shù)的情況:
y_k是對樣本x的第k個輸出(假設(shè)輸出層有多個node),是x所有維度的一個線性組合。更一般性而言,我們定義在任意一個樣本x_n上error function:
其中,上面error function針對參數(shù)的梯度是:
?
這個結(jié)果可以看做是一種“局部計算”——這個乘積一部分是誤差連接在權(quán)重的輸出端,另一部分是變量連接在權(quán)重的輸入端。上面的形式在邏輯回歸中也出現(xiàn)過(章節(jié)4.3.2),在softmax中也是類似,下面來看在更一般的多層前向網(wǎng)絡(luò)中是怎么樣的。
在一個一般結(jié)構(gòu)的前向網(wǎng)絡(luò)中,每個神經(jīng)元(不算輸入層)計算它輸入的加權(quán)和:
?
其中zi是前面一個神經(jīng)元(后面叫做節(jié)點或者node之類的都是同一個意思)的激勵值輸出,也是一個輸入值輸入到了節(jié)點j,是這個連接的權(quán)重。在前面一篇今天開始學(xué)PRML-5.1節(jié),我們介紹過,可以通過引入一個額外的輸入節(jié)點且固定激勵值是+1,我們可以把bias項合并在上面的累加中。因此,我們對待bias項是和對待其他的待估權(quán)重是一樣的。然后得到節(jié)點j的激勵函數(shù)的形式:
上面兩個式子就說明了一個神經(jīng)元獲得輸入值然后得到激勵值輸出的過程。對于訓(xùn)練集合中的任何一個樣本,我們都反復(fù)通過上面兩個式子,計算出所有隱藏神經(jīng)元和輸出神經(jīng)元的激勵值。這個過程就叫做向前傳播,就像是一個向前的流經(jīng)過網(wǎng)絡(luò)一樣。
下面來推導(dǎo)error function對的導(dǎo)數(shù),下面每一個節(jié)點的值都依賴于具體的樣本n,但是為了清晰表達(dá),省去了n這個標(biāo)記。權(quán)重只能通過輸入網(wǎng)絡(luò)的值來影響神經(jīng)元j,因此通過鏈?zhǔn)椒▌t可以得到推導(dǎo):
記
這個表示很重要,一般可以稱為error(誤差或者殘差);從(5.48)可以得到:
于是可以得到:
和前面提到的線性模型一樣,上面的導(dǎo)數(shù)也是由連接的輸出端的誤差和輸入端輸入值的成績得到(z=1是bias項)。因此,關(guān)鍵就是計算網(wǎng)絡(luò)中隱藏神經(jīng)元和輸出神經(jīng)元的的值了。
?
對于輸出層,任何一個神經(jīng)元k可以得到:
注:這個推導(dǎo)是直接從(5.46)來的,在書中用的是線性輸出來推導(dǎo)的,即y_k=a_k。如果不是線性輸出,而是個f(a_k),那么還要乘以一項f(a_k)的導(dǎo)數(shù)。
?
對于隱藏層,我們用鏈?zhǔn)椒▌t:
k代表所有j神經(jīng)元的下一層神經(jīng)元。這個式子的意思是說,j神經(jīng)元對目標(biāo)error function的影響是只能通過所有的所有來實現(xiàn)的。通過(5.51)(5.48-49),可以得到
稱為反向傳導(dǎo)法則。到這里,大概可以看到為什么叫做“反向傳導(dǎo)”了,可以從圖5.7進(jìn)一步了解:誤差的傳播是從輸出層逐層回傳的。先通過output層計算殘差并求出最后一層參數(shù),然后往回傳播。
?
最后來總結(jié)一下BP算法的過程:(這里偷懶一下直接借用書上的總結(jié)啦:))
?
思路很清晰。如果用傳統(tǒng)的梯度下降來求解,需要對所有的樣本求出來的導(dǎo)數(shù)做累加,然后用于傳統(tǒng)的梯度下降的公式中。
5.3.2 A simple example
下面來就一個稍微具體一點的例子說明一下:一個兩層神經(jīng)網(wǎng)絡(luò)(如圖5.1),輸出層是線性輸出,并且采用sum-of-squares誤差,激勵函數(shù)采用雙曲正切函數(shù)tanh,
?
并且導(dǎo)數(shù):
定義在一個樣本n上面的誤差函數(shù):
?
其中yk是輸出值,tk是目標(biāo)值;向前傳播的過程可以描述為:
然后計算每一個輸出神經(jīng)元的殘差和隱層神經(jīng)元的殘差:
最后得到第一層參數(shù)和第二層參數(shù)的導(dǎo)數(shù),分別用于梯度下降計算。
?
5.3.3 Efficiency of backpropagation
神經(jīng)網(wǎng)絡(luò)計算的一個主要問題是計算量大,在之前的模型中,如果有W數(shù)量的連接(神經(jīng)元突觸),那么一次前向傳播的復(fù)雜度是O(W),而一般來說W是遠(yuǎn)遠(yuǎn)大于神經(jīng)元節(jié)點數(shù)量的。
在5.48可以看到,每一個參數(shù)需要有一次乘法和一次加法。
另外一種求倒數(shù)的方式是用數(shù)值方法,
其中;數(shù)值方法計算精度是一個問題,我們可以把變的非常小,直到接近于精度的極限。采用symmetrical central differences可以大大蓋上上述的精度問題:
但是計算量差不多是(5.68)的兩倍。實際上數(shù)值方法的計算不能利用前面的有用信息,每一次導(dǎo)數(shù)都需要獨立計算,計算上并不能簡化。
?
但是有意思的是數(shù)值導(dǎo)數(shù)在另外一個地方有用武之地——gradient check!我們可以用central differences的結(jié)果和BP算法中的導(dǎo)數(shù)進(jìn)行比較,以此來判斷BP算法執(zhí)行是否是正確的。
總結(jié)
以上是生活随笔為你收集整理的今天开始学Pattern Recognition and Machine Learning (PRML),章节5.2-5.3,Neural Networks神经网络训练(BP算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今天开始学模式识别与机器学习(PRML)
- 下一篇: 神经网络weight参数怎么初始化