ChatGPT解决这个技术问题 Extra ChatGPT

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

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 4年前关闭。改进这个问题

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

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

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

N
NCC1701

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

网络的内部结构越多,网络就越能代表复杂的解决方案。另一方面,过多的内部结构会变慢,可能会导致训练发散,或导致过度拟合——这将阻止您的网络很好地泛化到新数据。

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

尝试不同的配置,看看哪种效果最好。您可以将您的训练集分成两部分——一份用于训练,一份用于评估——然后训练和评估不同的方法。不幸的是,在您的情况下,这种实验方法似乎不可用。使用经验法则。很多人都想出了很多关于什么最有效的猜测。关于隐藏层中神经元的数量,人们推测(例如)它应该(a)在输入和输出层大小之间,(b)设置为接近(输入+输出)* 2/3,或者(c) 永远不要大于输入层大小的两倍。经验法则的问题在于它们并不总是考虑到重要的信息,例如问题有多“困难”、训练和测试集的大小等。因此,这些规则经常被使用作为“让我们尝试一堆东西,看看什么是最好的”方法的粗略起点。使用动态调整网络配置的算法。 Cascade Correlation 等算法从最小网络开始,然后在训练期间添加隐藏节点。这可以使您的实验设置更简单一些,并且(理论上)可以带来更好的性能(因为您不会意外使用不适当数量的隐藏节点)。

有很多关于这个主题的研究——所以如果你真的感兴趣,可以阅读很多。查看引文 on this summary,尤其是:

Lawrence, S.、Giles, CL 和 Tsoi, AC (1996),“什么尺寸的神经网络可以提供最佳泛化?反向传播的收敛特性”。技术报告 UMIACS-TR-96-22 和 CS-TR-3617,马里兰大学帕克分校高级计算机研究所。

Elisseeff, A. 和 Paugam-Moisy, H. (1997),“用于精确学习的多层网络的大小:分析方法”。神经信息处理系统的进展 9,马萨诸塞州剑桥市:麻省理工学院出版社,第 162-168 页。


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

在实践中,这并不困难(基于对数十个 MLP 进行编码和训练)。

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

在实践中,要达到或超过您的规范要求的神经网络的预测精度,您几乎不需要在网络架构上花费大量时间——这是正确的三个原因:

一旦您确定了数据模型(输入向量中的特征数量,所需的响应变量是数值型还是分类型,如果是后者,您有多少独特的类标签),则指定网络架构所需的大多数参数都是固定的'已经选择);

实际上可调整的少数剩余架构参数几乎总是(根据我的经验,有 100% 的时间)受到那些固定架构参数的高度约束——即,这些参数的值受到最大值和最小值的严格限制;和

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

https://i.stack.imgur.com/xvb0C.png

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

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

剩下的只有两个参数,完全可以自行决定——隐藏层的数量和构成每个层的节点数量。

隐藏层数

如果您的数据是线性可分的(您在开始编写 NN 时通常知道这一点),那么您根本不需要任何隐藏层。 (如果情况确实如此,我不会使用神经网络来解决这个问题——选择一个更简单的线性分类器)。其中第一个——隐藏层的数量——几乎总是一个。这个假设背后有很多经验权重——在实践中,很少有单个隐藏层无法解决的问题可以通过添加另一个隐藏层来解决。同样,有一个共识是添加额外隐藏层的性能差异:使用第二个(或第三个等)隐藏层提高性能的情况非常小。对于大多数问题,一个隐藏层就足够了。

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

换句话说,通过在训练期间对网络应用剪枝算法,您可以比任何先验理论更接近优化的网络配置。

构成隐藏层的节点数

但是构成隐藏层的节点数量呢?假设这个值或多或少不受约束——即,它可以小于或大于输入层的大小。除此之外,您可能知道,还有大量关于 NN 中隐藏层配置问题的评论(参见著名的 NN FAQ 以获得该评论的精彩摘要)。有许多经验得出的经验法则,但其中最常依赖的是隐藏层的大小在输入层和输出层之间。 “Introduction to Neural Networks in Java”的作者 Jeff Heaton 提供了更多内容,这些内容在我刚刚链接到的页面上进行了引用。同样,对面向应用的神经网络文献的扫描几乎肯定会发现隐藏层的大小通常在输入和输出层大小之间。但是between并不代表在中间;实际上,通常最好将隐藏层大小设置为更接近输入向量的大小。原因是如果隐藏层太小,网络可能难以收敛。对于初始配置,较大尺寸的错误——与较小的隐藏层相比,较大的隐藏层为网络提供了更多的容量,有助于其收敛。事实上,这个理由经常被用来推荐一个隐藏层大小大于(更多节点)输入层——即,从一个鼓励快速收敛的初始架构开始,之后你可以修剪“多余”节点(识别隐藏层中权重值非常低的节点,并将它们从重构的网络中消除)。


“一个隐藏层足以解决大多数问题” - 所以......任意回归和分类任务?你有这方面的证据吗?这是对具有无限数量神经元的理论隐藏层的引用吗?
同样,您是否有关于隐藏层大小不受约束的说法的参考? 1个节点? 30 万个节点?我在这里很搞笑,但是这个答案中有很多主张,我希望能得到一些解释。
p
paraglider

我已经将 MLP 用于商业软件,它只有一个隐藏层,只有一个节点。由于输入节点和输出节点是固定的,我只需要更改隐藏层的数量并使用所实现的泛化。通过改变隐藏层的数量,我从来没有真正通过一个隐藏层和一个节点来实现很大的不同。我只使用了一个带有一个节点的隐藏层。它工作得很好,而且减少计算量在我的软件前提下非常诱人。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅