误差反向传播算法(BP)

优化算法基本上都是在反向传播算出梯度之后进行改进的,因为反向传播算法是一个递归形式,通过一层层的向后求出传播误差即可。

计算Loss函数的目的:**计算出当前神经网络建模出来的输出数据与理想数据之间的距离,根据反向传播算法可以不断更新网络中的参数使loss函数不断下降,使输出数据更加理想。

那么如何根据一个网络的loss来更新参数,即如何更新网络节点中的权重w和偏差b的值?

神经网络中的参数说明:
误差反向传播算法(BP)
误差反向传播算法(BP)表示神经网络中第(l-1)层第k个节点到l层中第j个节点之间的权重。(例如图中的权重)
误差反向传播算法(BP)
误差反向传播算法(BP)表示第l层网络在第j个节点处的偏差。(如图中所示)
故该节点可以输出为:
误差反向传播算法(BP)
神经网络输出后会经过一个**函数,用σ表示,则经过**函数输出为:
误差反向传播算法(BP)
通过符号误差反向传播算法(BP)可以对神经网络里面每一个数据准确的表示。

**定义损失函数C:**反向传播就是求∂C/∂w和∂C/∂b,然后将这个值和对应的w,b进行相减就可以实现一次参数的更新。为什么这样的操作可以优化网络,减小loss值呢?

来源于导数概念和速度相关,∂C/∂w和∂C/∂b就是C相对于w和v变化的速度,∂C/∂w的绝对值越大,表示w对C的值影响越大。如果期望C变小,w应该对应减小,但是对于w具体应该减多少并没有确定答案。这里通过变化的速度和学习率相乘作为一个减少值,经多轮迭代,期望c达到最小点。此时无论是局部最小还是全局最小,周围一定是平滑的,所以∂C/∂w和∂C/∂b会趋近于0,参数停止更新。
误差反向传播算法(BP)

**求导:**我们想要求得∂C/∂w和∂C/∂b的值,即对C影响速率的值。需要找到一个中间变量,因为:
误差反向传播算法(BP)
定义:误差反向传播算法(BP)
理用链式求导法则可以求出:误差反向传播算法(BP)
同理:误差反向传播算法(BP)
通过媒介误差反向传播算法(BP)很容易求出∂C/∂w和∂C/∂b。
这里误差反向传播算法(BP)就是误差反向传播算法(BP)对于C的影响大小(联想导数和速率的关系)。其中误差反向传播算法(BP)是第l层的第j个神经元未经过**函数前的输出,所以误差反向传播算法(BP)可以理解为网络中第l层第j个神经元对loss函数的影响。
如何求得误差反向传播算法(BP)的值?
通过递归方式,如果知道误差反向传播算法(BP)误差反向传播算法(BP)之间的关系,就可以推得整个网络的每个节误差反向传播算法(BP)点的值。

1.求得误差反向传播算法(BP)误差反向传播算法(BP)之间的关系:
误差反向传播算法(BP)
误差反向传播算法(BP)
所以:误差反向传播算法(BP)
带入上式可得:误差反向传播算法(BP)
误差反向传播算法(BP)误差反向传播算法(BP)之间的关系:误差反向传播算法(BP)(应把a[l,j]修正为a[l,j]对z[l,j]的偏导)
理解起来就是网络中前一层的某一个神经元对于loss的影响与该层后一层所有的神经元对于loss的影响、该神经元的输出大小、该神经元与后一层神经元连接的权重有关。

2.假设最后一层网络是L,最后一层如何计算:
根据通用链式法则可得:误差反向传播算法(BP)
这里需要注意的是最后一层的**函数是哪一种。最后一层**函数在计算某一个神经元输出时可能会结合其他节点的输出来计算,比如softmax**函数,输出是一个概率值[0,1]。
现在考虑两个具体的损失函数,并且采用之前定义的均方误差损失函数:
误差反向传播算法(BP)
·sigmoid损失函数:误差反向传播算法(BP)
误差反向传播算法(BP)
求导结果:误差反向传播算法(BP)
因为sigmoid输出的值仅与输入的x值有关,所以误差反向传播算法(BP)当k≠j时为0,所以:
误差反向传播算法(BP)
·softmax损失函数:
误差反向传播算法(BP)
函数形式:输出也是[0,1]的值,不过需要依赖最后一层所有的数来计算分母
求导得:
误差反向传播算法(BP)
所以误差反向传播算法(BP)
BP算法总结:
根据上面,BP推导有三部曲,先求出误差反向传播算法(BP),再根据误差反向传播算法(BP)分别求出误差反向传播算法(BP)。总结公式如下:
误差反向传播算法(BP)
(应把a[l,j]修正为a[l,j]对z[l,j]的偏导)
启动上面反传的导火索是最后一层的误差反向传播算法(BP)值,计算公式为:
误差反向传播算法(BP)
参考文章:
https://www.jianshu.com/p/74bb815f612e