在实践中,这并不难(基于对数十个MLP的编码和培训)。
从教科书的意义上讲,使架构“正确”是困难的-我同意,调整网络架构以致无法通过进一步优化架构来提高性能(分辨率)是困难的。但是只有在极少数情况下才需要这种优化程度。
在实践中,要达到或超过规范所要求的神经网络的预测精度,几乎不需要花费大量时间来构建网络体系结构,这是有三个原因的:
一旦决定了数据模型,指定网络体系结构所需的大多数参数将被修复 (输入向量中的特征数量,所需的响应变量是数字的还是分类的,如果是后者,则是多少个唯一的类标签)您已选择);
剩下的几个实际上可调整的架构参数几乎总是(在我的经验中是100%的时间) 受到那些固定架构参数的高度约束 -即,这些参数的值由max和min值紧密限制;和
无需在训练开始之前确定最佳架构,实际上,神经网络代码通常包含一个小模块,可以在训练过程中以编程方式调整网络架构(通过删除权重值接近零的节点,通常称为“ “ 修剪 。”)

根据上表,神经网络的架构完全由六个参数(内部网格中的六个单元)指定。其中的两个(输入和输出层的层类型数量)总是一个和一个-神经网络具有一个输入层和一个输出层。您的NN必须至少具有一个输入层和一个输出层-不多也不少。其次,包含这两个层中的每层的节点数是固定的-输入层的大小取决于输入向量的大小-即,输入层中的节点数等于输入向量的长度(实际上几乎总是将一个以上的神经元作为偏置节点添加到输入层。
同样,输出层的大小由响应变量固定(数值响应变量的单个节点,并且(假设使用softmax,如果响应变量是类标签,则输出层中节点的数量仅等于唯一变量的数量)类标签)。
剩下的两个参数是完全可以自由决定的-隐藏层的数量和构成这些层中每一层的节点的数量。
隐藏层数
如果您的数据是线性可分离的(开始编码NN时您通常会知道),那么您根本不需要任何隐藏层。 (如果实际上是这种情况,我将不会使用NN来解决此问题-选择一个更简单的线性分类器)。其中第一个-隐藏层的数量-几乎总是一个。这种假设背后有很多经验上的分量-实际上,很少有一个单独的隐藏层无法解决的问题可以通过添加另一个隐藏层来解决。同样,人们普遍认为,添加其他隐藏层会带来性能差异:使用第二个(或第三个等)隐藏层提高性能的情况非常小。一个隐藏层足以解决大多数问题。
在您的问题中,您提到由于任何原因,您都无法通过反复试验找到最佳的网络架构。调整NN配置(不使用反复试验)的另一种方法是“ 修剪 ”。该技术的要点是在训练期间通过识别那些节点(如果从网络中删除不会显着影响网络性能(即,数据分辨率))来从网络中删除节点。 (即使没有使用正式的修剪技术,您也可以通过训练后查看权重矩阵来粗略了解哪些节点不重要;寻找权重非常接近零的原因是权重两端的节点显然,如果您在训练期间使用修剪算法,则应从更有可能具有多余(即“可修剪”)节点的网络配置开始,换句话说,在决定网络体系结构时,如果您添加修剪步骤,则会在更多神经元方面犯错。
换句话说,通过在训练过程中对网络应用修剪算法,您可以比任何先验理论都更可能获得更优化的网络配置。
包含隐藏层的节点数
但是构成隐藏层的节点数又如何呢?授予此值或多或少不受约束-即,它可以小于或大于输入层的大小。除此之外,您可能已经知道,关于NN中隐藏层配置的问题还有很多评论(有关该评论的出色摘要,请参见著名的NN FAQ )。有许多根据经验得出的经验法则,但其中最常依靠的是隐藏层的大小在输入层和输出层之间 。 “ Java中的神经网络简介 ”的作者Jeff Heaton提供了更多内容,这些内容在我刚刚链接的页面上都有叙述。同样,对面向应用程序的神经网络文献的扫描几乎可以肯定地表明,隐藏层的大小通常在输入和输出层的大小之间。但是, 两者之间并不意味着中间。实际上,通常最好将隐藏层的大小设置为更接近输入向量的大小。原因是,如果隐藏层太小,则网络可能难以收敛。对于初始配置,较大的隐藏层会产生错误-与较小的隐藏层相比,较大的隐藏层将为网络提供更大的容量,有助于网络收敛。确实,这种辩护通常用于建议一个比输入层大 (更多节点)的隐藏层大小,即从初始架构开始,该架构将鼓励快速收敛,之后您可以修剪“多余”节点(确定隐藏层中的节点的权重值非常低,并将其从重构网络中删除)。
0
我正在寻找一种有关如何计算层数和每层神经元数的方法。作为输入,我只有输入向量的大小,输出向量的大小和训练集的大小。
通常,最好的网络是通过尝试不同的网络拓扑并选择误差最小的网络来确定的。不幸的是我不能那样做。