Answers:
在完全连接的网络中,每层神经元的数量和层数的考虑取决于问题的特征空间。为了说明在二维情况下发生的情况以进行描绘,我使用了二维空间。我用过科学家的照片。为了了解其他网,CNN
我建议您在这里看看。
假设您只有一个神经元,在这种情况下,在学习了网络参数之后,您将拥有一个线性决策边界,该边界可以将空间分为两个单独的类。
假设要求您分隔以下数据。您将需要d1
指定指定上限的决策边界,并以某种方式进行AND
操作以确定输入数据是在其左侧还是在右侧。Line d2
正在执行另一项AND
操作,以调查输入数据是否大于d2
或等于输入数据。在这种情况下,d1
我们试图了解输入是否在直线的左侧以将输入分类为圆形,也d2
试图找出输入是否在直线的右侧以将输入分类为圆形。现在我们需要另一个AND
运算以总结训练参数后构造的两条线的结果。如果输入位于的左侧d1
和右侧d2
,则应将其分类为圆形。
现在假设您遇到以下问题,并且要求您分离这些类。在这种情况下,理由与上述完全一样。
对于以下数据:
决策边界不是凸的,并且比以前的边界复杂。首先,您必须拥有一个可以找到内部圆圈的子网。然后,您必须具有另一个子网,该子网可以找到内部矩形决策边界,该边界确定矩形内部的输入不是圆形,如果位于外部,则为圆形。之后,您必须对结果进行总结,并说输入数据是在较大矩形内部还是内部矩形外部,应将其分类为circle。AND
为此,您需要另一项操作。该网络将是这样的:
假设要求您找到以下带圆圈的决策边界。
在这种情况下,您的网络将类似于以下提到的网络,但在第一个隐藏层中具有更多的神经元。
很好的问题,因为还没有确切的答案。这是一个活跃的研究领域。
最终,网络的体系结构与数据的维数有关。由于神经网络是通用逼近器,因此只要您的网络足够大,它就可以拟合您的数据。
真正了解哪种架构最有效的唯一方法是尝试所有架构,然后选择最佳架构。但是,当然,对于神经网络而言,这非常困难,因为每种模型都需要花费大量时间来训练。某些人要做的是首先训练一个故意过大的模型,然后通过消除对网络没有太大贡献的权重来修剪它。
如果您的网络太大,则可能会过大或难以融合。凭直觉,发生的事情是您的网络试图以比应有的更复杂的方式解释您的数据。这就像试图回答一个问题,而这个问题可以用一个句子长达10页的文章来回答。构造这么长的答案可能很困难,并且可能会抛出很多不必要的事实。(请参阅此问题)
另一方面,如果您的网络太小,则数据将因此不足。当您撰写一篇长达10页的论文时,就像用一个句子回答。尽管您的答案可能会很好,但是您将缺少一些相关事实。
如果知道数据的维数,则可以判断网络是否足够大。要估算数据的维数,您可以尝试计算其排名。这是人们如何估计网络规模的核心思想。
但是,它并不那么简单。的确,如果您的网络需要是64维的,那么您是要构建一个大小为64的隐藏层还是两个大小为8的隐藏层?在这里,我将为您提供两种情况下的直觉。
深入意味着增加更多的隐藏层。它的作用是允许网络计算更复杂的功能。例如,在卷积神经网络中,经常显示出前几层代表“低级”特征,例如边缘,最后几层代表“高级”特征,例如面部,身体部位等。
如果您的数据非常非结构化(例如图像),并且需要大量处理才能从中提取有用的信息,则通常需要深入研究。
更深入意味着创建更复杂的功能,而更广泛意味着仅创建更多这些功能。可能是您的问题可以通过非常简单的功能来解释,但是其中有很多功能是可以解决的。通常,由于复杂功能比简单功能承载的信息更多,因此,随着网络末端的临近,层变得越来越窄,因此您不需要那么多信息。
简短的回答:这与数据的大小和应用程序的类型非常相关。
选择正确的层数只能通过实践来实现。这个问题还没有普遍的答案。通过选择网络体系结构,可以将可能的空间(假设空间)限制为一系列特定的张量运算,将输入数据映射为输出数据。在DeepNN中,每一层只能访问前一层输出中存在的信息。如果一层丢弃了一些与眼前问题有关的信息,则这些信息将永远无法被后续层恢复。这通常称为“ 信息瓶颈 ”。
信息瓶颈是一把双刃剑:
1)如果您使用少量的层/神经元,那么该模型将仅学习数据的一些有用的表示/功能,并且会丢失一些重要的表示/功能,因为中间层的容量非常有限(拟合不足)。
2)如果您使用大量的层/神经元,那么该模型将学习过多的训练数据特有的表示/特征,并且不会将其推广到现实世界和训练集之外的数据(过度拟合)。
示例和更多发现的有用链接:
[1] https://livebook.manning.com#!/ book / deep-learning-with-python / chapter-3 / point-1130-232-232-0
[2] https://www.quantamagazine.org/new-theory-cracks-open-the-black-box-of-deep-learning-20170921/
除了以前的答案外,还有一些方法是将神经网络的拓扑结构内生地出现,作为训练的一部分。最显着的是,您拥有增强型拓扑的神经进化(NEAT),从无隐藏层的基本网络开始,然后使用遗传算法“复杂化”网络结构。NEAT在许多ML框架中实现。这是一篇有关学习Mario的实现的非常容易理解的文章:CrAIg:使用神经网络学习Mario