天天看點

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

推薦圖書:《資料準備和特征工程》

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

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

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

換個表述方式

在(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年代後期,人們也遇到了一些限制,尤其是當人們試圖用反向傳播來訓練深層神經網絡(即具有許多隐藏層的網絡)的時候。

總括反向傳播

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

閱讀更多精彩文章

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

繼續閱讀