zoukankan      html  css  js  c++  java
  • 实例讲解反向传播

    一、背景介绍

     假设我们的训练集每个样本都有两个特征-$x_1, x_2$,也就是下面的$i_1, i_2$,每个样本的标签为$o_1, o_2$(假设标签是二分类,我们用one-hot表示标签)

     我们要用下面的神经网络来进行训练:

    二、前向传播与反向传播

     现在对他们赋上初值,如下图:(你暂时可以认为下面的$o_1=0.01, o_2=0.99$就是我们的标签,真实标签也许应该是$[0, 1]$)

     

     1)前向传播

      输入层到隐藏层

     $net_{h2} = w_3 * i_1 + w_4*i_2 + b_1 * 1$

    $net_{h2} = 0.25 * 0.05 + 0.3 * 0.1 + 0.35 * 1 = 0.3925$

    $out_{h_2} = 0.5968$

      隐藏层---->输出层:

     $net_{o1} = 0.4 * 0.5932 + 0.45 * 0.5968 + 0.6 * 1 = 1.1058$

    $out_{o1} = 0.7514$

     

    $net_{o2} = w_7 * out_{h1} + w_8 * out_{h2} + b_2 * 1$

    $net_{o2} = 0.5 * 0.5932 + 0.55 * 0.5968 + 0.6 * 1 = 1.2248$

    $out_{o2} = 0.7730$

      有了输出,我们的输出和真实值之间的差距是多少呢?

     

     2)反向传播

      计算总误差

     这就是我们当前正向传播后的loss

      隐藏层到输出层的权重更新

      我们先以更新权重$w_5$为例,下面的图可以更直观的看清楚误差是怎样反向传播的

      我们分别计算每个式子的值:

      最后三者相乘:

     

      看看上面的公式,我们发现:

     $frac{partialleft(E_{ ext {total}} ight)}{partialleft(w_{5} ight)}=-left(operatorname{target}_{o 1}- ext {out}_{o 1} ight) * ext { out }_{o 1}left(1- ext {out}_{o 1} ight) * out_{h1}=0.7414 * 0.1868 * 0.5932 = 0.0821$

     

    $frac{partialleft(E_{ ext {total}} ight)}{partialleft(w_{6} ight)}=-left(operatorname{target}_{o 1}- ext {out}_{o 1} ight) * ext { out }_{o 1}left(1- ext {out}_{o 1} ight) * out_{h2}=0.7414 * 0.1868 * 0.5968 = 0.0827$

     

    $frac{partialleft(E_{ ext {total}} ight)}{partialleft(w_{7} ight)}=-left(operatorname{target}_{o 2}- ext {out}_{o 2} ight) * ext { out }_{o 2}left(1- ext {out}_{o 2} ight) * out_{h1}=-0.217 * 0.1755 * 0.5932 = -0.0226$

     

    $frac{partialleft(E_{ ext {total}} ight)}{partialleft(w_{8} ight)}=-left(operatorname{target}_{o 2}- ext {out}_{o 2} ight) * ext { out }_{o 2}left(1- ext {out}_{o 2} ight) * out_{h2}=-0.217 * 0.1755 * 0.5968 = -0.0227$

      有了梯度,可以用来更新$w_5$了:这里学习率设置为0.5

      输入层到隐藏层的权值更新

     

      所以我们要对$w_1$更新的话,$w_1$参与了$net_{h1}$的计算,$net_{h1}$参与了$out_{h1}$的计算,$out_{h1}$参与了$net_{o1}$和$net_{o2}$的计算,$net_{o1}$和$net_{o2}$参与了$out_{o1}$和$out_{o2}$的计算,$out_{o1}$和$out_{o2}$参与$E_{total}$的计算,我们来逐个剖析

      同理,计算出

      两者相加,得到总值

      最后,三者相乘

      这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代。

    三、参考

     本文参考这里,感谢作者的分享!

  • 相关阅读:
    Spring MVC全局异常后返回JSON异常数据
    spring mvc 异常统一处理方式
    Duplicate fragment name ERROR Jetty Maven Plugin
    Android中自己定义组件和它的属性
    stl非变易算法(二)
    unix more命令
    g711u与g729比較编码格式
    MD5的加密和解密(总结)
    js 定义类对象
    润乾报表实现可反复分组报表及改进
  • 原文地址:https://www.cnblogs.com/always-fight/p/12770304.html
Copyright © 2011-2022 走看看