反向傳播(英語:Backpropagation,縮寫為BP)是「誤差反向傳播」的簡稱。由於多層前饋神經網絡的訓練經常採用誤差反向傳播算法,人們也常把多層前饋神經網絡稱為BP網絡。
反向傳播算法發明的歷史請參考我的前文《神經網絡簡史》。
多層前饋神經網絡是指通過按某種方式將神經元連接起來,就可構成相關神經網絡。下圖所示為一個熟知的前饋網絡模型,該網絡有L層,第1 層為輸入層,第L層為網絡輸出層。在這個網絡中,前一層神經元全連接到後一層神經元,同層的神經元之間沒有任何連接。
反向傳播通常被認為是基於優化理論的一種監督式學習方法,雖然它也用在一些無監督網絡(如自動編碼器)中。
本文主要內容:
神經網絡應用梯度下降的直觀理解
反向傳播算法的學習過程
反向傳播算法推導
總結探討
本文靈感來源
參考文獻
直觀理解
考慮一個有兩個輸入單元、一個輸出單元、沒有隱藏單元的簡單神經網絡。每個神經元都使用輸入的加權和作為線性輸出。
最初在訓練之前,會隨機分配權重。之後神經元根據訓練實例進行學習,在此情況下包含元組 (x1,x2,t) 的集合,其中 x1與x2是網絡的輸入,t 為正確輸出(在給定相同的輸入時網絡最終應當產生的輸出)。網絡在給定x1 和 x2時,會計算一個輸出 y,很可能與t 不同(因為權重最初是隨機的)。衡量期望輸出t 與實際輸出 y 之間的差異的一個常見方法是採用平方誤差測度:
其中E為差異或誤差。
為什麼採用平方差?其數學背景是最小二乘法,也可以理解為空間兩點的距離或者平方誤差等。最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。最重要的應用是在曲線擬合上。最小平方所涵義的最佳擬合,即殘差(殘差為:觀測值與模型提供的擬合值之間的差距)平方總和的最小化。
舉例來講,考慮單一訓練實例的網絡:(1,1,0),輸入x1 與x2均為1,正確輸出t 為 0(網絡只有一個輸出)。現在若將實際輸出 y 畫在x軸,誤差E畫在y 軸,得出的是一條拋物線。拋物線的極小值對應輸出y,最小化了誤差E。對於單一訓練實例,極小值還會接觸到 x 軸,這意味著誤差為零,網絡可以產生與期望輸出t 完全匹配的輸出y。因此,把輸入映射到輸出的問題就化為了一個找到一個能產生最小誤差的函數的最優化問題。
單一實例的神經網絡的誤差函數非常容易理解,可以通過解方程,直接找到最小值。這裡給一個梯度表示,如下圖,便於理解多實例神經網絡的梯度表示。
反向傳播算法的目的是找到一組能最大限度地減小誤差的權重。尋找拋物線或任意維度中任何函數的極大值的方法有若干種。其中一種方法是通過求解方程組,但這依賴於網絡是一個線性系統,而目標也需要可以訓練多層非線性網絡(因為多層線性網絡與單層網絡等價)。
如果考慮兩個實例呢(依然是單層神經網絡,不考慮非線性變換)?
考慮一個神經元的輸出取決於其所有輸入的加權總和:
其中w1和 w2是從輸入單元到輸出單元相連的權重。因此,誤差取決於輸入到該神經元的權重,也是網絡要學習最終需要改變的。若每個權重都畫在一個水平的軸上,而誤差畫在垂直軸上,得出的就是一個拋物面(若一個神經元有 k 個權重,則誤差曲面的維度就會是k+1,因而就是二維拋物線的k+1維等價)。
拋物面的最小值需要通過梯度下降法求得。如下圖所示。
如果是多個實例呢?並且是多層神經網絡的非線性變換呢?從數學角度看,已經不能通過求解方程組得到最小值,也不能簡單的描繪多維權重係數構成的函數所對應的幾何形狀(比如拋物面)。但是運用抽象推理,大概想像成這樣子:
以上就是神經網絡學習和誤差函數原理的直觀表示。
結合梯度的概念,這裡先給出梯度下降的推導結果(公式所示),下面逐步解釋為什麼有這個推導結果。
這個公式推導所帶出的三個導數非常重要,是影響梯度的三個重要因素。我把上面三個偏導分成三部分來討論,分別對應於誤差函數,激活函數,神經元模型。假設我們要得到的是第i層到第j層的連接權重w_ij,用於梯度的偏導可以通俗的表達為:
下面分別從神經元模型,誤差函數和激活函數的角度解釋這個公式。
一個神經元的基本模型如下圖所示。
通向一個神經元的輸入net_j是之前神經元的輸出o_i 的加權和。若該神經元輸出層後的第一層,輸入層的輸出 o_i就是網絡的輸入 x_i。該神經元的輸入數量是 n。變量 w_ij表示神經元 i 與 j 之間的權重。對於每一個神經元,其對應的輸出為:
從數學的角度來看,神經元模型定義了兩層的複合函數:內層是net_k,外層是φ函數。激活函數φ一般是非線性可微函數(反向傳播要求人工神經元的激勵函數可微)。常用作激活函數的是Sigmoid函數:
或者寫成:
這個函數也被稱為單極性Sigmoid函數。其導數形式很好:
其圖像如何下:
雙極性Sigmoid函數要比較常用。公式如下:
或者寫成(把上式中分子分母同時除以e^z,令x=-2z就得到第二個式子):
其導數為:
其圖像為:
從上圖可以看出,對於Sigmoid函數,當z的取值越來越大後(飽和區),函數曲線變得越來越平緩,意味著此時的導數也越來越小。同樣的,當z的取值越來越小時(飽和區),也有這個問題。僅僅在z取值為0附近時,導數的取值較大。在後文講到的反向傳播算法中,每一層向前遞推都要乘以導數,得到梯度變化值。Sigmoid的這個曲線意味著在大多數時候,我們的梯度變化值很小,導致我們的W,b更新到極值的速度較慢,也就是我們的算法收斂速度較慢。
由於反向傳播使用梯度下降法,需要計算平方誤差函數對網絡權重的導數。假設對於一個輸出神經元,平方誤差函數為:
其中
由梯度的定義,與方向導數有關聯的一個概念是函數的梯度。多元函數的偏導向量構成了梯度,梯度的方向是函數在這點增長最快的方向,那麼函數的偏導在這點的梯度方向也達到最大值。其中,要使用梯度下降法更新 w_ij,必須選擇一個學習速率μ。要加在原本的權重上的變化,等於學習速率與梯度的乘積,乘以-1:
之所以要乘以-1 是因為要更新誤差函數極小值而不是極大值的方向。
從數學的角度看,平方誤差函數形成了對輸出o_j的複合函數:
這個式子無論對於輸出層的神經元,還是隱藏層的神經元,都是成立的。
綜上所述,誤差函數是關於權重的函數,為了在由權重係數構成的多維空間中尋找一個下降最快的梯度方向,我們需要對所有權重係數求偏導。根據複合函數的求導規則,其一般形式為:
反向傳播算法的學習過程
學習過程由信號的正向傳播與誤差的反向傳播兩個過程組成。正向傳播時,輸入樣本從輸入層傳入,經各隱層逐層處理後,傳向輸出層。若輸出層的實際輸出與期望的輸出(教師信號) 不符,則轉入誤差的反向傳播階段。誤差反傳是將輸出誤差以某種形式通過隱層向輸入層逐層反傳,並將誤差分攤給各層的所有單元,從而獲得各層單元的誤差信號,此誤差信號作為修正各單元權值的依據。這種信號正向傳播與誤差反向傳播的各層權值調整過程,是周而復始地進行的。權值不斷調整的過程,也就是網絡學習訓練過程。此過程一直進行到網絡輸出的誤差減少到可接受的程度,或進行到預先設定的學習次數為止。
學習過程的偽碼描述如下:
輸入:訓練集和學習率
初始化網絡權值(通常是小的隨機值)
do
forEach 訓練樣本 ex
prediction = neural-net-output(network, ex) // 正向傳遞,得到當前樣本的輸出
actual = teacher-output(ex)//從監督老師那裡獲得真實輸出
計算輸出單元的誤差 (prediction - actual)//獲得殘差
計算 對於所有隱藏層到輸出層的權值和閾值 // 反向傳遞
計算 對於所有輸入層到隱藏層的權值和閾值 // 繼續反向傳遞
更新網絡權值和閾值 // 輸入層不會被誤差估計改變
until 所有樣本正確分類或滿足其他停止條件
return 權重與閾值確定的多層前饋神經網絡
完整的誤差反向傳播算法包括前向計算和反向傳播兩部分。
反向傳播算法推導
為了最小化誤差E,最終歸結為優化問題。前面說過,反向傳播算法的目的是找到一組能最大限度地減小誤差的權重,在反向傳播中使用的方法是梯度下降法。這樣我們就需要計算誤差函數E對權重的偏導。由上文,誤差函數對權重w_ij的偏導數是三個偏導數的乘積:
我們的目標就是分別求得這三個偏導。
在右邊的最後一項中(神經元模型),只有加權和 net_j取決於 w_ij,因此:
當對一個權重求導時,其他權重就視為常量。這裡如有不確定,把加權和展開即可明白。
對於激活函數部分,神經元j 的輸出對其輸入的導數就是激活函數的偏導數(這裡假定使用Sigmoid函數):
這就是為什麼反向傳播需要的激活函數是可微的。同時,前向傳播時,很容易求得net_j(各層神經元計算得到的加權和),所以該偏導也容易求得。
對於誤差函數部分的偏導,為了方便理解,分輸出層和隱藏層來討論。
如果神經元在輸出層中,因為此時o_j=y以及
所以第一項可以直接算出。
但如果j 是網絡中任一內層(隱藏層),就需要用到鏈式求導法則。
下面以一個神經網絡的局部來說明。神經網絡中相鄰的兩層構成一個計算單元,因此只需要理解第j層和第k(j+1) 層之間的結構和運算,便可以通曉整個網絡的結構和運算(前面說過,層與層之間全連接,同層之間沒有連接)。
注意到我們要求的是第i層到第j層的連接權重w_ij,考慮第j層中的某個神經元的輸出o_j是第k層所有神經元{u,v,…,w}的輸入,把誤差(損失)函數E看作是{u,v,…,w}的函數(注意,這裡的第k層可能是輸出層,也可能是隱藏層;作為輸出層時,既可能是多值輸出,也可能是單值輸出)。可以得到:
這裡應用鏈式求導法則:
最後一步做了兩次替換:
對於上面推導結果,我們發現:
因此,若已知所有關於下一層(更接近輸出神經元的一層)的輸出關於o_k 的導數,則可以計算 o_j的導數。
現在把上述推導放在一起:
此時:
則:
綜上,權重的調整隻和以下因素有關:
前向神經元的輸出(和所調整權重有關的一個前向神經元的輸出作為輸入)
當前神經元的激活函數
所有後向神經元(誤差函數導數,激活函數導數,並一直遞歸下去)及其前向傳播時的權重(這些權重用來作為誤差後向傳播的權重)
遞歸會終結在輸出層,從而使用殘差(y-t)。注意到遞歸的層數以及係數作用,這裡有一大串連乘,如果連乘的數字小於1,則梯度越乘越小,導致梯度消散;如果連乘的數字大於1,則梯度越乘越大,導致梯度爆炸
對於偏置來說,注意到偏置是沒有權重,調整的是偏置本身
總結探討
總結起來,BP的誤差反向傳播思想可以概括為:利用輸出層的誤差來估計出其直接前導層的誤差,再藉助於這個新的誤差來計算更前一層的誤差,按照這樣的方式逐層反傳下去便可以得到所有各層的誤差估計。
BP算法的提出在一定程度上解決了多層網絡參數訓練難的問題,但是其自身也存在如下一些問題。
首先,誤差在反向傳播過程中會逐漸衰減/增大,經過多層的傳遞後將會變得消散/爆炸,這使得BP在深層網絡中並不可行。對於梯度爆炸,則一般可以通過調整神經網絡模型中的初始化參數得以解決。對於無法完美解決的梯度消失問題,目前有很多研究,一個可能部分解決梯度消失問題的辦法是使用ReLU(Rectified Linear Unit)激活函數(σ(z)=max(0,z))。
其次,BP採用最速梯度下降的優化思想,而實際問題的誤差函數通常不是凸的,存在眾多局部極小值點,算法很難得到最優解。極小值問題,有多種解決方案,比如從多個不同的初始點開始搜索,模擬退火,隨機梯度下降,遺傳算法等。但這些都是啟發式,理論上尚缺乏保障。
第三,由於訓練過程中依靠於導數信息來進行權值的調整,當權值調節過大時會使大部分神經元的加權和過大,致使傳遞函數工作於S型函數的飽和區,所以權值的調整會出現停頓的情況。
第四,隱層神經元的個數設置是個未解決的問題,實際應用中通常靠試錯法調整。
第五,BP神經網絡的過擬合,常用的方法是早停和正則化。早停是指:將數據分成訓練集和驗證集,訓練集用來計算梯度,更新連接權和閾值,驗證集用來估計誤差,如果訓練集誤差降低但是驗證集誤差升高,則停止訓練,同時返回具有最小驗證集誤差的連接權和閾值。正則化是指:誤差目標函數中增加一個用於描述網絡複雜度的部分,例如連接權與閾值的平方和。
最後,對於一些複雜網絡的優化問題,BP算法受到學習速率的限制需要花費幾個小時,甚至更長的時間來完成訓練任務。累積BP算法和標準BP算法各有優缺點。
本文靈感來源
影響本文寫作的有幾篇文章。
第一篇是四川大學章毅教授的《一張圖看懂BP算法》,初讀此文,不明覺厲。現在回頭看一下,頗有啟發。文章通過引入敏感性這個概念,提供了一個很好的角度解釋反向傳播。
通過構造敏感性,可以看到前向計算和反向傳播呈中心對稱。它顯示了網絡的前向計算和反向傳播具有相似的計算形式。這對於理解反向傳播的加權和特別有幫助。
文章引入虛擬神經元的概念,來表示加權和的中間過程。在前向計算中, 網絡傳遞的信息是神經元的輸出, 向虛擬神經元施加的映射是激活函數。而在反向傳播中,網絡傳遞的信息是神經元的敏感性。兩個計算均通過虛擬神經元對傳入的信息求和。不同的地方僅在於對虛擬神經元施加非線性映射的方式, 向虛擬神經元施加的映射是與激活函數的導數乘積。
如何理解敏感性呢?其實敏感性就是前面推導梯度求導三部分的誤差函數導數部分,如下圖所示:
用公式表示為:
第二篇文章是《A Step by Step Backpropagation Example》。文章從輸出層開始,一步一步,非常清晰的推導反向傳播算法。如下圖所示:
如果是第一次理解算法,還沒有熟悉形式化推導,該文章很有幫助。文章明晰了一下幾點:
第三篇文章是《反向傳播神經網絡極簡入門》,對於理解形式化推導很有幫助。
文章《Principles of training multi-layer neural network using backpropagation》提供了直觀理解反向傳播的完整例子。
另外,學習的過程是不斷的釐清概念的過程。對於神經網絡,以及機器學習的認識有幾點需要明確(從周志華在《機器學習》第五章中整理):
神經網絡是什麼?神經網絡是由具有適應性的簡單單元組成的廣泛並行互連的網絡,它的組織能夠模擬生物神經系統對真實世界物體所作出的交互反應。
神經網絡和生物神經網絡的關係?周志華在《機器學習》第五章中特別言明:所談的是「人工神經網絡」,而不是生物學意義上的神經網絡。
神經網絡和機器學習的關係?在機器學習中談論神經網絡時指「神經網絡學習」,或者說,是機器學習與神經網絡這兩個學科領域的交叉部分。
神經網絡的學習過程是怎樣的?就是根據訓練數據來調整神經元之間的「連接權」,以及每個功能神經元的閾值;換言之,神經網絡「學」到的東西,蘊含在連接權與閾值中。
反向傳播算法的準確說法應該是誤差反向傳播算法,有時候稱為BP算法或者BP網絡,一般是指用BP算法訓練的多層前饋神經網絡。
神經網絡的結構通常稱為「多層前饋神經網絡」,其中的前饋怎麼理解?「前饋」並不意味著網絡中信號不能向後傳,而是指網絡拓撲結構上不存在環或迴路。
參考文獻
《反向傳播神經網絡極簡入門》
《一張圖看懂BP算法》四川大學 章毅
《神經網絡七十年:回顧與展望》
《BP神經網絡的發展現狀綜述》周政
《基於導數優化的BP學習算法的研究綜述》
《機器學習》第五章:神經網絡 周志華
http://www.cnblogs.com/pinard/p/6437495.html
《Principles of training multi-layer neural network using backpropagation》
http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html
《A Step by Step Backpropagation Example》
英文:https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/
中文: http://yongyuan.name/blog/back-propagtion.html
http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/
https://www.gitbook.com/book/tigerneil/neural-networks-and-deep-learning-zh/details
https://en.wikipedia.org/wiki/Backpropagation
https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/