神经网络需要多少隐藏层和隐藏节点?
本文提供了配置多层感知器隐藏部分的指南。
到目前为止,在本系列神经网络中,我们已经讨论了感知器 NN、多层 NN,以及如何使用 Python 开发此类 NN。在我们继续讨论您可以选择使用多少隐藏层和节点之前,请考虑了解以下系列。
- 如何使用神经网络进行分类:什么是感知器?
- 如何使用简单的感知器神经网络示例对数据进行分类
- 如何训练基本的感知器神经网络
- 了解简单的神经网络训练
- 神经网络训练理论简介
- 了解神经网络中的学习率
- 使用多层感知器进行高级机器学习
- Sigmoid 激活函数:多层感知器神经网络中的激活
- 如何训练多层感知器神经网络
- 了解多层感知器的训练公式和反向传播
- Python 实现的神经网络架构
- 如何在 Python 中创建多层感知器神经网络
- 使用神经网络进行信号处理:神经网络设计中的验证
- 训练神经网络数据集:如何训练和验证 Python 神经网络
- 神经网络需要多少隐藏层和隐藏节点?
隐藏层回顾
首先,让我们回顾一下神经网络中隐藏节点的一些要点。
- 仅由输入节点和输出节点组成的感知器(称为单层感知器)不是很有用,因为它们无法近似表征许多类型的现实生活现象的复杂输入 - 输出关系。更具体地说,单层感知器仅限于线性可分 问题;正如我们在第 7 部分中看到的,即使是像布尔 XOR 函数这样基本的东西也不是线性可分的。
- 添加隐藏层 输入层和输出层之间的感知器变成了一个通用逼近器 ,这实质上意味着它能够捕获和再现极其复杂的输入-输出关系。
- 隐藏层的存在使训练变得更加复杂,因为输入到隐藏 权重对最终误差有间接影响 (这是我用来表示网络输出值与目标值之间的差异的术语 由训练数据提供)。
- 我们用来训练多层感知器的技术称为反向传播 :我们将最终误差传播回网络的输入端,这种方式允许我们有效地修改未直接连接到输出节点的权重。反向传播过程是可扩展的——即,相同的过程允许我们训练与任意数量的隐藏层相关联的权重。
下图总结了一个基本的多层感知器的结构。
有多少隐藏层?
正如您所料,这个问题没有简单的答案。然而,最重要的是要理解带有一个隐藏层的感知器是一个非常强大的计算系统。如果你在一个隐藏层上没有得到足够的结果,首先尝试其他改进——也许你需要优化你的学习率,或者增加训练 epoch 的数量,或者增强你的训练数据集。添加第二个隐藏层会增加代码复杂性和处理时间。
另一件要记住的事情是,一个过于强大的神经网络不仅仅是在浪费编码工作和处理器资源——它实际上可能通过使网络更容易受到过度训练而产生积极的伤害。
我们在第 4 部分中讨论了过度训练,其中包含下图作为一种可视化解决方案不够泛化的神经网络操作的方法。
一个超级强大的感知器可能会以一种模糊地类似于人们有时“过度考虑”某种情况的方式来处理训练数据。
当我们过分关注细节并对一个实际上很简单的问题投入过多的智力努力时,我们就会错过“大局”,最终得到的解决方案将被证明是次优的。同样,具有过多计算能力和训练数据不足的感知器可能会选择过于具体的解决方案,而不是寻找能够更有效地对新输入样本进行分类的通用解决方案(如下图所示)。
那么我们什么时候真正需要多个隐藏层呢?我不能根据个人经验给你任何指导。我能做的最好的事情就是传授 Jeff Heaton 博士的专业知识(参见链接文本的第 158 页),他指出一个隐藏层允许神经网络逼近任何涉及“从一个有限空间到另一个有限空间的连续映射”的函数.”
通过两个隐藏层,网络能够“以任意精度表示任意决策边界”。
有多少隐藏节点?
寻找隐藏层的最佳维度需要反复试验。如上所述,节点过多是不可取的,但你必须有足够的节点来使网络能够捕捉输入-输出关系的复杂性。
反复试验是好的,但你需要一些合理的起点。在上面链接的同一本书(第 159 页)中,Heaton 博士提到了选择隐藏层维度的三个经验法则。我将根据我模糊的信号处理直觉提供建议。
- 如果网络只有一个输出节点,并且您认为所需的输入-输出关系相当简单,请从等于输入维度三分之二的隐藏层维度开始。
- 如果您有多个输出节点,或者您认为所需的输入-输出关系很复杂,请使隐藏层维度等于输入维度加上输出维度(但保持小于输入维度的两倍)。
- 如果您认为所需的输入-输出关系极其复杂,请将隐藏维度设置为小于输入维度的两倍。
结论
希望这篇文章能帮助你理解多层感知器隐藏层配置的配置和细化过程。
在下一篇文章中,我们将使用我的 Python 实现和一些示例问题来探索隐藏层维度的影响。
工业机器人