浅谈神经网络(二)

神经网络中可以改变的有:

1、各神经元的权值

2、bias,广义上,也是权值

3、激活函数

4、神经网络的层数

5、各层神经元的个数

6、神经网络的连接结构

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

下面我们一项一项进行说明,如何改变这些参数

一、权值

权值的改变分为 有监督的学习 和 无监督的学习

1、有监督的学习Supervised Learning

给定许多样本(包含输入与输出),将输入数据通过神经网络后,产生的实际输出和期望输出进行比较,通过差值逐步调整各神经元的权值和bias,两个问题:

(1)期望输出是什么?

期望输出就是给定的样本的输出,而实际输出就是输入经过神经网络后产生的输出

(2)各权值初始化的值为多少?

初始化权值随机分配,一般为较小的非零随机数,比如归一化到(-1,1)

例: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,1)之间)

(1)var = ( x - min )/( max - min),那么数据x就化简到[0,1]之间了。(编程中,可以var = ( x - min + 1 )/( max - min - 1),加上常数1防止分母为0)

(2)var = 2 * ( x - min ) / ( max - min ) - 1,那么数据x就化简到[-1,1]之间了。(C编程中,可以采用 var = rand()*2.0/RAND_MAX-1)

输出数据的反归一化

如果采用sigmoid函数,函数值区间为(0,1),由var = ( x - min )/( max - min)可得反归一化后的值为

 x = var*(max - min) + min  (若有常数A,则x = var*(max - min + 1) + min - 1)

原文地址:https://www.cnblogs.com/shuaishuaidefeizhu/p/6832351.html