反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数


写在前面:最近赶上《模式识别》课程考试,就把BP重新复习了下。猜测老师可能会出这方面的计算题(hhh,也是不知道我哪里来的自信),就学习了Matt Mazur博客的例题。

(再加一句废话:其实在我之前,已经有前辈 @EdisonGzq 写过了,觉得还是有必要自己推,所以就画蛇添足了)


这里我们使用两个输入、隐含层两个神经元、两个输出,其中隐含层和输出层都有偏置,结构如下:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播_02


为了能够保证传播过程的顺利进行,这里对参数进行了初始化:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播_03


前向传播

隐含层

这里我们先计算


的输入:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播算法 多层神经网络示意图_04


之后将输入传递给激活函数(这里使用的是sigmoid激活函数),得到:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_05


同理,可以得到


的结果:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_06


输出层

将隐含层的输出作为输入,对输出层的神经元重复上述过程。


的输出如下:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_模式识别_07


同理可以得到


的输出:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_08


误差计算

这里我们均方误差作为目标函数:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_09


有了output,之后分别计算



的误差:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_10


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_11


则,总误差为:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_12


反向传播

反向传播是根据链式求导法则对参数(



)进行更新。


输出层-->隐含层

(1)


的更新


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播算法 多层神经网络示意图_13


进一步解释:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播算法 多层神经网络示意图_14


为了求出


的梯度,我们需要计算上式的每个因子。


首先计算对


的梯度:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_模式识别_15


其次计算对


的梯度:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_16


之后计算对


的梯度:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播算法 多层神经网络示意图_17


最后得到的


的梯度就是上式三个因子的乘积:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_18


这里将学习率设为0.5,更新之后的


为:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播_19


同理,可对


完成一次更新:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_20


(2)


的更新


(结构图显示每层共用一个偏置,但是个人觉得每个神经元的偏置计算结果应该是不一样的,故应该分别进行更新,这里只对第一个神经元的偏置更新进行说明,下同)


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_21


得到一个更新之后的


为:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_22


隐含层-->输入层

(1)


的更新


对于


的梯度,我们需要计算出:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播_23


更进一步说明:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_24


根据上图,我们知道



都有作用,因此:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_25


先计算上式第一个因式


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_26


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_27



反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播_28


所以


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_29


将它们相乘得到:


反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_30


同理,对第二个因式


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_31


因此


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播算法 多层神经网络示意图_32


之后,我们可以得到


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播_33


反向传播算法 多层神经网络示意图 反向传播算法简单例题_模式识别_34


这样,就得到了


的梯度


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_35


更新之后的



反向传播算法 多层神经网络示意图 反向传播算法简单例题_模式识别_36


同理,我们可以得到其余更新后的w


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播_37


(2)


的更新


反向传播算法 多层神经网络示意图 反向传播算法简单例题_反向传播_38


可得


的梯度


反向传播算法 多层神经网络示意图 反向传播算法简单例题_激活函数_39


则,完成一次更新后的



反向传播算法 多层神经网络示意图 反向传播算法简单例题_前向传播和反向传播_40


这样,我们就完成了一次前向传播和反向传播。

注:除偏置更新的图片外,其余图片均来自Matt Mazur博客。