Skip to content

Backpropagation

Backpropagation 是一種能有效計算梯度的方法。

我們的網路:

$$x^n \to \text{NN}(\theta) \to y^n \leftrightarrow_{C^n} \hat y^n$$

Gradient Descent Review

假設我們有以下參數:$\theta = \{w_1, w_2, \dots, b_1, b_2, \dots\}$

我們會逐次更新參數如下:$\theta^0 \to \theta^1 \to \theta^2 \to \cdots$

但因為有太多參數,所以我們必需「有效地」更新參數。

給定 loss function:

$$ \begin{aligned} L ( \theta ) & = \sum _ { n = 1 } ^ { N } C ^ { n } ( \theta ) \\ \to \frac { \partial L ( \theta ) } { \partial w } & = \sum _ { n = 1 } ^ { N } \frac { \partial C ^ { n } ( \theta ) } { \partial w } \end{aligned} $$

Backpropagation

假設只考慮其中一個 neuron,則 $z = x_1w_1 + x_2w_2 + b$,我們所要求的是:

$$\frac { \partial C } { \partial w } = \frac { \partial z } { \partial w } \frac { \partial C } { \partial z }$$

透過 forward pass 和 backward pass 可分別算出:

  • Forward pass: Compute $\partial z / \partial w$ for all parameters
  • Backward pass: Compute $\partial C / \partial z$ for all activation function inputs $z$

Forward pass

  • $\partial z / \partial w_1 = x_1$
  • $\partial z / \partial w_2 = x_2$

其實就是 input value 前面所接的值。

你要算出這個 neural network 裡面的每一個 weight 對它的 activation function 的 input $z$ 的偏微分,你就把你的 input 丟進去。然後,計算每一個 neuron 的 output 就結束了。

Backward pass

要計算出 $\frac { \partial C } { \partial z }$ 是非常複雜的,但我們可以透過 chain rule 做些拆解:

$$ \begin{aligned} \frac { \partial C } { \partial z } & = \frac { \partial a } { \partial z } \frac { \partial C } { \partial a } \\ & = \sigma ^ { \prime } ( z ) \left[ \frac { \partial z ^ { \prime } } { \partial a } \frac { \partial C } { \partial z ^ { \prime } } + \frac { \partial z ^ { \prime \prime } } { \partial a } \frac { \partial C } { \partial z ^ { \prime \prime } } \right] \\ & = \sigma ^ { \prime } ( z ) \left[ w _ { 3 } \frac { \partial C } { \partial z ^ { \prime } } + w _ { 4 } \frac { \partial C } { \partial z ^ { \prime \prime } } \right] \end{aligned} $$

想像有另一個 network,方向是反過來的,下面這個網路即和上式所代表的意義一樣:

Case 1. Output Layer

$$ \begin{aligned} \frac { \partial C } { \partial z ^ { \prime } } & = \frac { \partial y _ { 1 } } { \partial z ^ { \prime } } \frac { \partial C } { \partial y _ { 1 } } \\ \frac { \partial C } { \partial z ^ { \prime \prime } } & = \frac { \partial y _ { 2 } } { \partial z ^ { \prime \prime } } \frac { \partial C } { \partial y _ { 2 } } \end{aligned} $$

Case 2. Not Output Layer

Compute $\partial C / \partial z$ recursively until we reach the output layer.

Summary