神经网络中可以改变的有:
1、各神经元的权值
2、bias,广义上,也是权值
3、激活函数
4、神经网络的层数
5、各层神经元的个数
6、神经网络的连接结构
7、输入输出的格式和质量
下面我们一项一项进行说明,如何改变这些参数
一、权值
权值的改变分为 有监督的学习 和 无监督的学习
1、有监督的学习Supervised Learning
给定许多样本(包含输入与输出),将输入数据通过神经网络后,产生的实际输出和期望输出进行比较,通过差值逐步调整各神经元的权值和bias,两个问题:
(1)期望输出是什么?
期望输出就是给定的样本的输出,而实际输出就是输入经过神经网络后产生的输出
(2)各权值初始化的值为多少?
初始化权值随机分配,比如C语言中利用rand()函数(随机产生0-RAND_MAX之间的数),初始化权值为-1到1之间:w[i][j]=rand()*2.0/RAND_MAX-1;
2、无监督的学习UnSupervised Learning
大概思想是:当两个神经元同时处于激发状态时两者间的连接权会被加强,否则被减弱。
注:关于训练算法有以下这些:
BP算法、...(留待后续补充)
......
算法多多,就像C语言中一个排序就有那么多算法一样,神经网络的训练算法有这么几种也不足为奇。
二、激活函数
(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函数
(5)后续补充...
......
三、输入输出的质量和格式
输入输出数据的质量:保证输入数据准确完整等等就行,这里不做深入讲解,具体可以看看数据预处理。
输入输出数据的格式:这里涉及到的就是数据的归一化问题,这里简单说一下。
1、什么是归一化?
归一化就是利用一定的算法,将输入输出数据归一化到[0,1]或者[-1,1]之间
2、为什么要归一化?
(1)输入输出的单位不一样(比如输入是温度,输出是电流),范围不一样(比如输入数据之间数值相差很大),会导致神经网络的收敛速度变慢、训练时间变长;
(2)数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小;
(3)激活函数本身的输出是有范围的,比如用sigmoid函数,其值域范围为[0,1],这样就要求必须将输出数据映射到[0,1]上面,也就是输出数据的归一化问题;
(4)sigmoid函数在[-5,5]范围之外偏向饱和,函数值之间差别太小,很难进行训练,比如f(5)和f(100)只相差0.0067,因此,我们取有效区间[-1,1],将输入数据映射到[-1,1]
上面,方便进行训练,这也就是输入数据的归一化问题;
3、如何进行归一化?
(1)y = ( x - min )/( max - min),那么数据x就化简到[0,1]之间了。(编程中,可以y = ( x - min + A )/( max - min - A),加上A防止分母为0)
(2)y = 2 * ( x - min ) / ( max - min ) - 1,那么数据x就化简到[-1,1]之间了。(C编程中,可以采用 y = rand()*2.0/RAND_MAX-1)