神经网络中的隐藏层计算什么?


187

我敢肯定,很多人都会以“让我为您找到的谷歌”的链接进行回复,因此我想说的是我已经设法弄清楚了这一点,所以请您原谅我对此缺乏理解,但是我无法弄清楚神经网络的实际实现实际上是可行的。

我了解输入层以及如何对数据进行规范化,也了解偏差单位,但是当涉及到隐藏层时,该层中的实际计算是什么,以及它如何映射到输出中就有点模糊了。我已经看到了在隐藏层中带有问号的图,布尔函数(例如AND / OR / XOR),激活函数以及映射到所有隐藏单元的输入节点,以及每个映射到仅几个隐藏单元的输入节点,等等。我只是在实践方面有几个问题。当然,像您向孩子解释那样,对整个神经网络过程的简单解释将非常棒。

隐藏层中进行了哪些计算?

这些计算如何映射到输出层?

输出层如何工作?从隐藏层反规范化数据?

为什么输入层中的某些层连接到隐藏层,而有些却没有呢?


13
这里周围的人都很友善,我从未见过“让我为您找到谷歌”的答案,但是许多令人惊讶的彻底和有见地的答案对最初似乎是基本问题的答案。不幸的是,我无法为您提供帮助,但它似乎很有意义,因此我很乐意投票。
晚会

4
感谢您的评论和Gael的投票,我可能对SO社区感到不高兴,因为我们都知道那些人可以如何获得:)很高兴在这里看到更多的协作精神,而不是试图获得徽章和通过编辑/结束问题来指出问题。
FAtBalloon

1
尽管我确实参与了神经网络的应用和方法,但我并不是神经网络领域的专家。我可能不太有用的答案是,隐藏物中的特定计算取决于您强加在输出上的“成本函数”,即您尝试实现的目标。例如,如果要将输入元素分组为聚类集合,则将计算隐藏层中元素之间的距离。这可能会经历该层中的各种迭代和优化循环,直到您达到允许该过程“离开”该层的错误标准为止。
Lucozade

Answers:


230

三句版本:

  • 每一层都可以将您想要的任何功能应用于上一层(通常是线性变换,然后是挤压非线性)。

  • 隐藏层的工作是将输入转换为输出层可以使用的东西。

  • 输出层将隐藏层的激活转换为希望输出启用的任何比例。

就像你五岁一样:

如果您希望计算机告诉您图片中是否有总线,那么如果计算机具有正确的工具,则可能会更轻松。

因此,您的公交车检测器可能由轮式检测器(以帮助您告诉它是车辆),盒子检测器(因为公交车的形状像个大盒子)和大小检测器(以告诉您它太大而不能成为汽车)制成)。这是隐藏层的三个元素:它们不是原始图像的一部分,而是旨在帮助您识别总线的工具。

如果所有这三个检测器都打开(或者也许它们特别活跃),那么很有可能在您面前有一辆公共汽车。

神经网络之所以有用,是因为有很好的工具(例如反向传播)来构建很多检测器并将它们组合在一起。


就像你是大人一样

前馈神经网络将一系列功能应用于数据。确切的函​​数将取决于您使用的神经网络:最常见的是,这些函数各自计算前一层的线性变换,然后压缩非线性。有时,这些函数还会执行其他操作(例如,在示例中计算逻辑函数,或者对图像中相邻像素进行平均)。因此,不同层的角色可能取决于要计算的功能,但是我将尝试变得非常笼统。

XHÿFXHGHÿ

FXGFX

FG

GFXFG


具有逻辑功能的示例:

FG

第一层功能:

  • 确保至少一个元素为“ TRUE”(使用OR)
  • 确保它们并非全部为“ TRUE”(使用NAND)

第二层功能:

  • 确保两个第一层条件都满足(使用AND)

网络的输出只是第二个功能的结果。第一层将输入转换为第二层可以使用的东西,以便整个网络可以执行XOR。


图片示例:

演讲的幻灯片61(也可作为单个图像在此处获得)显示(一种可视化方式)特定神经网络中不同的隐藏层在寻找什么。

第一层寻找图像中的短边:很容易从原始像素数据中找到它们,但是它们本身对告诉您看脸,公共汽车还是大象的用处不大。

下一层构成边缘:如果底部隐藏层的边缘以某种方式组合在一起,则最左列中间的检眼器之一可能会打开。很难制作出一个能很好地从原始像素中找到如此特殊的东西的单层:与边缘像素相比,从边缘检测器中构建眼睛检测器要容易得多。

下一层将眼睛检测器和鼻​​子检测器组成面部。换句话说,当来自上一层的眼睛探测器和鼻子探测器以正确的模式打开时,这些指示灯将亮起。这些非常适合查找特定种类的面孔:如果其中一个或多个点亮,则您的输出层应报告存在面孔。

这是有用的,因为人脸检测器很容易在眼睛检测器和鼻​​子检测器中构建,但实际上很难在像素强度中构建。

因此,每一层都使您离原始像素越来越远,并且更接近最​​终目标(例如人脸检测或总线检测)。


回答其他各种问题

“为什么输入层中的某些层连接到隐藏层,而有些却没有呢?”

网络中断开连接的节点称为“偏置”节点。有一个非常好的解释这里。简短的答案是,它们就像回归中的截距项。

“图像示例中的“眼睛检测器”图片来自何处?”

我没有仔细检查链接到的特定图像,但总的来说,这些可视化效果显示了输入层中的一组像素,这些像素可最大化相应神经元的活动。因此,如果我们将神经元视为眼睛检测器,这就是神经元认为最像眼睛的图像。人们通常通过优化(爬山)过程找到这些像素集。

在一些使用世界上最大的神经网络的Google员工的这篇论文中,他们以这种方式以及第二种方式分别显示了“面部检测器”神经元和“猫检测器”神经元:它们还显示了激活神经网络的实际图像。神经元最强(图3,图16)。第二种方法很不错,因为它显示了网络的灵活性和非线性-这些高级“检测器”对所有这些图像都敏感,即使它们在像素级别看起来并不特别相似。


让我知道这里是否不清楚或还有其他问题。


2
那么,对于给定层上的每个节点,是否只有一个定义好的算法,权重是什么使输出不同?还是可以将层中的每个节点编程为不同的?
FAtBalloon

3
@GeorgeMcDowd解决了关键问题:正如您所建议的那样,查看像素并识别总线非常困难。幸运的是,查看像素并找到边缘很容易-这是第一个隐藏层试图做的所有事情。下一层尝试基于边缘进行推理,这比基于像素进行推理要容易得多。
大卫·J·哈里斯

4
因此,对于您为此付出的时间和精力,应该给您其他奖励(不仅仅是分数)!
samsamara 2014年

1
@JoshuaEnfield我认为1980年代的逻辑是类似于人们认为大脑工作的方式的组合,它在任何地方都是可区分的,并且价值观像您提到的那样受到限制。从那时起,人们发现,f(x) = max(x, 0)(“线性校正单位”)通常效果更好,即使它没有很多特性。
David J. Harris

2
总线示例和功能链就是其中一个。不明白为什么教科书不能具有这种描述性。
灌溉

12

我将尝试添加到直观的操作说明中...

考虑神经网络的一种直观的好方法是考虑线性回归模型的作用。线性回归将获取一些输入,并得出一个线性模型,该模型将每个输入值乘以某个模型的最佳加权系数,然后尝试将这些结果的总和映射到与真实输出非常匹配的输出响应。通过找到将期望输出值与模型学习的值之间的一些误差度量最小化的值来确定系数。换句话说,线性模型将尝试为每个输入创建系数乘数,并对所有系数求和以求出(多个)输入和(通常为单个)输出值之间的关系。几乎可以将同一模型视为神经网络的基本构建模块。

但是,单个单元的感知器还有一个,它将以非线性方式处理加权数据的总和。它通常使用挤压功能(S型或tanh)来完成此任务。因此,您有了隐藏层的基本单位,这是一个块,它将对一组加权输入求和-然后将求和后的响应传递给非线性函数以创建(隐藏层)输出节点响应。偏差单位就像线性回归中一样,是一个恒定的偏移量,该偏移量被添加到每个要处理的节点上。由于存在非线性处理模块,因此您不再局限于仅线性响应(如线性回归模型中一样)。

好的,但是当您有多个单个感知器单元一起工作时,每个感知器单元可能具有不同的输入权重乘数和不同的响应(即使ALL都使用前面描述的相同非线性模块来处理同一组输入)。使响应不同的是,每个响应都有不同的系数权重,这些系数权重是由神经网络通过训练(某些形式包括梯度下降)来学习的。然后,再次处理所有感知器的结果,并将其传递到输出层,就像处理各个块一样。那么问题是如何为所有块确定正确的权重?

学习正确权重的一种常见方法是从随机权重开始,然后测量真实实际输出与学习的模型输出之间的误差响应。错误通常会通过网络向后传递,并且反馈算法将单独增加或减少这些权重,使其与错误成比例。网络将通过向前传递,测量输出响应,然后进行更新(传递权重调整向后传递)并校正权重,直到达到某个令人满意的错误级别为止,反复进行迭代。此时,您拥有的回归模型比线性回归模型更灵活,这就是通常所说的通用函数逼近器。

真正帮助我学习神经网络如何真正运行的方法之一是研究并构建神经网络实现的代码。最好的基本代码说明之一可以在(免费提供的)《 DSP的科学家和工程师指南》的神经网络一章中找到。26.它主要是用非常基本的语言(我认为它是fortran)编写的,确实可以帮助您了解发生了什么。


12

我将分两步描述我的观点:“输入到隐藏”步骤和“隐藏到输出”步骤。我将首先执行“隐藏到输出”步骤,因为(对我而言)这似乎不太有趣。

隐藏到输出

隐藏层的输出可能有所不同,但现在让我们假设它们来自S型激活函数。因此,它们是介于0和1之间的值,对于许多输入而言,它们可能只是0和1。

我喜欢将这些隐藏的神经元输出与输出层之间的转换仅视为一种翻译(在语言意义上,而非几何意义上)。如果转换是可逆的,那么这当然是正确的,如果不是,则翻译中会丢失一些东西。但是您基本上只是从不同的角度看待隐藏神经元的输出。

输入到隐藏

假设您有3个输入神经元(只是为了方便在这里写一些方程式)和一些隐藏的神经元。每个隐藏的神经元都会获得输入的加权总和,因此例如

hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)

这表示的值对的值hidden_1非常敏感,对的值input_1完全不敏感,input_2而对的值仅稍敏感input_3

因此,您可以说这hidden_1是捕获输入的特定方面,您可以称其为“ input_1重要”方面。

hidden_1通常通过将输入传递给某些函数来形成输出,因此,假设您使用的是S型函数。此函数取0到1之间的值;因此,可以将其视为表示input_1重要或不重要的开关。

这就是隐藏层的作用!它提取输入空间的方面特征

现在权重也可以是负数!这意味着您可以获得诸如“ input_1重要但同时也input_2消除了这一重要性”之类的方面:

hidden_2 = 10 * (input_1) - 10 * (input_2 ) + 0 * (input_3)

input_1input_3具有“共享”的重要性:

hidden_3 = 5 * (input_1) + 0 * (input_2) + 5 * (input_3)

更多几何

如果您知道一些线性代数,则可以沿特定方向投影进行几何思考。在上面的示例中,我沿input_1方向投影。

让我们hidden_1从上方再看一遍。一旦at的值input_1足够大,sigmoid激活函数的输出将仅保持为1,它将不会变得更大。换句话说,越来越多input_1的输出不会有任何区别。同样,如果它沿相反(即负)方向移动,则在一点之后输出将不受影响。

好的。但是,假设我们不希望在某个方向上的无限大方向上具有灵敏度,而是希望仅在一行中的某个范围内激活它。意思是对于非常负的值没有影响,对于非常正的值没有影响,但是对于介于5和16之间的值,您希望它唤醒。在此处可以将径向基函数用作激活函数。

摘要

隐藏层提取输入空间的特征,而输出层将其转换为所需的上下文。多层网络之类的东西可能还不止于此,但这是我到目前为止所了解的。

编辑:此页面及其精彩的交互式图形比我上述冗长而繁琐的答案所能做的更好:http : //neuralnetworksanddeeplearning.com/chap4.html


1
像OP一样,我对神经网络中的隐藏层有些困惑。在您的示例中,NN算法如何找到hidden_​​1,hidden_​​2和hidden_​​3神经元的权重?而且由于hidden_​​1,hidden_​​2和hidden_​​3是从相同的输入变量派生的,权重是否会收敛到相同的解决方案?
RobertF

5

让我们以分类为例。输出层试图做的是估计样本属于给定类别的条件概率,即该样本属于给定类别的可能性。用几何术语来说,通过阈值函数以非线性方式组合图层可以使神经网络解决最有趣的非凸问题(语音识别,对象识别等)。换句话说,输出单元能够产生象所描绘的那些非凸决策函数这里

人们可以将隐藏层中的单元视为从数据中学习复杂特征的方法,这些数据可以使输出层能够更好地区分一类与另一类,从而生成更准确的决策边界。例如,在面部识别的情况下,第一层中的单元学习类似边缘的特征(在给定的方向和位置检测边缘),而更高层则学习将这些特征组合起来以检测鼻子,嘴巴或眼睛等面部特征。每个隐藏单元的权重代表这些特征,其输出(假设它是一个S型)表示该特征存在于样本中的概率。

通常,输出层和隐藏层的输出的含义取决于您要解决的问题(回归,分类)和所采用的损失函数(交叉熵,最小二乘误差等)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.