一个例子搞懂神经网络前向传播和反向传播

最近学习神经网络的前向和反向传播,读起来比较难懂,一大堆的公式推导,现在,我用一个例子来对前向传播和反向传播进行讲解。

我们要讲解的例子如下所示:

在这里插入图片描述

在上述例子中,我们设输入 x 1 = 0.1 , x 2 = 0.2 x1=0.1,x2=0.2 x1=0.1,x2=0.2,各权重为 w 1 = 0.15 , w 2 = 0.25 , w 3 = 0.3 , w 4 = 0.35 , w 5 = 0.4 , w 6 = 0.36 , w 7 = 0.45 , w 8 = 0.5 w1=0.15,w2=0.25,w3=0.3,w4=0.35,w5=0.4,w6=0.36,w7=0.45,w8=0.5 w1=0.15,w2=0.25,w3=0.3,w4=0.35,w5=0.4,w6=0.36,w7=0.45,w8=0.5 ,偏置项的值始终为1,其权重分别为 b 11 = b 12 = 0.3 , b 21 = b 22 = 0.6 b11=b12=0.3,b21=b22=0.6 b11=b12=0.3,b21=b22=0.6 ,输出为 o 1 = 0.5 , o 2 = 1 o1=0.5,o2=1 o1=0.5,o2=1,设隐藏层和输出层的激活函数都为 s i g m o i d sigmoid sigmoid 函数。

1. 前向传播

  1. 计算 x → h x \rightarrow h xh
    h 1 h1 h1 的输入为 i n p u t h 1 input_{h1} inputh1,则可以计算出
    i n p u t h 1 = w 1 ∗ x 1 + w 3 ∗ x 2 + b 11 ∗ 1 = 0.15 ∗ 0.1 + 0.3 ∗ 0.2 + 0.3 ∗ 1 = 0.375 \begin{aligned} input_{h1} &= w1 * x1 + w3 * x2 + b11 * 1 \\ &= 0.15*0.1 + 0.3*0.2+0.3*1 \\ &= 0.375 \end{aligned} inputh1=w1x1+w3x2+b111=0.150.1+0.30.2+0.31=0.375同理可计算出
    i n p u t h 2 = w 2 ∗ x 1 + w 4 ∗ x 2 + b 12 ∗ 1 = 0.25 ∗ 0.1 + 0.35 ∗ 0.2 + 0.3 ∗ 1 = 0.395 \begin{aligned} input_{h2} &= w2 * x1 + w4 * x2 + b12 * 1 \\ &= 0.25*0.1 + 0.35*0.2+0.3*1 \\ &= 0.395 \end{aligned} inputh2=w2x1+w4x2+b121=0.250.1+0.350.2+0.31=0.395

  2. 计算隐藏层
    由于激活函数为 s i g m o i d sigmoid sigmoid 函数,所以,可以得到
    o u t p u t h 1 = 1 1 + e − i n p u t h 1 = 0.5926665999540697 o u t p u t h 2 = 1 1 + e − i n p u t h 2 = 0.5974857658270161 output_{h1} = \frac{1}{1+e^{-input_{h1}}}=0.5926665999540697 \\ output_{h2} = \frac{1}{1+e^{-input_{h2}}}=0.5974857658270161 outputh1=1+einputh11=0.5926665999540697outputh2=1+einputh21=0.5974857658270161

  3. 计算 h → o h \rightarrow o ho
    o 1 o1 o1 的输入为 i n p u t o 1 input_{o1} inputo1,则可以计算出
    KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲ input_{o1} &= …同理可计算出
    i n p u t o 2 = w 6 ∗ o u t p u t h 1 + w 8 ∗ o u t p u t h 2 + b 22 ∗ 1 = 0.36 ∗ 0.5926665999540697 + 0.5 ∗ 0.5974857658270161 + 0.6 ∗ 1 = 1.1121028588969732 \begin{aligned} input_{o2} &= w6 * output_{h1} + w8 * output_{h2} + b22 * 1 \\ &= 0.36*0.5926665999540697 + 0.5*0.5974857658270161+0.6*1 \\ &= 1.1121028588969732 \end{aligned} inputo2=w6outputh1+w8outputh2+b221=0.360.5926665999540697+0.50.5974857658270161+0.61=1.1121028588969732

  4. 计算输出层
    由于激活函数为 s i g m o i d sigmoid sigmoid 函数,所以,可以得到
    o u t p u t o 1 = 1 1 + e − i n p u t o 1 = 0.7513705371459397 o u t p u t o 2 = 1 1 + e − i n p u t o 2 = 0.7525209414502783 output_{o1} = \frac{1}{1+e^{-input_{o1}}}=0.7513705371459397 \\ output_{o2} = \frac{1}{1+e^{-input_{o2}}}=0.7525209414502783 outputo1=1+einputo11=0.7513705371459397outputo2=1+einputo21=0.7525209414502783

2. 反向传播

反向传播实则就是求各个权重对损失函数的梯度,然后按照负梯度的方向对各个损失函数进行梯度下降处理。

  1. 计算损失
    在这里,我们使用平方差损失来作为损失函数,由此可以得到总损失表达如下:
    E a l l = E o 1 + E o 2 = 1 2 ( o 1 − o u t p u t o 1 ) 2 + 1 2 ( o 2 − o u t p u t o 2 ) 2 = 1 2 ( 0.5 − 0.7513705371459397 ) 2 + 1 2 ( 1 − 0.7525209414502783 ) 2 = 0.06221651568284743 \begin{aligned} E_{all} &=E_{o1}+E_{o2} \\ &=\frac{1}{2}(o1-output_{o1})^2+\frac{1}{2}(o2-output_{o2})^2 \\ &= \frac{1}{2}(0.5-0.7513705371459397)^2+\frac{1}{2}(1-0.7525209414502783)^2 \\ &= 0.06221651568284743 \end{aligned} Eall=Eo1+Eo2=21(o1outputo1)2+21(o2outputo2)2=21(0.50.7513705371459397)2+21(10.7525209414502783)2=0.06221651568284743下面我们以 w 5 w5 w5 为例,更新权重。

  2. 计算偏导数
    为了更新 w 5 w5 w5,使得更新后的 w 5 w5 w5 能够更加准确的拟合,我们需要计算出损失函数对 w 5 w5 w5 的偏导数,然后按照梯度下降的方向对 w 5 w5 w5 进行更新, w 5 w5 w5 的偏导数表示如下:
    ∂ E a l l ∂ w 5 = ∂ E a l l ∂ o u t p u t o 1 ⋅ ∂ o u t p u t o 1 ∂ i n p u t o 1 ⋅ ∂ i n p u t o 1 ∂ w 5 \frac{\partial E_{all}}{ \partial w5}=\frac{ \partial E_{all}}{ \partial output_{o1}} \cdot \frac{ \partial output_{o1}}{ \partial input_{o1}} \cdot \frac{ \partial input_{o1}} { \partial w5} w5Eall=outputo1Eallinputo1outputo1w5inputo1至于为什么这么表示呢,我们只截取一部分原图来讲解,请看下图
    在这里插入图片描述
    上图中,与 w 5 w5 w5 有关系的我已经用红线画出来了, w 5 w5 w5 能够影响到最后结果的途径就是我红线画出来的东西,以上途径中包含三个部分,一是对 w 5 w5 w5 的加权,而是对 o 1 o1 o1 输入的激活函数,三是对激活后的输出进行的损失计算,这三个部分都有 w 5 w5 w5 的影响在里面,所以根据链式求导法则, w 5 w5 w5 的偏导数表示如上。
    对上面的每一部分进行计算
    ∂ E a l l ∂ o u t p u t o 1 = ∂ [ 1 2 ( o 1 − o u t p u t o 1 ) 2 + 1 2 ( o 2 − o u t p u t o 2 ) 2 ] ∂ o u t p u t o 1 = − ( o 1 − o u t p u t o 1 ) = 0.2513705371459397 ∂ o u t p u t o 1 ∂ i n p u t o 1 = ∂ 1 1 + e − i n p u t o 1 ∂ i n p u t o 1 = 0.18681285305496176 ∂ i n p u t o 1 ∂ w 5 = ∂ [ w 5 ∗ o u t p u t h 1 + w 7 ∗ o u t p u t h 2 + b 21 ∗ 1 ] ∂ w 5 = o u t p u t h 1 = 0.5926665999540697 \begin{aligned} \frac{ \partial E_{all}}{ \partial output_{o1}} &=\frac{ \partial [\frac{1}{2}(o1-output_{o1})^2+\frac{1}{2}(o2-output_{o2})^2]}{ \partial output_{o1}} \\ \\ &=-(o1-output_{o1}) \\ \\ &=0.2513705371459397 \\ \\ \frac{ \partial output_{o1}}{ \partial input_{o1}}&=\frac{ \partial \frac{1}{1+e^{-input_{o1}}}}{ \partial input_{o1}} \\ \\ &=0.18681285305496176 \\ \\ \frac{ \partial input_{o1}} { \partial w5} &=\frac{ \partial [w5 * output_{h1} + w7 * output_{h2} + b21 * 1]} { \partial w5} \\ \\ &= output_{h1} =0.5926665999540697 \end{aligned} outputo1Eallinputo1outputo1w5inputo1=outputo1[21(o1outputo1)2+21(o2outputo2)2]=(o1outputo1)=0.2513705371459397=inputo11+einputo11=0.18681285305496176=w5[w5outputh1+w7outputh2+b211]=outputh1=0.5926665999540697 所以有,
    ∂ E a l l ∂ w 5 = ∂ E a l l ∂ o u t p u t o 1 ⋅ ∂ o u t p u t o 1 ∂ i n p u t o 1 ⋅ ∂ i n p u t o 1 ∂ w 5 = 0.027831177385208006 \begin{aligned} \frac{\partial E_{all}}{ \partial w5} &=\frac{ \partial E_{all}}{ \partial output_{o1}} \cdot \frac{ \partial output_{o1}}{ \partial input_{o1}} \cdot \frac{ \partial input_{o1}} { \partial w5} \\ \\ &= 0.027831177385208006 \end{aligned} w5Eall=outputo1Eallinputo1outputo1w5inputo1=0.027831177385208006

  3. 更新权重
    得到了 w 5 w5 w5 的偏导数后,对其进行负梯度的更新,此时的更新需要设置一个学习率 η \eta η,它能够控制每一轮从负梯度中更新多少,这里我们设置 η = 0.3 \eta=0.3 η=0.3,得到
    w 5 = w 5 − η ∗ ∂ E a l l ∂ w 5 = 0.4 − 0.3 ∗ 0.027831177385208006 = 0.3916506467844376 \begin{aligned} w5&=w5-\eta * \frac{\partial E_{all}}{ \partial w5} \\ \\ &=0.4-0.3 * 0.027831177385208006 \\ &= 0.3916506467844376 \end{aligned} w5=w5ηw5Eall=0.40.30.027831177385208006=0.3916506467844376按照同样的方式可以更新其他参数,需要注意的是,在更新 w 1 w1 w1 等参数时,其产生的影响会有不止一条路径,将其进行相加即可,如下图的红线即为 w 1 w1 w1 施加影响的路径:
    在这里插入图片描述

按照上述方法反复进行前向传播、反向传播,即可不断更新权值,不断的优化神经网络,使损失逐渐减小。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值