dcb510cb39f7ad6a8b8643116bf04fce.png

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

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


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

f7c960ea0c52412687ef5f3281c008de.png

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

b027a45b5279a0c730a25731825a03bc.png

前向传播

隐含层

这里我们先计算

的输入:

8f1b1d946cd3b2328151ef5d7420c569.png

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

b7c48f656e3b503187092e89d24134ec.png

同理,可以得到

的结果:

c13d3bcf36bbe02893840bff3f45f4c1.png

输出层

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

的输出如下:

4cabf399c6bc71c37ffeac22850a45b3.png

同理可以得到

的输出:

e11a3906a39235e96bb23fed272109a5.png

误差计算

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

ba8e92ca30468d8c0956365415f49215.png

有了output,之后分别计算

的误差:

cab880547f005afa6e3d118031f4b1b1.png

7ef96e03c266654e089ed804c943bbd0.png

则,总误差为:

bf29c06ac35aa86e1b342fb3255fef1b.png

反向传播

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

)进行更新。

输出层-->隐含层

(1)

的更新

a7b19b0d7717e4d2e62e2f55b04a5678.png

进一步解释:

965278f354e0d5ec01f49351f2f8bba9.png

为了求出

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

首先计算对

的梯度:

8192c310f57802437b6904afe9f8b6f4.png

其次计算对

的梯度:

1cb37b053e186ffc36f915683ca16d6b.png

之后计算对

的梯度:

0981503cfcad783f3ca595a93f62189f.png

最后得到的

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

7cb6e7d8423f2d55794163a34ebc592c.png

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

为:

d55c37afccb9d9294ee404015214e380.png

同理,可对

完成一次更新:

e8097ce7f718f71ca60055ab93950ad4.png

(2)

的更新

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

731eefbb17957c3b01cf313c0f51f90e.png

得到一个更新之后的

为:

6553839781cf92bac0633caf5fd5b21b.png

隐含层-->输入层

(1)

的更新

对于

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

11299916085bcf777c9cb5d75356bc41.png

更进一步说明:

9633542bfd501dfeb1e1585ef659d777.png

根据上图,我们知道

都有作用,因此:

6745292c6cc43791aad17124e9375699.png

先计算上式第一个因式

47eed92cd898d679a24395b1a2d3eac8.png

d04b6f04a66a2cf97796e763cd844da6.png

1215cd38823455ba59ef8a6270b51352.png

所以

743b1ec94e86ecc7092aa78dfbc46ff8.png

将它们相乘得到:

85648ca6f79fe7e64e0f4a76533073ca.png

同理,对第二个因式

182b7b324be0be7a919f009de5287c90.png

因此

161e15603c766605f42dba87ceafb394.png

之后,我们可以得到

546d2af2424833629d415cd9efce8a9e.png

3e7ccc6bda556732185bf6b7e112d943.png

这样,就得到了

的梯度

dfa0c4cd470e3e298feec5c8514dfc10.png

更新之后的

5ecb57bdf258afbd093a3cfc0dcc7e10.png

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

bb081b05de20d3482c3ba1ad27e067f7.png

(2)

的更新

545606c66fe8bb625fe63d0e87c076a0.png

可得

的梯度

54c308ee987c2052d758b59963da25d6.png

则,完成一次更新后的

9ceab57309e8523c7e44a6b3445c0b0d.png

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

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

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐