反向傳播演算法

2022-08-23 12:54:14 字數 3196 閱讀 8090

上一節的我們已經知道了前向傳播是如何計算的了。即給定x如何通過各個節點計算出y。

那麼還有乙個問題就是我們如何確定各個神經元的權重,或者如何說訓練乙個神經網路。

在傳統機器學習演算法中我們會使用梯度下降演算法來做權重更新:

\[\theta_j:=\theta_j-\alpha\frac\deltaj(θ)

\]即使用輸出值構造乙個損失函式,然後以權重為自變數,執行梯度下降的更新規則使得損失函式達到最小。

那麼其實bp演算法(之後反向傳播演算法都簡稱為bp演算法,個人習慣)做了一件差不多的事情,但是又有那麼些區別。這是由於神經網路的拓撲結構決定的。

我們可以對比一下神經網路和傳統的機器學習演算法的正向計算:

神經網路:

\[\begin\nonumber

&\vec_1=f(w_1\centerdot\vec)\\ \nonumber

&\vec_2=f(w_2\centerdot\vec_1)\\ \nonumber

&\vec_3=f(w_3\centerdot\vec_2)\\ \nonumber

&\vec=f(w_4\centerdot\vec_3)\\ \nonumber

\end

\]感知機:

\[y=h(x)=\sum_^n\theta_ix_i=\theta^tx

\]所以其實從拓撲結構上來講,感知機甚至可以看做是單層的神經網路。在這種單層的神經網路結構中,對權重求導是簡單的,直接求偏導即可。但是在多層復合函式的神經網路結構中,每個節點都需要被求導,復合函式求導最容易想到的方法就是鏈式法則,然而鏈式法則會存在一些問題。

我們先使用乙個簡單的例子來說明鏈式法則,或者說正向求導為什麼不好,然後引出反向求導來說明反向傳播演算法。

對於乙個比較複雜的表示式:\(e=(a+b)*(b+1)\),我們可以引入兩個中間變數:\(c=a+b\)、\(d=b+1\)且令\(a=2\)、\(b=1\)。

按照鏈式求導法則以\(e\)對\(b\)求偏導的話:

\[\frac = \frac \cdot \frac + \frac \cdot \frac = d \cdot 1+c\cdot1=2b+a+1=5

\]\(e\)對\(a\)求偏導:

\[\frac = \frac \cdot \frac = d\cdot1=b+1=2

\]我們還可以使用計算圖來理解這個過程。

原式用計算圖來表示就是:

前向計算:

並對每個節點單獨計算偏導值:

於是我們如何用這個計算圖來理解復合函式求偏導的過程呢。

對於\(\frac \),計算圖的路徑是a-c-e,相同路徑節點上的值直接相乘就是:\(\frac =1\cdot2\)。

對於\(\frac \),唯一的不同就是,這個偏導值經過兩個路徑,而不同路徑即b-d-eb-c-e之間的值需要相加:\(\frac =1 \cdot 2 + 1 \cdot 3\)。

正向的鏈式求導法則或者在計算圖上遍歷路徑的方法也能求復合函式的偏導數的值。那為什麼要使用bp演算法呢?

神經網路往往是乙個非常大的網路,所以計算成本是非常高的,而上面講解那種方法存在乙個對計算成本非常致命的缺陷。我們在用\(e\)分別對\(a\)和\(b\)求導的過程中c-e路徑被使用了兩次,或者說\(\frac \)被計算了兩次。

也就是說:正向的鏈式求導會存在計算冗餘

以圖為例,那麼其實正向的求導就是自底向上地求導,本圖顯示了各個節點對於b的偏導值,所以遍歷了所有節點只能求得對應單個輸入的偏導值。

反向求導就是自頂向下地求導,這裡看出遍歷完所以節點之後,對應所有輸入的偏導值都可以求出來。

但是,世界上並沒有免費的午餐,反向傳播雖然在時間複雜度上比正向傳播要快,但是反向傳播在計算之前必須要先前向計算一遍,其實也就是反向傳播比起正向傳播在演算法複雜度上利用了空間複雜度換取了時間複雜度

複雜度分析參考引用2。

我們以本圖為例具體說明一下神經網路中bp演算法的計算過程。

\[y'=y(1-y)

\]我們以均方誤差作為損失函式,訓練樣本為\((\vec,\vec)\):

要使損失函式最小:

\[loss = (y_i-t_i)^2

\]對輸出層節點\(i\)求誤差:

\[\delta_i=y_i(1-y_i)(t_i-y_i)

\]那麼帶入節點,比如節點8:

\[\delta_8=y_1(1-y_1)(t_1-y_1)

\]對於隱層節點有:

\[\delta_i=a_i(1-a_i)\sum_}w_\delta_k

\]隨便帶入乙個節點4:

\[\delta_4=a_4(1-a_4)(w_\delta_8+w_\delta_9)

\]以上就是誤差項的求法,將誤差項帶入梯度下降就得到了權重的更新式子:

\[w_\gets w_+\eta\delta_jx_

\]這裡的\(x_ji\)就是節點\(i\)傳遞給節點\(j\)的值。

那麼比如權重\(w_\)的更新方式就是:

\[w_\gets w_+\eta\delta_8 a_4

\]一篇使用計算圖講解反向傳播演算法的文章,強烈推薦

bp演算法的複雜度分析

零基礎入門深度學習(3) - 神經網路和反向傳播演算法

反向傳播演算法

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

反向傳播演算法

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

反向傳播演算法

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