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

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

隐藏了多less层

具有隐藏层的模型将parsing可线性分离的数据。 所以,除非你已经知道你的数据不是线性可分的,否则validation这一点并不会造成什么影响 – 为什么使用比任务要求更复杂的模型呢? 如果它是线性分离的,那么更简单的技术就可以工作,但感知器也可以完成这项工作。

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

隐藏层中有多less个节点?

从MLP学术文献。 我自己的经验等,我已经收集并经常依赖几条经验法则( RoT ),而且我也发现这些经验法则是可靠的指导(即,指导是准确的,甚至当它不是时,它通常下一步该怎么做):

基于改进收敛的RoT :

当你开始build模的时候,在隐藏层的更多节点的边上。

为什么? 首先,隐藏层中的一些额外节点不可能造成任何伤害 – 您的MLP仍然会收敛。 另一方面,隐藏层中的节点太less会阻碍收敛。 通过这种方式考虑,额外的节点会提供一些额外的容量 – 在迭代(训练或模型构build)期间额外的权重来存储/释放信号到networking。 其次,如果你开始在隐藏层中添加额外的节点,那么稍后修改它们是很容易的(在迭代过程中)。 这是常见的,并有诊断技术来帮助你(例如,辛顿图,这只是一个权重matrix的视觉描绘,重量值的热图)。

基于input层大小和输出层大小的RoT :

经验法则是这个[hidden]层的大小在input层大小和输出层大小之间。

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

基于主要组件的RoT :

通常情况下,我们指定尽可能多的隐藏节点作为维度[主要组件]需要捕获input数据集的70-90%的方差

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

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

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

在你的模型build立过程中,执着地去testing; testing将揭示“不正确的”networking架构的签名。 例如,如果你从一个隐藏层由less量节点组成的MLP开始(根据testing结果你将逐渐增加),你的训练和泛化误差将会由于偏差和不足造成。

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


在实践中,我这样做:

input图层 :我的数据vactor的大小(模型中的特征数量)+ 1,当然不包括响应variables

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

隐藏层开始一个隐藏层的节点数量等于input层的大小。 “理想”尺寸更可能是较小的(即input层数量和输出层数量之间的一些节点数目)而不是较大 – 再次,这只是一个经验观察,而体积这个观察是我自己的经验。 如果项目certificate需要额外的时间,那么我从一个由less量节点组成的单个隐藏层开始,然后(正如我刚刚解释的),我一次一个地向隐藏层添加节点,同时计算泛化错误,训练错误,偏差和方差。 当泛化误差已经下降并且在它开始再次增加之前,那个节点的数目是我select的。 见下图。

在这里输入图像描述

select隐藏层中神经元的数量以及selectneural network中隐藏层的数量是非常困难的。

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

但select神经元和隐藏层数的最好方法是实验。 训练不同数量的隐藏层和隐藏神经元的neural network,并使用交叉validation来测量这些networking的性能。 您可以坚持产生最佳性能networking的号码。

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

关键部分将是:

  1. 染色体 :定义每个隐藏层中有多less个单元的vector(例如,[20,5,1,0,0]表示第一个隐藏层中的20个单元,第二个中的5个单元,以及缺失第四个和第五个层的单元)。 您可以设置要尝试的最大层数的限制以及每层中的最大单元数。 你也应该限制染色体的产生。 例如[10,0,3,…]不应该生成,因为任何缺失图层之后的单位('3,…')将是不相关的,会浪费评估周期。
  2. 健身function(Fitness Function) :返回由给定染色体定义的networking的交叉validation集合中最低训练错误的倒数的函数。 如果你想find“最小/最快但最准确的networking”,你还可以包括总单位数或计算时间。

你也可以考虑:

  • 修剪 :从一个大型networking开始,然后减less图层和隐藏单位,同时跟踪交叉validation集性能。
  • 增长 :从一个非常小的networking开始,然后添加单位和图层,并再次跟踪CV集性能。