反向傳播算法的工作原理(2)

推薦圖書:《數據準備和特徵工程》

在第一部分(《反向傳播算法的工作原理(1)》)已經得到了如下結論,本文將在前述基礎上,做進一步的證明和解釋。

換個表述方式

在(BP1)和(BP2)中使用了Hadamard積,如果不熟悉它,可以換一種方式表述,利用矩陣乘法:(BP1)可以改寫爲:

其中 是一個方陣,其對角線是 ,非對角線項爲零。請注意,此矩陣通過矩陣乘法作用於

有上面糧食,可得:

對於熟悉矩陣乘法的讀者來說,這個方程可能比(BP1)和(BP2)更容易理解。我之所以關注(BP1)和(BP2),是因爲這種方法在數值上的實現速度更快。

四個基本方程的證明

現在我們將證明(BP1)—(BP4)四個基本方程,它們都是多元微積分鏈式法則的結果。

讓我們從方程(BP1)開始,它給出了輸出誤差的表達式 。爲了證明這個方程,根據定義回想一下

應用鏈式法則,我們可以根據輸出激活的偏導數來重新表示上面的偏導數,

其中, 是對輸出層中所有 個神經元的求和。當 時, 神經元的激活函數輸 只依賴於 神經元的加權輸入 。因此,當 時, 將會消失。所以,我們可以將(37)簡化爲

(38)的右邊第二項 可以寫成 ,然後方程變成

這是(BP1)的分量形式。

接下來,我們將證明(BP2),它給出了 的誤差方程式,這個誤差與下一層的誤差 相關。爲此,我們需要重寫 , 而這個方程式與 相關。我們可以採用鏈式法則:

在最後一行中,交換了右側的兩項的位置,並用了 替換 。要計算 ,請注意

通過求微分,我們得到

代入(42),得:

這就得到了(BP2)的分量形式。

其它兩個方程(BP3)和(BP4),也可以遵循鏈式法則進行證明。此處從略。

反向傳播算法

根據前述方程,下面以算法的形式,顯示地寫出反向傳播算法:

  1. 輸入 :爲輸入層設置相應的激活
  2. 前向傳播:對於每個 ,計算
  3. 輸出誤差:   :計算向量 .
  4. 反向傳播誤差: 對於每個 ,計算 .
  5. 輸出: 代價函數梯度的是: .

研究一下這個算法,你就會明白爲什麼它被稱爲反向傳播。我們從最後一層開始,反向計算誤差向量 。在網絡中反向操作似乎很奇怪,但是如果你考慮反向傳播的證據,反向傳播源於這樣一個事實:代價函數是網絡輸出的函數。爲了瞭解代價是如何隨先前的權重和偏差而變化的,我們需要反覆應用鏈式規則,在各個層中反向操作以獲得可用的表達式。

爲什麼說反向傳播是一種快速算法?

爲什麼說反向傳播是一種快速算法?爲了回答這個問題,我們思考一下計算梯度的另一種方法。想象一下神經網絡研究的早期。也許是上世紀五六十年代,你是世界上第一個想到用梯度下降來學習的人!但要使這個想法奏效,你需要一種計算代價函數梯度的方法。回想一下你的微積分知識,決定看看是否可以用鏈式法則來計算梯度。但是在嘗試了一段時間後,所用的代數知識看起來很複雜,你變得灰心喪氣。所以你試着找到另一種方法。你決定把代價僅僅看作是權重 的函數(稍後我們會回到偏差問題)。你給權重 編號,並希望計算某個特定的權重 。一個很明顯的方法就是使用近似法:

其中, 是一個小正數, 是在 方向上的單位矢量。換句話說,我們可以對 的兩個稍微不同的值的代價 進行計算,然後應用方程(46),以此來估算 ——求極限。我們可以用同樣的思路來計算與偏差相關的偏導數

這種方法看起來非常具有可行性。它在概念上很簡單,而且非常容易實現,只需要幾行代碼。當然,它看起來比用鏈式法則計算梯度的想法更可取!

遺憾的是,雖然這種方法看起來很可取,但是當你實現代碼時,運行過程卻是非常緩慢的。爲了理解原因,假設我們的網絡中有一百萬個權重。對於每個不同的權重 ,我們需要計算 ,以便對 進行計算。這意味着:要計算梯度,我們需要對代價函數進行一百萬次不同的計算,需要通過網絡(每個訓練示例)進行一百萬次的正向傳遞。我們還需要計算 ,所以總共需要通過網絡進行一百萬零一次的傳遞。

而反向傳播則不同,它使我們能夠同時計算所有的偏導數 ,只需通過網絡正向傳遞一次,然後通過網絡反向傳遞。粗略地說,反向傳遞的計算代價與正向傳遞的計算代價大致相同。這種說法貌似合理,但需要進行一些分析才能做出仔細的陳述。之所以“貌似合理”,是因爲在正向傳遞的過程中,主要的計算代價是乘以權重矩陣;而在反向過程中,主要的計算代價是乘以權重矩陣的轉置。這些操作的計算代價顯然是相似的。因此,反向傳播的總代價與僅僅通過網絡進行兩次正向傳播的代價大致相同。把這個代價與我們在(46)的方法中所需的一百萬零一次的正向傳遞的代價進行比較,兩種方法的高下不言而喻!因此,儘管反向傳播看起來比基於(46)的方法更復雜,但實際上它的速度要快得多。

這種提速在1986年首次得到充分的重視,它大大擴展了神經網絡能夠解決的問題的範圍。這進而引起了人們使用神經網絡的熱潮。當然,反向傳播不是靈丹妙藥。即使在20世紀80年代後期,人們也遇到了一些限制,尤其是當人們試圖用反向傳播來訓練深層神經網絡(即具有許多隱藏層的網絡)的時候。

總括反向傳播

正如我所解釋的,反向傳播有兩個謎團。首先,算法到底在做什麼?我們已經繪製出了從輸出反向傳播的誤差圖片。但是當我們做這些矩陣和矢量乘法的時候,我們能不能更深入一點,建立起更多的直覺來理解到底發生了什麼?第二個謎團是,一開始人們是怎樣發現反向傳播的?遵循算法中的步驟,甚至理解對於算法有效性的證明是一回事。但這並不意味着:你對問題的理解深度足以讓你在第一時間發現算法。有沒有一條合理的推理思路可以讓你發現反向傳播算法?在本節中,我將解決這兩個謎團。

爲了提高對算法的直覺,讓我們想象一下,用 更新網絡中的某個權重

權重的變化會導致相應神經元的輸出激活發生變化:

這又會導致下一層的所有激活發生變化:

這些變化又會導致下一層的變化,再下一層的變化,以此類推,直到最後一層發生變化,然後是代價函數的變化:

代價中的變化 與權重中的變化 有關,如下所示

這表明,計算 的一個可能的方法是:仔細研究 中的一個小變化是如何傳播的,從而導致 的微小變化。如果我們能做到這一點,小心地用易於計算的量來表示所有的東西,那麼我們應該能夠計算

試一下。更改 會在 層的 神經元激活中引起一個小的變化 。帶來這一更改的是:

在激活 中的更改將導致下一層中所有激活的改變,即 層的改變。我們將專注於其中某一個激活(比如 )受到影響的方式。

事實上,它會導致以下變化:

代入式(48)中的表達式,我們得到:

當然, 將導致下一層的激活發生變化。事實上,我們可以想象一條從 的整個網絡路徑。每次激活的變化都會導致下一次激活的變化,最後是輸出代價的變化。如果路徑經過激活 ,則得到的表達式是:

也就是說,我們爲所經過的每一個額外的神經元選擇了一個 類型項,以及末尾的 項。這表示 的變化,而變化的原因是:網絡的這條特定路徑上的激活發生了變化。當然, 中的更改可以通過多種路徑傳播,從而影響代價,但我們只考慮一條路徑。爲了計算 的總變化,一種貌似合理的做法是:將權重和最終代價之間的所有可能的路徑相加,即:

總結了路徑上的中間神經元的所有可能的選擇,與(47)相比,我們看到

現在,方程(53)看起來很複雜。然而,它有一個很好的直觀解釋,(53)是 對網絡中某個權重的變化率。這個方程告訴我們的是:網絡中兩個神經元之間的每一條邊都與一個變化因子有關;這個變化因子只是一個神經元的激活相對於另一個神經元的激活的偏導數。從第一個權重到第一個神經元的邊有一個變化因子 。一條路徑的變化因子就是路徑上所有變化因子的乘積。總變化率 是從初始權重到最終代價的所有路徑的速率因子之和。對於單個路徑,此過程如下所示:

到目前爲止,我所提供的是一個啓發性的論證,這也是一種思維方式,考慮網絡中的權重受到干擾時,會發生什麼情況。我只是概述了一個思路,你可以沿着這個思路進一步進行論證。首先,你可以導出方程(53)中所有單個偏導數的顯式表達式。這一點用微積分很容易做到。做完這些之後,你可以試着把所有的指數之和寫成矩陣乘法的形式。結果證明這是乏味的,需要一些毅力,但不需要非凡的洞察力。寫完之後還要儘可能地簡化,你會發現:你最終得到的正是反向傳播算法!所以你可以把反向傳播算法看作是:一種計算所有這些路徑的變化因子之和的方法。或者,換個角度說,反向傳播算法是一種巧妙的方法,它可以追蹤權重(和偏差)的小擾動,這些擾動通過網絡傳播,到達輸出,然後影響代價。

參考鏈接:http://www.math.hkbu.edu.hk/~mhyipa/nndl/chap2.pdf


關注微信公衆號:老齊教室

閱讀更多精彩文章


本文分享自微信公衆號 - 飛槳PPDB(Tsing_Liu)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章