写在前面:最近赶上《模式识别》课程考试,就把BP重新复习了下。猜测老师可能会出这方面的计算题(hhh,也是不知道我哪里来的自信),就学习了Matt Mazur博客的例题。
(再加一句废话:其实在我之前,已经有前辈 @EdisonGzq 写过了,觉得还是有必要自己推,所以就画蛇添足了)
这里我们使用两个输入、隐含层两个神经元、两个输出,其中隐含层和输出层都有偏置,结构如下:
为了能够保证传播过程的顺利进行,这里对参数进行了初始化:
前向传播
隐含层
这里我们先计算
的输入:
之后将输入传递给激活函数(这里使用的是sigmoid激活函数),得到:
同理,可以得到
的结果:
输出层
将隐含层的输出作为输入,对输出层的神经元重复上述过程。
的输出如下:
同理可以得到
的输出:
误差计算
这里我们均方误差作为目标函数:
有了output,之后分别计算
和
的误差:
则,总误差为:
反向传播
反向传播是根据链式求导法则对参数(
和
)进行更新。
输出层-->隐含层
(1)
的更新
进一步解释:
为了求出
的梯度,我们需要计算上式的每个因子。
首先计算对
的梯度:
其次计算对
的梯度:
之后计算对
的梯度:
最后得到的
的梯度就是上式三个因子的乘积:
这里将学习率设为0.5,更新之后的
为:
同理,可对
完成一次更新:
(2)
的更新
(结构图显示每层共用一个偏置,但是个人觉得每个神经元的偏置计算结果应该是不一样的,故应该分别进行更新,这里只对第一个神经元的偏置更新进行说明,下同)
得到一个更新之后的
为:
隐含层-->输入层
(1)
的更新
对于
的梯度,我们需要计算出:
更进一步说明:
根据上图,我们知道
对
都有作用,因此:
先计算上式第一个因式
而
所以
将它们相乘得到:
同理,对第二个因式
因此
之后,我们可以得到
这样,就得到了
的梯度
更新之后的
同理,我们可以得到其余更新后的w
(2)
的更新
可得
的梯度
则,完成一次更新后的
为
这样,我们就完成了一次前向传播和反向传播。
注:除偏置更新的图片外,其余图片均来自Matt Mazur博客。