[转]考拉BP神经网络的matlab实现学习历程(二)

本节主要学习BP中几个容易混绕的概念和问题:什么是网络的泛化能力?过拟合是什么,怎么处理?学习速率有什么作用?神经网络的权值和阈值分别是个什么概念?用BP逼近非线性函数,如何提高训练精度?

什么是网络的泛化能力?

一个神经网路是否优良,与传统最小二乘之类的拟合评价不同(主要依据残差,拟合优度等),不是体现在其对已有的数据拟合能力上,而是对后来的预测能力,既泛化能力

网络的预测能力(也称泛化能力、推广能力)与训练能力(也称逼近能力、学习能力)的矛盾。一般情况下,训练能力时,预测能力也,并且一定程度上,随训练能力地提高,预测能力也提高。但这种趋势有一个极限,当达到此极限时,随训练能力的提高,预测能力反而下降,即出现所谓“过拟合”现象。此时,网络学习了过多的样本细节,而不能反映样本内含的规律。

过拟合是什么,怎么处理?

神经网络计算不能一味地追求训练误差最小,这样很容易出现“过拟合”现象,只要能够实时检测误差率的变化就可以确定最佳的训练次数,比如15000次左右的学习次数,如果你不观察,设成500000次学习,不仅需要很长时间来跑,而且最后结果肯定令人大失所望。

避免过拟合的一种方法是:在数据输入中,给训练的数据分类,分为正常训练用、变量数据、测试数据,在后面节将讲到如何进行这种分类。
其中变量数据,在网络训练中,起到的作用就是防止过拟合状态。

学习速率有什么作用?

学习速率这个参数可以控制能量函数的步幅,并且如果设为自动调整的话,可以在误差率经过快速下降后,将学习速率变慢,从而增加BPNN的稳定性。
此时训练方法采用

net.trainFcn = 'traingda'; % 变学习率梯度下降算法
 net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法

可以定义一个变动的学习速率,如

p = [-1 -1 2 2; 0 5 0 5];
t = [-1 -1 1 1];
net = newff(p,t,3,{},'traingda');
net.trainParam.lr = 0.05;
net.trainParam.lr_inc = 1.05;
net = train(net,p,t);
y = sim(net,p)

在后面的拟合例题中,我们也将用到学习速率这个参数。

神经网络的权值和阈值分别是个什么概念?

第一节中,我们已经谈到了权值和阀值的概念。这里我们更深入的说明一下,因为他们很重要,关系到网络最后的结果。权值和阈值是神经元之间的连接,将数据输入计算出一个输出,然后与实际输出比较,误差反传,不断调整权值和阈值。

假如下面两个点属于不同的类,须设计分类器将他们分开

p1=[1 1 -1]’;
p2=[1 -1 -1]’;

这里用单层神经元感知器,假设初始权值

w=[0.2 0.2 0.3]

同时假设初始阀值

b=-0.3

输出 a1 a2

a1=hardlims(w*p1+b)
a2=hardlims(w*p2+b)

如果不能分开,还须不断调整w,b

用BP逼近非线性函数,如何提高训练精度

(1)调整网络结构
增加网络的层数可以进一步降低误差,提高精度但会使网络复杂化,从而增加网络的训练时间。精度的提高实际上也可以通过增加隐层神经元的数目来获得,其效果更容易观察和掌握,所以应优先考虑

(2)初始值选取
为了使误差尽可能小 ,需要合理选择初始权重和偏置,如果太大就容易陷入饱和区,导致停顿 。一般应选为均匀分布的小数,介于 (-1,1) 【即归一化处理】。

(3)学习速率调整
学习速率的选取很重要 ,大了可能导致系统不稳定,小了会导致训练周期过长、收敛慢,达不到要求的误差。一般倾向于选取较小的学习速率以保持系统稳定,通过观察误差下降曲线来判断。下降较快说明学习率比较合适,若有较大振荡则说明学习率偏大。同时,由于网络规模大小的不同,学习率选择应当针对其进行调整。采用变学习速率的方案,令学习速率随学习进展而逐步减少,可收到良好的效果。

(4)期望误差
期望误差当然希望越小越好,但是也要有合适值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Collatz序列,又称为考拉兹猜想,是指对于任意大于1的自然数n,若n为偶数,则将n除以2,否则将n乘以3再加1,得到新的自然数后继续进行同样的操作,直到最终结果为1为止。现在我们来用 Python 实现 Collatz 序列: ```python def collatz(n): """ 根据考拉兹猜想计算Collatz序列 """ seq = [n] while n != 1: if n % 2 == 0: n = n // 2 else: n = n * 3 + 1 seq.append(n) return seq ``` 上面的代码中,我们定义了一个 collatz 函数,它接收一个正整数 n 作为输入,并返回对应的 Collatz 序列。首先,我们创建一个列表 seq,将输入的 n 加入其中。然后,我们开始进行循环,当 n 不等于 1 时,根据考拉兹猜想的规则计算下一个数,并将其加入 seq 列表中。最后返回 seq 列表即可。 我们可以使用下面的代码来测试一下这个函数: ```python n = 27 seq = collatz(n) print(seq) ``` 输出结果为: ``` [27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1] ``` 可以看到,输入为 27 时,经过计算得到的 Collatz 序列为 [27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值