如何理解神经网络内部运作的几何直觉?

机器算法验证 机器学习 神经网络 近似 直觉 功能
2022-03-29 15:24:58

我最近一直在研究 ANN 背后的理论,我想了解其非线性多类分类能力背后的“魔力”。这使我进入了这个网站,该网站很好地解释了如何实现这种近似。

我是这样理解的(在 3D 中):隐藏层可以被认为是输出 3D 阶跃函数(或塔函数),如下所示:

塔功能

作者指出,可以使用多个这样的来逼近任意函数,例如:

在此处输入图像描述

似乎是有道理的,但是作者的构造相当做作以提供该概念背后的一些直觉。

但是,在给定任意 ANN 的情况下,如何准确地验证这一点?这是我想知道/理解的:

  1. AFAIK 近似值是平滑近似值,但这种“直觉”似乎提供了离散近似值,对吗?
  2. 塔的数量似乎是基于隐藏层的数量——上面的塔是由两个隐藏层创建的。如何仅使用单个隐藏层来验证这一点(以 3d 为例)?
  3. 这些塔是在一些权重强制为零的情况下创建的,但我没有看到我玩过的一些人工神经网络是这种情况。真的会是塔功能吗?可以是4到的任何东西吗n边和几乎接近一个圆?(作者说是这样,但把它留作自学)。

我真的很想了解任意 3D 函数的 3D 逼近能力,即 ANN 可以用单个隐藏层逼近——我想看看这种逼近是如何形成多维直觉的?

以下是我认为可以提供帮助的想法:

  1. 采用任意 3D 函数,例如f(x1,x2)=x12+x22+3.
  2. 生成训练集(x1,x2)比如说 1000 个数据点,其中很多点在曲线上,上面几个,下面几个。曲线上的那些被标记为“正类”(1),那些不被标记为“负类”(0)
  3. 将此数据输入 ANN 并使用一个隐藏层(大约 2-6 个神经元)可视化近似值。

这种结构正确吗?这行得通吗?我该怎么做呢?我还不擅长反向传播来自己实现这一点,我正在寻找这方面的更多清晰度和方向——现有的例子表明这将是理想的。

1个回答

最近有两篇关于具有分段线性非线性(包括 ReLU 激活)的深度神经网络的一些几何特性的精彩文章:

  1. 关于深度神经网络的线性区域数, Montufar、Pascanu、Cho 和 Bengio。
  2. Pascanu、Montufar 和 Bengio 关于具有分段线性激活的深度前馈网络的响应区域数。

当涉及到神经网络时,它们提供了一些急需的理论和严谨性。

他们的分析围绕着这样一个想法:

尽管使用相同数量的计算单元,深度网络能够将其输入空间分成比浅层网络更多的线性响应区域。

因此,我们可以将具有分段线性激活的深度神经网络解释为将输入空间划分为一堆区域,并且在每个区域上都有一些线性超曲面。

在您引用的图形中,请注意各种 (x,y) 区域在其上具有线性超曲面(看似倾斜平面或平面)。因此,我们在您参考的图形中看到了上述两篇文章的假设。

此外,他们声明(来自合著者的强调):

深度网络能够通过将输入邻域映射到某个中间隐藏层的公共输出来识别指数数量的输入邻域。在这个中间层的激活上执行的计算被复制了很多次,在每个识别的邻域中一次。这允许网络计算看起来非常复杂的函数,即使它们是用相对较少的参数定义的。

基本上,这是允许深度网络具有难以置信的鲁棒性和多样化特征表示的机制,尽管其参数数量少于浅层网络。特别是,深度神经网络可以学习指数数量的这些线性区域。以第一篇参考论文中的定理 8 为例,其中指出:

定理 8:一个 maxout 网络L层宽n0和排名k至少可以计算函数kL1kn0线性区域。

这同样适用于具有分段线性激活的深度神经网络,例如 ReLU。如果您使用类似 sigmoid 的激活,您将拥有看起来更平滑的正弦超曲面。许多研究人员现在使用 ReLUs 或 ReLUs 的一些变体(leaky ReLUs、PReLUs、ELUs、RReLUs,不胜枚举),因为它们的分段线性结构与可以饱和的 sigmoidal 单元相比允许更好的梯度反向传播(具有非常平坦/渐近区域)并有效地消除梯度。

这种指数结果至关重要,否则分段线性可能无法有效地表示我们在计算机视觉或其他硬机器学习任务中必须学习的非线性函数类型。然而,我们确实有这个指数结果,因此这些深度网络(理论上)可以通过用大量线性区域来逼近它们来学习各种非线性。

至于你关于超曲面的问题:你绝对可以设置一个回归问题,让你的深度网络尝试学习y=f(x1,x2)超曲面。这无异于仅仅使用深度网络来设置回归问题,很多深度学习包都可以做到这一点,没问题。

如果你只想测试你的直觉,现在有很多很棒的深度学习包可用:Theano(Lasagne、No Learn 和基于它构建的 Keras)、TensorFlow,还有很多其他的我确定我要离开了出去。这些深度学习包将为您计算反向传播。但是,对于像您提到的那样的较小规模的问题,自己编写反向传播确实是一个好主意,只需执行一次,然后学习如何对其进行梯度检查。但就像我说的,如果你只是想尝试一下并可视化它,你可以很快开始使用这些深度学习包。

如果一个人能够正确训练网络(我们使用足够的数据点,正确初始化它,训练顺利,坦率地说,这是它自己的另一个问题),那么一种可视化我们的网络所学内容的方法,在这种情况下,一个超曲面,只是在 xy 网格或网格上绘制我们的超曲面并将其可视化。

如果上述直觉是正确的,那么使用带有 ReLU 的深度网络,我们的深度网络将学习指数数量的区域,每个区域都有自己的线性超曲面。当然,重点是因为我们有指数级的多,线性近似可以变得如此精细,并且我们不会感觉到所有的锯齿状,因为我们使用了足够深/足够大的网络。