版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34886403/article/details/86229974
假如我们有个这样的网络:
第一层是输入层,包含两个神经元i1,i2,和截距项b1;第二层是隐含层,包含两个神经元h1,h2和截距项b2,第三层是输出o1,o2,每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。
其中,
输入数据 i1=0.05,i2=0.10;
输出数据 o1=0.01,o2=0.99;
初始权重 w1=0.15,w2=0.20,w3=0.25,w4=0.30,w5=0.40,w6=0.45,w7=0.50,w8=0.88
目标:给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。
Step 1:前向传播
1.输入层——>隐含层
h1=w1∗i1+w2∗I2+b1
h1=0.15∗0.05+0.2∗0.1+0.35
神经元h1的激活:(此处用到激活函数为sigmoid)
activeh1=e−h11=1+e−0.37751=0.59326992
同理,可计算出
activeh2=0.596884378
2.隐藏层——>输出层
计算出o1和o2
o1=w5∗h1+w6∗h2+b2
o1=0.4∗0.59326992+0.45∗0.596884378+0.6=1.105905967
激活后
activeo1=1+e−1.1059059671=0.75136507
同理计算出o2
activeo2=0.772928465
这样前向传播的过程就结束了,我们得到输出值为[0.75136079 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。
step 2 反向传播
1.计算总误差
Etotal=∑21(target−output)2
但是有两个输出,所以分别计算o1和o2的误差,总误差为两者之和:
Eactiveo1=21(0.01−0.75136507)2=0.274811083
KaTeX parse error: Expected '}', got 'EOF' at end of input: …2}}=0.023560026
Etatol=Eactiveo1+Eactiveo2=0.298371109
2.反向传播
我们使用反向传播的目标是更新网络中的每个权重,使它们使实际输出更接近目标输出,从而最大限度地减少每个输出神经元和整个网络的误差。
考虑一下, 我们想知道
w5的变化对总误差的影响有多大,也就是(也就是
w5的偏导数或者说是梯度)
通过链式求导:
∂w5∂Etatal=∂activeo1∂Etotal∗∂o1∂activeo1∗∂w5∂o1
而
Etotal=21(targeto1−activeo1)2+21(targeto2−activeo2)2
∂activeo1∂Etotal=2∗21(targeto1−activeo1)∗−1+0
代入数据得
∂activeo1∂Etotal=0.7413650
接下来是对激活函数求导:
activeo1=1+e−neto11
∂o1∂activeo1=activeo1(1−activeo1)=0.186815602
然后再看
o1=w5∗activeh1+w6∗activeh2+b2
∂w5∂o1=1∗activeh1∗w5+0+0=0.59326992
把上面的组合起来
∂w5∂Etatal=∂activeo1∂Etotal∗∂o1∂activeo1∗∂w5∂o1=0.74136507∗0.186815602∗0.59326992
注意,在更新权重是往往加入学习率:
w5+=w5−η∂w5∂Etotal