ChatGPT解决这个技术问题 Extra ChatGPT

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

关闭。这个问题是基于意见的。它目前不接受答案。想改进这个问题?更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。去年关闭。改进这个问题

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


s
styvane

有多少隐藏层?

具有零隐藏层的模型将解析线性可分数据。因此,除非您已经知道您的数据不是线性可分的,否则验证这一点并没有什么坏处——为什么要使用比任务要求更复杂的模型呢?如果它是线性可分的,那么更简单的技术将起作用,但感知器也可以完成这项工作。

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

隐藏层有多少个节点?

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

RoT 基于改进收敛:

当您开始构建模型时,会在隐藏层中的更多节点方面犯错。

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

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

经验法则是这个[隐藏]层的大小介于输入层大小...和输出层大小...之间。要计算隐藏节点的数量,我们使用以下一般规则:(数字输入 + 输出)x 2/3

RoT 基于主成分:

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

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

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

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

在你的模型构建过程中,痴迷地测试;测试将揭示“不正确”网络架构的特征。例如,如果您从具有由少量节点组成的隐藏层的 MLP 开始(根据测试结果,您将根据需要逐渐增加),您的训练和泛化误差都将由偏差和欠拟合引起。

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

在实践中,我这样做:

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

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

隐藏层:首先是一个隐藏层,其节点数等于输入层的大小。 “理想”大小更有可能更小(即,输入层中的数字和输出层中的数字之间的一些节点数)而不是更大——再次,这只是一个经验观察,并且大部分这个观察是我自己的经验。如果项目证明需要额外的时间是合理的,那么我从一个由少量节点组成的单个隐藏层开始,然后(正如我上面解释的)我将节点添加到隐藏层,一次一个,同时计算泛化误差、训练误差、偏差和方差。当泛化误差下降并且在它再次开始增加之前,此时的节点数量是我的选择。见下图。

https://i.stack.imgur.com/LO1Id.png


我想添加一些关于 #1 RoT 的相关结果:在成功的 SVM 中,您实际上将输入映射到更高维空间(在 NN 用语中,隐藏节点比输入层中的节点更多)。输出层的工作是从这个过度完整的表示中得到决定。也可能与随机投影有关。 Adam Coates 和 Andrew Y. Ng (2011) 的精彩论文讨论了相关主题。
很好的解释。关于在使用 sklearn 和 MLPClassifier 时如何绘制像上面这样的图形的任何想法?
@sera 你的意思是 xkcd 风格?
原则上,你能自动化优化隐藏层中神经元数量的过程吗?另外,你也能自动优化隐藏层的数量吗?
J
Justas

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

关键部分是:

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

您还可以考虑:

修剪:从大型网络开始,然后减少层和隐藏单元,同时跟踪交叉验证集的性能。

增长:从一个非常小的网络开始,然后添加单元和层,并再次跟踪 CV 集的性能。


O
Ove

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

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

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


m
mlstudent

最近有关于这个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 这样的事情在实践中仍然可以提供帮助。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅