- 深度學習原理與應用
- 周中元 黃穎 張誠 周新
- 2058字
- 2021-04-30 22:05:39
3.6 誤差反向傳播算法
3.5.5節介紹了通過計算神經網絡參數的梯度(嚴格地說是損失函數關于連接權重的梯度)來尋找最優解,這看起來已經非常完美地解決了參數的最優化問題。但是,人工神經網絡,特別是深度神經網絡的參數非常多,這種計算方法非常耗時。相比而言,誤差反向傳播算法就要高效得多。
誤差反向傳播算法早在20世紀60年代就已經提出,其思想就是根據實際輸出值與期望值之間的誤差大小來修正算法,這與人類習慣的學習校正方法是相通的。
如圖3-21所示,多層神經網絡的演算將結果從左到右逐層向前傳遞,這是“正向”學習過程。與此相反,比較實際輸出與期望輸出之間的誤差的計算過程是反向的。“反向”就是從右到左,把誤差從輸出層開始,反方向逐層傳播到前面各層,與此同時,通過逐層調整連接權重來減小誤差。

圖3-21 神經網絡的誤差反向傳播
為了更好地理解誤差反向傳播算法,下面來推導連接權重調整公式。先以單層感知器為例,如圖3-22所示。

圖3-22 單層單輸出感知器
設激活函數為λ=1的Sigmoid函數y=f(u),根據鏈式求導法則:

單層單輸出感知器的權重調整值公式為:

注:單層感知器的損失函數為,單層單輸出感知器的實際輸出為
下面再來看有兩個輸出的單層感知器的情況,如圖3-23所示。

圖3-23 兩個輸出的單層感知器
兩個輸出的單層感知器的損失函數:

對損失函數求導

wij表示xi和yj之間的連接權重。
上式右側,結果只與yj相關,因此

與單個輸出的感知器運算過程一樣

兩個輸出的單層感知器的權重調整值公式為:
Δwij=η(rj?yj)yj(1?yj)xi
由此可見,連接權重wij的調整值?wij只與其相關的輸入xi和輸出yj有關。
最后看多層感知器的情況。
首先是只有一個輸出單元,w1ij表示輸入層與中間層之間的連接權重,w2j1表示中間層與輸出層之間的連接權重。i表示輸入層單元,j表示中間層單元,如圖3-24所示。

圖3-24 只有一個輸出單元的多層感知器
先調整中間層與輸出層之間的連接權重。
對損失函數E求w2j1的導數

與單層感知器一樣,對損失函數E求導

zj是中間層的輸出值,也是輸出層的輸入值。中間層與輸出層連接權重調整值計算公式為
?w2j1=η(r?y)y(1?y)zj
同樣的方式可以得到輸入層與中間層之間的連接權重調整公式為:
?w1ij=η(r?y)y(1?y)w2j1zj(1?zj)xi
圖3-25總結了只有一個輸出的多層傳感器的權重調整。

圖3-25 只有一個輸出單元的多層感知器的權重調整
對于有多個輸出單元的多層感知器,公式的推導類似,連接權重調整公式為:

有多個輸出單元的多層感知器如圖3-26所示。

圖3-26 有多個輸出單元的多層感知器
同樣用一幅圖片總結一下有多個輸出的多層傳感器的權重調整,如圖3-27所示。與單輸出單元權重調整的不同之處:輸入層與中間層之間的權重調整值是相關單元在中間層與輸出層之間的權重調整值的總和。

圖3-27 有多個輸出單元的多層感知器的權重調整
前面推導中使用的激活函數是λ=1的sigmoid函數。這個函數雖然是可導的,但還有缺點。
從圖3-28中可以看出,當u→∞時,即時,y→0;u→?∞1?y→0,這樣導致
,,因此無法調整連接權重。這是因為梯度值過小,出現了所謂的“梯度消失”問題。
另外一方面,當u→0時,梯度值又過大,出現了“梯度爆炸”問題,如圖3-28所示。

圖3-28 梯度消失和爆炸圖示
造成梯度消失和梯度爆炸的原因:
(1)隱藏層的層數過多;
(2)采用了不合適的激活函數;
(3)權重初始化值過大。
為了防止梯度消失和爆炸,可以采用以下方法:
(1)精選初始化參數,如He初始化;
(2)使用ReLU、Leaky-ReLU、PReLU、Maxout等激活函數替代sigmoid函數;
(3)使用數據規范化處理,通過對每一層的輸出規范為均值和方差一致的方法,消除了權重參數放大縮小帶來的影響,進而解決梯度消失和爆炸的問題;
(4)LSTM的結構設計也可以改善RNN中的梯度消失問題。
前面用數學公式介紹了誤差反向傳遞算法。這樣做雖然很嚴謹,但不易獲得感性認識。還有一種基于計算圖(computational graph)的形式,非常便于直觀地理解誤差反向算法。計算圖將計算過程用圖形表示出來,圖中每個節點表示一個函數,節點之間的連接直線稱為邊,用來表示輸入/輸出變量,變量可以是標量、向量、矩陣、張量甚至是另一類型的變量,如圖3-29所示。

圖3-29 計算圖示例
計算圖是正向表示運算順序,反向可以直觀地表示出誤差的傳遞過程,如圖3-30所示,誤差分析傳播是將誤差值E乘以該節點的偏導數,然后傳遞給上一個節點。

圖3-30 誤差反向傳播圖示
下面用sigmoid函數作為例子來看計算圖是如何完成誤差反向傳播的。其中,值
假定是后面的節點傳遞過來的,如圖3-31所示。

圖3-31 sigmoid函數正向計算和誤差反向傳播圖示
再看一個帶有數值的、含有加法和乘法的例子,重點看誤差反向傳播在加法和乘法運算時的誤差反向傳播所乘數值大小的差別。
有人在超市里購買了2個蘋果、3個橘子,蘋果一個100元,橘子一個150元,另收消費稅10%,一共需要支付多少錢?其正向計算和誤差反向傳播如圖3-32所示。

圖3-32 購物費正向計算和誤差反向傳播圖示
設支付金額為L,蘋果個數為x1,蘋果單價為x2,蘋果總價為u,橘子單價為x3,橘子個數為x4,橘子總價為v,稅率為r,貨物總價為:
L=(u+v)×r=(x1×x2+x3×x4)×r
注意,加法節點反向傳播所乘的偏導數為1,所以輸入的誤差值會原封不動地傳向前一個節點。乘法節點的偏導數正好是另一個乘數,所以誤差傳播會將原誤差值乘以另一個乘數。