竞争神经网络与SOM神经网络详解与matlab实践

目录

竞争神经网络

权值和阈值调整的方法

竞争神经网络的缺点:

SOM神经网络

SOM权值的调整:

竞争神经网络与SOM神经网络在MATLAB中实现


SOM是无监督式的机器学习算法,它的结果不会涉及到具体的分类。例如最近在做一个场景中垃圾检测的项目,结果只要告诉我们有无垃圾,安排人去清扫就可以,无需再细分类地告诉我们具体是哪一类垃圾,这样太繁琐而且性价比不高。SOM等无监督式的网络就很适合于这类情况的使用。而竞争神经网络是基于无监督学习方法的神经网络的重要类型,常常作为基本的网络形式构成一些具有自组织能力的网络,如SOM。

竞争神经网络

我们注意到,结构上和RBF等网络是比较像的。这里的距离是负数距离,||ndist||中带一个n,表示negative。在matlab中计算方法是ngedist。

它的计算过程是:待分类样本输入后,和样本(就是输入权值向量IW)计算负距离。||ndist||计算后输出是S1x1维的列向量,列向量中每个元素为输入向量p和IW距离的负数。之后,再和一个阈值b1相加,得到n1。接下来就进入了最重要的竞争层,在竞争层中,只有值最大的一个输入才能“崭露头角”,输出为1,其它菜鸡的输入都会变成0。

举个例子:

如上图,只有在输入4的位置处,对应的输出才是1,其它都是0。这就是竞争层的作用。

通过这样的方法,对于n1中最大的元素,可以获胜,竞争层输出1。如果b1=0,即没有阈值向量作用,那么只有当神经元的权值向量IW与输入向量最接近时,它在n1中各元素的负值最小,而值最大,所以能赢得竞争。这就是为什么要用负距离

就使得不是每次迭代就把所有神经元的权重都更新一遍,而是每次迭代只更新一个隐含层神经元的权重。例如上面这个例子的输出a1,a1是S1x1的维度,其中就一个值为1,其它为0,那么就只有1的位置对应的那个神经元的权重才会得到更新(只有获胜的神经元才有机会跳转权值)。

这样不断迭代,势必会带来一个问题:获胜的神经元通过调整能够不断缩小误差,导致它们取胜几率不断增大,导致最后整个网络中只有一部分胜利的神经元取得成功,其他神经元始终没有取得训练,成为“死神经元”。

解决这个问题的办法:设置较大的b1,帮助被冷落的神经元们获得竞争胜利的机会。针对某个竞争神经元而言,如果偏置b1取得比较大,那么就能帮助输入p在竞争中获得更大的取胜概率。当然,这个b也是会动态调整的,通过学习函数learncon来帮助动态调整b:Update the biases with the learning function learncon so that the biases of frequently active neurons become smaller, and biases of infrequently active neurons become larger.

权重IW{1,1}如何设定?

  • are initialized to the centers of the input ranges with the function midpoint.也就是说是取输入向量的中心

中心怎么理解呢?简单的说是最大最小值的平均值。

而midpoint在matlab里的效果:W = midpoint(S,PR)

S

Number of rows (neurons)

PR

R-by-Q matrix of input value ranges = [Pmin Pmax]

and returns an S-by-R matrix with rows set to (Pmin+Pmax)'/2.

这里,输入参数意义是:产生S个神经元,PR是一个矩阵(向量)。输出结果中注意有个转置!

输入:

W = midpoint(5,[0 1; -2 2])

按上述规则计算结果是:

阈值b1在matlab中获取方法是:initcon (S,PR)

S

Number of rows (neurons)

PR

R-by-2 matrix of R = [Pmin Pmax] (default = [1 1])

具体的计算过程 :

权值和阈值调整的方法

从上面函数我们知道PR参数,是可以调整的,从而调整权值和阈值。我们在matlab文档里来看一下:

竞争获胜的神经元的权值调整公式

核心计算公式:

等于前一个权值加一个误差项。误差项是学习率乘上误差delta,可以类比BP网络的调整方法,有点相似。只是BP中误差delta用的是梯度下降,要求一个微分,而这里就直接相减了。

阈值的调整方法在matlab中的计算公式是:

在周开利老师的《神经网络模型及其MATLAB仿真程序设计》一书中,生动地将c称为良心值。lr为学习率。表现在matlab代码中如下图:

The Kohonen rule allows the weights of a neuron to learn an input vector, and because of this it is useful in recognition applications.

Thus, the neuron whose weight vector was closest to the input vector is updated to be even closer. The result is that the winning neuron is more likely to win the competition the next time a similar vector is presented, and less likely to win when a very different input vector is presented. As more and more inputs are presented, each neuron in the layer closest to a group of input vectors soon adjusts its weight vector toward those input vectors. Eventually, if there are enough neurons, every cluster of similar input vectors will have a neuron that outputs 1 when a vector in the cluster is presented, while outputting a 0 at all other times. Thus, the competitive network learns to categorize the input vectors it sees.

The function learnk is used to perform the Kohonen learning rule in this toolbox.

竞争神经网络的缺点:

SOM神经网络

SOM能够通过其输入样本学会检测其规律性和输入样本相互之间的关系,并且根据这些输入样本的信息自适应地调整网络,使得网络以后的响应与输入样本相适应。竞争型神经网络的神经元通过输入信息能够识别成组的相似输入向量;自组织映射神经网络通过学习同样能够识别成组的相似输入向量,使那些网络层中彼此靠的很近的神经元对相似的输入向量产生响应。与竞争型神经网络不同的是,SOM不但能学习输入向量的分布情况,还可以学习输入向量的拓扑结构,其单个神经元对模式分类不起决定性作用,而要靠多个神经元的协同作用才能完成模式分类。

  • A self-organizing map (SOM) or self-organizing feature map (SOFM) is a type of artificial neural network that is trained using unsupervised learning to produce a low-dimensional (typically two-dimensional), discretized representation of the input space of the training samples, called a map.

  • The self-organizing map describes a mapping from a higher dimensional input space to a lower dimensional map space.(它把一个高维度的样本映射到二维空间上)

  • This architecture is like that of a competitive network, except no bias is used here.(和传统竞争神经元很相似,就是少了个阈值向量)

  • Instead of updating only the winning neuron, neurons close to the winning neuron are updated along with the winning neuron.(一次不仅只更新一个神经元,而是竞争获胜的神经元邻域的神经元都会获得更新)

训练(迭代)的过程分为两步:

1、ordering phase:排序阶段。邻域神经元都会得到更新

2、tuning phase:微调阶段。只有一个神经元更新

SOM权值的调整:

竞争神经网络与SOM神经网络在MATLAB中实现

  • newc

    • –  Create competitive layer

    • –  net = newc(PR,S,KLR,CLR)

  • newsom

    • –  Create self-organizing map

    • –  net = newsom(P,[D1,D2,...],TFCN,DFCN,STEPS,IN)

%% I. 清空环境变量
clear all
clc

%% II. 训练集/测试集产生
%%
% 1. 导入数据
load water_data.mat

%%
% 2. 数据归一化,防止小特征淹没
attributes = mapminmax(attributes);

%%
% 3. 训练集和测试集划分

% 训练集――35个样本
P_train = attributes(:,1:35);
T_train = classes(:,1:35);
% 测试集――4个样本
P_test = attributes(:,36:end);
T_test = classes(:,36:end);

%% III. 竞争神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newc(minmax(P_train),4,0.01,0.01);

%%
% 2. 设置训练参数
net.trainParam.epochs = 500;

%%
% 3. 训练网络
net = train(net,P_train);

%%
% 4. 仿真测试

% 训练集
t_sim_compet_1 = sim(net,P_train);
T_sim_compet_1 = vec2ind(t_sim_compet_1);
% 测试集
t_sim_compet_2 = sim(net,P_test);
T_sim_compet_2 = vec2ind(t_sim_compet_2);

%% IV. SOFM神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newsom(P_train,[4 4]);

%%
% 2. 设置训练参数
net.trainParam.epochs = 200;

%%
% 3. 训练网络
net = train(net,P_train);

%%
% 4. 仿真测试

% 训练集
t_sim_sofm_1 = sim(net,P_train);
T_sim_sofm_1 = vec2ind(t_sim_sofm_1);  %向量和稀疏矩阵之间转换
% 测试集
t_sim_sofm_2 = sim(net,P_test);
T_sim_sofm_2 = vec2ind(t_sim_sofm_2);

%% V. 结果对比
%%
% 1. 竞争神经网络
result_compet_1 = [T_train' T_sim_compet_1']
result_compet_2 = [T_test' T_sim_compet_2']

%%
% 2. SOFM神经网络
result_sofm_1 = [T_train' T_sim_sofm_1']
result_sofm_2 = [T_test' T_sim_sofm_2']

参考文献:

1、周开利《神经网络模型及其MATLAB仿真程序设计》

2、MATLAB文档

猜你喜欢

转载自blog.csdn.net/lyxleft/article/details/82851147