闲谈神经网络--写给初学者(二)

继续上篇来写。为了使这个神经网络满足我们需要,我们能够改变的东西有:

(0)输入输出的格式和质量

(1)各个神经元的权重值W

(2)偏置bias,这个改变从广义上说,也算是改变权重W0

(3)激活函数

(4)神经网络层数

(5)每一层神经元个数

(6)神经网络的结构

那么问题又来了,这些参数怎么改变呢?我们一部分一部分的进行讲解。

一、激活函数的选取

下面列出几个激活函数数学定义以及Matlab中的相应函数,大家可以在matlab中用函数画一下,看看他们到底是怎么一个函数。

(1) 线性函数 ( Liner Function )

 

Matlab中可以使用:purelin函数

(2) 阈值函数 ( Threshold Function )

 

Matlab中可以使用:hardlim和hardlims函数,值域分别为[0,1]和[-1,1]

(3) S形函数 ( Sigmoid Function )

Matlab中可以使用:logsig函数

(4) 双极S形函数 

Matlab中可以使用:tansig函数

  上面列出了几个激活函数,当然还可以选择其他的激活函数,那么到底怎么选择呢?目前我看到的是:就是使用Matlab默认的,或者瞎试,哪个好用哪个。不过我觉得,等对神经网络理解比较透彻了,应该对如何选择会有更深入的认识。

二、各个神经元的权重值W和偏置bias

  我们输入网络数据,再输出数据,就是为了改变W和bias,使网络更符合要求,对于如何修改W和bias,是借助于一定的训练算法和学习算法来完成的。这些训练算法和学习算法,对应于Matlab中就是一些训练函数和学习函数。注意:训练用英文train来表示,学习用learn来表示。

   接下来问题是:这些算法是依据什么原理设计的呢?总结下来有下面两种训练算法:有监督学习算法和无监督学习算法。

1.有监督学习算法,也叫有教师学习算法等等,但是记住英文名就可以了:Supervised Learning,简单来说就是:我们输入许多数据,经过神经网络后会有输入数据,根据这个输出数据和期望的输出数据的差值大小,进而来调整权重和bias。有下面两点注意:

(1)期望输出哪里来的?其实我们用一些数据来训练网络,那么肯定得有输入输出数据,这个输出就是我们的期望输出数据,而网络的输出就是实际输出,随着不停的调整权重和bias,这个差值会越来越小。例如输出大于期望,那么就可以减小权重,或者使bias更负一些等等。

(2)初始权重和bias如何选择?默认是随机分配的,因此对于我们创建的神经网络,每一次训练运行,结果都会不同的,就是因为初始权重和bias是随机的。想保存最好的一次状态,可以save filename net来进行保存。

2.无监督学习算法,也叫无教师学习算法等等,但是记住英文名就可以了:UnSupervised Learning,大概思想是:当两个神经元同时处于激发状态时两者间的连接权会被加强,否则被减弱。具体不再详细讲解。

上面讲了理论,在Matlab中,训练算法有:
(1)traingdx(梯度下降动量法),
(2)trainlm(Levenberg-Marquadt反传算法),其中BP网络默认是这个函数   
(3)traingd(普通的梯度下降法)
(4)trainbfg
(5)trainrp
(6)等等

为什么会有这么多算法呢?你想啊,我们学习编程过程中,连一个排序,就有好多好多算法,所以这里神奇的神经网络有这么多算法,也不奇怪了。

补充一点:很多人问,train和learn到底有什么区别呢?可以看下面的回答:

简单来说,就是train是全局的调整权重和bias,而learn是调整局部的神经元的权重和bias。

三、神经网络层数、每一层神经元个数、神经网络的结构

  简单来说就是选择不同的网络,如BP,RBF、Hopfield等网络,有机会在介绍这些具体的网络时,可以深入的讲一讲。

四、输入输出的格式和质量

1.输入输出数据的质量:保证输入数据准确完整等等就行,这里不做深入讲解,具体可以看看数据预处理。

2.输入输出数据的格式:这里涉及到的就是数据的归一化问题,这里简单说一下。

  输入输出数据的归一化简单来说:就是利用一定的算法,把输入输出数据归一到[0,1]区间或者[-1,1]之间,原因如下:

(1)输入输出数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。例如有些输入数值是高度,而有些是温度,纯数字大小很差别很大。

(2)数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。

(3)由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。

(4)S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X),f(100)与f(5)只相差0.0067。

  知道了为什么要归一化,那么如何进行归一化呢?两个公式

(1)y = ( x - min )/( max - min ),那么数据x就化简到[0,1]之间了。

(2)y = 2 * ( x - min ) / ( max - min ) - 1,那么数据x就化简到[-1,1]之间了。

  知道了数学上的公式,那么在Matlab中如何使用呢?

 使用一个统一的公式:mapminmax,具体用法:

(1)[Y,settings]=mapminmax(a);默认把a的值映射到[-1,1]中,返回值给Y,settings保存一些设置的信息,使用的公式是:y = 2 * ( x - min ) / ( max - min ) - 1
(2)settings.ymin=0;化成[0,1]范围,需要提前设置setting的属性,计算公式:y = ( x - min )/( max - min )
        mapminmax(x,settings)%传入两个参数
(3)mapminmax('reverse',Y,settings)%将原来归一化后的数据再反回去,之所以可以反回去,是因为传入了settings参数,而这个参数里面保存有反之前的数据,如最大值,最小值等等。
    我们可以改变的参数以及里面一些东西讲完了,先写这么多,下一篇给大家写一个例子,会通过BP网络的一个例子,看看到底怎么使用,再加深一下印象吧。看累了就顺便扫扫下面邪恶的广告,觉得不错可以帮帮告诉一下朋友,有啥好想法也可以给我留言,我也转告美女,不早了,睡觉吧。 
posted on 2014-11-19 10:24  船长  阅读(697)  评论(0编辑  收藏  举报