反向传播算法(过程及公式推导)_神经网络反向传播算法的公式推导

52fab0f62fc0ffe5646eec1dc2fdad16.png

这几天在学习深度学习方面的知识,学习到反向传播的时候真的是满脑子的疑惑。这篇博客主要是想按照自己的理解说一下感受

主要的参考博客是我在知乎上看到的,算是转载,但是我想自己推导一下,加深印象。原博知乎链接:

MrLi:神经网络BP反向传播算法推导​zhuanlan.zhihu.com

以及觉得很好懂得反向传播的博客链接:

EdisonGzq:深度学习---反向传播的具体案例​zhuanlan.zhihu.com
cc61b99662b0e78a9b29224704757dff.png

后面参考了CSDN上面的博客来理解反向传播与激活函数的关系。

https://blog.csdn.net/xierhacker/article/details/53431207​blog.csdn.net

(写这篇博客只是为了自己加深印象如果原博主觉得有抄袭成分请告知,我删博。同时感谢一下前辈们的辛苦付出,让我们菜鸟能更好去了解,我也是参考了以上这些博客对反向传播算法有了更深刻的理解)

一、符号说明

首先定义一下符号的表达:

—— 神经网络的总层数

—— 第
层神经元的个数

—— 连接第
层的第
个神经元和第
层的第
个神经元的权重系数

—— 第
层的第
个神经元的截距项(bias)

—— 第
层神经元的权重系数矩阵(由
构成的矩阵)

—— 第
层神经元的截距向量(由
构成的向量)

—— 第
层的第
个神经元的加权输入

—— 第
层神经元的加权输入向量,其每个元素为

—— 第
层的第
个神经元的激活函数输出

—— 第
层神经元的激活函数输出向量,其每个元素为

二、神经网络的示意图

86debd4c162dd3d8d4f098155dbe8210.png
神经网络示意图

根究神经网络示意图可得到如下公式:

层第
个神经元的加权输入为:

层第
个神经元的激活输出为:

其中,

为神经网络采用的激活函数,写成向量形式为:

其中

最后令

表示整个神经网络的代价函数,其应是关于最后一层的输出
的函数,即:

cost

三、反向传播

假设神经网络中的某个权重

有很小的扰动误差
,如下图所示:

fe181648d385a767e91a06629c4dfc57.png

权重

的这个很小的变化将使对应的神经元的激活函数输出产生一个很小的误差

164576ec63adcc24c0d8091c363d3f9c.png

该误差将进一步传递到下一层,使下一层的所有神经元的激活函数输出都产生一个误差:

249b4932eb83c636ca229495a2d19d99.png

同理,这些误差都将沿着网络往下一层传递,直至到达输出层,从而使代价函数产生一个误差

:

c9da913529ba4c00c6c995cf0229de8f.png

根据导数的定义可知:

因而可以通过仔细跟踪

如何产生
的过程来求取
。下面将给出详细推导过程。

首先,我们考察由

直接使第
层的第
个神经元产生的误差
,根据偏导数定义有:

由于第

层的第
个神经元回对第
层的每一个神经元的输出都产生误差,因此第
个神经元的输出误差为:

因而,有向量表达:

其中

表示将两个向量按元素对应相乘的运算,
表示第
层权重矩阵的第
列。进一步考察第
层的第
个神经元,由于
层的一个神经元将受到
层的所有神经元输出的影响,即有
中误差传递线路,因而需对所有误差传递线路累加求和

其中

表示
层权重矩阵的第
行,对
层的所有神经元写成向量形式有:

同理,可写出

直至

最后,输出层神经元的误差将使代价函数

产生误差

将上面的式子代入可得到:

其中

表示激活函数的导数,令
,则上式可简化为:

再代入

表达式有:

化简得:

同理继续代入

、……、
,并令
,可得:

代入

再代入

因此,

化简得:

至此我们得到代价函数关于权重系数的偏导数,对于偏置项

可采用相同的方法求其偏导数,对
,我们有:

替换

中的

因此,

以上就是所有的公式的推导。

下面给出反向传播算法的实现步骤:

  1. 输入:特征
    、初始权重
    ,并令
  2. 前向传播:令
    ,计算
  3. 输出误差
  4. 误差反向传播:令
    ,计算
  5. 输出:代价函数
    的梯度,
  6. 更新权值和偏置:

现在,来根据得到的公式然后再来深入回顾一下这几个公式,说一下背后的思想,这里主要是参考了CSDN的一篇博客,链接入下:

https://blog.csdn.net/xierhacker/article/details/53431207​blog.csdn.net

公式1:

公式2:

公式3:

公式4:

假如我们这里的输出层用的激活函数是sigmoid,公式及形状如下图所示

b650b6af1a5f1bfcdf4c7a520ea31f86.png

函数的值域为(0,1),而且函数值趋向于0和趋向于1的时候,函数都变得平坦,意味着这个函数的导数越来越趋向于0。那么根据公式1可以知道最后一层的误差也会变得很小,根据公式3和公式4,权值和偏置学习的速度也会变得很小。所以,对于sigmoid激活函数来说,当输出层的激活值过大或者过小的时候,学习速度都会变小,我们称输出函数已经饱和。

从公式2中可以看出非输出层的误差

受到其下一层的误差
决定,也就是说,要是输出层“饱和”,那么输出层的误差变小
,那么非输出层的误差也将变得小。而误差变小,根据公式3和公式4,直接导致学习速度的变小。

前面说的总结起来就是:当输入的神经元的激活值

很低,或者输出层神经元饱和了(过高激活或者过低激活),都将导致学习速度的降低。

上面的结论也启发我们设计一些激活函数:比如说避免激活函数的导数等于0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值