引言

在神经网络中,为了更有效的计算梯度,需要用到反向传播算法。我们先从链式求导法则开始。

链式求导法

先介绍下链式求导法则,在后面的反向传播算法中会用到。

李宏毅机器学习——深度学习反向传播算法_反向传播算法

那么李宏毅机器学习——深度学习反向传播算法_激活函数_02;

李宏毅机器学习——深度学习反向传播算法_反向传播算法_03

李宏毅机器学习——深度学习反向传播算法_神经网络_04

改变了s会改变x和y,从而改变了z。

李宏毅机器学习——深度学习反向传播算法_深度学习_05

注意,如果改变s会改变多个变量,它们的关系也是成立的。

损失函数

李宏毅机器学习——深度学习反向传播算法_反向传播算法_06

假设给定一组参数李宏毅机器学习——深度学习反向传播算法_激活函数_07,把一个训练数据李宏毅机器学习——深度学习反向传播算法_神经网络_08代入NN(神经网络)中,会得到输出李宏毅机器学习——深度学习反向传播算法_激活函数_09

李宏毅机器学习——深度学习反向传播算法_激活函数_10是输出李宏毅机器学习——深度学习反向传播算法_激活函数_09和实际李宏毅机器学习——深度学习反向传播算法_激活函数_12距离函数,值越大代表越距离远,也就是效果越不好。

那在神经网络训练算法中,损失函数定义为:

李宏毅机器学习——深度学习反向传播算法_神经网络_13

如果把损失函数对参数李宏毅机器学习——深度学习反向传播算法_深度学习_14做微分的话,得到

李宏毅机器学习——深度学习反向传播算法_神经网络_15

只要计算出某一笔数据对李宏毅机器学习——深度学习反向传播算法_深度学习_14的微分,就可以得到李宏毅机器学习——深度学习反向传播算法_激活函数_17李宏毅机器学习——深度学习反向传播算法_深度学习_14的微分。

李宏毅机器学习——深度学习反向传播算法_深度学习_19

假设我们先考虑这个神经元。

李宏毅机器学习——深度学习反向传播算法_神经网络_20

假设只有两个输入李宏毅机器学习——深度学习反向传播算法_深度学习_21,计算李宏毅机器学习——深度学习反向传播算法_反向传播算法_22得到李宏毅机器学习——深度学习反向传播算法_激活函数_23后再代入激活函数,经过多次运算会得到最终的输出李宏毅机器学习——深度学习反向传播算法_神经网络_24

李宏毅机器学习——深度学习反向传播算法_深度学习_25

现在问题是如何计算损失(距离函数)李宏毅机器学习——深度学习反向传播算法_神经网络_26李宏毅机器学习——深度学习反向传播算法_深度学习_14的偏微分李宏毅机器学习——深度学习反向传播算法_神经网络_28

利用链式求导法

李宏毅机器学习——深度学习反向传播算法_深度学习_29

计算李宏毅机器学习——深度学习反向传播算法_神经网络_30的过程叫做正向过程(Forward pass);计算李宏毅机器学习——深度学习反向传播算法_神经网络_31的过程叫做反向过程(Backward pass)

正向过程

李宏毅机器学习——深度学习反向传播算法_反向传播算法_22

李宏毅机器学习——深度学习反向传播算法_激活函数_33

李宏毅机器学习——深度学习反向传播算法_反向传播算法_34

如上图所示,假设输入是李宏毅机器学习——深度学习反向传播算法_反向传播算法_35,上面蓝色神经元的参数:李宏毅机器学习——深度学习反向传播算法_激活函数_36,激活函数是​​​Sigmoid​​​函数;
下面蓝色神经元的参数:李宏毅机器学习——深度学习反向传播算法_激活函数_37

对下面的神经元来说,计算李宏毅机器学习——深度学习反向传播算法_激活函数_38的偏微分,可以很快得出李宏毅机器学习——深度学习反向传播算法_神经网络_39,也就是输入李宏毅机器学习——深度学习反向传播算法_深度学习_40,随着从前往后计算每个神经元的输出,整个过程就可以很快结束,因此叫正向过程。

反向过程

李宏毅机器学习——深度学习反向传播算法_深度学习_41

困难的是如何计算李宏毅机器学习——深度学习反向传播算法_神经网络_31

李宏毅机器学习——深度学习反向传播算法_深度学习_43

假设激活函数是​​Sigmoid​​​函数李宏毅机器学习——深度学习反向传播算法_神经网络_44,然后得到的函数值李宏毅机器学习——深度学习反向传播算法_反向传播算法_45会乘上某个权重(比如李宏毅机器学习——深度学习反向传播算法_激活函数_46)再加上其他值得到李宏毅机器学习——深度学习反向传播算法_反向传播算法_47(注意这里只是一个符号,不是李宏毅机器学习——深度学习反向传播算法_激活函数_23的导数);李宏毅机器学习——深度学习反向传播算法_反向传播算法_45也会乘上权重(比如李宏毅机器学习——深度学习反向传播算法_反向传播算法_50)再加上其他东西得到李宏毅机器学习——深度学习反向传播算法_深度学习_51(注意这里只是一个符号,不是李宏毅机器学习——深度学习反向传播算法_激活函数_23的二阶导数);

李宏毅机器学习——深度学习反向传播算法_反向传播算法_53

李宏毅机器学习——深度学习反向传播算法_神经网络_54

可以这样理解,李宏毅机器学习——深度学习反向传播算法_激活函数_23通过影响李宏毅机器学习——深度学习反向传播算法_反向传播算法_45来影响李宏毅机器学习——深度学习反向传播算法_神经网络_26

李宏毅机器学习——深度学习反向传播算法_激活函数_58

那就剩下

李宏毅机器学习——深度学习反向传播算法_深度学习_59

改变了李宏毅机器学习——深度学习反向传播算法_反向传播算法_45会改变李宏毅机器学习——深度学习反向传播算法_神经网络_61李宏毅机器学习——深度学习反向传播算法_深度学习_51,从而改变了李宏毅机器学习——深度学习反向传播算法_神经网络_26

我们先计算简单的

李宏毅机器学习——深度学习反向传播算法_激活函数_64


李宏毅机器学习——深度学习反向传播算法_激活函数_65

同理

李宏毅机器学习——深度学习反向传播算法_反向传播算法_66

现在难点就是李宏毅机器学习——深度学习反向传播算法_反向传播算法_67李宏毅机器学习——深度学习反向传播算法_深度学习_68

我们这里先假装我们知道这两项的值。然后整理下原来的式子:

李宏毅机器学习——深度学习反向传播算法_激活函数_69

李宏毅机器学习——深度学习反向传播算法_反向传播算法_70

假设有另外一个特殊的神经元,它是上图的样子,输入就是李宏毅机器学习——深度学习反向传播算法_反向传播算法_67李宏毅机器学习——深度学习反向传播算法_深度学习_68,它们分别乘以李宏毅机器学习——深度学习反向传播算法_激活函数_46李宏毅机器学习——深度学习反向传播算法_反向传播算法_50,然后求和得到的结果再乘上李宏毅机器学习——深度学习反向传播算法_深度学习_75
就得到了李宏毅机器学习——深度学习反向传播算法_神经网络_31

李宏毅机器学习——深度学习反向传播算法_激活函数_23在正向传播的过程中已经知道了,因此这里的李宏毅机器学习——深度学习反向传播算法_深度学习_75是一个常数。

说了这么多,还是没说怎么计算李宏毅机器学习——深度学习反向传播算法_反向传播算法_67李宏毅机器学习——深度学习反向传播算法_深度学习_68啊。别急,下面就开始计算。

这里要分两种情况考虑:

李宏毅机器学习——深度学习反向传播算法_深度学习_81

情形一: 红色的两个神经元就是输出层,它们能直接得到输出。

根据链式法则有:

李宏毅机器学习——深度学习反向传播算法_反向传播算法_82

只要知道激活函数是啥就能计算出李宏毅机器学习——深度学习反向传播算法_神经网络_83

李宏毅机器学习——深度学习反向传播算法_深度学习_84也可以根据我们选取的损失函数简单的计算出来。

同理李宏毅机器学习——深度学习反向传播算法_深度学习_68的计算也一样

情形二:红色的不是输出层

李宏毅机器学习——深度学习反向传播算法_激活函数_86

红色的是中间层,它们的激活函数的值会当成下一层的输入继续参数计算。

李宏毅机器学习——深度学习反向传播算法_神经网络_87

如果我们知道李宏毅机器学习——深度学习反向传播算法_激活函数_88李宏毅机器学习——深度学习反向传播算法_反向传播算法_89

同理(回顾一下上面那个特殊的神经元)我们就可以计算李宏毅机器学习——深度学习反向传播算法_神经网络_90

李宏毅机器学习——深度学习反向传播算法_深度学习_91

问题就会这样反复循环下去,我们不停的看下一层,直到遇到了输出层。然后就可以由输出层往前计算出整个NN的所有的参数。

那我们为何不换个角度考虑问题,我们直接先算输出层的偏微分,然后依次往前计算。

李宏毅机器学习——深度学习反向传播算法_激活函数_92

这就是反向传播算法的思想。