bp神经网络的背景我们不在做过多的介绍,就是模拟神经元,进行分类训练。他的物理意义是什么呢,就是每个神经元对应我们计算中的滤波器,当他"看到"某个图片或者某组数据,反应就特别强烈,相乘所得的值就特别大,这大概就是所说的激活吧。首先,我们来看看bp神经的数学样例图:
大家肯定有疑问了,为什么是三层,为什么不是两层或者更多层,其实都是可以的,只是是三层效果比较基础,在前面的线性分类器中我们知道,层数越多,训练的拟合性就越好,神经网络也是一样类似的。但是随着层数的增多,计算的难度以及权值的更新都会变得更加复杂化。
上面已经大致描述了我自己对于bp神经网络物理意义的描述,接下来我们来看看数学推导, 因为数学推导过后,我们才能根据数学推导来进行相应的编码工作。bp神经网络是有监督的分学习,就是通过多组样本数据,计算所得结果,然后通过理想结果与所得结果的偏差,来反向更新计算神经源的权重,达到拟合的目的,最终通过不断的调整权值,与计算所得与期望结果的偏差越来越小。我们来举个简单的例子:
输入: x1=0.05, x2=0.10 这里样本其实应该有多个,我们先假设其中一个,这个例子也是借鉴https://www.cnblogs.com/charlotte77/p/5629865.html其中的一段
输出: E1=0.01, E2=0.99
初始权重:
w1=0.15,w2=0.20,w3=0.25,w4=0.30; b1=0.35 b2=0.60
w5=0.40,w6=0.45,w7=0.50,w8=0.55
这个偏置B有什么作用能, 其实就是类似截距b,使分类更加灵活贴近实际值
我们先来定义下激活函数,激活函数有很多,其主要作用是将线性的神经网络分类变为非线性的,使分类更加灵活, 我们主要用sigmoid函数: 其定义如下:
首先我们来看正向,正向很简单,就是根据上图,通过输入依次计算即可,得到样本的最终输出:
N1=sigmoid(net1)=sigmoid(x1*w1+x2*w3+B1) = 0.592666599954
N2=sigmoid(net2)=sigmoid(x1*w2+x2*w4+B1) = 0.701279883341
O1=sigmoid(net3)=sigmoid(N1*w5+N2*w7+B2)=sigmoid(1.1877067)=0.76633
O2=sigmoid(net4)=sigmoid(N1*w6+N2*w8+B2)=sigmoid(1.252404)=0.77771
的到的最终结果[0.76633, 0.77771] 与期望结果[0.05,0.1] 的差别有些大,因此我们需要更新权重即w来使输入通过计算尽量拟合期望的真实结果,其实就是一个学习的过程。
更新权值以及偏置的方法已经有专家提出,叫误差反向传播,这个算法的物理意义在于:
我们先定义期望结果与实际结果的方差E,E==
,方差很好的体现了和期望的偏差,我们看之前方差E的公式,其中O1=sigmoid(N1*w5+N2*w7+B2), O2=sigmoid(N1*w6+N2*w8+B2), 将O1和O2同样的带入,得到E关于权重的方程,在这个例子中,有4个权重,因此姑且认为E的函数为4元函数,最终化解为修正w即权重的值,使E最小。
那么我们如何更新w呢, 让E有最小值?
首先假设我们想更新w5的值,我们来求E关于W5的偏导数,即求在W5方向上的导数,因为导数在二维线条上反应的是线条的变化率(本身是4纬的,想象下二维导数是切线,三维导数是切平面,但是偏导数是其中某个方向的切线),因此我们更新的公式为w5=w5-,
为步长,初始化我们可以自定义,为什么我们只更新
这么长么,因为我们有多组样本,可能当前该组样本所提供的更新方向并非最终我们想要的方向,所以我们姑且先更新这么长,等待下一组样本,再朝着另外的方向再进行更新,知道最终所有的样本训练完成,这个时候找到最优的w5,使满足E最小。
接下来,我们来推导,利用链式求导法则,不要忘记中间还有一层sigmod函数,
=
,下面我们一步一步来推导,因为w5只在O1中出现,所以我们先求O1的偏导数:
=
=net*(1-net),其详细推导过程如下:
=f(N1*w5+N2*w7+B2)'=N1
所以最终的更新为w5=w5-( -(E1-O1)*( net*(1-net) )*N1 ),
自取,0.5,0.3都可以,将具体的数值带入即可更新.
类似的,w1~w7,都可以应用改公式来更新,通过多组样本训练,得到最优的w以及b, 使整体E最小.