选了从爽老师的《智能系统》,习题2.6是第一个实验作业,题目如下:

〖2.6〗根据所学过的BP网络设计及改进方案设计实现模糊控制规则为T = int((e+ec)/2)的模糊神经网络控制器,其中输入变量eec的变化范围分别是:e = int[-2, 2],ec = int[-2, 2]。网络设计的目标误差为

0.001。设计要求为:

①输入、输出矢量及问题的阐述;

②给出网络结构

③学习方法(包括所采用的改进方法);

④初始化及必要的参数选取;

⑤最后的结果,循环次数,训练时间,其中着重讨论:

a)不同隐含层S1时的收敛速度与误差精度的对比分析,

b)当S1设置为较好的情况下,在训练过程中取始终不变的学习速率lr值时,对lr值为不同值时的训练时间,包括稳定性进行观察比较,

c)当采用自适应值学习速率时,与单一固定的学习速率lr中最好的情况进行对比训练的观察,

d)给出结论或体会。

⑥验证,采用插值法选取多于训练时的输入,对所设计的网络进行验证,给出验证的AT值。

根据老师讲解,要把Matlab的训练方法、学习方法、几种网络结构、几种初始化方法都进行实验对比。

这里遇到一个比较有趣的现象:

手动初始化函数,使用大多实验指导书推荐的,随机初值

net.iw{1} = rands(5, 1);

2000次循环后仍然有很高的SSE:

默认的初始化方式在1000循环后就得到了很好的结果:

查看默认的初始化方式的权值矩阵

W10 =

7
7
-7
7
7

训练结束后

W1 =

6.7031
7.4758
-7.0055
7.1810
7.6923

可以看出,只是在W10基础上发生了很小的变化。多次初始化,会发现,正负符号分布是随机的,而绝对值始终为7,这很好理解,因为输出层使用了线性激活函数,很容易对前面的符号进行修改。

最关键的是,是W10各权值绝对值7是怎么来的呢?

对前馈网络来说,有两种不同的初始化方式经常被用到:initwb和initnw。initwb函数根据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。这种方式经常用在转换函数是线性函数时。initnw通常用于转换函数是曲线函数。它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。它比起单纯的给权重和偏置随机赋值有以下优点:(1)减少神经元的浪费(因为所有神经元的活动区域都在输入空间内)。(2)有更快的训练速度(因为输入空间的每个区域都在活动的神经元范围中)。

Matlab官方文档中有对Nguyen和Widrow[NgWi90]方法的介绍https://www.mathworks.com/help/deeplearning/ref/initnw.html

最后修改日期: 2018年10月13日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。