多层感知器(MLP)架构:选择隐藏层数和隐藏层大小的标准?

时间:2012-05-12 17:18:08

标签: machine-learning neural-network deep-learning perceptron

如果我们有10个特征向量,那么我们可以在输入层有10个神经节点。如果我们有5个输出类,那么我们可以在输出层有5个节点。但是选择MLP中隐藏层数的标准是什么? 1个隐藏层中有多少个神经节点?

4 个答案:

答案 0 :(得分:198)

有多少隐藏图层

隐藏图层的模型将解析线性可分数据。因此,除非您已经知道您的数据不能线性分离,否则验证这一点并不会有什么影响 - 为什么要使用比任务要求更复杂的模型?如果它是线性可分的,那么一种更简单的技术就可以工作,但Perceptron也可以完成这项工作。

假设您的数据确实需要通过非线性技术进行分离,那么 始终以一个隐藏层开始 。几乎可以肯定,这就是你所需要的一切。如果您的数据可以使用MLP分离,那么该MLP可能只需要一个隐藏层。这有理论上的理由,但我的理由纯粹是经验性的:使用单隐藏层MLP解决了许多困难的分类/回归问题,但我不记得遇到任何用于成功建模的多重隐藏层MLP数据 - 无论是在ML公告板,ML教科书,学术论文等等。当然,它们存在,但证明其使用合理的情况在经验上非常罕见。


隐藏层中有多少个节点?

来自MLP学术文献。我自己的经验等等,我已经收集并经常依赖几条经验法则( RoT ),我也发现它是可靠的指南(即,指导是准确的,甚至是如果不是,通常明确下一步该做什么):

RoT基于改善收敛性:

  

当您开始建模时,错误地站在更多节点的一侧   在隐藏层。

为什么呢?首先,隐藏层中的一些额外节点不会造成任何伤害 - 您的MLP仍然会收敛。另一方面,隐藏层中的节点太少会阻止收敛。可以这样考虑,额外的节点提供了一些过剩的容量 - 在迭代(训练或模型构建)期间向网络存储/释放信号的额外权重。其次,如果您从隐藏层中的其他节点开始,那么以后很容易修剪它们(在迭代过程中)。这很常见,并且有一些诊断技术可以帮助您(例如,Hinton Diagram,它只是重量矩阵的视觉描绘,是热量值的热图,)。

RoTs基于输入图层的大小和输出图层的大小:

  

根据经验,这个[隐藏]图层的大小是某个地方   在输入图层大小...和输出图层大小....

之间      

要计算隐藏节点的数量,我们使用以下一般规则:   (输入数量+输出)x 2/3

RoT基于主要成分:

  

通常,我们指定与维度[principal]一样多的隐藏节点   组件]需要捕获输入数据的70-90%的方差   设置

然而NN FAQ作者称这些规则为#34;废话" (字面意思)因为它们:忽略训练实例的数量,目标中的噪声(响应变量的值)以及特征空间的复杂性。

在他看来(在我看来他总是知道他在说什么),根据你的MLP是否包含某种形式的正规化来选择隐藏层中的神经元数量,或者提早停止

优化隐藏层中神经元数量的唯一有效技术:

在你的模型建设过程中,痴迷地测试;测试将揭示&#34;不正确&#34;的签名。网络架构。例如,如果您开始使用具有由少量节点组成的隐藏层的MLP(根据测试结果,您将根据需要逐渐增加),您的训练和泛化误差将因偏差和欠拟合而导致。< / p>

然后一次增加一个隐藏层中的节点数,直到泛化错误开始增加,这次是由于过度拟合和高方差。


在实践中,我这样做:

输入图层:我的数据vactor的大小(我模型中的要素数量)+偏置节点的数量+ 1,当然不包括响应变量

输出层:由我的模型确定的soley:回归(一个节点)与分类(相当于类数的节点数,假设softmax)

隐藏图层启动一个隐藏图层,其中许多节点等于输入图层的大小。 &#34;理想&#34;尺寸更可能更小(即,输入层中的数字和输出层中的数字之间的一些节点)而不是更大 - 再次,这只是一个经验观察,并且这个观察的大部分是我自己的经历。如果项目证明了所需的额外时间,那么我从一个由少量节点组成的隐藏层开始,然后(如上所述)我将节点添加到隐藏层,一次一个,同时计算泛化错误,训练错误,偏差和方差。当泛化错误已经下降并且在它再次开始增加之前,那个点上的节点数是我的选择。见下图。

enter image description here

答案 1 :(得分:2)

很难选择隐藏层中的神经元数量,并选择神经网络中隐藏层的数量。

通常,对于大多数应用程序,一个隐藏层就足够了。此外,隐藏层中的神经元数量应介于输入数量(示例中为10)和输出数量(示例中为5)之间。

但选择神经元和隐藏层数的最佳方法是实验。训练具有不同数量的隐藏层和隐藏神经元的几个神经网络,并使用cross-validation来衡量这些网络的性能。您可以坚持使用能够产生性能最佳网络的数字。

答案 2 :(得分:1)

要自动选择每个图层的最佳图层数和最佳神经元数,您可以使用 genetic optimization

关键部分是:

  1. 染色体:定义每个隐藏层中有多少单位的矢量(例如[20,5,1,0,0]表示第一个隐藏层中的20个单位,第二个中隐含5个单位,... ,缺少第4层和第5层)。您可以设置要尝试的最大层数的限制,以及每个层中的最大单元数。您还应该限制染色体的生成方式。例如。不应生成[10,0,3,...],因为缺失层之后的任何单元('3,......')将无关紧要并且会浪费评估周期。
  2. 适应度函数:返回由给定染色体定义的网络的交叉验证集中最低训练误差的倒数的函数。如果您想要找到“最小/最快但最准确的网络”,您还可以包括总单位数或计算时间。
  3. 你也可以考虑:

    • 修剪:从大型网络开始,然后减少图层和隐藏单元,同时跟踪交叉验证集的性能。
    • 成长:从一个非常小的网络开始,然后添加单位和图层,再次跟踪CV集的表现。

答案 3 :(得分:0)

最近对此https://arxiv.org/abs/1809.09953进行了理论研究。假设您使用RELU MLP,则所有隐藏层都具有相同数量的节点,并且与神经网络近似的损失函数和真实函数服从某些技术属性(在本文中),您可以选择深度为顺序$ \ log(n)$和隐藏层的宽度顺序为$ n ^ {d /(2(\ beta + d))} \ log ^ 2(n)$。这里$ n $是样本量,$ d $是输入向量的维数,$ \ beta $是真实函数的平滑度参数。由于$ \ beta $是未知的,因此您可能希望将其视为超参数。

这样做可以保证,作为样本量的函数收敛到$ 1 $的概率,作为样本量的函数,近似误差收敛到$ 0 $。他们给费率。请注意,不能保证这是“最佳”架构,但至少可以为您提供一个良好的起点。此外,根据我自己的经验,辍学之类的东西在实践中仍然会有所帮助。