实例讲解反向传播
一、背景介绍
假设我们的训练集每个样本都有两个特征-$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{\partial\left(E_{\text {total}}\right)}{\partial\left(w_{5}\right)}=-\left(\operatorname{target}_{o 1}-\text {out}_{o 1}\right) * \text { out }_{o 1}\left(1-\text {out}_{o 1}\right) * out_{h1}=0.7414 * 0.1868 * 0.5932 = 0.0821$
$\frac{\partial\left(E_{\text {total}}\right)}{\partial\left(w_{6}\right)}=-\left(\operatorname{target}_{o 1}-\text {out}_{o 1}\right) * \text { out }_{o 1}\left(1-\text {out}_{o 1}\right) * out_{h2}=0.7414 * 0.1868 * 0.5968 = 0.0827$
$\frac{\partial\left(E_{\text {total}}\right)}{\partial\left(w_{7}\right)}=-\left(\operatorname{target}_{o 2}-\text {out}_{o 2}\right) * \text { out }_{o 2}\left(1-\text {out}_{o 2}\right) * out_{h1}=-0.217 * 0.1755 * 0.5932 = -0.0226$
$\frac{\partial\left(E_{\text {total}}\right)}{\partial\left(w_{8}\right)}=-\left(\operatorname{target}_{o 2}-\text {out}_{o 2}\right) * \text { out }_{o 2}\left(1-\text {out}_{o 2}\right) * 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}$的计算,我们来逐个剖析
同理,计算出
两者相加,得到总值
最后,三者相乘
这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代。
三、参考
本文参考这里,感谢作者的分享!