【问题标题】:Layers and Neurons of a Neural Network神经网络的层和神经元
【发布时间】:2016-09-02 11:45:12
【问题描述】:

我想了解更多关于神经网络的信息,我正在开发一个 C++ 程序来制作一个 NN,但我坚持使用 BackPropagation 算法,很抱歉没有提供一些工作代码。
我知道有很多库可以用多种语言创建 NN,但我更喜欢自己制作一个。关键是我不知道实现特定目标(例如模式识别或函数逼近等)需要多少层和多少神经元。
我的问题是:如果我想识别一些特定的模式,比如在图像检测中,应该需要多少层和每层神经元?假设我的图像都是 8x8 像素,我自然会从 64 个神经元的输入层开始,但我不知道必须在隐藏层和输出层中放置多少神经元。比方说我要区分猫和狗,或者不管你怎么想,输出层怎么可能呢?我可以想象一个只有一个神经元的输出层使用经典逻辑函数 (1/(1+exp(-x)) 输出介于 0 和 1 之间的值,当它接近 0 时,输入是一只猫,当接近 1 时它是一只狗,但是 . .. 这是正确的吗?如果我添加一个像鱼这样的新模式怎么办?如果输入包含一只狗和一只猫(..和一条鱼)怎么办?这让我觉得输出层的逻辑函数不是很适合这样的模式识别,只是因为 1/(1+exp(-x)) 的范围在 (0,1) 中。我是否必须更改激活函数或将其他一些神经元添加到输出层?是否有一些其他的激活函数更准确地做到这一点?每一层中的每个神经元是否具有相同的激活函数,还是层与层不同?

很抱歉所有这些问题,但这个话题对我来说不是很清楚。 我在互联网上阅读了很多内容,发现图书馆尚未实现且难以阅读,并且对 NN 可以做什么,但不是它可以做什么有很多解释。
我从https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/http://neuralnetworksanddeeplearning.com/chap1.html 中阅读了很多内容,在这里我了解了如何逼近一个函数(因为一个层中的每个神经元都可以被认为是一个阶跃函数,具有特定的权重和偏差阶跃)以及如何回溯传播算法有效,但其他教程和类似教程更侧重于预先存在的库。我还阅读了这个问题Determining the proper amount of Neurons for a Neural Network,但我还想涉及 NN 的激活函数,这是最好的,也是最好的。

提前感谢您的回答!

【问题讨论】:

  • 我认为如果您的问题更加集中和简洁,您会在这里做得更好。此外,如果您删除 C++ 标记,因为这个问题与 C++ 无关。
  • 为什么不尝试在逻辑回归等更简单的模型(本质上是没有任何隐藏层的人工神经网络)上实现反向传播,然后扩展到更复杂的模型?只是一个想法。此外,coursera (google it) 正在提供斯坦福大学教授 Andrew Ng 的 DNN 专业课程。信息量很大。
  • @Zroach 感谢您的 cmets,我将了解 Coursera 提供的有关 DNN 的内容。我想知道 DNN 的主要特征是什么,以及如何通过实现特定目标来构建一个 DNN。无论如何,从一个简化的问题开始是最好的方法。

标签: algorithm neural-network


【解决方案1】:

你的问题比较笼统,所以我只能给出一些笼统的建议:

您需要的层数取决于您要解决的问题的复杂性。从给定输入获得输出所需的计算越多,所需的层数就越多。

单层网络只能解决非常简单的问题。这些被称为线性可分的,通常是微不足道的。使用两层会更好,使用三层,至少在理论上,如果层中有足够的单元格,则可以执行各种分类任务。但在实践中,通常最好在网络中添加第 4 层或第 5 层,同时减少单层中的单元数。

请注意,标准的反向传播算法在超过 4 或 5 层时表现不佳。如果您需要更多层,请查看深度学习

每一层中的单元格数量主要取决于输入的数量,如果您解决分类任务,还取决于您想要检测的类别数量。在实践中,逐层减少单元格的数量是很常见的,但也有例外。

关于输出函数的问题:在大多数情况下,您应该坚持使用一种类型的 sigmoid 函数。您描述的情况并不是真正的问题,因为您可以为“鱼”类添加另一个输出单元。特定激活函数的选择并不那么关键。基本上,您使用的值和导数可以有效地计算。

【讨论】:

  • 感谢您的回答。所以你的意思是,如果我必须识别 15 种模式,我可以添加 15 个带有 sigmoid 函数的输出单元,不是吗?是否有规则或方法可以知道我必须放置多少层和每层的单元格,或者它只是启发式的?如果我在层数上超过,在深度学习中用于训练和升级权重的算法是什么?抱歉,有这么开放的问题,但我正在寻找它是如何工作的
【解决方案2】:

@Frank Puffer 已经提供了一些很好的信息,但让我加两分钱。首先,您要问的大部分内容都在hyperparameter optimization 范围内。尽管有各种“经验法则”,但实际情况是确定最佳架构(层数/大小、连接结构等)和学习率等其他参数通常需要大量实验。好消息是,这些超参数的参数化是神经网络实现中最简单的方面之一。因此,我建议您专注于构建您的软件,使层数、层大小、学习率等都易于配置。

现在您专门询问了检测图像中的模式。值得一提的是,使用标准多层感知器 (MLP) 对原始图像数据执行分类可能在计算上很昂贵,尤其是对于较大的图像。通常使用旨在提取有用的空间局部特征的架构(即:Convolutional Neural Networks 或 CNN)。

您仍然可以为此使用标准 MLP,但计算复杂性可能使其成为一个站不住脚的解决方案。例如,CNN 的稀疏连通性显着减少了需要优化的参数数量,同时构建了更适合图像分类的概念层次表示。

无论如何,我建议使用随机梯度下降来实现反向传播以进行优化。这仍然是通常用于训练神经网络、CNN、RNN 等的方法。

关于输出神经元的数量,这个问题确实有一个简单的答案:使用“one-hot”编码。对于您想要识别的每个类,您都有一个输出神经元。在你的狗、猫和鱼类的例子中,你有三个神经元。对于代表狗的输入图像,您会期望“狗”神经元的值为 1,而其他所有神经元的值为 0。然后,在推理过程中,您可以将输出解释为反映 NN 置信度的概率分布。例如,如果您得到输出 dog:0.70、cat:0.25、fish:0.05,那么您有 70% 的置信度认为图像是狗,以此类推。

对于激活函数,我看到的最新研究似乎表明Rectified Linear Units 通常是一个不错的选择,因为它们易于区分和计算,并且它们避免了困扰更深层网络的问题,称为“消失”梯度问题”。

祝你好运!

【讨论】:

  • 非常感谢,您让我对 CNN 以及它们的工作原理感到好奇,也许我可以将它们做得更适合我的目标。按照您的建议,我将了解有关整流线性单元的更多信息。谢谢!