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

机器算法验证 机器学习 神经网络 非线性回归
2022-01-22 11:35:55

我敢肯定很多人会回复“让我为你搜索”的链接,所以我想说我已经尝试解决这个问题,所以请原谅我在这里缺乏理解,但我无法弄清楚如何神经网络的实际实现确实有效。

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

隐藏层做了哪些计算?

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

输出层如何工作?对来自隐藏层的数据进行反规范化?

为什么输入层中的某些层连接到隐藏层而有些不连接?

4个回答

三句版:

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

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

  • 输出层将隐藏层激活转换为您希望输出的任何规模。

就像你 5 岁一样:

如果您想让计算机告诉您图片中是否有公共汽车,那么如果计算机具有正确的工具,它可能会更轻松。

所以你的公共汽车检测器可能由一个车轮检测器(帮助告诉你它是一辆车)和一个盒子检测器(因为公共汽车的形状像一个大盒子)和一个尺寸检测器(告诉你它太大而不能成为汽车)组成)。这些是隐藏层的三个元素:它们不是原始图像的一部分,它们是您设计用来帮助您识别总线的工具。

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

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


就像你是一个成年人

前馈神经网络将一系列函数应用于数据。确切的函​​数将取决于您使用的神经网络:最常见的是,这些函数每个都计算前一层的线性变换,然后是挤压非线性。有时这些函数会做其他事情(比如在您的示例中计算逻辑函数,或者对图像中的相邻像素进行平均)。所以不同层的角色可能取决于正在计算的函数,但我会尽量笼统。

我们称输入向量x, 隐藏层激活h, 和输出激活y. 你有一些功能f映射从xh和另一个功能g映射从hy.

所以隐藏层的激活是f(x)网络的输出是g(f(x)).

为什么有两个功能(fg) 而不是一个?

如果每个函数的复杂程度是有限的,那么g(f(x))可以计算的东西fg不能单独做。


具有逻辑功能的示例:

例如,如果我们只允许fg要成为像“AND”、“OR”和“NAND”这样的简单逻辑运算符,那么您不能仅用其中一个来计算“XOR”等其他函数。另一方面,如果我们愿意将这些函数叠加在一起,我们可以计算“XOR”:

第一层功能:

  • 确保至少一个元素为“TRUE”(使用 OR)
  • 确保它们不都是“真”(使用 NAND)

第二层功能:

  • 确保同时满足第一层标准(使用 AND)

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


带有图像的示例:

本次演讲的幻灯片 61(也可在此处以单张图像形式提供)显示(一种可视化方式)特定神经网络中的不同隐藏层正在寻找什么。

第一层寻找图像中的短边:这些很容易从原始像素数据中找到,但它们本身对于告诉你是在看一张脸、一辆公共汽车还是一头大象并不是很有用.

下一层组成边缘:如果来自底部隐藏层的边缘以某种方式结合在一起,那么最左边一列中间的一个眼睛检测器可能会打开。很难制作一个如此擅长从原始像素中找到如此具体的东西的单层:用边缘检测器构建眼睛检测器比用原始像素构建眼睛检测器要容易得多。

下一层将眼睛探测器和鼻子探测器组成面部。换句话说,当前一层的眼睛探测器和鼻子探测器以正确的模式打开时,这些就会亮起来。它们非常擅长寻找特定类型的面孔:如果其中一个或多个亮起,那么您的输出层应该报告存在一个面孔。

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

所以每一层都让你离原始像素越来越远,离你的最终目标越来越近(例如人脸检测或公共汽车检测)。


其他各种问题的答案

“为什么输入层中有些层连接到隐藏层而有些没有?”

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

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

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

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


如果这里有任何不清楚的地方或者您还有其他问题,请告诉我。

我将分两步描述我对此的看法:输入到隐藏步骤和隐藏到输出步骤。我将首先执行隐藏到输出的步骤,因为它似乎不那么有趣(对我来说)。

隐藏到输出

隐藏层的输出可能是不同的东西,但现在让我们假设它们来自sigmoidal激活函数。所以它们是介于 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通常是通过将输入传递给某个函数来形成的,因此假设您使用的是sigmoid函数。该函数的取值介于 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

我将尝试添加到直观的操作描述...

考虑神经网络的一个很好的直观方法是考虑线性回归模型试图做什么。线性回归将采用一些输入并提出一个线性模型,该模型将每个输入值乘以一些模型最佳加权系数,并尝试将这些结果的总和映射到与真实输出非常匹配的输出响应。系数是通过找到将最小化期望输出值和模型学习值之间的一些误差度量的值来确定的。另一种说法是,线性模型将尝试为每个输入创建系数乘数并将所有这些乘数相加,以尝试确定(多个)输入和(通常是单个)输出值之间的关系。同样的模型几乎可以被认为是神经网络的基本构建块。

但是单单元感知器还有一个部分,它将以非线性方式处理加权数据的总和。它通常使用压缩函数(sigmoid 或 tanh)来完成此操作。所以你有隐藏层的基本单元,它是一个块,它将对一组加权输入求和——然后它将求和的响应传递给一个非线性函数以创建一个(隐藏层)输出节点响应。偏置单元就像在线性回归中一样,是添加到每个要处理的节点的恒定偏移量。由于非线性处理模块,您不再局限于仅线性响应(如在线性回归模型中)。

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

学习正确权重的一种常见方法是从随机权重开始,并测量真实实际输出和学习模型输出之间的误差响应。误差通常会通过网络向后传递,反馈算法将根据误差的某个比例单独增加或减少这些权重。网络将通过向前传递、测量输出响应、然后更新(向后传递权重调整)和纠正权重来重复迭代,直到达到某个令人满意的错误水平。那时你有一个比线性回归模型更灵活的回归模型,这就是通常所说的通用函数逼近器。

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

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

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

通常,输出层和隐藏层的输出的含义取决于您尝试解决的问题(回归、分类)和您使用的损失函数(交叉熵、最小二乘误差……)