这几天在学习深度学习方面的知识,学习到反向传播的时候真的是满脑子的疑惑。这篇博客主要是想按照自己的理解说一下感受
主要的参考博客是我在知乎上看到的,算是转载,但是我想自己推导一下,加深印象。原博知乎链接:
MrLi:神经网络BP反向传播算法推导zhuanlan.zhihu.com以及觉得很好懂得反向传播的博客链接:
EdisonGzq:深度学习---反向传播的具体案例zhuanlan.zhihu.com后面参考了CSDN上面的博客来理解反向传播与激活函数的关系。
https://blog.csdn.net/xierhacker/article/details/53431207blog.csdn.net(写这篇博客只是为了自己加深印象如果原博主觉得有抄袭成分请告知,我删博。同时感谢一下前辈们的辛苦付出,让我们菜鸟能更好去了解,我也是参考了以上这些博客对反向传播算法有了更深刻的理解)
一、符号说明
首先定义一下符号的表达:
二、神经网络的示意图
根究神经网络示意图可得到如下公式:
第
第
其中,
其中
最后令
cost
三、反向传播
假设神经网络中的某个权重
权重
该误差将进一步传递到下一层,使下一层的所有神经元的激活函数输出都产生一个误差:
同理,这些误差都将沿着网络往下一层传递,直至到达输出层,从而使代价函数产生一个误差
根据导数的定义可知:
因而可以通过仔细跟踪
首先,我们考察由
由于第
因而,有向量表达:
其中
其中
同理,可写出
最后,输出层神经元的误差将使代价函数
将上面的式子代入可得到:
其中
再代入
令
化简得:
同理继续代入
代入
再代入
因此,
化简得:
至此我们得到代价函数关于权重系数的偏导数,对于偏置项
替换
因此,
以上就是所有的公式的推导。
下面给出反向传播算法的实现步骤:
- 输入:特征
、初始权重、,并令;
- 前向传播:令
,计算及;
- 输出误差
;
- 误差反向传播:令
,计算;
- 输出:代价函数
的梯度,,
- 更新权值和偏置:
和
现在,来根据得到的公式然后再来深入回顾一下这几个公式,说一下背后的思想,这里主要是参考了CSDN的一篇博客,链接入下:
https://blog.csdn.net/xierhacker/article/details/53431207blog.csdn.net公式1:
公式2:
公式3:
公式4:
假如我们这里的输出层用的激活函数是sigmoid,公式及形状如下图所示
函数的值域为(0,1),而且函数值趋向于0和趋向于1的时候,函数都变得平坦,意味着这个函数的导数越来越趋向于0。那么根据公式1可以知道最后一层的误差也会变得很小,根据公式3和公式4,权值和偏置学习的速度也会变得很小。所以,对于sigmoid激活函数来说,当输出层的激活值过大或者过小的时候,学习速度都会变小,我们称输出函数已经饱和。
从公式2中可以看出非输出层的误差
前面说的总结起来就是:当输入的神经元的激活值
上面的结论也启发我们设计一些激活函数:比如说避免激活函数的导数等于0。