估计人工神经网络的神经元数量和层数[关闭]


76

我正在寻找一种有关如何计算层数和每层神经元数的方法。作为输入,我只有输入向量的大小,输出向量的大小和训练集的大小。

通常,最好的网络是通过尝试不同的网络拓扑并选择误差最小的网络来确定的。不幸的是我不能那样做。


构建神经网络时可以考虑的另一件事是要素之间的冗余度。冗余度越大,您为隐藏层选择的节点数就越少,因此神经网络被迫提取相关特征。相反,如果添加更多节点和层,则允许神经网络以新的非线性方式重新组合特征。也就是说,您允许网络采用新的视角。PS:我本来会将此添加为评论,但我的声誉不足。
PARTH SURESH

Answers:


103

这是一个非常困难的问题。

网络的内部结构越多,网络在表示复杂解决方案方面就越好。另一方面,过多的内部结构会降低速度,可能会导致培训分散,或导致过度拟合-这将阻止您的网络很好地推广到新数据。

传统上,人们以几种不同的方式解决此问题:

  1. 尝试不同的配置,看看哪种方法最有效。 您可以将训练集分为两部分,一个用于训练,一个用于评估,然后训练和评估不同的方法。不幸的是,在您的情况下,听起来好像这种实验方法不可用。

  2. 用经验法则。 很多人对最有效的方法提出了很多猜测。关于隐藏层中的神经元数量,人们推测(例如)它应该(a)在输入和输出层大小之间,(b)设置为接近(输入+输出)* 2/3,或者(c)不得大于输入层大小的两倍。

    经验法则的问题在于它们并不总是考虑重要的信息例如问题的“难度”如何,训练和测试集的大小等等。因此,经常使用这些规则作为“让我们尝试一堆东西,看看什么是最好的”的粗略起点。

  3. 使用可动态调整网络配置的算法。 诸如Cascade Correlation之类的算法从最小网络开始,然后在训练期间添加隐藏节点。这可以使您的实验设置更简单,并且(理论上)可以提高性能(因为您不会偶然使用不适当数量的隐藏节点)。

关于这个主题有很多研究-因此,如果您真的有兴趣,可以阅读很多东西。查看此摘要的引用,尤其是:


4
+1非常好的答案。每当需要调整模型参数时,都可以像第一种方法一样使用交叉验证技术。当您有多个要优化的参数时,这将变得更加困难,例如libSVM,它会使用交叉验证对两个参数的空间进行网格搜索。其他方法已经使用遗传算法来学习网络的结构以及通常的权重。
Amro 2010年

44

在实践中,这并不难(基于对数十个MLP的编码和培训)。

从教科书的意义上讲,使架构“正确”是困难的-我同意,调整网络架构以致无法通过进一步优化架构来提高性能(分辨率)是困难的。但是只有在极少数情况下才需要这种优化程度。

实际上,要达到或超过规范所要求的神经网络的预测精度,您几乎不需要花费大量时间来构建网络体系结构,这是有三个原因的:

  • 一旦决定了数据模型,指定网络体系结构所需的 大多数参数都会被修复(输入向量中的特征数量,所需的响应变量是数字的还是分类的,如果是后者,则是多少个唯一的类标签)您已选择);

  • 剩下的几个实际上可调整的架构参数几乎总是(在我的经验中是100%的时间)受到那些固定架构参数的高度约束-即,这些参数的值由max和min值严格限制;和

  • 无需在训练开始之前确定最佳架构,实际上,神经网络代码通常包含一个小模块,可以在训练过程中以编程方式调整网络架构(通过删除权重值接近零的节点,通常称为“ “修剪。”)

在此处输入图片说明

根据上表,神经网络的架构完全由六个参数(内部网格中的六个单元)指定。其中的两个(输入和输出层的层类型数)总是一个和一个-神经网络具有一个输入层和一个输出层。您的NN必须至少具有一个输入层和一个输出层-不多也不少。其次,包含这两层中的每一层的节点数是固定的-输入层,取决于输入向量的大小-即,输入层中的节点数等于输入向量的长度(实际上几乎总是将一个以上的神经元作为偏置节点添加到输入层。

同样,输出层的大小由响应变量固定(数字响应变量为单个节点,并且(假设使用softmax,如果响应变量为类标签,则输出层中节点的数量仅等于唯一变量的数量)类标签)。

即叶只有两个参数对于其存在任何酌在所有-隐藏层的数目和每一个包括这些层的节点的数目。

隐藏层数

如果您的数据是线性可分离的(开始编码NN时您通常会知道),那么您根本不需要任何隐藏层。(如果实际上是这样,我将不会使用NN来解决此问题-选择一个更简单的线性分类器)。其中第一个-隐藏层的数量-几乎总是一个。这种假设背后有很多经验上的分量-实际上,很少有一个单独的隐藏层无法解决的问题可以通过添加另一个隐藏层来解决。同样,有一个共识是,添加其他隐藏层会带来性能差异:第二(或第三等)隐藏层可提高性能的情况非常小。一个隐藏层足以解决大多数问题。

在您的问题中,您提到无论出于何种原因,都无法通过反复试验找到最佳的网络架构。调整NN配置的另一种方法(不使用反复试验)是'修剪'。该技术的要点是在训练期间通过识别那些节点(如果从网络中删除不会显着影响网络性能(即数据分辨率))来从网络中删除节点。(即使没有使用正式的修剪技术,您也可以通过训练后查看权重矩阵来粗略了解哪些节点不重要;寻找权重非常接近零-正是那些权重两端的节点显然,如果您在训练期间使用修剪算法,则应从更有可能具有多余(即“可修剪”)节点的网络配置开始,换句话说,在决定网络体系结构时,如果您添加修剪步骤,则会在更多神经元方面犯错。

换句话说,通过在训练过程中对网络应用修剪算法,您可以比任何先验理论都更可能获得更优化的网络配置。

包含隐藏层的节点数

但是构成隐藏层的节点数又如何呢?授予此值或多或少不受约束-即,它可以小于或大于输入层的大小。除此之外,您可能已经知道,关于NN中隐藏层配置的问题有很多评论(有关该评论的出色摘要,请参见著名的NN FAQ)。有许多根据经验得出的经验法则,但是其中最常依靠的是隐藏层的大小在输入层和输出层之间。Jeff Heaton,《Java中的神经网络简介》一书的作者”提供了更多内容,这些内容在我刚刚链接到的页面上都有叙述。同样,对面向应用的神经网络文献进行扫描,几乎可以肯定的发现,隐藏层的大小通常输入和输出层的大小之间。但是之间的间隔并不意味着在中间;实际上,通常最好将隐藏层的大小设置为更接近输入向量的大小,原因是如果隐藏层太小,则网络可能难以收敛。对于初始配置,较大的隐藏层会产生错误-与较小的隐藏层相比,较大的隐藏层将为网络提供更大的容量,有助于网络收敛,实际上,此理由通常用于推荐大于 (更多节点)输入层-即从初始架构开始,该架构将鼓励快速收敛,之后您可以修剪“多余”节点(在隐藏层中以非常低的权重值标识节点,并将其从您的权重中删除重构网络)。


1
“一个隐藏层足以解决大多数问题”-因此...任意回归和分类任务?您有证据吗?这是对具有无限数量神经元的理论隐藏层的引用吗?
克里斯·安德森

1
同样,您是否对隐藏层的大小不受限制的说法有参考?1个节点?30万个节点?我在这里很有趣,但是此答案中有很多主张,我希望对此做出一些解释。
克里斯·安德森

0

我已经将MLP用于商业软件,该软件只有一个隐藏层,只有一个节点。由于输入节点和输出节点是固定的,因此我只需要更改隐藏层的数量并进行通用化即可。通过更改隐藏层的数量,仅使用一个隐藏层和一个节点所实现的目标并没有太大的改变。我只是在一个节点上使用了一个隐藏层。在我的软件前提下,它工作得很好,而且减少计算量也很诱人。

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.