76

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

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

4

3 回答 3

103

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

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

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

  1. 尝试不同的配置,看看哪种效果最好。 您可以将您的训练集分成两部分——一份用于训练,一份用于评估——然后训练和评估不同的方法。不幸的是,在您的情况下,这种实验方法似乎不可用。

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

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

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

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

于 2010-07-27T16:30:25.277 回答
44

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

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

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

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

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

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

在此处输入图像描述

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

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

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

隐藏层数

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

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

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

构成隐藏层的节点数

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

于 2010-07-27T21:10:06.007 回答
0

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

于 2014-09-10T14:11:57.457 回答