一、背景介绍

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

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

反向传播算法 java 反向传播算法简单例题_反向传播算法 java

反向传播算法 java 反向传播算法简单例题_反向传播_02

二、前向传播与反向传播

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

反向传播算法 java 反向传播算法简单例题_权值_03

 

 

 

反向传播算法 java 反向传播算法简单例题_反向传播_04

 1)前向传播

  输入层到隐藏层

反向传播算法 java 反向传播算法简单例题_反向传播_05

 $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$

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

反向传播算法 java 反向传播算法简单例题_权重_06

 

 $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)反向传播

计算总误差

反向传播算法 java 反向传播算法简单例题_权重_07

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

 

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

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

反向传播算法 java 反向传播算法简单例题_反向传播_08

 

 

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

反向传播算法 java 反向传播算法简单例题_权重_09

  最后三者相乘:

反向传播算法 java 反向传播算法简单例题_权重_10

 

 

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

反向传播算法 java 反向传播算法简单例题_权值_11

$\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

反向传播算法 java 反向传播算法简单例题_反向传播_12

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

反向传播算法 java 反向传播算法简单例题_反向传播算法 java_13

 

 

反向传播算法 java 反向传播算法简单例题_反向传播_14

 

所以我们要对$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}$的计算,我们来逐个剖析

反向传播算法 java 反向传播算法简单例题_反向传播算法 java_15

  同理,计算出

 

反向传播算法 java 反向传播算法简单例题_反向传播_16

  两者相加,得到总值

 

反向传播算法 java 反向传播算法简单例题_反向传播_17

反向传播算法 java 反向传播算法简单例题_权值_18

最后,三者相乘

反向传播算法 java 反向传播算法简单例题_反向传播算法 java_19

反向传播算法 java 反向传播算法简单例题_权重_20

 

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