我正在寻找一种有关如何计算层数和每层神经元数的方法。作为输入,我只有输入向量的大小,输出向量的大小和训练集的大小。
通常,最好的网络是通过尝试不同的网络拓扑并选择误差最小的网络来确定的。不幸的是我不能那样做。
Answers:
这是一个非常困难的问题。
网络的内部结构越多,网络在表示复杂解决方案方面就越好。另一方面,过多的内部结构会降低速度,可能会导致培训分散,或导致过度拟合-这将阻止您的网络很好地推广到新数据。
传统上,人们以几种不同的方式解决此问题:
尝试不同的配置,看看哪种方法最有效。 您可以将训练集分为两部分,一个用于训练,一个用于评估,然后训练和评估不同的方法。不幸的是,在您的情况下,听起来好像这种实验方法不可用。
用经验法则。 很多人对最有效的方法提出了很多猜测。关于隐藏层中的神经元数量,人们推测(例如)它应该(a)在输入和输出层大小之间,(b)设置为接近(输入+输出)* 2/3,或者(c)不得大于输入层大小的两倍。
经验法则的问题在于它们并不总是考虑重要的信息,例如问题的“难度”如何,训练和测试集的大小等等。因此,经常使用这些规则作为“让我们尝试一堆东西,看看什么是最好的”的粗略起点。
使用可动态调整网络配置的算法。 诸如Cascade Correlation之类的算法从最小网络开始,然后在训练期间添加隐藏节点。这可以使您的实验设置更简单,并且(理论上)可以提高性能(因为您不会偶然使用不适当数量的隐藏节点)。
关于这个主题有很多研究-因此,如果您真的有兴趣,可以阅读很多东西。查看此摘要的引用,尤其是:
Lawrence,S.,Giles,CL和Tsoi,AC(1996),“什么大小的神经网络可提供最佳泛化?反向传播的收敛特性”。 马里兰大学学院公园高级计算机研究所UMIACS-TR-96-22和CS-TR-3617技术报告。
Elisseeff,A.和Paugam-Moisy,H.(1997),“用于精确学习的多层网络的大小:分析方法”。 神经信息处理系统的进展9,麻省剑桥:麻省理工学院出版社,第162-168页。
在实践中,这并不难(基于对数十个MLP的编码和培训)。
从教科书的意义上讲,使架构“正确”是困难的-我同意,调整网络架构以致无法通过进一步优化架构来提高性能(分辨率)是困难的。但是只有在极少数情况下才需要这种优化程度。
实际上,要达到或超过规范所要求的神经网络的预测精度,您几乎不需要花费大量时间来构建网络体系结构,这是有三个原因的:
一旦决定了数据模型,指定网络体系结构所需的 大多数参数都会被修复(输入向量中的特征数量,所需的响应变量是数字的还是分类的,如果是后者,则是多少个唯一的类标签)您已选择);
剩下的几个实际上可调整的架构参数几乎总是(在我的经验中是100%的时间)受到那些固定架构参数的高度约束-即,这些参数的值由max和min值严格限制;和
无需在训练开始之前确定最佳架构,实际上,神经网络代码通常包含一个小模块,可以在训练过程中以编程方式调整网络架构(通过删除权重值接近零的节点,通常称为“ “修剪。”)
根据上表,神经网络的架构完全由六个参数(内部网格中的六个单元)指定。其中的两个(输入和输出层的层类型数)总是一个和一个-神经网络具有一个输入层和一个输出层。您的NN必须至少具有一个输入层和一个输出层-不多也不少。其次,包含这两层中的每一层的节点数是固定的-输入层,取决于输入向量的大小-即,输入层中的节点数等于输入向量的长度(实际上几乎总是将一个以上的神经元作为偏置节点添加到输入层。
同样,输出层的大小由响应变量固定(数字响应变量为单个节点,并且(假设使用softmax,如果响应变量为类标签,则输出层中节点的数量仅等于唯一变量的数量)类标签)。
即叶只有两个参数对于其存在任何酌在所有-隐藏层的数目和每一个包括这些层的节点的数目。
如果您的数据是线性可分离的(开始编码NN时您通常会知道),那么您根本不需要任何隐藏层。(如果实际上是这样,我将不会使用NN来解决此问题-选择一个更简单的线性分类器)。其中第一个-隐藏层的数量-几乎总是一个。这种假设背后有很多经验上的分量-实际上,很少有一个单独的隐藏层无法解决的问题可以通过添加另一个隐藏层来解决。同样,有一个共识是,添加其他隐藏层会带来性能差异:第二(或第三等)隐藏层可提高性能的情况非常小。一个隐藏层足以解决大多数问题。
在您的问题中,您提到无论出于何种原因,都无法通过反复试验找到最佳的网络架构。调整NN配置的另一种方法(不使用反复试验)是'修剪'。该技术的要点是在训练期间通过识别那些节点(如果从网络中删除不会显着影响网络性能(即数据分辨率))来从网络中删除节点。(即使没有使用正式的修剪技术,您也可以通过训练后查看权重矩阵来粗略了解哪些节点不重要;寻找权重非常接近零-正是那些权重两端的节点显然,如果您在训练期间使用修剪算法,则应从更有可能具有多余(即“可修剪”)节点的网络配置开始,换句话说,在决定网络体系结构时,如果您添加修剪步骤,则会在更多神经元方面犯错。
换句话说,通过在训练过程中对网络应用修剪算法,您可以比任何先验理论都更可能获得更优化的网络配置。
但是构成隐藏层的节点数又如何呢?授予此值或多或少不受约束-即,它可以小于或大于输入层的大小。除此之外,您可能已经知道,关于NN中隐藏层配置的问题有很多评论(有关该评论的出色摘要,请参见著名的NN FAQ)。有许多根据经验得出的经验法则,但是其中最常依靠的是隐藏层的大小在输入层和输出层之间。Jeff Heaton,《Java中的神经网络简介》一书的作者”提供了更多内容,这些内容在我刚刚链接到的页面上都有叙述。同样,对面向应用的神经网络文献进行扫描,几乎可以肯定的发现,隐藏层的大小通常在输入和输出层的大小之间。但是之间的间隔并不意味着在中间;实际上,通常最好将隐藏层的大小设置为更接近输入向量的大小,原因是如果隐藏层太小,则网络可能难以收敛。对于初始配置,较大的隐藏层会产生错误-与较小的隐藏层相比,较大的隐藏层将为网络提供更大的容量,有助于网络收敛,实际上,此理由通常用于推荐大于 (更多节点)输入层-即从初始架构开始,该架构将鼓励快速收敛,之后您可以修剪“多余”节点(在隐藏层中以非常低的权重值标识节点,并将其从您的权重中删除重构网络)。