我正在寻找一种方法来计算层数和每层神经元的数量.作为输入,我只有输入向量的大小,输出向量的大小和trainig集的大小.
通常,通过尝试不同的网络拓扑并选择具有最小误差的网络来确定最佳网络.不幸的是我做不到.
这是一个非常难的问题.
网络内部结构越多,网络在表示复杂解决方案方面就越好.另一方面,太多的内部结构较慢,可能导致培训分歧,或导致过度拟合 - 这将阻止您的网络很好地推广到新数据.
人们传统上以几种不同的方式解决这个问题:
尝试不同的配置,看看什么效果最好. 您可以将训练集分为两部分 - 一部分用于训练,一部分用于评估 - 然后训练和评估不同的方法.不幸的是,在您的情况下,这种实验方法不可用.
使用经验法则. 很多人都想出了最有效的猜测.关于隐藏层中神经元的数量,人们推测(例如)它应该(a)介于输入和输出层大小之间,(b)设置为接近(输入+输出)*2/3,或者(c)绝不大于输入层大小的两倍.
经验法则的问题在于,它们并不总是考虑重要的信息,例如问题的"难度",培训和测试集的大小等等.因此,这些规则经常被使用作为"让我们尝试一堆事物,看看什么作品最好"的方法的粗略起点.
使用动态调整网络配置的算法.Cascade Correlation 等算法以最小网络开始,然后在训练期间添加隐藏节点.这可以使您的实验设置更简单,并且(理论上)可以带来更好的性能(因为您不会意外地使用不适当数量的隐藏节点).
关于这个主题有很多研究 - 所以如果你真的很感兴趣,还有很多东西需要阅读.查看此摘要的引用,特别是:
Lawrence,S.,Giles,CL和Tsoi,AC(1996),"什么尺寸的神经网络给出了最优化的泛化?反向传播的收敛性". 技术报告UMIACS-TR-96-22和CS-TR-3617,马里兰大学帕克分校高级计算机研究所.
Elisseeff,A.和Paugam-Moisy,H.(1997),"用于精确学习的多层网络的大小:分析方法". 神经信息处理系统的进展9,剑桥,麻省:麻省理工学院出版社,pp.162-168.
在实践中,这并不困难(基于编码和训练了数十个MLP).
在教科书意义上,让架构"正确"很难 - 也就是说,调整你的网络架构使得通过进一步优化架构无法改善性能(分辨率)是很难的,我同意.但只有在极少数情况下才需要优化程度.
实际上,为了达到或超过规范所要求的神经网络的预测精度,您几乎不需要花费大量时间来使用网络架构 - 这就是为什么这样做的三个原因:
一旦确定了数据模型(输入向量中的要素数量,所需的响应变量是数字还是分类,如果是后者,有多少个唯一类标签),指定网络体系结构所需的 大多数参数都会固定下来你选择了);
实际上可调节的少数剩余架构参数几乎总是(在我的经验中100%的时间)受到那些固定架构参数的高度约束 - 即,这些参数的值受最大值和最小值的严格限制; 和
最佳结构并没有被确定训练开始前,事实上,它是神经网络的代码很常见的,包括一个小模块以编程调训练过程中网络架构(通过去除节点,其权重值接近零-通常被称为" 修剪.")
根据上表,神经网络的架构完全由六个参数(内部网格中的六个单元)指定.其中两个(输入和输出层的层数类型)总是一个和一个 - 神经网络具有单个输入层和单个输出层.您的NN必须至少有一个输入层和一个输出层 - 不多也不少.第二,节点的每个包括这两个层的数量是固定的-输入层,由所述输入矢量的大小-即,在输入层节点的数量等于所述输入矢量的长度(实际上另外一个神经元几乎总是作为偏置节点添加到输入层.
类似地,输出层的大小由响应变量(数值响应变量单个节点,并固定(假设SOFTMAX被使用,如果响应变量是一个类的标签,所述输出层的节点的数量简单地等于唯一数班级标签).
这留下了两个完全有自由裁量权的参数 - 隐藏层的数量和构成每个层的节点数量.
如果你的数据是线性可分的(你开始编码NN时经常会知道)那么你根本不需要任何隐藏层.(如果事实确实如此,我不会使用NN来解决这个问题 - 选择一个更简单的线性分类器).第一个 - 隐藏层的数量 - 几乎总是一个.这种假设背后有很多经验权重 - 实际上,通过添加另一个隐藏层,单个隐藏层无法解决的问题很少.同样,存在一个共识是添加额外隐藏层的性能差异:第二(或第三等)隐藏层的性能提升的情况非常小.一个隐藏层足以解决大多数问题.
在您的问题中,您提到无论出于何种原因,您都无法通过反复试验找到最佳的网络架构.调整NN配置(不使用反复试验)的另一种方法是" 修剪"".该技术的要点是通过识别,如果从网络中移除,也不会显着地影响网络性能的那些节点训练期间去除来自网络节点(即,该数据的分辨率).(即使不使用正式的剪枝技术,你可以得到一个粗略的想法,其中节点是不是训练后看你的权重矩阵重要;寻找的权重非常接近于零 - 这是对那些权重的两端节点修剪过程中经常删除)显然,如果你在训练期间使用修剪算法,然后用网络配置是更可能有多余的开始(即"可删节")节点 - 换句话说,在网络架构决定的时候,如果添加修剪步骤,则会在更多神经元的一侧出错.
换句话说,通过在训练期间对您的网络应用修剪算法,您可以更接近优化的网络配置,而不是任何先验理论可能给您的.
但是构成隐藏层的节点数量呢?当然,该值或多或少不受约束 - 即,它可以小于或大于输入层的大小.除此之外,正如您可能知道的那样,对于NN中隐藏层配置的问题有一大堆评论(请参阅着名的NN常见问题解答以获得该评论的优秀摘要).有许多经验导出的经验法则,但其中最常用的是隐藏层的大小在输入和输出层之间.Jeff Heaton," Java中神经网络简介 "一书的作者"提供了一些,在我刚刚链接到的页面上列出.同样,扫描面向应用程序的神经网络文献,几乎可以肯定地揭示隐藏的层大小通常在输入和输出层大小之间.但是之间并不意味着中间;实际上,通常最好将隐藏层大小设置为更接近输入向量的大小.原因是如果隐藏层太小,网络可能难以收敛.对于初始配置,宁可较大尺寸-更大的隐藏层使网络容量更有助于它收敛,以更小的隐藏层相比的确,这种理由通常用来推荐一个隐藏层的大小.大于 (更多节点)输入层 - 即,从一个鼓励快速收敛的初始架构开始,之后你可以修剪'多余'节点(用非常低的权重值识别隐藏层中的节点并从你的节点中消除它们重新考虑的网络).