神经网络--反向传播

172 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

上一篇博客提到了学习率的概念,这一篇博客所讲述的反向传播也会用到这个概念,反向传播最终更新权重的时候会用到学习率,之所以这一点在开篇就说明,是希望读者看到此篇博客的时候不要有抵触的心理,公式的推导也没有那么难,就是基本的链式求导。如下图所示,为一个简单的神经网络,包括输出层i,隐藏层h,输出层o,在隐藏层与输出层之前使用sigmoid激活函数。

1.PNG

每层之间的权重和偏置项已经标出,后面的公式计算全部用标出的符号表示,当然除了带入符号之外,也可以替换成相应的数字用于查验每次参与计算得到的结果,这样做的目的是使得计算更容易直观化展示。

前向传播

i->h(输入层到隐藏层)

h1 = 1i * w1 + i2 * w2 + b1

h2 = i1 * w3 + i2 * w4 + b1

h->o(隐藏层到输出层)别忘记激活函数

S(o1) = 1/(1+e^h1)

S(o2) = 1/(1+e^h2)

o1 = S(o1) * w5 + S(o2) * w6 + b2

o2 = S(o1) * w7 + S(o2) * w8 + b2

至此,前向传播就结束了,由输入得到输出形成了一个完整的过程。假设我们预期的输出值为o11和o22,那么o11-o1和o22-o2,就是真实值与计算值的误差。

反向传播

首先,说明总误差的概念。单独的误差由前向传播的末尾已经给出,那么总误差的计算公式如下

Σs = Σ(1/2(oii - oi)^2)

上面这个公式啥意思呢,乍一看可能不明白,我以上面神经网络为例进行说明,

Σs = 1/2((o22-o2)^2+(o11-o1)^2),

就是一个求误差的平方和公式而已。

h->i(隐藏层到输出层)

以求解w5的更新为例,

2.PNG

对于

3.PNG 求偏导数不要怕,我只是将公式符号化了,没啥难的,这个意思就是对sigmoid函数求导,等同于对1/(1+e^-x)求导数

对于上式子的第一项

4.PNG

这么一计算不就出来了吗,o11和o1都是已知的数值,直接带进去就完事。 对于第二项,就是对sigmoid函数求偏导,这里就不介绍sigmoid函数求导的过程了,直接给出结果

5.PNG

对于第三项

6.PNG

这样,对于w5的计算反向传播就计算完成了,下面就是要更新w5。那么怎么更新w5呢,这个时候就需要用到开篇介绍的学习率了

7.PNG

求w1的时候特别注意了,求w5是o1->s(o1)->w5进行计算,上面已经详细叙述过了,而w1与求w5不同之处在于,w1的更新仍然会受到o1和o2两个方面的影响,所以计算的时候要特别注意,不要落下。

10.png

下面依次计算

11.png

12.png

13.png

14.png

155.png

Inked16_LI.jpg

177.png

188.png

Inked19_LI.jpg

最后,就完成了误差反向传播的计算,后面的一张图借鉴了网上的图片,感觉这位大神讲的非常透彻,比我自己写写画画的清楚一些,而且我有些地方也理解错了,时看到这位大神的博客后顿悟的。