反向传播


前言

反向传播算法是一种训练人工神经网络的常用方法。它通过计算网络中所有权重的梯度,并对权重进行迭代更新,以最小化损失函数。
根据上面的介绍,我们可以得知,反向传播算法的关键,是找出每个权重的梯度,然后可以使用前面讲到的梯度下降方法,进行权重的更新。

三层网络的例子

我们先来看最基本的三层网络。如图,这三层网络分别称为输入层、隐藏层、输出层。对于隐藏层和输出层的每个神经元,输入是上一层输出值的加权和,输出是一个函数值。

正向计算输出

我们先通过初始输入 $[x_1, x_2, x_3]^T$ 和初始参数计算输出。图中: $$\begin{cases} a_4=f_4(w_{41}x_1+w_{42}x_2+w_{43}x_3+b_4) \\ y_1=f_8(w_{84}a_4+w_{85}a_5+w_{86}a_6+w_{87}a_7+b_8) \end{cases}$$
以此类推,最终计算出初始输出 $[y’_1, y’_2]^T$ 。

反向更新权重

现在我们有了初始输出 $[y’_1, y’_2]^T$ 和期望输出 $[y_1, y_2]^T$ 。为了最优化损失函数,我们想到误差取平方和,并使之最小。即我们要得到 $F=(y_1-y’_1)^2+(y_2-y’_2)^2$ 的最小值。为了达到这个目标,我们可以求网络中每个参数的偏导数(即梯度),并利用梯度下降方法不断优化参数。例如,上图中,利用链式求导法则,我们可以求得: $$\begin{cases} \frac {\partial F} {\partial w_{84}} = \frac {\partial F} {\partial y_1} \frac {\partial y_1} {\partial Input_8} \frac {\partial Input_8} {\partial w_{84}} \\ \frac {\partial F} {\partial b_8} = \frac {\partial F} {\partial y_1} \frac {\partial y_1} {\partial Input_8} \end{cases}$$
其中 $Input_8=w_{84}a_4+w_{85}a_5+w_{86}a_6+w_{87}a_7+b_8$ 。类似地:$$\begin{cases} \begin{split} \frac {\partial F} {\partial w_{41}} = &(\frac {\partial F} {\partial y_1} \frac {\partial y_1} {\partial Input_8} \frac {\partial Input_8} {\partial a_4} + \\ &\frac {\partial F} {\partial y_2} \frac {\partial y_2} {\partial Input_9} \frac {\partial Input_9} {\partial a_4}) \frac {\partial a_4} {\partial Input_4} \frac {\partial Input_4} {\partial w_{41}} \end{split} \\ \begin{split} \frac {\partial F} {\partial b_4} = &(\frac {\partial F} {\partial y_1} \frac {\partial y_1} {\partial Input_8} \frac {\partial Input_8} {\partial a_4} + \\ &\frac {\partial F} {\partial y_2} \frac {\partial y_2} {\partial Input_9} \frac {\partial Input_9} {\partial a_4}) \frac {\partial a_4} {\partial Input_4} \end{split} \end{cases}$$
其中 $Input_i$ 表示节点 $i$ 的加权输入。
以此类推,我们可以求得所有参数的偏导数,然后就可以使用梯度下降方法,不断优化,直至收敛。

扩展到多层网络

我们发现,无论网络有几层,我们都可以通过链式法则计算出结果对所有参数的偏导数,进而使用梯度下降,求得最优参数组合。

参考资料

零基础入门深度学习(3) - 神经网络和反向传播算法


坚持原创技术分享,您的支持将鼓励我继续创作!