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

2021-10-12 07:56:13 字數 3849 閱讀 4646

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

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

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

有上面糧食,可得:

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

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

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

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

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

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

這是(bp1)的分量形式。

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

通過求微分,我們得到

代入(42),得:

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

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

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

輸入 :為輸入層設定相應的啟用 。

前向傳播:對於每個 ,計算 和 。

輸出誤差:  :計算向量 .

反向傳播誤差: 對於每個 ,計算 .

輸出: 代價函式梯度的是: 和 .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

反向傳播演算法

首先我們對數學符號做一些約定。我們首先考慮簡單的情況 前饋神經網路,如圖 所示。我們先假設任意兩層之間沒有權值共享。方向傳播演算法本質上就是梯度下降演算法,所以我們要對損失函式關於每個引數求導。設單個輸入例項 x 損失函式為 j x 那麼我們要求解 j wi 和 j bi i 1,2,n 對 j 關...

反向傳播演算法

反向傳播演算法的工作機制為對 錯誤的神經元施以懲罰。從輸出層開始,向上層次查詢 錯誤的神經元,微調這些神經元輸入值的權重,以達到修復輸出錯誤的目的。神經元之所以給出錯誤的 原因在於它前面為其提供輸入的神經元,更確切地說是由兩個神經元之間的權重及輸入值決定的。我們可以嘗試對權重進行微調。每次調整的幅度...

反向傳播演算法

看了很多有關神經網路的資料,一直對於反向傳播演算法總是不理解,對於其過程也是覺得很複雜,讓人想放棄,寫一篇部落格來從頭到尾來擼一遍反向傳播,讓這個黑盒子變透明。主要涉及到的數學方法,就是求偏導數,鏈式法則,沒有其他的複雜的數學公式了 當然求偏導的原理,是利用梯度下降法 因為是要將誤差減小,那麼就需要...