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


104

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



Answers:


216

有多少隐藏层

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

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


隐藏层中有多少个节点?

来自MLP学术文献。根据我自己的经验等,我已经收集并经常依赖一些经验法则(RoT),并且我发现这些经验法则也是可靠的指南(即,该指南是准确的,即使不是,也是如此)。通常很清楚下一步该怎么做):

RoT基于改进的收敛性:

当您开始建立模型时,在隐藏层中更多节点的一侧出错。

为什么?首先,隐藏层中的几个额外节点可能不会造成任何损害-您的MLP仍将收敛。另一方面,隐藏层中的节点太少会阻止收敛。以这种方式考虑,其他节点会提供一些多余的容量-额外的权重,以便在迭代(训练或模型构建)期间将信号存储/释放到网络。其次,如果您从隐藏层中的其他节点开始,那么稍后可以很容易地修剪它们(在迭代过程中)。这很常见,并且有诊断技术可以为您提供帮助(例如,欣顿图,它只是重量矩阵的可视化表示,重量值的“热图”)。

基于输入层大小和输出层大小的RoT

经验法则是,此[隐藏]层的大小介于输入层大小...和输出层大小...之间。

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

RoT基于主要成分:

通常,我们指定与捕获输入数据集方差的70-90%所需的维度[主要成分]一样多的隐藏节点

但是关于NN常见问题解答作者称这些规则为“废话”,因为它们:忽略训练实例的数量,目标中的噪声(响应变量的值)以及特征空间的复杂性。

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

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

在建立模型的过程中,进行强迫性测试;测试将揭示“不正确”网络体系结构的特征。例如,如果您开始使用的MLP具有由少量节点组成的隐藏层(您将根据测试结果根据需要逐渐增加该隐藏层),则由于偏差和拟合不足,您的训练和泛化误差都会很高。

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


在实践中,我这样做:

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

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

隐藏层开始时一个隐藏层节点数等于输入层的大小。“理想”大小更可能更小(即,输入层中的节点数与输出层中的节点数之间的一定数量的节点),而不是更大-再次,这只是一个经验观察,并且庞大这种观察是我自己的经验。如果项目证明需要额外的时间,那么我将从包含少量节点的单个隐藏层开始,然后(如上所述),我一次将一个节点添加到“隐藏层”,同时计算概化错误,训练错误,偏差和方差。当泛化误差下降并且在误差开始再次增大之前,我选择此时的节点数。参见下图。

在此处输入图片说明


1
我想添加有关#1 RoT的一些相关结果:在成功的SVM中,您实际上将输入映射到更高维度的空间(在NN看来,隐藏节点比输入层中的节点更多)。输出层的工作是从这种过度完成的表示中获取决策。也可能与随机投影有关。Adam Coates和Andrew Y. Ng(2011)的精彩论文讨论了相关主题。
Vladislavs Dovgalecs

很好的解释。关于使用sklearn和MLPClassifier时如何绘制上述图形的任何想法?
seralouk

1
@sera是指xkcd样式吗?
denfromufa

原则上,您可以自动化优化隐藏层中神经元数量的过程吗?另外,您还能自动优化隐藏层的数量吗?
艾迪生

2

选择隐藏层中神经元的数量以及选择神经网络中隐藏层的数量非常困难。

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

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


1

要自动选择最佳层数和每个层的最佳神经元数,可以使用遗传优化

关键部分是:

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

您还可以考虑:

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

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 $。他们给费率。请注意,不能保证这是“最佳”架构,但至少可以为您提供一个良好的起点。此外,根据我自己的经验,辍学之类的东西仍然可以在实践中提供帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.