如何选择前馈神经网络中隐藏层和节点的数量?


Answers:


467

我知道这个问题已经得到回答,但是我认为现有的回答除了指向通常与该问题的主题相关的链接之外,还没有真正涉及到这个问题。特别是,该链接描述了一种用于程序网络配置的技术,但这不是网络配置的“ [a]标准和公认的方法 ”。

通过遵循一小组清晰的规则,可以以编程方式设置有效的网络体系结构(即,神经元层的数量和类型以及组成每一层的神经元的数量)。按照此架构,这将为您提供一种称职的架构,但可能不是最佳架构。

但是,一旦初始化了该网络,您就可以在训练过程中使用许多辅助算法来迭代调整配置。这些家族中的一个家族通过在一定数量的训练时期后基于权重向量的(较小)值修剪节点来进行工作,换句话说,消除了不必要的/冗余的节点(更多内容请参见下文)。

因此,每个NN具有三种类型的层:inputhiddenoutput


因此,创建NN体系结构意味着得出每种类型的层数以及这些层中每层的节点数的值。

输入层

很简单-每个NN都恰好有其中之一-没有我所知道的异常。

关于组成该层的神经元的数量,一旦您知道训练数据的形状,就可以完全唯一地确定此参数。具体来说,组成该层的神经元数量等于数据中的要素(列)数量。某些NN配置为偏差项增加了一个附加节点。


输出层

像输入层一样,每个NN都只有一个输出层。确定其大小(神经元数量)很简单;它完全取决于所选的模型配置。

您的NN是在机器模式还是回归模式下运行(使用在统计中也使用过但为其赋予不同含义的术语的ML约定非常令人困惑)。机器模式:返回类别标签(例如,“高级帐户” /“基本帐户”)。回归模式返回一个值(例如价格)。

如果NN是回归器,则输出层具有单个节点。

如果NN是分类器,则除非使用softmax,否则它也只有一个节点,在这种情况下,输出层在模型中每个类标签具有一个节点。

隐藏层

因此,这几条规则为输入和输出层设置了层数和大小(神经元/层)。留下隐藏的层。

多少个隐藏层?好吧,如果您的数据是线性可分离的(开始编码NN时您通常会知道),那么您根本不需要任何隐藏层。当然,您也不需要NN来解析数据,但是它仍然可以完成任务。

除此之外,您可能已经知道,关于NN中隐藏层配置的问题有大量评论(有关该评论的出色摘要,请参见疯狂透彻且有见地的NN FAQ)。在本主题中达成共识的一个问题是,添加其他隐藏层的性能有所不同:使用第二个(或第三个等)隐藏层提高性能的情况很少。一个隐藏层足以解决大多数问题。

那么隐藏层的大小呢?有多少神经元呢?有一些凭经验得出的经验法则,其中最常依靠的是“ 隐藏层的最佳大小通常在输入层大小和输出层的大小之间 ”。Java神经网络简介的作者Jeff Heaton 提供了更多内容。

总而言之,对于大多数问题,只需使用以下两个规则来设置隐藏层配置,就有可能获得不错的性能(即使没有第二个优化步骤):(i)隐藏层的数量等于一;(ii)该层中神经元的数量是输入和输出层中神经元的平均值。


网络配置优化

修剪描述了一组技术(通过节点而不是层)调整网络大小以提高计算性能,有时还提高分辨率性能。这些技术的要点是在训练期间通过识别那些节点(如果从网络中删除不会显着影响网络性能(即,数据分辨率))来从网络中删除节点。(即使没有使用正式的修剪技术,您也可以通过训练后查看权重矩阵来粗略了解哪些节点不重要;权重非常接近零-通常是那些权重两端的节点显然,如果您在训练期间使用了修剪算法,则应从网络配置开始,该配置更可能具有多余(即“可修剪”)节点-换句话说,

换句话说,通过在训练过程中对网络应用修剪算法,可以实现最佳的网络配置。我不知道您是否可以在单个“前期”操作(例如基于遗传算法的算法)中做到这一点,尽管我现在确实知道这种两步优化更为普遍。


31
您指出,对于大多数问题而言,只需要一个隐藏层即可。也许最好说具有更多隐藏层的NN非常难以训练(如果您想知道如何,请查看多伦多Uof的Hinton小组的出版物,“深度学习”),因此这些问题不仅需要隐藏神经网络认为该层是“不可解决的”。
bayerj 2011年

13
您编写如果NN是回归器,则输出层具有单个节点。。为什么只有一个节点?为什么不能有多个连续输出?
gerrit 2012年

5
@gerrit如果目标输出是矢量值,则肯定可以有多个连续输出。不过,为矢量值输出定义适当的损失函数可能比使用一个输出复杂一些。
lmjohns3,2013年

5
我认为这是相反的:如果NN是分类器,那么除非使用softmax,否则它也只有一个节点,在这种情况下,输出层在模型中每个类标签具有一个节点。
viyps 2014年

2
@doug谢谢您的精彩回答。这使我可以将ANN从3个隐藏层减少到1个,并通过设置正确数量的隐藏神经元来达到相同的分类精度...我只是使用了输入和输出求和的平均值。谢谢!
rayryeng '17

129

@doug的答案对我有用。还有一条经验法则可以帮助解决有监督的学习问题。如果将神经元数量保持在以下水平,通常可以防止过度拟合:

Nh=Ns(α(Ni+No))

Ni
No
Ns
α

alpha

Ns(Ni+No)α

对于自动化程序,您将从2的alpha开始(训练数据的自由度是模型的两倍),如果训练数据集的误差(损失)明显小于,则工作到10。您的测试数据集。


7
这个公式非常有趣和有用。这个公式有参考吗?这样会更有帮助。
prashanth

2
@prashanth我在上面提到的NN Design文本中结合了一些断言和公式。但是我不认为它以我显示的形式被明确调用。我的版本是一个非常粗略的近似,带有许多简化的假设。YMMV。
滚刀

1
首先,我想写训练集而不是先前评论中的测试集。如果我们将其理解为“您至少需要那么多神经元来从数据集中学习足够的特征(您提到的DOF)”,则该公式可能有意义。如果数据集的特征可以代表总体,并且该模型可以概括的很好,那么可能是另一个问题(但很重要)。
kon psych

3
Nh(Ni+No)

2
@mateus,多层的更好的经验法则是N_h对此的解决方案(每层隐藏神经元的平均数量)N_s = (N_i + N_o) * N_h ^ N_hidden_layers。但是我仍然不会使用这个公式。当您不打算实施任何其他正则化方法时,仅适用于非常基本的问题(玩具问题)。
滚刀,

60

介绍到神经网络的Java (第二版),杰夫·希顿 -预览可以免费从谷歌图书和以前在作者的网站

隐藏层数

关于隐藏层,实际上必须做出两个决定:在神经网络中实际要拥有多少个隐藏层,以及在每个这些层中将有多少个神经元。我们将首先研究如何确定与神经网络一起使用的隐藏层数。

需要两个隐藏层的问题很少遇到。但是,具有两个隐藏层的神经网络可以表示任何形状的函数。当前,从理论上讲,没有理由将神经网络用于两个以上的隐藏层。实际上,对于许多实际问题,没有理由使用不止一个隐藏层。表5.1总结了具有各种隐藏层的神经网络体系结构的功能。

表5.1:确定隐藏层数

| 隐藏层数| 结果

 0-仅能表示线性可分离函数或决策。

 1-可以近似包含连续映射的任何函数
从一个有限的空间到另一个。

 2-可以代表任意精度的任意决策边界
具有合理的激活功能,可以近似任何平滑
映射到任何精度。

确定隐藏的神经元层的数量只是问题的一小部分。您还必须确定这些隐藏层中的每一个中将包含多少个神经元。下一部分将介绍此过程。

隐藏层中的神经元数量

确定隐藏层中神经元的数量是确定整体神经网络体系结构中非常重要的一部分。尽管这些层不直接与外部环境交互,但是它们对最终输出具有巨大的影响。必须仔细考虑隐藏层的数量以及每个这些隐藏层中的神经元数量。

在隐藏层中使用太少的神经元将导致所谓的欠拟合。当隐藏层中的神经元太少而无法充分检测复杂数据集中的信号时,就会发生拟合不足。

在隐藏层中使用过多的神经元会导致一些问题。首先,隐藏层中的神经元过多可能会导致过度拟合。当神经网络具有如此大的信息处理能力以至于训练集中包含的有限信息量不足以训练隐藏层中的所有神经元时,就会发生过度拟合。即使训练数据足够,也会出现第二个问题。隐藏层中过多的神经元会增加训练网络所需的时间。训练时间会增加到无法充分训练神经网络的程度。显然,隐藏层中的神经元太多和太少之间必须达成某种折衷。

有很多经验法则来确定要在隐藏层中使用的神经元的正确数量,例如:

  • 隐藏神经元的数量应在输入层的大小和输出层的大小之间。
  • 隐藏神经元的数量应为输入层大小的2/3加上输出层大小的2/3。
  • 隐藏神经元的数量应小于输入层大小的两倍。

这三个规则为您考虑提供了一个起点。最终,神经网络架构的选择将取决于反复试验。但是反复试验到底意味着什么?您不想开始在网络上随机抛出层和神经元。这样做将非常耗时。第8章,“修剪神经网络”将探讨确定神经网络最佳结构的各种方法。


我也喜欢以下来自我在researchgate.net上找到答案的摘录,它仅用几句话就能传达很多内容:

斯蒂芬·彼得森(Steffen B Petersen)·奥尔堡大学

[...]

为了确保网络概括节点数量的能力,必须保持尽可能低的数量。如果节点过多,您的网络将成为一个内存库,可以回忆训练集的完善程度,但是在不属于训练集的样本上效果不佳。


您是否知道Steffen B Petersen的报价来源?
塞巴斯蒂安·尼尔森

对不起,我没有。我尝试搜索它,但找不到它...我认为该文章已从网络上删除。也许您可以直接与他联系?
jj_

不应该考虑训练集的大小吗?我有一个包含约300,000个唯一样本(汽车价格)的表格数据集。输入层有89个节点。训练一个没有正则化的网络,并且在一个隐藏层中只有89个节点,经过几个时期,我的训练损失达到了平稳状态。RMSE稳定在约1,800美元(在此回归问题中,单个输出节点就是价格)。
rodrigo-silveira

我认为斯特芬乙彼得森报价的来源是这里:researchgate.net/post/...
TripleAntigen

43

目前,我正在对此进行实证研究(正在我们的HPC设施中处理一个处理器世纪的模拟!)。我的建议是使用“大型”网络和正则化,如果使用正则化,则网络体系结构将变得不那么重要(前提是它足够大以表示我们要捕获的基础功能),但是您确实需要调整正则化参数正确。

架构选择的问题之一是,它是对模型复杂性的离散而不是连续的控制,因此可能是一个钝器,特别是当理想复杂性较低时。

但是,所有这一切都遵循“免费午餐”定理,尽管在大多数情况下正则化是有效的,但总有一些情况下架构选择的效果更好,并且这是唯一可以解决当前问题的唯一方法尝试两种方法并进行交叉验证。

如果要构建自动化的神经网络构建器,我将使用Radford Neal的基于混合蒙特卡洛(HMC)采样的贝叶斯方法,并使用大型网络并在权重上进行集成,而不是优化单个网络的权重。然而,这在计算上是昂贵的并且有点“妖术”,但是尼尔教授获得的结果表明这是值得的!


“目前我正在对此进行经验研究”-是否有任何更新?
马丁·托马

2
不,不是,我仍然建议使用大型网络和正则化方法,但没有灵丹妙药,有些问题不需要正则化,但是有些数据集需要隐藏层大小调整和正则化。遗憾的是,审阅者不喜欢该论文:-(
Dikran Marsupial



6

使用全局超参数搜索构建神经网络的自动化方法:

输入和输出层是固定大小的。

可能有所不同:

  • 层数
  • 每层神经元的数量
  • 层的类型

可以将多种方法用于此离散优化问题,并将网络超出样本误差作为成本函数。

  • 1)在参数空间上进行网格/随机搜索,从稍微好一点的位置开始
  • 2)大量的方法可以用来寻求最优的架构。(是的,这需要时间)。
  • 3)做一些调整,冲洗,重复。

6

抱歉,我无法发表评论,请耐心等待。无论如何,我碰到了这个讨论线程,使我想起了我最近看过的一篇论文。我认为参与此活动的人们可能会感兴趣:

AdaNet:人工神经网络的自适应结构学习

Corinna Cortes,Xavier Gonzalvo,Vitaly Kuznetsov,Mehryar Mohri,Scott Yang;2017年,第34届国际机器学习国际会议论文集,PMLR 70:874-883。

摘要我们提出了一种用于分析和学习人工神经网络的新框架。我们的方法可以同时自适应地学习网络的结构及其权重。该方法基于并伴随着强大的数据相关理论学习保证,因此最终的网络体系结构可证明适应于任何给定问题的复杂性。



3

我想提出一种不太常见但超级有效的方法

基本上,您可以利用一组称为“遗传算法”的算法,这些算法尝试一小部分潜在选项(层的随机数和每层节点的数量)。然后,它将这群选择视为“父母”,通过组合/变异一个或多个父母来创造孩子,就像有机体的进化一样。最好的孩子和一些随机的好孩子被保存在每一代中,几代人之后,适者生存。

对于约100个或更少的参数(例如层数,层类型和每层神经元数的选择),此方法超级有效。通过为每一代创建许多潜在的网络体系结构并对其进行部分训练,直到可以估计出学习曲线(通常取决于许多参数的100-10k个小批量)来使用它。经过几代人的努力,您可能希望将训练和验证开始具有明显不同的错误率(过度拟合)的点作为选择孩子的目标函数。在选择最终模型以更快得出结论之前,最好使用数据的很小一部分(10-20%)。此外,对网络初始化使用单个种子即可正确比较结果。

对于一个体面的网络,10到50代应该会产生很好的结果。


另一个非常有趣的方法是贝叶斯优化,它也是一种相对较少参数的极其有效的黑盒优化方法。arxiv.org/pdf/1206.2944.pdf
丹·埃雷兹

2

隐藏层数及其可实现的功能:

0-仅能表示线性可分离函数或决策。

1-可以近似包含从一个有限空间到另一个有限空间的连续映射的任何函数。

2-可以表示具有合理激活函数的任意精度的任意决策边界,并且可以将任意平滑映射近似为任意精度。

超过2个-附加层可以学习层的复杂表示(某种自动要素工程)。


8
请提供资料。– 评论者
吉姆(Jim)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.