1.基本原理
神经网络里最简单的模型,就是感知器。感知器可以实现N维空间的线性划分。如二维空间,下图就是用一条直线将(0 0)分为一类,其余四点为一类。实现了与门。
如果要将以上四点划分为(0 1)(1 0)为一类,(1 1)(0 0)为一类,显然是无法用直线将其分开。如果是三维空间,就是平面划分。如果N维,即超平面。
下图为一个神经元模型,输入为pX1的向量,输出为a。感知器工作时,首要要学习,也就是对w和b进行调整。首先要有n个P向量,和一个你期望的该p向量得到的t值。w和b是不为0的随机值,训练的目的就是调整w和b的值,使e=t-a的值不断接近0。当所有样本输出的值都等于t时,学习结束。
这是,给定相关值,你就可以得到你期望的结果。其中wp+b累加输出的值n,要经过一个函数,这个函数根据需要选取,并不一定要取阶跃函数。
下图可以看出在二维空间了w和b分别是如何影响划分的直线的。
2.单层感知器
以下图为感知器基本模型,摘自matlab的帮助文档。
上图有以下几个要点:
2.1 R为输入个数,S为单层神经元的个数。感知器里可以有s个神经元,但神经元之间无信息传递,之间互不影响。
2.2 输出是sX1的a向量,实现了对RX1的p向量的s次在R维空间的线性二划分。
综合以上分析,可以看出神经网络设计的重点:
2.1 如何将神经元相互联系起来,即网络的设计;
2.2 选择什么样的方法调整每个神经元的w和b值,该算法必须收敛,即在有限步骤内,让误差e趋近0;
2.3 每个神经元选择什么样的函数得到a输出;
3. 算法实现(matlab)
其中P为RXN输入矩阵,T为SXN的目标矩阵;
R为输入个数,N为训练的样本数;
S为神经元个数;
repeat为最大迭代次数;W b e为经过训练得到的W b e;如果线性可分的话,并在repeat步类收敛,e就是0。
1: function [W b e] = perceptron(P, T, repeat)
2: switch nargin
3: case 0
4: case 1
5: error(\'Must enter P and T\');
6: case 2
7: repeat = 10000;
8: end
9: [r n]=size(P);
10: s =size(T,1);
11: W=ones(s,r);
12: b=ones(s,1);
13: e=ones(s,n);
14: for i=1:repeat
15: index=mod(i,n);
16: if(index == 0)
17: index = 4;
18: end
19: p=P(:,index);
20: t=T(:,index);
21: a= W*p + b;
22: for j=1:s
23: if a(j) >= 0
24: a(j) = 1;
25: else
26: a(j) = 0;
27: end
28: end
29: %e:s by n
30: e(:,index)=(t-a)*0.5;
31: W=W+e(:,index)*p\';
32: b=b+e(:,index);
33: if(e == 0)
34: break;
35: end
36: end
37: end
这里需要说明一下w和b是如何调整的,即31行。新的权重值为旧的加上误差值乘以输入,思想很简单。即用误差调整w和b,显然误差为0,就无调整。不为0,就朝着使误差减小的方向调整,即负反馈的思想。乘以输入,是对调整的修正,使调整更加迅速。可以设想,如果一个输入非常小,一个非常大,那输入小的增量也要小,大的增量也要大。如果都大,那就容易产生震荡。如果小,收敛就很慢,需要学习的时间就会变得很长。