【机器学习算法篇】卷积神经网络中反向传播算法深入理解

本文详细介绍了BP算法的工作原理,包括前向传播与反向传播过程,展示了如何通过调整权重使神经网络学习从输入到输出的映射,以最小化误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

CNN的参数调优是通过BP算法实现的,BP算法详解如下。

概览

使用有2个输入单元的神经网络,2个隐层神经元以及2个输出神经元。此外,隐层和输出神经元会包含一个偏置,下面是基本的网络结构:

为了便于后面说明的说明,我们对该网络设置一些初始的权重、偏置以及输入和输出:

反向传播的目标是对权重进行优化,使得神经网络能够学习到从任意的输入到输出的准确映射。

在这篇博文中,我们仅使用一个简单的训练集,即输入为0.05和0.10,我们希望网络的输出为0.01和0.99(即输入的样本是两个: (0.05, 0.99), (0.10, 0.99))。

前向传播

首先来看看对于给定的初始化权重和偏置,网络对于输入0.05和0.10的输出是啥。我们将输入输进网络中。

我们先计算从全部网络的输入到隐层的每一个神经元,激活函数采用logistic函数,对于从隐层到输出层,我们重复这一过程。

全部的网络输入也被称为网络的输入Derivation of Backpropagation

下面是对于h1h1全部网络输入的输入计算过程:

neth1=w1i1+w2i2+b11neth1=0.150.05+0.20.1+0.351=0.3775neth1=w1∗i1+w2∗i2+b1∗1neth1=0.15∗0.05+0.2∗0.1+0.35∗1=0.3775

(译者注:类比到CNN网络里,这个过程就是卷积过程,得到特征响应图)

然后我们将其输入到激活函数中,得到输出h1h1:

outh1=11+eneth1=11+e0.3775=0.593269992outh1=11+e−neth1=11+e−0.3775=0.593269992

(译者注:类比到CNN网络里,这个过程特征响应图经过激活函数运算的过程)

对于h2h2通过上面相同的过程,我们可以得到:

outh2=0.596884378outh2=0.596884378

对于输入层神经元,将隐层的输出作为输入(译者注:在CNN中,还需要经过池化后才能作为下一层的输入,至于为啥需要池化,这里译者不就解释了),重复上面相同的过程,我们可以得到:

neto1=w5outh1+w6outh2+b21neto1=0.40.593269992+0.450.596884378+0.61=1.105905967outo1=11+eneto1=11+e1.105905967=0.75136507neto1=w5∗outh1+w6∗outh2+b2∗1neto1=0.4∗0.593269992+0.45∗0.596884378+0.6∗1=1.105905967outo1=11+e−neto1=11+e−1.105905967=0.75136507

同样的,重复上面相同的过程,可以得到O2O2:

outO2=0.772928465outO2=0.772928465

计算总误差

现在对于输出的每一个神经元,使用平方误差函数求和来计算总的误差:

Etotal=12(targetoutput)2Etotal=∑12(target−output)2

output就是我们的预测label,而target就是groundtruth。1212使得我们在求骗到的时候可以消去2,不影响模型参数的结果求解。

对于第一个神经元的输出O1O1真实值是0.01,而网络的输出是0.75136507, 因而第一个神经元的输出误差为:

EO1=12(targetoutput)2=12(0.010.75136507)2=0.274811083EO1=12(target−output)2=12(0.01−0.75136507)2=0.274811083

重复上面过程,可以得到第二个神经元的输出O2O2为:

EO2=0.023560026EO2=0.023560026

所以整个神经网络的误差求和为:

Etotal=EO1+EO2=0.274811083+0.023560026=0.298371109Etotal=EO1+EO2=0.274811083+0.023560026=0.298371109

反向传播

反向传播的目标是:通过更新网络中的每一个权重,使得最终的输出接近于groundtruth,这样就得到整个网络的误差作为一个整体进行了最小化。

输出层

先来考察w5w5,我们想知道对于w5w5的改变可以多大程度上影响总的误差,也就是Etotalw5∂Etotal∂w5

通过使用链式法则,可以得到:

Etotalw5=Etotalouto1outO1netO1netO1w5∂Etotal∂w5=∂Etotal∂outo1∗∂outO1∂netO1∗∂netO1∂w5

为了更直观的表述上面链式法则的过程,对其进行可视化:

我们对上面使用链式法则得到的每一项分别进行计算。首先,整体误差关于各个神经元的输出改变了?

Etotal=12(targetoutput)2=12(targetO1outputO1)2+12(targetO2outputO2)2EtotaloutO1=212(targetO1outputO1)211+0=(targetO1outputO1)=(0.010.75136507)=0.74136507Etotal=∑12(target−output)2=12(targetO1−outputO1)2+12(targetO2−outputO2)2∂Etotal∂outO1=2∗12(targetO1−outputO1)2−1∗−1+0=−(targetO1−outputO1)=−(0.01−0.75136507)=0.74136507

logistic函数的偏导数为输出乘以1减去输出,即:

outO1=11+enetO1outO1netO1=outO1(1outO1)=0.75136507(10.75136507)=0.186815602outO1=11+e−netO1∂outO1∂netO1=outO1(1−outO1)=0.75136507(1−0.75136507)=0.186815602

最后,整个网络的输入O1O1关于w5w5改变了多少呢?

netO1=w5outh1+w6outh2+b21Etotalw5=Etotalouto1outO1netO1netO1w5Etotalw5=0.741365070.1868156020.593269992=0.082167041netO1=w5∗outh1+w6∗outh2+b2∗1∂Etotal∂w5=∂Etotal∂outo1∗∂outO1∂netO1∗∂netO1∂w5∂Etotal∂w5=0.74136507∗0.186815602∗0.593269992=0.082167041

你也会看到用delta规则表示的形式:

Etotalw5=(targetO1outO1)outO1(1outo1)outh1∂Etotal∂w5=−(targetO1−outO1)∗outO1(1−outo1)∗outh1

我们可以将EtotaloutO1∂Etotal∂outO1outO1netO1∂outO1∂netO1写为EtotalnetO1∂Etotal∂netO1,并用δO1δO1表示它,从而可以将上面的式子表示为:

δO1=Etotalouto1outO1netO1δO1=(targetO1outO1)outO1(1outo1)δO1=∂Etotal∂outo1∗∂outO1∂netO1δO1=−(targetO1−outO1)∗outO1(1−outo1)

因此有:

Etotalw5=δO1outh1∂Etotal∂w5=δO1outh1

有一些论文中通过将负号从δδ中提出来将其也可以写为下面这种形式:

Etotalw5=δO1outh1∂Etotal∂w5=−δO1outh1

为了减小误差,我们将w5w5原来的值减去目前的权重(通常会乘上一个学习率ηη,这里我们将其设置为0.5):

w+5=w5ηEtotalw5w5+=w5−η∗∂Etotal∂w5

学习率在不同的文章中可以记法不一样,有用αα的,有用ηη的,有用ϵϵ的。

重复上面的过程,我们可以得到更新后的w6w6w7w7w8w8

w+6=0.408666186w+7=0.511301270w+8=0.561370121w6+=0.408666186w7+=0.511301270w8+=0.561370121

注意,在我们继续向前推进反向传播的时候,在要使用到w5w5w6w6w7w7w8w8的地方,我们仍然使用的是原来的权重,而不是更新后的权重。

隐层

我们继续推进反向传播来计算w1w1w2w2w3w3w4w4更新的权重:

同样使用链式法则,我们可以得到:

Etotalw1=Etotalouth1outh1neth1neth1w1∂Etotal∂w1=∂Etotal∂outh1∗∂outh1∂neth1∗∂neth1∂w1

可视化上面的链式法则:

对于这一层(隐层)的更新我们采用上面输出层相似的处理方式,不过会稍有不同,这种不同主要是因为每一个隐层神经元的输出对于最终的输出都是有贡献的。我们知道outh1outh1既影响outO1outO1也影响outO2outO2,因此Etotalouth1∂Etotal∂outh1需要同时考虑到这两个输出神经元影响:

Etotalouth1=EO1outh1+EO2outh1∂Etotal∂outh1=∂EO1∂outh1+∂EO2∂outh1

又由于:

EO1outh1=EO1netO1netO1outh1∂EO1∂outh1=∂EO1∂netO1∗∂netO1∂outh1

我们可以用前面计算的值来计算EO1netO1∂EO1∂netO1:

EO1netO1=EO1outO1outO1netO1=0.741365070.186815602=0.138498562∂EO1∂netO1=∂EO1∂outO1∗∂outO1∂netO1=0.74136507∗0.186815602=0.138498562

又因为netO1outh1∂netO1∂outh1等于w5w5:

netO1=w5outh1+w6outh2+b21netO1outh1=w5=0.40netO1=w5∗outh1+w6∗outh2+b2∗1∂netO1∂outh1=w5=0.40

将上面每步分开算的结果合起来得:

EO1outh1=EO1netO1netO1outh1=0.1384985620.40=0.055399425∂EO1∂outh1=∂EO1∂netO1∗∂netO1∂outh1=0.138498562∗0.40=0.055399425

与上面的步骤一样,我们可以得到:

EO2outh1=w5=0.019049119∂EO2∂outh1=w5=−0.019049119

因此:

Etotalouth1=EO1outh1+EO2outh1=0.055399425+(0.019049119)=0.036350306∂Etotal∂outh1=∂EO1∂outh1+∂EO2∂outh1=0.055399425+(−0.019049119)=0.036350306

现在我们已经有了Etotalouth1∂Etotal∂outh1,我们还需要为每一个需要更新的权重计算outh1neth1∂outh1∂neth1neth1w∂neth1∂w

outh1=11+e(neth1)outh1neth1=outh1(1outh1)=0.59326999(10.59326999)=0.241300709outh1=11+e(neth1)∂outh1∂neth1=outh1(1−outh1)=0.59326999(1−0.59326999)=0.241300709

如我们前面对于输出神经元所做的一样,我们计算h1h1的全部输入关于w1w1求偏导:

neth1=w1i1+w2i2+b11neth1w1=i1=0.05neth1=w1∗i1+w2∗i2+b1∗1∂neth1∂w1=i1=0.05

将上面计算的各个部分合起来:

Etotalw1=Etotalouth1outh1neth1neth1w1Etotalw1=0.0363503060.2413007090.05=0.000438568∂Etotal∂w1=∂Etotal∂outh1∗∂outh1∂neth1∗∂neth1∂w1∂Etotal∂w1=0.036350306∗0.241300709∗0.05=0.000438568

你可以可能会看到下面的这种写法:

Etotalw1=(OEtotaloutOoutOnetOnetOouth1)outh1neth1neth1w1Etotalw1=(OδOwhO)outh1(1outh1)iEtotalw1=δh1i1∂Etotal∂w1=(∑O∂Etotal∂outO∗∂outO∂netO∗∂netO∂outh1)∗∂outh1∂neth1∗∂neth1∂w1∂Etotal∂w1=(∑OδO∗whO)∗outh1(1−outh1)∗i∂Etotal∂w1=δh1i1

现在我们可以更新w1w1:

w+1=w1ηEtotalw1=0.150.50.000438568=0.149780716w1+=w1−η∗∂Etotal∂w1=0.15−0.5∗0.000438568=0.149780716

根据上面相同的计算过程,我们可以得到w2w2w3w3w4w4

w+2=0.19956143w+3=0.24975114w+4=0.29950229w2+=0.19956143w3+=0.24975114w4+=0.29950229

现在,我们已经更新了所有的权重,在最初,在我们的输入为0.05和0.1的时候,网络的误差为0.298371109, 经过第一次方向传播后,网络的误差降低到了0.291027924。虽然看起来下降得不是很多,但是在重复这个过程10000次以后,网络的误差就下降到了0.000035085。这个时候,当我们把0.05和0.1再输入进去,两个神经元的输出为0.015912196(vs 0.01)和0.984065734(vs 0.99)。

参考:

http://yongyuan.name/blog/back-propagtion.html

https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值