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