Backpropagation(反向传播)
为什么引入反向传播算法?
因为在神经网络中用gradient descent
太复杂
Chain rule
因为反向传播算法主要是链式法则的应用,所以补充链式法则
两个例子:
Example
以每一层都是两个神经元的全连接神经网络为例:
在神经网络中计算Loss
的时候,是先求出来每一个output
的C
,再对这些C
求和
损失函数和对损失函数求偏微分如下:
那这个式子就可以转化成对n
个C
分别求偏微分,那也就是单独计算出每一个C
,求偏微分,在得到Loss
,假设先考虑一个neuron
所以根据链式法则,要分别计算出z
对w
的偏微分,c
对z
的偏微分
先求z对w的偏微分
根据函数z的表达式可知,z
对w
的偏微分有两部分,z
对w1
的微分和对w2
的微分,很好算,分别是x1
和x2
,可以发现,这两个微分的结果就是这一个neuron
的input
,而且w1
对应的是x1
,w2
对应的是x2
根据上面的规律,不难发现,如果给出一个神经网络,知道input
和weight
,我们可以快速看出一个neuron
的z
对w
的偏微分
再求C对z的偏微分,通过第一个neuron
得到的结果是a
,a
再结果一系列neuron
等得到output C
,所以由链式法则可知,只看第一个neuron
,那么 C
对z
的偏微分就是a
对z
的偏微分乘上C
对a
的偏微分
然后a
假设是由sigmod
函数得到,那么a
对z
的偏微分就是sigmod
对z
的偏微分,记作σ'(z)
C
对a
的微分呢?可以发现,跟后面两个neuron
有关,因为是全连接的神经网络,由链式法则就可以知道,C
对a
的偏微分等于z'
对a
的偏微分乘上C
对z'
的偏微分加上z''
对a
的偏微分乘上C
对z''
的偏微分,z'
对a
的偏微分由前面得到的规律可知,就等于w3
,同理,z''
对a
的偏微分是w4
,然后又剩下了C
对z'
的偏微分,和C
对z''
的偏微分,又要往后看…
假设已经知道了C
对z'
的偏微分,和C
对z''
的偏微分,那么代入C
对z
的偏微分可得到
换一个角度,假设有一个神经网络是下面这样,并且可以表示成对应的公式
现在的问题就是C
对z'
的偏微分,和C
对z''
的偏微分我们并不知道
这两个呢又跟后面全连接的neuron
有关,后面的一个又跟后面的后面有关,一直递推下去的话,我们直到output layer
才能求出来前一层,再一直往前,就可以知道每一个neuron
的C
对z
的偏微分了
所以,来再看一下我们要求的公式
那么,就和清楚的知道,我们从前往后根据weight
和input
就知道每一个neuron
的z
对w
的偏微分了,从后往前,就可以算出每一个neuron
的C
对z
的偏微分了,最终C
对w
的偏微分就可以算出来啦,然后通过下面的式子就得到了Loss
的偏微分