Life sucks, but you're gonna love it.

0%

Machine-Learning-2020 | Lecture#4 Deep Learning Preparation - Backpropagation

这一部分还是deep learning的准备课程,就是反向传播。

在更新神经网络参数的过程中,反向传播是很重要的一步。那么如何有效得计算反向传播也同样重要。

正向传播

首先我们来捋一捋神经网络的正向传播过程。

  • 输入 $\bf x = \left[\begin{equation}\begin{array}{c}\bf x1\\bf x_2\end{array}\end{equation}\right] $ ,第$i$ 层的权重为 $\bf w = \left[\begin{equation}\begin{array}{c|c}\bf w{11} \ w{12}\ \bf w{21} \ w_{22} \end{array}\end{equation}\right] $, 激活函数为 $\sigma(z)$, 通过激活函数的结果为 $\bf a$, 然后$\bf a$ 再作为下一层的输入通过神经元,通过激活函数,直到最后一层得到Loss function $\bf L$

反向传播

反向传播的过程是为了求得gradient然后更新每一层的每个神经元的参数。

Chain Rue

这里的 $n$ 表示的是第 $n$ 个training example。那我们只要计算一个example的更新就可以了

Forward Pass

根据Chain rule和我们知道的神经网络结构图,对于一层中的一个神经元,我们可以得到:

从这一层中可以看出,如果我们要求 $w_1$ 对 $C$ 的导数,我们能做的就是求 $z$ 对 $C$ 的倒数乘以 $w_1$ 对 $z$ 的导数。即,

那么,$\frac{\part z}{\part w_1}$ 很好计算,通过之前神经元的结构的例子,我们可以得出 $\frac{\part z}{\part w_1}$ 就是 $w_1$前面连接的输入,即$x_1$

而后面的 $\frac{\part C}{\part z}$ 则不能直接算出。

这样一来,我们把所有接在要求的参数前面的输入都保存下来,这样就可以得到 $\frac{\part C}{\part w_1}$ 导数的第一项。

Backward Pass

那怎么求 $\frac{\part C}{\part z}$ 呢?

根据Chain Rule, 我们可以接着计算 $\frac{\part C}{\part z} = \frac{\part a}{\part z}\cdot \frac{\part C}{\part a}$ 。在这个式子中,$\frac{\part a}{\part z}$ 很好算,因为我们知道激活函数,那么就很容易计算激活函数的导数。那又出现了一个令人头疼的项,就是 $\frac{\part C}{\part a}$。

$\frac{\part C}{\part a}$ 如果接着使用chain rule的话,可以看出 $a$ 是通过 $z’$ 和 $z’’$ 两项来共同影响最后的结果 $C$ 的,所以我们可以得到

而 $\frac{\part z’}{\part a}$ 和 $\frac{\part z’’}{\part a}$ 可以通过 $z’$ 和 $z’’$ 之前接的项来表示,而这时候我们要求的导数又变成了$\frac{\part C}{\part z’}$ 和 $\frac{\part C}{\part z’’}$. 这一项其实和 $\frac{\part C}{\part z}$ 是相似的, 所以计算 $\frac{\part C}{\part z’}$ 的过程是要重复 计算 $\frac{\part C}{\part z}$ 的过程 。

总结一下,

所以看到了吗,在每一层,我们如果想要计算cost function对这层的参数的导数,就要历经这一层之后的所有层,然后求导,这就造成了一个很大而且重复的工作量。所以我们在这里考虑将这些数值保存起来。

怎么保存呢?

  • 先考虑最后的情况

    假设我们的 $z’$ 是最后一层,过了这一层之后我们的 $z’$再过一个激活层就可以得到输出 $y = \sigma(z’)$

    那么,此时的 $\frac{\part C}{\part z’} = \frac{\part y}{\part z’}\cdot \frac{\part C}{\part y}$. 这里等式右边的第一项就是激活函数的导数,即 $\sigma’(z’)$ ;而第二项是根据cost function决定的,是一个constant。那这样我们就可以分别得到 $\frac{\part C}{\part z’}$ 和 $\frac{\part C}{\part z’’}$ 的值。

  • 考虑一般情况

    假设现在 $z’$ 不是最后一层,那么根据刚才算出来的最后一层的值和 $\frac{\part C}{\part z} = \sigma ‘(z)\left [w_3\frac{\part C}{\part z’} + w_4 \frac{\part C}{\part z’’}\right ]$ ,我们可以得到 $\frac{\part C}{\part z}$ 的值。这个式子也可以看做是个反向传送的神经网络。

那么我们最后要算的 $\frac{\part C}{\part w_1}$就可以用forward pass 和backward pass两部分保存的参数相乘得到。