时间: 2020-09-03 00:08:26 人气: 2296 评论: 0
拓扑学,神经网络,深度学习,流形假设
最近,深度神经网络引起了人们广泛的关注,因为它在计算机视觉等领域取得了突破性的成果。1
但是,他们仍然有一些担忧。一个是人们无法监控到神经网络究竟在做什么。例如一个人训练得好,就能获得高质量的成绩,但要了解这个过程是如何发展的过程是比较困难的。所以网络出现故障,很难理解出了什么问题。
尽管深入了解深度神经网络的行为是一个很大的挑战,但是探索低维深度神经网络 - 每层只有少量神经元的网络要容易得多。事实上,我们可以创建可视化来完全理解这种网络的行为和培训。为了使我们能够更深入地了解神经网络的行为,我们可以将神经网络与数学的拓扑结构关联起来进行研究。
随之而来的是一些问题,例如我们如何界定对于不同数据集进行分类的神经网络复杂性的基本下界。
让我们从一个非常简单的数据集开始研究,一个平面上的两条曲线。神经网络将会判定平面上的某个点属于两条曲线中的哪一条
可视化神经网络的行为或任何分类算法的比较简单的方法就是查看它如何分类每个可能的数据点。
我们将从最简单的神经网络开始。这样的网络只是试图通过用一条线来分隔两类数据。
这种简单神经网络没有什么研究意义。因为现代神经网络通常在其输入和输出之间具有多个层,称为“隐藏”层。这些复杂网络至少有一个“隐藏”层。
和以前一样,我们可以通过查看神经网络中的不同点的划分来研究神经网络的行为。它将数据分成比一条线更复杂的曲线。
每一层,神经网络将数据转换创建一个新的representation(表示)2。我们可以查看每个表示中的数据以及神经网络如何对它们进行分类。当神经网络通过将数据转换成不同的表示后,神经网络将会在数据平面(或者更高维的超平面)中画一条线。
在之前的可视化中,我们以“原始”表示的形式查看数据。我们就相当于在输入层中直接看这些数据表示。现在我们将在第一层被转换之后再来看数据表示。你可以想象成我们在看隐藏层中的数据。
每个维度对应于图层中的神经元的活动。
在上一节中概述的方法中,我们通过查看与每个图层相对应的表示来了解神经网络。我们获取到了一个离散的representation(表示)列表。
比较困难的部分是我们如何从一个表示到另一个表示。值得庆幸的是,神经网络图层使得这一过程变得非常简单。
神经网络中使用了各种各样的层。我们将讨论一个具体的例子tanh层。Tanh层tanh(Wx + b) 包括:
我们可以通过持续变化看到神经网络处理数据的过程:
这个与其他标准层的情况大致相同,其中包括仿射变换,然后逐点应用激励函数。
我们可以运用这种技术来了解更复杂的网络。例如,以下网络使用四个隐藏层将两个稍微纠缠的螺旋分类。随着时间的推移,我们可以看到它从“原始”表示转变为更高层次的表达的过程。虽然螺旋本来是纠缠在一起,但最终它们是线性可分的。
另一方面,下面的网络,也是使用多层,却无法分割纠缠更复杂的两个螺旋。
这里值得明确的指出,这些任务只是有点挑战,因为我们仅使用了低维神经网络。如果我们使用高维度的神经网络,这一切都将非常简单。
(Andrej Karpathy已经根据ConvnetJS做了一个很好的演示,可以让你通过这种可视化的训练来交互式地探索网络)
每一层都会拉伸和挤压空间,但不会切割,折断或折叠。直觉上,我们可以看到它保留了拓扑性质。例如,一个数据集合在被处理变化后还能与变化之前相关联。
像这样的不影响拓扑的变换被称为同胚。从形式上来说,它们是双向连续函数。
定理:如果权重矩阵W是非奇异的,那么具有N个输入和N个输出的层是同胚的。 (需要注意区域和范围是否相同。)
证明:我们一步一步考虑这个问题:
因此,如果W是一个非零行列式,我们的层变换就是一个同胚。∎
如果我们把这些层中的许多层合在一起的话,结果仍是同胚。
A是红色的,B是蓝色的
考虑具有两个类的二维数据集A,B是包含于2维实数集合的:
A = {x | d(x,0) < 1/3}
B = {x | 2/3 < d(x,0) < 1}
要求:不管深度如何,神经网络需要有3层或3层以上的隐藏层来处理才可能分割开这个数据集合
如前所述,用sigmoid单元或softmax层进行分类相当于试图找到一个超平面(或在这种情况下是一条线),可以将A和B分割开。但是在只有两个隐藏层的网络拓扑结构中不可能以这种方式分离数据。
在下面的可视化图片中,我们观察到网络训练时的隐藏表示,以及分类线。正如我们所看到的,它正在努力学习如何去做这件事。
最后它被拉到了一个无法分割开的形状。虽然,它实际上能够实现80%的分类准确性。
因为这个例子只有一个隐藏层,所以无论如何都会失败。
证明:每一层都是同胚或者该层的权重矩阵具有全0行列式。如果它是一个同胚的,A仍然被B环绕,不能将它们分开。但是假设它有一个0的行列式:那么数据集就会在某个轴上折叠。由于我们正在处理与原始数据集同胚的类,且A被B环绕着,任何轴上的折叠都会使A与B重叠二无法分离。
如果我们添加第三个隐藏单位,问题就变得微不足道了。神经网络学习如下表示:
有了这个表示,我们可以用超平面分割此数据集。
为了更好地理解发生了什么,让我们考虑一个更简单的1维数据集:
A=[−13,13]
B=[−1,−23]∪[23,1]
如果没有使用两层或更多隐藏单元,我们无法对这个数据集进行分类。但是,如果我们使用两个隐藏单元,我们可以将数据表示为一条很好的曲线,使我们能够用一条直线来分隔类:
发生了什么?当x > - 1时,一个隐藏单位学会命中x>−1/2,而另一个隐藏单元会命中x < 1/2。当x > -1/2且x < 1/2时,那就是类别A
这与现实世界的数据集,如图像数据有关吗?如果真的认真对待多种假设,我认为这是有可能的。
流形假设是自然数据在其嵌入空间中形成低维流形。理论3和实验4都有充分的证据证实这一点。如果你相信这一点,那么分类算法的任务就是从根本上分离一堆纠缠的流形。
在前面的例子中,一类完全包围另一类。然而,狗的影像似乎不可能完全被猫影像流形包围。但是,还有其他一些更合理的拓扑结构供我们研究,我们将在下一节中看到。
另一个值得考虑的有趣数据集是两个连接的圆环面,A和B。
就像我们考虑的以前的数据集一样,这个数据集不能使用n + 1维来分离,即四维。
这个链接可以用拓扑领域的结理论(knot theory)来研究。有时候,当我们看到一个链接,它确定是否是一个真实的链接(一堆纠结在一起,但可以通过连续变形分离)。
如果使用仅有3个单位的层的神经网络可以对它进行分类,那么它是非连接的。(问题:从理论上讲,只有3个单位的网络是否可以将所有的连接分类?)
从这个结点来看,我们连续可视化的神经网络产生的表示不仅仅是一个的动画,它是一个解开连接的过程。在拓扑结构中,我们将其称为原始链接和分离链接之间的环境同位素。
形式上,流形之间的环境同位素A和B是一个连续的函数F:[0 ,1] × X→ Y,这样每个Ft是X的一个同胚到它的域,F0是单位函數,而F1是从A到B的映射。那么函数Ft就是不断从A的同胚中来完成映射A到B。
定理:在输入和网络层的表示之间是同伦的,如果:a)W不是奇异的,b)我们愿意排列隐藏层中的神经元,c)有超过1个隐藏单元。
证明:同样,我们分别考虑网络的每个阶段:
我想如果有一个程序可以自动发现这样的环境同位素,并自动证明某些链接的等价性,或某些链接是可分的那一定很有趣。神经网络是否能击败艺术的现状是很有意思的议题。
(显然如果knots是非常复杂的非定常多项式(NP),这对于神经网络来说不是一个好兆头。)
到目前为止,我们讨论过的那种连接看起来似乎不太可能出现在现实世界中,但是有更高维度的描述。在现实世界的数据中似乎可能存在这样的事情。
连接和结是111维度流形,但是我们需要4个维度来解决所有这些问题。同样,人们可能需要更高维度的空间才能够解开n维流形。所有n维流形可以在2 n + 2维中解开。6
(我对结理论知之甚少,真的需要更多地了解关于维度和连接的已知知识,如果我们知道一个流形可以嵌入到n维空间中,而不是多维的维数,我们有什么限制? )
神经网络自然而然的做法是,非常简单的路线是尝试将上限拉开,并尽可能地拉伸缠绕的部分。虽然这不会接近真正的解决方案,但它可以达到相对较高的分类准确度,并且是一个最小值。
它会在试图拉伸的区域表现为非常夸张的形状,而且在它试图拉伸的地方导数很大,并且会出现尖锐的断层。7为了解决这个问题,我们可以通过引入压缩来缓解这一现象。8
由于这类局部极小值从解决拓扑问题的角度来看绝对没有用处,所以拓扑问题可能为探讨这些问题提供了一个很好的着手点。
另一方面,如果我们只关心取得良好的分类结果。如果数据流形的一小部分在另一个流形上被截断了,这似乎对我们没有影响。尽管如此,我们似乎应该能够得到更好更准确的分类结果。
(我的直觉是试图以这样的方式来欺骗这个问题是一个坏主意:很难想象它不会是一个死胡同,特别是在一个局部最小化是一个大问题的优化问题中,不能真正解决问题似乎是一个糟糕的表现配方。)
我对标准神经网络层次的思考越多(标准神经网络也就是说,仿射变换之后是点激活函数),我就越迷惑。
也许有一个不同的层,我们可以用来对传统知识的方式进行分类?
我就去学习了矢量场,这是我觉得可以成为下一个操作流型的方法:
然后根据它来变形空间:
人们可以在固定点学习矢量场(只需从训练集中取一些固定点作为锚点)并以某种方式进行插值。上面的矢量字段的形式是:
其中V0和v1是矢量和f0(x)和f1(x)是n维高斯面。这是由径向基函数而来的。
我开始觉得,线性可分离性可能是不合理的,相当于神经网络的需求量。在某些方面,感觉自然要做的是使用k最近邻(k-NN)。然而,k-NN的成功在很大程度上取决于它对数据进行分类的表示,因此一个好的数据分类表示是k-NN的必要条件。
作为第一个实验中,我通过训练取得了一些MNIST网络(两层卷积网,没有下降现象)约1 %测试错误率。然后,我放弃了最后的softmax层,并使用了k-NN算法。我能够始终如一地将测试误差降低到了0.1-0.2%。
尽管如此,这还不是很正确。网络仍然试图进行线性分类,但是由于我们在测试时使用了k-NN,所以它能够从纠正此错误。
由于1 /距离权重,k-NN关于其所作用的表示是可区分的。因此,我们可以直接训练一个网络进行k-NN分类。这可以被认为是一种“最近邻居”层,可以作为softmax的替代品。
我们不希望为每个小批量的整个训练集进行前馈,因为这会导致计算量非常大。我认为一个很好的方法是根据最小批量的其他元素的类别对每个小批量的元素进行分类,给每个元素赋予1 /(距离分类目标的距离)的权重。9
令人遗憾的是,即使使用复杂的体系结构,使用k-NN也只会降低5-4%的测试错误 - 而使用更简单的体系结构会导致更糟糕的结果。
不过,我真的很喜欢这种方法,因为我们“要求”网络做的方式似乎更合理。我们希望同一个流形的点比其他点更接近,而流形可以用超平面分离。这应该对应于不同类别的之间的膨胀空间来分离流型。这就像简化。
数据的拓扑属性(如链接)可能会使无法使用低维网络线性分隔类。即使在技术上可行的情况下,例如螺旋,这样做也是非常具有挑战性的。
为了用神经网络准确地分类数据,有时需要宽层。而且,传统的神经网络层在表示重要的流形操作方面似乎不是很好; 即使我们巧妙地手动设置权重,但要紧凑地表示我们想要的转换也是很难的。新的处理层,特别是机器学习的多样性的处理方法,可能是有用的补充。
(这是一个正在开展的研究项目,作为一个公开的研究实验,我很乐意收到你对这些想法的反馈意见,你可以在线或在最后发表评论,对于错别字,技术错误或你想要的澄清看到添加,你可以在github上提交你的变动。)
感谢Yoshua Bengio,Michael Nielsen,Dario Amodei,Eliana Lorch,Jacob Steinhardt和Tamsyn Waterhouse的评论和鼓励。