CNN卷积神经网络原理详解(下)

反向传播

前面讲解了卷积神经网络的网络基本架构。我们在实际运算的时候会发现,随着计算次数的增加,我们的输出结果与我们的预期结果会不断的逼近。这是因为网络中的权重参数在不断的调整,那么参数是如何调整的?这就涉及到一个反向传播的问题。反向传播其实是神经网络的一个基础,下面我通过一个简单的示例带大家详细了解一下这个数学过程。

前向传播过程

了解反向传播之前,我们先来简单回顾一下前向传播的过程。也就是神经网络正常走完一个周期的过程。
在这里插入图片描述
如图所示,这是典型的神经网络的基本构成。其中L1层是输入层,L2层是隐藏层,L3层是输出层。假定我们现在输入一系列数组,我们希望最后的输出是我们预期的值,那么这些数组必然要经历一个参数的计算过程,下面我们通过一个具体的示例讲述一下这个变化是如何发生的。
首先我们明确初始条件
输入数据: x 1 = 0.05 x_{1}=0.05 x1=0.05, x 2 = 0.1 x_{2}=0.1 x2=0.1;
输出数据: y 1 = 0.01 y_{1}=0.01 y1=0.01, y 2 = 0.99 y_{2}=0.99 y2=0.99;
初始权重(随着计算的进行,权重会不断的更新迭代): w 1 = 0.15 , w 2 = 0.2 , w 3 = 0.25 , w 4 = 0.3 , w 5 = 0.4 , w 6 = 0.45 , w 7 = 0.5 , w 8 = 0.55 w_{1}=0.15,w_{2}=0.2,w_{3}=0.25, w_{4}=0.3,w_{5}=0.4,w_{6}=0.45,w_{7}=0.5,w_{8}=0.55 w1=0.15,w2=0.2,w3=0.25,w4=0.3,w5=0.4,w6=0.45,w7=0.5,w8=0.55;
偏置: b 1 = 0.35 , b 2 = 0.6 b_{1}=0.35,b_{2}=0.6 b1=0.35,b2=0.6.
激活函数为sigmoid函数(用激活函数是为了去线性化,具体原因我会在下次笔记中介绍)

这个神经网络的目的就是,我们给出一组输入,最后使得输出尽可能的接近 y 1 = 0.01 , y 2 = 0.99 y_{1}=0.01,y_{2}=0.99 y1=0.01,y2=0.99.

现在开始前向传播
(1)从L1层到L2层(输入层到隐藏层):
计算神经元 x 1 x_{1} x1的输入加权和: n e t a 11 = w 1 ∗ x 1 + w 2 ∗ x 2 + b 1 ∗ 1 net_{a11}=w_{1}*x_{1}+w_{2}*x_{2}+b_{1}*1 neta11=w1x1+w2x2+b11
带入数据: n e t a 11 = 0.15 ∗ 0.05 + 0.2 ∗ 0.1 + 0.35 ∗ 1 = 0.3775 net_{a11}=0.15*0.05+0.2*0.1+0.35*1=0.3775 neta11=0.150.05+0.20.1+0.351=0.3775

神经元 a 11 a_{11} a11的输出为(对神经元执行一次sigmoid激活):
o u t a 11 = 1 1 + e − n e t a 11 = 1 1 + e − 0.3775 = 0.593269992 out_{a11}=\frac{1}{1+e^{-net_{a11}}}=\frac{1}{1+e^{-0.3775}}=0.593269992 outa11=1+eneta111=1+e0.37751=0.593269992
同理可得 a 12 a_{12} a12的输出为: o u t a 12 = 0.596884378 out_{a12}=0.596884378 outa12=0.596884378

(2)从L2层到L3层(隐藏层到输出层):
(此时的L2层相当于我们的输入层,计算过程类似上一层)
计算输出神经元 y 1 y_{1} y1的输入加权和: n e t y 1 = w 5 ∗ o u t a 11 + w 6 ∗ o u t a 12 + b 2 ∗ 1 net_{y1}=w_{5}*out_{a11}+w_{6}*out_{a12}+b_{2}*1 nety1=w5outa11+w6outa12+b21

带入数据: n e t y 1 = 0.4 ∗ 0.593269992 + 0.45 ∗ 0.596884378 + 0.6 ∗ 1 = 1.105905967 net_{y1}=0.4*0.593269992+0.45*0.596884378+0.6*1=1.105905967 nety1=0.40.593269992+0.450.596884378+0.61=1.105905967
o u t y 1 = 1 1 + e − n e t y 1 = 1 1 + e − 1.105905967 = 0.75136507 out_{y1}=\frac{1}{1+e^{-net_{y1}}}=\frac{1}{1+e^{-1.105905967}}=0.75136507 outy1=1+enety11=1+e1.1059059671=0.75136507
同理可得 y 2 y_{2} y2的输出为: o u t y 2 = 0.772928465 out_{y2}= 0.772928465 outy2=0.772928465

这样前向传播的过程就结束了,我们得到的输出值为[0.75136507 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,为了得到一组接近我们需要的数据,我们需要调整参数(神经网络的权重),重新计算输出。那么如何调整参数?我们应该知道当前参数对误差的总影响,具体的方法就是要进行反向传播计算。

反向传播过程

在进行反向传播之前,我们最后再回顾一下我们刚刚做了什么事情。
刚刚,我们首先定义了一组输入数值 X X X;
2,我们对输入数组执行第一册计算并将结果给到了隐藏层L2,我们假定这个函数为 F ( x ) F(x) F(x);
3,我们对隐藏层进行了非线性处理,假定这一步操作为 S ( F ( x ) ) S(F(x)) S(F(x));
4,接着我们将L2层视为新的输入层,对他执行了一系列变化并将值给到输出层L3,假定这一步操作为 G ( S ( F ( x ) ) ) G(S(F(x))) G(S(F(x)));
5,最后我们对输出层执行了非线性变化,得到第一次计算的最终结果,这一步操作可以看做 T ( G ( S ( F ( x ) ) ) ) T(G(S(F(x)))) T(G(S(F(x)))).
6,根据链式法则,现在我们要做的就是给这个多嵌套的函数脱衣服。。。

脱衣服的过程一定要遵循先穿的后脱,后穿的先脱(会不会被河蟹)。。。

开始脱衣服 反向传播
1,计算总误差:

E t o t a l = ∑ 1 2 ( t a r g e t − o u t p u t ) 2 E_{total}=\sum \frac{1}{2}(target-output)^{2} Etotal=</

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三景页三景页

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值