基于BP神经网络的数字识别基础系统(二)
(接上篇)
上一篇的链接:http://blog.csdn.net/z_x_1996/article/details/55670814
上一篇提出的两个问题即
训练过程中,系数w如何改变的问题,即寻找一个比较好的改变方式,使得w能够更快的收敛到正确的系数。
使用这样的神经网络,只能拟合线性的求解方式,无法拟合非线性的求解方式。
中的第二个问题已经得到了较好的解决,第一个问题笔者准备在这一篇进行讨论。
首先笔者必须提前申明的是,不同情况下的求最优的方式多种多样,各有各的特点,也有很多优秀的算法。这里笔者主要介绍两种比较经典并且通用的算法并且比较这两种方法的优劣从而方便读者进行选择。当然老规矩,如果有什么不妥或者错误的地方,欢迎读者批评指出。
这里笔者需要说明:算法若要完全看懂需要一定的高数内容,主要涉及到条件极值的求法等等。若有遗忘,建议重点看一下导数(这就很尴尬了)以及拉格朗日乘子法求条件极值。当然如果使用编译好的工具库的话,那会使用就行了,可以跳过本段,但是如果懂的话当然更好。
首先笔者分析一下我们的核心式子(也是在数学形式上明确一下问题):
笔者准备先从最简单的线性决策函数开始切入到BP神经网络的最优系数求解。即确定一组Wi使得以上式子满足样本在一定误差内的正确输出。
为了方便叙述,我们先标注几个数学符号
角标d:d用来标注样本序号。
t:目标输出,即标签输出,其中td是第d个样本的标签输出,即output。
O:实际输出,其中Od是第d个样本的实际输出。
首先我们定义好一个度量标准来衡量在当前系数下的训练误差:
注:这里之所以乘上1/2是为了求导时方便约去产生的2。另外,误差的定义方式选取平方和形式的原因可以参考线性回归模型的极大似然估计法:http://blog.csdn.net/z_x_1996/article/details/70176819。
到这里我们有了一个衡量的标准,问题便进一步数学化、明确化了。
即我们需要寻找到一组系数w,使得E取最小值。
另外笔者在这里要强调的是,我们在处理问题的时候一定对问题有明确的认识,换句话说,我们要时刻谨记着我们的已知条件和需要求解的变量。比如在这个式子中间,t是标签输出,是常量;o是在取定系数w过后系统的输出值,是一个关于w的函数,是个变量;d是样本空间中的一个样本,是常量。
问题到了这一步很多读者会说这还不简单,这就是一个多元函数求极值的问题,求偏导后令其偏导数为0得到方程组后解方程组就可以确定系数w了啊。
没错,这确实是很棒很精确的一种方法,但是实际操作起来会十分棘手,笔者接下来就来说明为什么不采用这个看上去简洁而且清晰的方法。
首先我们来根据这个思路看一下过程,首先我们要求出各个偏导
这里input的含义是样本d的第i个元素。
现在我们来想一想一张图片有多少个元素,即多少分辨率,别的不说,我们就来看100*100分辨率的图片,这样的图片有10000个像素也就是说有10000个元素,换句话说i最大能够取到10000,这也就意味着这个偏导等于0的方程组会有10000个方程。更令人头疼的是,线性的决策函数在很多情况下是不能满足要求的,以后我们用到的一般都是非线性的函数,那么其偏导数也不再是线性的。那么我们需要面对的便是一个10000元的包含10000个方程的非线性方程组求解。我们姑且不谈方程组的可解性如何,就算解出来,对于一个非线性的方程来说,多解是一个十分普遍的现象。假如wi有ni个值,那么我们需要确定的极值将会有n1到n10000的连乘个。在这么多个值中寻找最优值也是一个十分费时的事情。
既然求偏导的方法被我们否定了,那么我们需要采用什么样的方法才能确定使得E最小的wi呢?
接下来便进入重头戏了,目前常用的两种方法:1.梯度下降法。2.增量梯度下降法。
2.2.1梯度下降法
梯度下降法(Gradient Descent)是利用了高等数学中梯度(Gradient)的概念。我们都知道梯度是方向导数最大的方向,换句话说,梯度向量指出了上升最快的方向,那么梯度下降法的思路便是先随机给出一组w,然后计算梯度后沿着梯度相反的方向w改变一个小量,这样不断的进行下去,从而到达极值点。
下面笔者便给出梯度下降法的推导。
(用电脑打公式实在是太麻烦了,这里笔者采用手写拍成图的方式,希望大家谅解一下~)
那么我们把思路代码化,先写出来训练w的伪代码
(这里为了方便手打,用m表示图中的下降步调,用deltaW代替W的改变微元)
GradDesc(样本空间D,下降步调m){
将每个网络权值W[i]初始化为某个小的随机值;
while(非终止条件){
初始化每个deltaW[i]为0;
for(d=0;d
把样本作为系统的输入,计算Od;
//计算梯度增量
for(i=0;i<单个样本总元素数量;i++){
deltaW[i] = deltaW[i] + m*(td-Od)*input[d][i];
}
}
//更新权值
for(i=0;i<单个样本总元素数量;i++){
W[i] = W[i] + deltaW[i];
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这里读者需要注意的有三点:
下降步调m的设置,一般经验值为0.3左右,当然m越大以为这更快的训练速度,但是也会承担在极值周围来回震荡的风险。
终止条件的设置。笔者一般喜欢将终止条件设置为当误差E小于某个值。也有很多设置成训练多少次的。这个视不同情况来定。笔者需要提醒读者的是:训练次数的增多并不意味着对未知样本分类准确性的提高(只能提高对训练样本的识别准确率),这种情况叫做过拟合,后面几篇博文中如果有机会笔者再来讲。
在更加普遍的情况下(非线性情况下),我们会遇到多个极值的问题,使用梯度下降方法有时容易陷在某个局部最小值而不是全局最小值,这将导致得不到最优的解,在后面博文中我们将通过改善算法来改善这个问题。
同时这里其实还有一个问题,(尽管大部分书上都没有讲,纯属笔者个人想法)而笔者个人认为这个问题是区别梯度下降算法和增量梯度下降算法的比较关键的地方:我们可以发现在这个算法中,我们为了求出deltaW的值,每次必须加载所有的样本从而来求那个segma和,当样本很多的时候(这是十分普遍的),一次性需要加载所有的样本将显得十分吃力,而增量梯度下降算法则在一定程度上用时间的代价换取空间的代价从而解决了这个问题。
那么梯度下降算法笔者就先讲到这儿,下一篇博文我们再来介绍增量梯度下降算法。
下一篇博文链接:http://blog.csdn.net/z_x_1996/article/details/68490009
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z_x_1996/article/details/60779141
网友评论