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

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

60169 次浏览

在一个隐藏层中选择神经元的数量和在你的神经网络中选择隐藏层的数量是非常困难的。

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

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

有多少隐藏层

具有 隐藏层的模型将解析 线性可分的数据。因此,除非您已经知道您的数据不是线性可分的,否则验证一下也无妨——为什么要使用比任务所需要的更复杂的模型呢?如果它是线性可分的,那么一个更简单的技术将工作,但感知器也将做这项工作。

假设您的数据确实需要通过非线性技术进行分离,那么 总是从一个隐藏层开始。几乎可以肯定这就是你所需要的。如果您的数据可以使用 MLP 分离,那么 MLP 可能只需要一个隐藏层。这是有理论依据的,但我的理由纯粹是经验主义的: 许多困难的分类/回归问题都是用单隐层 MLP 解决的,然而我不记得遇到过任何用于成功建模数据的多隐层 MLP ——无论是在机器学习论坛,机器学习教科书,学术论文等。当然,它们是存在的,但是从经验上来说,使用它们合理的情况是非常罕见的。


隐藏层中有多少个节点

从 MLP 的学术文献。我自己的经验,等等,我已经收集并经常依靠几个经验法则() ,我也发现它们是可靠的指导(即,指导是准确的,即使它不是,它通常清楚下一步该做什么) :

基于提高收敛性的最低工资:

当开始构建模型时,在 more节点的一侧执行 err 操作 在隐藏层。

为什么?首先,隐藏层中的一些额外节点不太可能造成任何伤害—— MLP 仍然会收敛。另一方面,隐层节点太少会阻碍收敛。这样来看,额外的节点提供了一些额外的容量——在迭代(培训或模型构建)期间向网络存储/释放信号的额外权重。其次,如果在隐藏层中开始使用其他节点,那么以后(在迭代过程中)很容易对它们进行修剪。这很常见,而且有一些诊断技术可以帮助你(例如,Hinton Diagram,它只是一个权重矩阵的可视化描述,一个权重值的“热图”)。

根据输入层的大小和输出层的大小,RoT :

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

之间

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

基于主要组成部分的 RoT :

通常,我们指定的隐藏节点数量与尺寸[主体 组件]需要捕获70-90% 的输入数据的方差 设置

然而 常见问题的作者称这些规则为“无意义的”(字面意思) ,因为它们: 忽略训练实例的数量,目标中的噪声(响应变量的值) ,以及特征空间的复杂性。

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

优化隐藏层神经元数量的唯一有效方法是:

在您的模型构建过程中,执着地进行测试; 测试将揭示“不正确”网络体系结构的特征。例如,如果你从一个 MLP 开始,它有一个由少量节点组成的隐藏层(根据测试结果,你会根据需要逐渐增加这个层) ,你的训练和泛化误差都会因为偏见和不适应而变得很高。

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


实际上,我是这样做的:

输入层 : 我的数据吸积器的大小(我的模型中特征的数量) + 1作为偏置节点,当然不包括响应变量

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

隐藏层 : to start一个隐藏层具有与输入层大小相等的节点数。“理想”的大小更可能是更小的(例如,在输入层和输出层之间的一些节点数)而不是更大的——再次强调,这只是一个经验观察,这个观察的大部分是我自己的经验。如果项目需要额外的时间,那么我从一个由少量节点组成的隐藏层开始,然后(正如我在上面解释的那样)我向隐藏层添加节点,一次一个,同时计算泛化误差、训练误差、偏差和方差。当泛化误差下降时,在它再次开始增加之前,那时的节点数是我的选择。见下图。

enter image description here

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

关键问题是:

  1. Chromosome: Vector that defines how many units in each hidden layer (e.g. [20,5,1,0,0] meaning 20 units in first hidden layer, 5 in second, ... , with layers 4 and 5 missing). You can set a limit on the maximum number number of layers to try, and the max number of units in each layer. You should also place restrictions of how the chromosomes are generated. E.g. [10, 0, 3, ... ] should not be generated, because any units after a missing layer (the '3,...') would be irrelevant and would waste evaluation cycles.
  2. 健康函数 : 一个函数返回给定染色体定义的网络交叉验证中最低训练误差的倒数。如果你想找到“最小/最快但是最精确的网络”,你也可以包括总单位数,或者计算时间。

你亦可考虑:

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

最近有关于这个 https://arxiv.org/abs/1809.09953的理论工作。假设你使用一个 RELU MLP,所有的隐层都有相同的节点数,你的损失函数和真函数,你正在近似一个神经网络遵守一些技术性质(在论文中) ,你可以选择你的深度为顺序 $log (n) $和你的隐层宽度为顺序 $n ^ { d/(2(beta + d))} log ^ 2(n) $。这里 $n $是样本大小,$d $是输入向量的维数,$beta $是真实函数的平滑度参数。由于 $beta $是未知的,您可能希望将其视为一个超参数。

这样做,你可以保证收敛到 $1 $的概率是样本大小的函数,你的逼近误差收敛到 $0 $的概率是样本大小的函数。他们给出了价格。请注意,这并不能保证是“最好的”架构,但它至少可以为您提供一个良好的起点。此外,我自己的经验表明,像辍学这样的事情在实践中仍然有帮助。