一步一步計算反向傳播

反向傳播(Backpropagation) 是訓練神經網絡的一種常見手段。在 神經網絡基礎 這一節裏,咱們提到,肯定好每一個神經節點的權重(weight)與誤差(bias)以後,就能經過前饋(feedforward)肯定神經網絡的輸出,但這只是輸出預測值。咱們還須要根據預測值,來 反推 各個權重與誤差須要如何調整,以使得預測值和指望值偏差更小。這就是反向傳播所作的事情。網絡

要弄明白反向傳播是如何工做的,以一個具體例子計算是最簡單直接的。假設現有一個 3 層的神經網絡以下:函數

假設現有同樣本,輸入爲 0.一、0.5,指望輸出爲 0.九、0.1。咱們初始權重、初始誤差如圖所示:post

接下來咱們經過這個樣本的訓練,來調整初始權重。學習

前饋

首先咱們經過前饋來肯定神經網絡的輸出,也就是預測值。回顧一下神經節點的輸入輸出,它的輸入是上一層各個節點經過權重與誤差計算的結果,咱們記爲 z;它的輸出是 z 通過 激活函數(activation functions)產生的輸出,記爲 a。通式以下:cdn

z^{l}_j = 
\sum_k w^{l}_{jk} a^{l-1}_k + b^l_j
a^{l}_j = \sigma(z^{l}_j)

其中,激活函數定義爲blog

\sigma(x) = \frac{1}{1 + e^{-x}}

先不用過於糾結公式的各個字符的含義,暫時只須要知道計算方法便可。get

帶入得:it

z_{h1} = 0.1 * 0.1 + 0.5 * 0.2 + 0.1 = 0.21
a_{h1} = \sigma(z_{h1}) = 0.549833997
z_{h2} = 0.1 * 0.3 + 0.5 * 0.4 + 0.2 = 0.43
a_{h2} = \sigma(z_{h2}) = 0.605873668

同理算出輸出層:io

z_{o1} = 0.549833997 * 0.5 + 0.605873668 * 0.6 + 0.3 = 0.938441199
a_{o1} = \sigma(z_{o1}) = 0.718784679
z_{o2} = 0.549833997 * 0.7 + 0.605873668 * 0.8 + 0.4 = 1.269582732
a_{o2} = \sigma(z_{o2}) = 0.780671310

這樣咱們完成了一次前饋的計算,獲得了神經網絡的兩個預測值(output),但這和樣本的指望值(target)有必定的偏差。咱們使用 平方偏差函數(squared error function)計算偏差 C,通式爲:function

C = \frac{1}{2n} \sum_{x} \|target-a^L(x)\|^2

帶入值爲:

C_{o1} = \frac{1}{2} * (0.9 - 0.718784679)^2 = 0.016419496
C_{o2} = \frac{1}{2} * (0.1 - 0.780671310)^2 = 0.231656716
C = C_{o1} + C_{o2} = 0.016419496 + 0.231656716 = 0.248076212

也就是說,神經網絡的預測值與實際值有 0.248076212 偏差,咱們的目標就是經過調節權重和誤差,讓這個偏差更小。

反向傳播

反向傳播實際上就是一個求導的過程。若是咱們要知道如何經過改變 w_5,使得總偏差能變小,這其實就是求總偏差 C 對 w_5 求偏導。根據鏈式法則

\frac{\partial{C}}{\partial{w_{5}}} = \frac{\partial{C}}{\partial{a_{o1}}} * \frac{\partial{a_{o1}}}{\partial{z_{o1}}} * \frac{\partial{z_{o1}}}{\partial{w_{5}}}

這個公式的含義實際上就是 w_5 的改變能對 C 形成的影響,接下來分別求等式右邊的三個部分。

首先由於

C = C_{o1} + C_{o2} = \frac{1}{2} * (0.9 - a_{o1})^2 + C_{o2}

其中 C_{o2}a_{o1} 無關,因此 C 對 a_{o1} 求偏導爲

\frac{\partial{C}}{\partial{a_{o1}}} = -(0.9 - a_{o1}) = -0.181215321

接下來求 \frac{\partial{a_{o1}}}{\partial{z_{o1}}},而

a_{o1} = \sigma(z_{o1})

因此

\frac{\partial{a_{o1}}}{\partial{z_{o1}}} = \sigma'(z_{o1})

\sigma'(x) = \sigma(x) * (1 - \sigma(x))

因此帶入可得

\frac{\partial{a_{o1}}}{\partial{z_{o1}}} = a_{o1} * (1 - a_{o1}) = 0.202133264

最後,咱們再看 \frac{\partial{z_{o1}}}{\partial{w_{5}}},由於

z_{o1} = w_5 * a_{h1} + w_6 * a_{h2} + b_3

因此

\frac{\partial{z_{o1}}}{\partial{w_{5}}} = a_{h1} = 0.21

綜上,

\frac{\partial{C}}{\partial{w_{5}}} = \frac{\partial{C}}{\partial{a_{o1}}} * \frac{\partial{a_{o1}}}{\partial{z_{o1}}} * \frac{\partial{z_{o1}}}{\partial{w_{5}}}
= -0.181215321 * 0.202133264 * 0.21
= -0.007692225

爲了使偏差更小,咱們使用 w_5 減去這個數,這裏引入一個較小的 學習速率(learning rate),用來控制梯度降低的速度,這裏取 0.5,則:

w_5 = w_5 - \eta * \frac{\partial{C}}{\partial{w_{5}}} = 0.5 - (-0.007692225) = 0.507692225

另外,計算誤差也是同樣的道理,以 b3 舉例

\frac{\partial{C}}{\partial{b_{3}}} = 
\frac{\partial{C}}{\partial{a_{o1}}} * \frac{\partial{a_{o1}}}{\partial{z_{o1}}} * \frac{\partial{z_{o1}}}{\partial{b_{3}}}

z_{o1} = w_5 * a_{h1} + w_6 * a_{h2} + b_3

因此

\frac{\partial{z_{o1}}}{\partial{b_{3}}} = 1

\frac{\partial{C}}{\partial{b_{3}}} = \frac{\partial{C}}{\partial{a_{o1}}} * \frac{\partial{a_{o1}}}{\partial{z_{o1}}} * \frac{\partial{z_{o1}}}{\partial{w_{5}}}
= -0.181215321 * 0.202133264 * 1
= -0.036629644

因此

b_3 = b_3 - \eta * \frac{\partial{C}}{\partial{b_{3}}} = 0.3 - (-0.036629644) = 0.336629644

同理,咱們能夠計算出新的 w_6w_7w_8w_9b_4,再根據公式計算出新的 w_1w_2w_3w_4b_1b_2。這樣,咱們就完成了一次反向傳播。

相關文章
相關標籤/搜索