如果我们有 10 个特征向量,那么我们可以在输入层有 10 个神经节点。如果我们有 5 个输出类,那么我们可以在输出层有 5 个节点。但是在 MLP 中选择隐藏层数和多少神经元的标准是什么? 1个隐藏层中的节点?
4 回答
有多少隐藏层?
具有零隐藏层的模型将解析线性可分数据。因此,除非您已经知道您的数据不是线性可分的,否则验证这一点并没有什么坏处——为什么要使用比任务要求更复杂的模型呢?如果它是线性可分的,那么更简单的技术将起作用,但感知器也可以完成这项工作。
假设您的数据确实需要通过非线性技术进行分离,那么总是从一个隐藏层开始。几乎可以肯定,这就是您所需要的。如果您的数据可以使用 MLP 进行分离,那么该 MLP 可能只需要一个隐藏层。这有理论上的理由,但我的理由纯粹是经验性的:使用单隐藏层 MLP 解决了许多困难的分类/回归问题,但我不记得遇到过任何用于成功建模数据的多隐藏层 MLP - - 无论是在 ML 公告板、ML 教科书、学术论文等上。它们当然存在,但证明使用它们的情况在经验上非常罕见。
隐藏层有多少个节点?
来自 MLP 学术文献。我自己的经验等,我收集并经常依赖几个经验法则(RoT),我也发现它们是可靠的指南(即,指导是准确的,即使不是,它通常很清楚下一步该做什么):
基于改进收敛的RoT :
当您开始构建模型时,会在隐藏层中的更多节点方面犯错。
为什么?首先,隐藏层中的一些额外节点不太可能造成任何伤害——您的 MLP 仍然会收敛。另一方面,隐藏层中的节点太少会阻碍收敛。这样想,额外的节点提供了一些额外的容量——在迭代(训练或模型构建)期间用于存储/释放信号到网络的额外权重。其次,如果您从隐藏层中的其他节点开始,那么以后(在迭代过程中)很容易修剪它们。这很常见,并且有一些诊断技术可以帮助您(例如,Hinton 图,它只是权重矩阵的直观描述,权重值的“热图”)。
基于输入层大小和输出层大小的RoT :
经验法则是这个[隐藏]层的大小介于输入层大小...和输出层大小...之间。
为了计算隐藏节点的数量,我们使用以下一般规则:(输入数量 + 输出数量)x 2/3
基于主成分的RoT :
通常,我们指定与捕获输入数据集 70-90% 方差所需的维度 [主要组件] 一样多的隐藏节点。
然而,NN FAQ作者称这些规则为“无稽之谈”(字面意思),因为它们:忽略了训练实例的数量、目标中的噪声(响应变量的值)以及特征空间的复杂性。
在他看来(在我看来,他总是知道自己在说什么),根据您的 MLP 是否包含某种形式的正则化或提前停止来选择隐藏层中的神经元数量。
优化隐藏层中神经元数量的唯一有效技术:
在你的模型构建过程中,痴迷地测试;测试将揭示“不正确”网络架构的特征。例如,如果您从具有由少量节点组成的隐藏层的 MLP 开始(根据测试结果,您将根据需要逐渐增加),您的训练和泛化误差都将由偏差和欠拟合引起。
然后增加隐藏层中的节点数,一次一个,直到泛化误差开始增加,这一次是由于过拟合和高方差。
在实践中,我这样做:
输入层:我的数据变量的大小(我的模型中的特征数量)+ 1 用于偏置节点,当然不包括响应变量
输出层:由我的模型确定:回归(一个节点)与分类(节点数等于类数,假设为softmax)
隐藏层:开始,一个隐藏层节点数等于输入层的大小。“理想”大小更可能更小(即,输入层中的数字和输出层中的数字之间的一些节点数)而不是更大 - 再次,这只是一个经验观察,并且大部分这个观察是我自己的经验。如果项目证明需要额外的时间是合理的,那么我从一个由少量节点组成的单个隐藏层开始,然后(正如我上面解释的)我将节点添加到隐藏层,一次一个,同时计算泛化误差、训练误差、偏差和方差。当泛化误差下降并且在它再次开始增加之前,此时的节点数量是我的选择。见下图。
选择隐藏层中的神经元数量以及选择神经网络中隐藏层的数量非常困难。
通常,对于大多数应用程序,一个隐藏层就足够了。此外,该隐藏层中的神经元数量应介于输入数量(在您的示例中为 10)和输出数量(在您的示例中为 5)之间。
但是选择神经元和隐藏层数量的最佳方法是实验。用不同数量的隐藏层和隐藏神经元训练几个神经网络,并使用交叉验证测量这些网络的性能。您可以坚持使用产生最佳性能网络的数字。
要自动为每一层选择最佳层数和最佳神经元数,您可以使用遗传优化。
关键部分是:
- Chromosome:定义每个隐藏层中有多少个单元的向量(例如,[20,5,1,0,0] 表示第一个隐藏层中有 20 个单元,第二个隐藏层中有 5 个单元,...,缺少第 4 层和第 5 层)。您可以设置要尝试的最大层数以及每层中的最大单元数。您还应该限制染色体的生成方式。例如,不应生成 [10, 0, 3, ... ],因为缺失层('3,...')之后的任何单元都是不相关的,并且会浪费评估周期。
- 适应度函数:返回由给定染色体定义的网络的交叉验证集中最低训练误差的倒数的函数。如果您想找到“最小/最快但最准确的网络”,您还可以包括总单位数或计算时间。
您还可以考虑:
- 修剪:从大型网络开始,然后减少层和隐藏单元,同时跟踪交叉验证集的性能。
- 成长:从一个非常小的网络开始,然后添加单元和层,并再次跟踪 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$。他们给出率。请注意,这不能保证是“最佳”架构,但它至少可以为您提供一个很好的起点。此外,我自己的经验表明,像 dropout 这样的事情在实践中仍然可以提供帮助。