轉載請註明出處:http://www.cnblogs.com/xbinworld/p/4265530.html html
這一篇是整個第五章的精華了,會重點介紹一下Neural Networks的訓練方法——反向傳播算法(backpropagation,BP),這個算法提出到如今近30年時間都沒什麼變化,可謂極其經典。也是deep learning的基石之一。仍是老樣子,下文基本是閱讀筆記(句子翻譯+本身理解),把書裏的內容梳理一遍,也不爲何目的,記下來之後本身能夠翻閱用。node
咱們能夠把NN看作一種通用的非線性函數,把輸入向量x變換成輸出向量y,能夠類比於第一章中的多項式曲線擬合問題。給定輸入集合,目標集合
,sum-of-squares error function定義爲:算法
這一節主要主要是想說明error function也能夠從最大似然估計的角度推導出來的。見(5.12-14)。這一部分從簡了,有時間完善。網絡
(case 2)固然也能夠是二分類問題邏輯迴歸模型(能夠參考第4章邏輯迴歸的內容),處理單一的2分類問題。dom
針對一個樣本的類別的條件機率是一個伯努利分佈Bernoulli distribution:ide
定義在數據集上的error function是cross-entropy:函數
有人證實,採用cross-entropy做爲分類問題的目標函數能夠比最小均方差泛化能力更強,以及訓練更快。優化
(case 3)若是咱們要作的分類是K個獨立二分類分體,那麼上面的條件分佈修改成:lua
error funciton:
這裏講一講參數共享,第一層的神經網絡的參數實際上被output層全部神經元所貢獻,這樣的貢獻能夠減小了必定的計算量同時提升了泛化能力。
(case 4)當咱們考慮不是獨立二分類,而是1-of-K的分類問題,也就是說每個結果是互斥的,咱們須要採用softmax分類:
在數據集上error function定義:
其中,softmax的激勵函數定義爲
上面這一段說明了softmax的一個平移不變性的特性,可是會在regularization框架下消失。
總結一下:
下面講一講優化的方法:
梯度降低(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中逃出。
在這一節中,咱們會討論一種快速計算前向網絡偏差函數E(w)梯度的方法——也就是著名的Error backpropagation算法,或者簡稱 backprop。
值得一提的是,backpropagation在其餘地方也有相似的名稱,好比在multilayer perceptron(MLP)常常也叫作backpropagation network。backpropagation在其中的意思是經過梯度降低的方法來訓練MLP。事實上,大部分算法(訓練)涉及一個迭代過程來最小化目標函數,在這個過程當中基本上有兩個階段:一是計算error function的對於參數的導數,BP正是提供了一種計算全部參數導數的快速、有效方法;二是經過求出的導數來更新原來的參數,最多見的方法就是梯度降低方法。這兩個階段是相互獨立的,這意味着BP算法的思想並非只能用於MLP這樣的網絡,也不是隻能用於均方偏差這樣的error function,BP能夠被用於不少其餘算法。
接下來咱們來推導一下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:
這個結果能夠看作是一種「局部計算」——這個乘積一部分是偏差鏈接在權重
的輸出端,另外一部分是變量
鏈接在權重
的輸入端。上面的形式在邏輯迴歸中也出現過(章節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.1),輸出層是線性輸出,而且採用sum-of-squares偏差,激勵函數採用雙曲正切函數tanh,
而且導數:
定義在一個樣本n上面的偏差函數:
而後計算每個輸出神經元的殘差和隱層神經元的殘差:
最後獲得第一層參數和第二層參數的導數,分別用於梯度降低計算。
神經網絡計算的一個主要問題是計算量大,在以前的模型中,若是有W數量的鏈接(神經元突觸),那麼一次前向傳播的複雜度是O(W),而通常來講W是遠遠大於神經元節點數量的。
在5.48能夠看到,每個參數須要有一次乘法和一次加法。
另一種求倒數的方式是用數值方法,
其中;數值方法計算精度是一個問題,咱們能夠把
變的很是小,直到接近於精度的極限。採用symmetrical central differences能夠大大蓋上上述的精度問題:
可是計算量差很少是(5.68)的兩倍。實際上數值方法的計算不能利用前面的有用信息,每一次導數都須要獨立計算,計算上並不能簡化。
可是有意思的是數值導數在另一個地方有用武之地——gradient check!咱們能夠用central differences的結果和BP算法中的導數進行比較,以此來判斷BP算法執行是不是正確的。