优化算法基本上都是在反向传播算出梯度之后进行改进的,因为反向传播算法是一个递归形式,通过一层层的向后求出传播误差即可。
计算Loss函数的目的:**计算出当前神经网络建模出来的输出数据与理想数据之间的距离,根据反向传播算法可以不断更新网络中的参数使loss函数不断下降,使输出数据更加理想。
那么如何根据一个网络的loss来更新参数,即如何更新网络节点中的权重w和偏差b的值?
神经网络中的参数说明:
表示神经网络中第(l-1)层第k个节点到l层中第j个节点之间的权重。(例如图中的权重)
表示第l层网络在第j个节点处的偏差。(如图中所示)
故该节点可以输出为:
神经网络输出后会经过一个激活函数,用σ表示,则经过激活函数输出为:
通过符号
可以对神经网络里面每一个数据准确的表示。
**定义损失函数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,参数停止更新。
**求导:**我们想要求得∂C/∂w和∂C/∂b的值,即对C影响速率的值。需要找到一个中间变量,因为:
定义:
理用链式求导法则可以求出:
同理:
通过媒介
很容易求出∂C/∂w和∂C/∂b。
这里
就是
对于C的影响大小(联想导数和速率的关系)。其中
是第l层的第j个神经元未经过激活函数前的输出,所以
可以理解为网络中第l层第j个神经元对loss函数的影响。
如何求得
的值?
通过递归方式,如果知道
和
之间的关系,就可以推得整个网络的每个节
点的值。1.求得和之间的关系:
所以:
带入上式可得:
即
和
之间的关系:
(应把a[l,j]修正为a[l,j]对z[l,j]的偏导)
理解起来就是网络中前一层的某一个神经元对于loss的影响与该层后一层所有的神经元对于loss的影响、该神经元的输出大小、该神经元与后一层神经元连接的权重有关。2.假设最后一层网络是L,最后一层如何计算:
根据通用链式法则可得:
这里需要注意的是最后一层的激活函数是哪一种。最后一层激活函数在计算某一个神经元输出时可能会结合其他节点的输出来计算,比如softmax激活函数,输出是一个概率值[0,1]。
现在考虑两个具体的损失函数,并且采用之前定义的均方误差损失函数:
·sigmoid损失函数:
求导结果:
因为sigmoid输出的值仅与输入的x值有关,所以
当k≠j时为0,所以:
·softmax损失函数:
函数形式:输出也是[0,1]的值,不过需要依赖最后一层所有的数来计算分母
求导得:
所以
BP算法总结:
根据上面,BP推导有三部曲,先求出
,再根据
分别求出
。总结公式如下:
(应把a[l,j]修正为a[l,j]对z[l,j]的偏导)
启动上面反传的导火索是最后一层的
值,计算公式为: