这一部分还是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两部分保存的参数相乘得到。