BP算法学习笔记
1 学习基础–神经网络的基本原理和前向过程
如下图所示,这时一个简单的神经网络模型,通过这样一个模型我们就可以完成一些工作。例如我们输入三个数据,a1表示一个公司的银行存款,a2表示所拥有的固定资产估值,a3表示这个人最近一个月的利润,out1表示这是状态良好,out2表示它状态不好。现在我们要通过这个网络来判断,我们是否给这个公司发放贷款。

现在我们先明确一下图中参数的意义:w表示权重,b表示偏置,下面是基本计算步骤。
z11=a1∗w1,11+a2∗w2,11+a3∗w3,11+b11z21=a1∗w1,21+a2∗w2,21+a3∗w3,21+b21h11=g(z11)h21=g(z21)z12=h11∗w1,12+h21∗w1,22+b12z22=h11∗w2,12+h21∗w2,22+b22out1=g(z12)out1=g(z22)
其中 g(x) 是**函数,**函数有多种可以选择,其数学意义是使我们的网络从线性网络到非线性网络,因为多数问题都是非线性的,至于详细原因分析见:未完成,在MINST数据集判断在我们使用ReLU函数作为**函数。
f(x)={x0ififx>0x⩽0
现在通过这个网络设置一组合理的偏置和权重就能使用这个网络帮我们做出决定。最长用到的比如我们有一组手写数组的照片,我们可以设定一组合适的值来判断这个数字是多少。这个就是新手入门必学的MINST手写数据集判断了。在下一篇中会用Python和这个数据集来实现。
那我们的问题就是找到这样一组合适的数据。这个方法就是BP算法了(Error Back Propagation 误差反向传播算法)
2反向传播的基本原理
反向传播中主要用到两个原理,链式求导法则和偏导数。
2.1概述
反向传播算法的全称是误差反向传播算法,其本质通过总的误差函数对每一个权重和偏置求偏导数,再通过偏导数更新权值和偏置,多次重复此步骤以找到最佳的偏置和权重值。(其原理是偏导数反应了某个函数值对整体的影响程度,同时两个偏导数刚好构成我们误差函数的梯度,而沿梯度方向函数最容易找到最小值,误差函数的最小值可不就是误差最小了吗,误差最小不就是我们找到最佳的一组权值和偏置了吗)
2.2误差函数
误差函数也是有多种可以选择的,至于详细分析见:未完成 。在MINST数据集判断在我们使用均方误差函数作为误差函数。其形式如下:
L=21i∑(outi−targeti)2
target 表示已知的真确结果。
2.3偏导数和梯度
现在我们再看误差函数 L ,此时我们将此函数的w(权值)和 b (偏置)作为变量(其他值都是系数)。则我们有构成函数:
L=f(W,B)
依照上图给出的示例,此时有一个由10个权值和4个偏置作为变量构成的函数。现在来明确一下梯度的概念:对于二位函数 f(x,y) 他的梯度表示为 ∇=(∂x∂f,∂y∂f) ,而我们都知道,沿着梯度方向函数值下降速度最快。关于导数,偏导数,梯度的具体分析见未完成。那么对于误差函数,我们自然是希望它的函数值为0最好了,所以我们就要求误差函数的梯度,然后沿着梯度方向更新变量取值(即选择权值和偏置的值)。则误差函数的梯度为:
∇=(∂w1,11∂L,∂w2,11∂L,∂w3,11∂L,∂w1,21∂L,∂w2,21∂L,∂w3,21∂L,∂w1,12∂L,∂w2,12∂L,∂w1,22∂L,∂w2,22∂L,∂b11∂L,∂b21∂L,∂b12∂L,∂b22∂L)
2.4 BP算法
现在我们学习BP算法的前置知识都具备了,我们开始推到整个过程。
2.4.1 输出层推导
输出层需要计算的偏导 ∂w1,12∂L,∂w2,12∂L,∂w1,22∂L,∂w2,22∂L,∂b12∂L,∂b22∂L ,我们依次计算这些值。
∂w1,12∂L=∂out1∂L×∂z12∂out1×∂w1,12∂z12∂w1,22∂L=∂out2∂L×∂z22∂out2×∂w1,22∂z22∂w2,12∂L=∂out1∂L×∂z12∂out1×∂w2,12∂z12∂w2,22∂L=∂out2∂L×∂z22∂out2×∂w2,22∂z22∂b12∂L=∂out2∂L×∂z12∂out2×∂b12∂z12∂b22∂L=∂out2∂L×∂z22∂out2×∂b22∂z22
将这些公式总结到一起表示如下
∂wm,nL∂L=∂outn∂L×∂znL∂outn×∂wm,nL∂znL=∂outn∂L×∂znL∂outn×hmL∂bnL∂L=∂outn∂L×∂znL∂outn×∂bnL∂znL=∂outn∂L×∂znL∂outn
令 δnL=∂outn∂L×∂znL∂outn 则上式化简为:
∂wm,nL∂L=δnL×hmL(式1-1)
∂bnL∂L=δnL(式1-2)
2.4.2 隐藏层推导
隐藏层需要计算 ∂w1,11∂L,∂w2,11∂L,∂w3,11∂L,∂w1,21∂L,∂w2,21∂L,∂w3,21∂L,∂b11∂L,∂b21∂L ,依次计算如下:
∂w1,11∂L=∂out1∂L×∂z12∂out1×∂h11∂z12×∂z11∂h11×∂w1,11∂z11+∂out2∂L×∂z22∂out2×∂h11∂z22×∂z11∂h11×∂w1,11∂z11∂w2,11∂L=∂out1∂L×∂z12∂out1×∂h11∂z12×∂z11∂h11×∂w2,11∂z11+∂out2∂L×∂z22∂out2×∂h11∂z22×∂z11∂h11×∂w2,11∂z11∂w3,11∂L=∂out1∂L×∂z12∂out1×∂h11∂z12×∂z11∂h11×∂w3,11∂z11+∂out2∂L×∂z22∂out2×∂h11∂z22×∂z11∂h11×∂w3,11∂z11∂w1,21∂L=∂out1∂L×∂z12∂out1×∂h21∂z12×∂z21∂h21×∂w1,21∂z21+∂out2∂L×∂z22∂out2×∂h21∂z22×∂z21∂h21×∂w1,21∂z21∂w2,21∂L=∂out1∂L×∂z12∂out1×∂h21∂z12×∂z21∂h21×∂w2,21∂z21+∂out2∂L×∂z22∂out2×∂h21∂z22×∂z21∂h21×∂w2,21∂z21∂w3,21∂L=∂out1∂L×∂z12∂out1×∂h21∂z12×∂z21∂h21×∂w3,21∂z21+∂out2∂L×∂z22∂out2×∂h21∂z22×∂z21∂h21×∂w3,21∂z21∂b11∂L=∂out1∂L×∂z12∂out1×∂h11∂z12×∂z11∂h11×∂b11∂z11+∂out2∂L×∂z22∂out2×∂h11∂z22×∂z11∂h11×∂b11∂z11∂b21∂L=∂out1∂L×∂z12∂out1×∂h21∂z12×∂z21∂h21×∂b21∂z21+∂out2∂L×∂z22∂out2×∂h21∂z22×∂z21∂h21×∂b21∂z21
整理化简这些式子(以 w1,11 为例)
∂w1,11∂L=i=1,2∑∂outi∂L×∂ziL∂outi×∂h11∂ziL×∂z11∂h11×∂w1,11∂z11
∂wm,nl∂L=i=1,2∑∂outi∂L×∂zil+1∂outi×∂hnl∂zil+1×∂znl∂hnl×∂wm,nl∂znl=i=1,2∑δil+1×∂hnl∂zil+1×∂znl∂hnl×∂wm,nl∂znl=i=1,2∑δil+1×wn,il+1×∂znl∂hnl×∂wm,nl∂znl=∑i=1,2δil+1×wn,il+1×δ′(znl)×am
注:δ′(znl)=∂znl∂hnl
同理可以求得:
∂wnl∂L=∑i=1,2δiL×wn,il+1×δ′(znl)
令 δnl=∑i=1,2δiL×wn,il+1×δ′(znl) 则得到
∂wm,nl∂l=δnl×am(式2-1)
∂bnl∂L=δnl(式2-2)
将所有公式总结如下:
∂wm,nL∂L=δnL×hmL−1(式1-1)
∂bnL∂L=δnL(式1-2)
δnL=∂outn∂L×∂znL∂outn
∂wm,nl∂l=δnl×am(式2-1)
∂bnl∂L=δnl(式2-2)
δnl=i=1,2∑δil+1×wn,il+1×δ′(znl)
从中可以看出,我们要求误差函数的梯度,只需求出 δnL 和 δnl 就可以了。所以我们用的公式就是这两个了
δnL=∂outn∂L×∂znL∂outn(输出层误差公式)
δnl=i=1,2∑δil+1×wn,il+1×δ′(znl)(隐藏层误差公式)
现在我们可以看明白为什么叫反向传播了,输出层的 δL 在输出隐藏层误差计算时需要使用,所以整个过程只能从后往前传播。
2.4.3 权值和偏置更新
依据公式计算出误差之后就是更新权值和偏置了。
权值更新:
wm,nl=wm,nl−δnl×am×η(隐藏层权值更新)
wm,nL=wm,nL−δnL×hmL−1×η(输出层权值更新)
bnl=bnl−δnl×η(隐藏层权值更新)
bnL=bnL−δnL×η(输出层权值更新)
注:η 表示学习效率,学习效率大运算结果容易反复横跳,太小就会导致学下效率低下。具体学习效率分析见未完成
至此一个完整的BP算法过程已经完成。
2.5 矩阵表示BP算法
隐藏层权值矩阵
w1=⎣⎡w1,11w2,11w3,11w1,21w2,21w3,21⎦⎤
输出层权值矩阵
w2=[w1,12w2,12w1,22w2,22]
输入矩阵
a=⎣⎡a1a2a3⎦⎤
隐藏层矩阵
h=[h11h21]z1=[z11z21]
输出层矩阵
out=[out1out2]z2=[z12z22]
输出层误差
δL=∂out∂L×∂zL∂out(输出层误差矩阵表示)
所以隐藏层误差表示为
δl=wl+1×δl+1×δ′(zl)(隐藏层误差矩阵表示)
注:有些案例写道 $ {w_{l+1}}^T$ 这是因为在定义下标时表示的方式不同引起的。我的下标规则是下标第一个值表示它的上一个目标在一列中所处的位置,下标第二个值表示它的下一个目标在该列中的位置。例如 w3,11 表示它是第1层的权值(上标),它从第一列的第3个元素(下标第一个值)指向第二列的第1个元素(下标第二个值)
权值更新如下:
wL=wL−δL×hL−1×η(输出层权值更新)
bL=bL−δL×η(输出层偏置更新)
wl=wl−δl×al×η(隐藏层权值更新)
bl=bl−δl×η(隐藏层偏置更新)
现在所有理论知识已经完成,但是还有两个缺点:
-
最终的出的公式将输入层和隐藏层分开了写,这样在编程的时候并不方便
-
现在的情况是基于只有一个隐藏层的网络进行的,在面对多层网络的时候还需再多考虑一点。
针对这样的情况我重新定义我们的表示方法,如下图示:

此时则有
δl={∂al∂l×∂zl∂alwl+1×δl+1×δ′(zl)ifl=Lothers(误差矩阵表示)
权值和偏置更新则有更新则有
wl=wl−δl×al×η(权值更新)
bl=bl−δl×η(偏置更新)
各位大哥最近下载资源没有C币了,如果对你有帮助求赏一个C币