BP神经网络

【参数】BP神经网络一般设置多少个隐层

作者 : 老饼 发表日期 : 2022-06-23 22:17:17 更新日期 : 2024-12-06 14:04:26
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



BP神经网络的隐层基本都是只设一个隐层即常用的BP神经网络为三层BP神经网络

为什么一般只设置一个隐层呢?本文进行详细分析一个隐层的好处以及多个隐层带来的弊端

通过本文,可以了解BP神经网络设置多少个隐层,以及为什么一般只设置为单个隐层




    01. BP神经网络设置多少个隐层     




本节讲解BP神经网络的隐层一般设置多少个隐层




      BP神经网络设置多少个隐层      


BP神经网络究竟设置几个隐层?相信很多初学者都有这样的疑惑
 笔者可以很肯定地给出答案:
 基本只设一个隐层!尽量不要超过两个隐层!
为什么只设一个隐层?多设几个隐层不可以吗?看完本文大家应该心中会有更深刻的理解




     为什么设一个隐层       


 为什么只设一个隐层就够了?因为一个隐层在理论上就已经能够拟合任意曲线了
三层BP神经网络就是使用多个tansig拼凑出目标曲线,
又由于tansig具有局部性,所以理论上,只要隐节点足够多,就能够拼凑出目标曲线
那么对于多隐层BP神经网络,单看最后一层,它相当于用多个"其它的曲线"来拼凑目标曲线
而这些"其它的曲线"并不限制形态,随着层数越多,它就可以更加的灵活
 可以看到,在本质上,单隐层与多隐层并没有太多区别,而单隐层事实上已经够了
多隐层只是放开了“拼凑曲线时所用的基函数”的限制,在很多时候这是将问题复杂化了

在问题分析上,单隐层使用的基函数就是tansig函数,在训练不好时,会更方便原因分析和调参






    02. 设置多个隐层会怎么样     




本节分析BP神经网络设置多个隐层时会有什么危害




     设置多个隐层的危害       


许多新人会想,我多设几个隐层也不怎么样,
但事实上,隐层设得多会有非常多的危害,下面列举一二细细道来
多隐层的危害一:网络很容易很跌宕
如果网络的层数很多,当输入有一点小小的变化时,经过层层的传播,这种变化会不断扩大,
在到达输出层时,x微小的变化可能就会演变成y极大的变化,也即x微小变化y就极大变化,
 多层神经网络对变化的传播
 大部分真实关系中y都是相对x平滑变化的,所以y对x响应太敏感往往都不符合x、y的真实关系
由于多层网络本身就极大可能是跌宕,因此很难确保训练出来的模型是平滑的、泛化能力良好的
多隐层的危害二:神经元死亡
多层网络很容易跌宕只是一种理论上的分析,在实际中更多时候是更加糟糕的情况--神经元死亡
由于x微小的变化,经过层层传播,达到某层时,已经变为极大值,这导致神经元死亡(即输出近似-1或1)
 多层神经网络容易输出枚举值
当某层神经元全部死亡时,它的所有输出将是枚举值,这就导致最终的输出层的输出值也是枚举值
而我们要拟合的是连续值,这样的模型明显就不符合我们的要求
多隐层的危害三:训练困难
由于网络很容易陷入上述的神经元失活、输出为枚举值的状态,此时网络要继续训练将非常缓慢
我们可以想象,一个处于枚举值状态的网络,当输入微小变化时,输出要么几乎不变,要么突变
这种现象对应到参数的梯度就是:要么梯度几乎为0,要么梯度极大
因为训练依赖于梯度,这时候模型要么就更新极慢,要么就突然迭代极极大,
所以多层神经网络的训练是困难的,相比浅层神经网络,深层神经网络很难训练出一个很好的值






     一个多隐层神经网络的实验       


下面我们不妨设置一个10层BP神经网络来拟合抛物线
拟合抛物线是一个简单的任务,理论上来说应该很轻易就能拟合到
编写代码如下,在代码中我们分别训练10次,并打印每次的拟合结果
% 实验:多隐层BP神经网络的拟合效果
clear all ;close all;
X = -3:0.2:3;                                                                  % 输入数据
y = X.^2;                                                                      % 输出数据
rand('seed',70);                                                               % 设定随机种子
for i = 1:10                                                                   % 训练10次
net = newff(X,y,ones(1,10)*3, [repmat({'tansig'},1,10),'purelin'],'trainlm');  % 构建10隐层的BP神经网络
[net,tr,py] = train(net,X,y);                                                  % 训练网络
subplot(2,5,i)                                                                 % 画图
plot(X,y,'-b',X,py,'-r')                                                       % 绘制真实曲线与拟合曲线
end
代码运行结果如下:
 层数对BP神经网络的影响
可以看到,10层的BP神经网络很多时候都无法抛物线
即使是这样的简单任务,当隐层设得较多时,效果都非常差,而且训练出来的网络很可能非常跌宕





     BP神经网络究竟设置几个隐层-总结     


总的来说,BP神经网络一般设置1个隐层就够了,如有必要,可以尝试2个隐层
如果一定要设置很多个隐层,那么必须考虑多隐层网络可能面临的各种困难
 事实上,在深度学习中就不得不设置多个隐层,所以深度学习很多时候都在致力于解决多隐层所遇到的各种困难
例如激活函数使用ReLu函数,学习率设得更小,在激活函数前添加归一化、改用ResNet结构等等一系列的措施

 所以,如果只是一个小数据、简单的问题,能用三层BP神经网络解决的,尽量不要设置过多的隐层
一个三层BP神经网络能解决的问题,尽量用三层BP神经网络解决,这不是绝对的,但在大方向上应该是这样





好了,关于BP神经网络究竟设置多少个隐层就讲到这里了~








  End  







联系老饼