估计人工neural network的神经元数量和层数

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

通常最好的networking是通过尝试不同的networking拓扑结构并select错误最less的networking来确定的。 不幸的是我不能那样做。

这是一个非常难的问题。

networking越是内部结构,networking就越能代表复杂的解决scheme。 另一方面,太多的内部结构比较慢,可能会导致训练发散,或者导致过度训练 – 这会阻止你的networking很好地融入新的数据。

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

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

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

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

  3. 使用dynamic调整networkingconfiguration的algorithm。 像级联相关的algorithm从最小的networking开始,然后在训练期间添加隐藏的节点。 这可以使您的实验设置更简单一些,理论上可以带来更好的性能(因为您不会意外地使用不适当数量的隐藏节点)。

关于这个问题有很多的研究 – 所以如果你真的感兴趣,有很多要阅读。 查看摘要中的引用,特别是:

  • Lawrence,S.,Giles,CL,and Tsoi,AC(1996), “什么规模的neural network给出最优泛化?反向传播的收敛性质” 。 学院公园马里兰大学高级计算机研究所的技术报告UMIACS-TR-96-22和CS-TR-3617。

  • Elisseeff,A。和Paugam-Moisy,H。(1997), “用于精确学习的多层networking的尺寸:分析方法” 。 “神经信息处理系统进展”9,麻省剑桥:麻省理工学院出版社,第162-168页。

实际上,这并不困难(基于编码和训练的数十个MLP)。

在教科书的意义上说,让架构“正确”是很难的 – 即调整你的networking架构,使得性能(分辨率)无法通过架构的进一步优化得到改善是困难的,我同意。 但只有在极less数情况下才需要优化程度。

在实践中,为了达到或超过规范所要求的neural network的预测精度,几乎不需要在networking架构上花费大量的时间,原因有三:

  • 一旦你决定了你的数据模型(input向量中的特征的数量,所需的响应variables是数字的还是分类的,以及如果后者是多less个唯一的类别标签),则指定networking体系结构所需的大多数参数 都是固定的你select了);

  • 实际上可以调节的其余几个架构参数几乎总是(在我的经验中是100%的时间) 受到那些固定架构参数的高度约束 – 即这些参数的值紧紧地受最大值和最小值的限制; 和

  • 在训练开始之前,并不需要确定最佳的体系结构,事实上,neural network代码通常包括一个小模块,用于在训练过程中以编程方式调整networking体系结构(通过删除重量值接近于零的节点 – 通常称为“ 修剪” 。)

在这里输入图像说明

根据上表,neural network的架构完全由六个参数(内部网格中的六个单元格)指定。 其中两个(input层和输出层的层数)总是一个和一个 – neural network有一个input层和一个输出层。 您的NN必须至less有一个input层和一个输出层 – 不多也不less。 其次,包括这两层中的每一层的节点的数量是固定的 – input层,通过inputvector的大小,即,input层中的节点的数量等于inputvector的长度(实际上一个神经元几乎总是作为偏置节点添加到input层)。

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

这就留下了两个参数,这两个参数都有自由裁量权 – 隐藏层的数量和每个层所包含的节点的数量。

隐藏层的数量

如果你的数据是线性分离的(在你开始编写一个NN的时候你经常知道),那么你根本不需要任何隐藏层。 (如果是这样的话,我不会使用NN来解决这个问题 – select一个更简单的线性分类器)。 其中第一个 – 隐藏层数 – 几乎总是一个。 在这个假设背后有很多经验权重 – 在实践中,通过增加另一个隐藏层,很less有单个隐藏层无法解决的问题变得可溶。 同样,还有一个共识就是增加隐藏层的性能差异:第二个(或第三个等)隐藏层的性能提高的情况非常小。 一个隐藏层对于大多数问题已经足够了。

在你的问题中,你提到过,无论出于何种原因,你都无法通过反复试验find最佳的networking架构。 另一种调整NNconfiguration的方法是“ 修剪 ”( pruning )。 该技术的要点是在训练期间通过识别那些从networking中移除的节点不会明显影响networking性能(即数据的parsing)的方式,从训练期间的networking中去除节点。 (即使不使用正式的修剪技术,通过在训练之后查看权重matrix,您可以粗略地了解哪些节点不重要;查找非常接近于零的权重 – 这些权重的任一端上的节点经常在修剪过程中被删除。)显然,如果在训练过程中使用修剪algorithm,那么从更可能具有过量(即“可修剪”)节点的networkingconfiguration开始,换句话说,当决定networking架构时,如果你添加一个修剪步骤,就会犯更多神经元的错误。

换句话说,通过在训练期间对networking应用修剪algorithm,您可以比任何先验理论所能提供的优化networkingconfiguration更接近。

包含隐藏层的节点数目

但是包含隐藏层的节点数呢? 当然这个值或多或less是不受约束的 – 也就是说,它可以小于或大于input层的大小。 除此之外,正如您可能知道的那样, neural network中隐藏层configuration问题上有一大堆评论(参见着名的NN常见问题解答 ,对该评论进行了精彩的总结)。 有许多经验派生的经验法则,但其中最常见的是隐藏层在input层和输出层之间的大小 。 Jeff Heaton,“ Java中的neural network入门 ”一书的作者提供了一些更多的内容,这些内容在我刚刚链接到的页面上列出。 同样,面向应用的neural network文献的扫描,几乎可以肯定地揭示隐藏层大小通常input和输出层大小之间。 但是之间并不意味着中间; 实际上,将隐藏层大小设置得更接近inputvector的大小通常会更好。 原因是如果隐藏层太小,networking可能难以收敛。 对于初始configuration,在较大的尺寸上犯错误 – 与较小的隐藏层相比,较大的隐藏层使networking具有更多的容量,这有助于它收敛。 事实上,这个理由经常被用来推荐input层(更多节点) 更大的隐藏层大小 – 也就是说,从一个鼓励快速收敛的初始架构开始,之后你可以修剪“过剩”节点(识别隐藏层中具有非常低权重值的节点,并将其从重新分解的networking中删除)。

我已经用一个商业软件只有一个隐藏层只有一个节点的MLP。 由于input节点和输出节点是固定的,所以我只能改变隐藏层的数量并且实现泛化。 通过改变隐藏层的数量,我从来没有真正发现我只用一个隐藏层和一个节点实现的巨大差异。 我只用了一个节点的隐藏层。 它运行得非常好,而且在我的软件前提下,计算量也非常有吸引力。