2014年4月6日发布
拓扑学、神经网络、深度学习、流形假设
最近,深度神经网络引起了极大的兴奋和兴趣,因为它们在计算机视觉等领域取得了突破性的成果。1
然而,对它们仍然存在一些担忧。其中之一是很难理解神经网络究竟在做什么。如果训练得当,它可以取得高质量的结果,但很难理解它是如何做到的。如果网络失败,很难理解出了什么问题。
尽管一般来说理解深度神经网络的行为是具有挑战性的,但探索低维深度神经网络却更容易——这些网络每层只有少数几个神经元。事实上,我们可以创建可视化来完全理解这些网络的行为和训练。这种视角将使我们更深入地理解神经网络的行为,并观察到将神经网络与一种称为拓扑学的数学领域联系起来的联系。
由此产生了许多有趣的事情,包括对能够对某些数据集进行分类的神经网络复杂性的基本下界。
一个简单的例子
让我们从一个非常简单的数据集开始,平面上的两条曲线。网络将学会将点分类为属于其中一条曲线或另一条曲线。
将神经网络的行为可视化的明显方法 - 或者说任何分类算法的行为 - 就是简单地查看它如何对每个可能的数据点进行分类。
我们将从最简单的神经网络类别开始,只有一个输入层和一个输出层。这样的网络只是尝试通过一条线将数据的两个类别分开。
那种网络并不是很有趣。现代神经网络通常在输入和输出之间有多个层,称为“隐藏”层。至少,它们有一个。
来自维基百科的简单网络图
与以往一样,我们可以通过观察网络对其定义域中不同点的作用来可视化该网络的行为。它用比直线更复杂的曲线来分隔数据。
通过每一层,网络转换数据,创建一个新的_表示_。2 我们可以查看每个表示中的数据以及网络如何对其进行分类。当我们到达最终表示时,网络将只是在数据中画一条线(或者在更高维度中,是一个超平面)。
在之前的可视化中,我们查看了数据的“原始”表示。您可以将其视为我们查看输入层。现在我们将查看第一层转换后的数据。您可以将其视为我们查看隐藏层。
每个维度对应于该层中神经元的激活。
隐藏层学习一种表示,使得数据是线性可分的
层的连续可视化
在前一节概述的方法中,我们通过查看与每一层对应的表示来学习理解网络。这为我们提供了一个离散的表示列表。
理解如何从一个状态转换到另一个状态是棘手的部分。幸运的是,神经网络层具有良好的特性,使这一过程变得非常容易。
神经网络中使用各种不同类型的层。我们将以双曲正切层为具体例子进行讨论。双曲正切层 tanh(Wx+b) 包括:
- 通过“权重”矩阵 W 进行线性变换
- 通过向量 b 进行平移
- 对 tanh 进行逐点应用
我们可以将这个过程视为一个连续的转换,如下所示:
其他标准层的情况大致相同,由仿射变换后跟单调激活函数的逐点应用组成。
我们可以将这种技术应用于理解更复杂的网络。例如,以下网络对稍微纠缠在一起的两个螺旋进行分类,使用四个隐藏层。随着时间的推移,我们可以看到它从“原始”表示转变为更高级别的表示,以便对数据进行分类。虽然最初螺旋是纠缠在一起的,但最终它们是线性可分的。
另一方面,下面的网络也使用多层,却无法对更为纠缠的两个螺旋进行分类。
这里值得明确指出的是,这些任务之所以有一定挑战性,是因为我们使用的是低维度神经网络。如果我们使用更宽的网络,所有这些都会变得相当容易。
(Andrej Karpathy基于ConvnetJS制作了一个不错的演示,允许您以这种可视化训练的方式进行交互式探索网络!)
双曲正切层的拓扑结构
每一层都会拉伸和挤压空间,但它从不切割、破坏或折叠空间。直观地,我们可以看到它保留了拓扑性质。例如,如果一个集合在之前是连通的,那么之后它仍然是连通的(反之亦然)。
像这样的变换,不影响拓扑结构,被称为同胚。形式上,它们是双射,两种方式都是连续函数。
定理:如果权重矩阵W是非奇异的,具有N个输入和N个输出的层是同胚映射。(尽管需要注意定义域和值域。)
证明:让我们逐步考虑这一步骤:
- 假设 W 的行列式非零。那么它是一个具有线性逆的双射线性函数。线性函数是连续的。因此,乘以 W 是一个同胚映射。 2. 平移是同胚映射。 3. tanh(以及sigmoid和softplus但不包括ReLU)是具有连续逆的连续函数。如果我们在考虑的定义域和值域上小心谨慎,它们是双射函数。逐点应用它们是一个同胚映射。
因此,如果 W 的行列式非零,我们的层是一个同胚。∎
如果我们任意组合多个这些层,这个结果仍然成立。
拓扑和分类
A 是红色的,B 是蓝色的
考虑一个二维数据集,其中包含两个类别 A、B⊂R2:
A ext{={x|d(x,0)<1/3}
B extbraceleft x extbar 2/3 < d(x,0) < 1 extbraceright
声明:无论深度如何,神经网络要对这个数据集进行分类,必须有一个具有3个或更多隐藏单元的层。
如前所述,使用Sigmoid单元或Softmax层进行分类等同于尝试在最终表示中找到分隔A和B的超平面(或在本例中是一条线)。只有两个隐藏单元,网络在拓扑上无法以这种方式分隔数据,注定在这个数据集上失败。
在以下可视化中,我们观察到网络训练时的隐藏表示以及分类线。当我们观察时,它在努力挣扎,试图学会如何做到这一点。
对于这个网络来说,努力工作并不足够。
最终它被拉入了一个相当低效的局部最小值。尽管如此,它实际上能够达到约80%的分类准确率。
这个例子只有一个隐藏层,但无论如何都会失败。
证明:每一层要么是一个同胚,要么该层的权重矩阵行列式为0。如果是同胚,A 仍然被 B 包围,一条直线无法将它们分开。但假设行列式为0:那么数据集将在某个轴上被压缩。由于我们处理的是与原始数据集同胚的东西,A 被 B 包围,在任何轴上的压缩意味着 A 和 B 的一些点混合在一起,变得无法区分。∎
如果我们添加第三个隐藏单元,问题就变得微不足道了。神经网络学习以下表示:
通过这种表示法,我们可以用一个超平面来分离数据集。
为了更好地了解正在发生的事情,让我们考虑一个更简单的一维数据集:
A = ext{【-13,13】}
B=[-1,-23]∪[23,1]
如果不使用两个或更多隐藏单元的层,我们无法对这个数据集进行分类。但是如果我们使用两个单元的隐藏层,我们学会将数据表示为一个漂亮的曲线,这使我们能够用一条直线将类别分开:
一个隐藏单元学会在 x">−12 时激活,另一个学会在 x">12 时激活。当第一个激活而第二个没有激活时,我们知道我们处于 A。
多样性假设
这与真实世界的数据集相关吗,比如图像数据?如果你认真对待流形假设,我认为这值得考虑。
在之前的例子中,一个类完全包围另一个类。然而,狗图像流形完全被猫图像流形包围的可能性似乎不太大。但还有其他更合理的拓扑情况可能仍会带来问题,我们将在下一节中看到。
链接与同伦
考虑的另一个有趣数据集是两个相连的圆环,A 和 B。
与我们之前考虑的数据集类似,这个数据集不能在不使用 n+1 维度的情况下分离,即第四维度。
链接在拓扑学的一个领域——结论理论中得到研究。有时当我们看到一个链接时,它并不立即明显是一个解链(一堆东西被缠在一起,但可以通过连续变形分开)还是不是。
一个相对简单的取消链接。
如果一个只使用3个单元的层的神经网络可以对其进行分类,那么它是一个非链接。 (问题:理论上,所有非链接都可以被只有3个单元的网络分类吗?)
从这个角度来看,我们对神经网络生成的表示持续的可视化不仅仅是一种漂亮的动画,它是一种解开链接的过程。在拓扑学中,我们会称之为原始链接和分离链接之间的_环境同胚_。
形式上,流形A和B之间的环境同胚是一个连续函数F:[0,1]×X→Y,使得每个Ft都是从X到其范围的同胚映射,F0是恒等函数,并且F1将A映射到B。也就是说,Ft从将A映射到自身连续过渡到将A映射到B。
定理:如果:a)W不是奇异的,b)我们愿意对隐藏层中的神经元进行排列,以及c)存在多于1个隐藏单元,则输入和网络层表示之间存在环境同胚。
证明:再次,我们分别考虑网络的每个阶段:
- 最困难的部分是线性变换。为了使这成为可能,我们需要 W 具有正行列式。我们的前提是它不为零,如果为负数,我们可以通过交换两个隐藏神经元来改变符号,因此我们可以保证行列式为正。正行列式矩阵的空间是path-connected,因此存在 p:[0,1 ightarrow GLn(R)[5](#fn5) 使得 p(0)=Id 和 p(1)=W。我们可以通过函数 x→p(t)x 不断地从单位函数过渡到 W 变换,通过在时间 t 的每个点上将 x 乘以连续过渡矩阵 p(t)。1. 我们可以通过函数 x→x+tb 不断地从单位函数过渡到 b 的平移。2. 我们可以通过函数 x→(1−t)x+tσ(x) 不断地从单位函数过渡到σ的逐点使用。∎
我想也许会有兴趣开发程序来自动发现这种环境同胚,并自动证明某些链接的等价性,或者某些链接是可分离的。了解神经网络是否能超越当前的技术水平将是很有趣的。
(显然,确定结是平凡的是 NP 问题。这对神经网络并不是个好兆头。)
到目前为止我们讨论的链接类型似乎不太可能出现在真实世界的数据中,但有更高维度的泛化。这种事情在真实世界的数据中似乎是有可能存在的。
链接和结是1维流形,但我们需要4维空间才能解开它们。同样,为了解开n维流形,可能需要更高维度的空间。所有n维流形可以在2n+2维空间中解开。6
(我对结论理论了解甚少,急需了解更多关于维度和链接的已知内容。如果我们知道流形可以嵌入到n维空间中,而不是流形的维度,那么我们有什么限制?)
走捷径
神经网络自然的行为是试图天真地拉开流形,并尽可能拉伸纠缠的部分。虽然这并不接近一个真正的解决方案,但可以实现相对较高的分类准确性,并成为一个诱人的局部最小值。
由于这种局部极小值从解决拓扑问题的角度来看是完全无用的,拓扑问题可能会成为探索解决这些问题的动力。
另一方面,如果我们只关心取得良好的分类结果,似乎我们可能并不在意。如果数据流形的一小部分被卡在另一个流形上,这对我们是个问题吗?看起来我们应该能够在不考虑这个问题的情况下获得任意好的分类结果。
(我直觉认为试图这样规避问题是一个坏主意:很难想象它不会成为死胡同。特别是在一个局部最小值是一个大问题的优化问题中,选择一个无法真正解决问题的架构似乎是性能不佳的典型。)
更好的图层来操作流形?
我越想到标准神经网络层——即仿射变换后跟着逐点激活函数——我就越感到失望。很难想象这些对于操纵流形真的很有用。
也许有一个非常不同类型的层,我们可以在与更传统的层组合时使用,这样做可能会有意义吗?
对我来说自然的事情是学习一个向量场,该向量场指示我们希望移动的流形的方向:
然后根据它来扭曲空间:
可以在固定点学习向量场(只需从训练集中取一些固定点用作锚点),然后以某种方式进行插值。上述向量场的形式为:
F(x) =v0f0(x)+v1f1(x)1+f0(x)+f1(x)
其中 v0 和 v1 是向量,f0(x) 和 f1(x) 是 n 维高斯函数。这在一定程度上受到径向基函数的启发。
K-最近邻层
我也开始认为线性可分性可能是对神经网络要求的一个巨大,可能是不合理的要求。在某种程度上,感觉自然的做法应该是使用k-最近邻居(k-NN)。然而,k-NN的成功很大程度上取决于它对数据进行分类的表示,因此在k-NN能够很好地工作之前,需要一个良好的表示。
作为第一个实验,我训练了一些MNIST网络(两层卷积网络,没有使用dropout),取得了约1%的测试错误率。然后我去掉了最后的softmax层,使用了k-NN算法。我能够始终实现测试错误率降低0.1-0.2%。
尽管如此,这并不完全感觉正确。网络仍在尝试进行线性分类,但由于我们在测试时使用k-NN,它能够在犯错后稍作调整。
k-NN 对其作用的表示具有可微性,这是因为存在 1/距离 权重。因此,我们可以直接为 k-NN 分类训练网络。这可以被视为一种“最近邻”层,作为 softmax 的替代。
我们不想为每个小批量馈送整个训练集,因为那将非常耗费计算资源。我认为一个不错的方法是根据小批量中其他元素的类别对每个元素进行分类,为每个元素赋予1/(距离分类目标的距离)的权重。9
即使使用复杂的架构,仅使用k-NN也只能降低到5-4%的测试错误率 - 而使用更简单的架构会得到更糟糕的结果。然而,我在调整超参数方面付出了很少的努力。
尽管如此,我真的非常喜欢这种审美上的方法,因为我们似乎要求网络做的事情更加合理。我们希望同一流形上的点比其他流形上的点更接近,而不是通过超平面将流形分开。这应该对应于扩大不同类别流形之间的空间,收缩各个流形。感觉像是简化。
结论
数据的拓扑特性,比如连接,可能会使得使用低维网络无法线性分离类别,无论深度如何。即使在技术上可能的情况下,比如螺旋形,也可能会非常具有挑战性。
要使用神经网络准确分类数据,有时需要宽层。此外,传统的神经网络层似乎不擅长表示流形的重要操作;即使我们巧妙地手动设置权重,也很难紧凑地表示我们想要的转换。受机器学习流形视角启发的新层可能是有用的补充。
(这是一个正在进行的研究项目。它作为公开进行研究的实验发布。我很高兴听到您对这些想法的反馈:您可以在文中或文末评论。对于拼写错误、技术错误或您希望添加的澄清,鼓励您提出拉取请求在github上。)
致谢
感谢Yoshua Bengio、Michael Nielsen、Dario Amodei、Eliana Lorch、Jacob Steinhardt和Tamsyn Waterhouse的评论和鼓励。
- 这似乎真正起步于Krizhevsky et al., (2012),他们整合了许多不同的部分以取得出色的结果。从那时起,已经有许多其他令人兴奋的工作。↩
- 这些表示形式,希望能使数据对网络的分类更"友好"。最近一直有很多探索表示形式的工作。也许最迷人的是在自然语言处理领域:我们学习到的词的表示形式,称为词嵌入,具有有趣的属性。参见Mikolov et al. (2013),Turian et al. (2010),以及Richard Socher的工作。为了让你快速了解,Turian论文中有一个非常好的可视化效果。↩
- 你可能想对图像执行的许多自然变换,比如平移或缩放其中的对象,或者改变光照,如果你连续执行这些变换,它们在图像空间中将形成连续曲线。↩
- Carlsson et al.发现图像的局部补丁形成了克莱因瓶。↩
- GLn(R)是实数上的可逆n×n矩阵的集合,正式称为广义线性群。↩
- 这个结果在Wikipedia的同构版本小节中提到。↩
- 参见Szegedy et al.,他们能够修改数据样本并找到轻微修改,导致一些最佳图像分类神经网络错误分类数据。这相当令人不安。↩
- 在收缩自动编码器中引入了收缩惩罚。参见Rifai et al. (2011)。↩
- 我使用了一个略显不够优雅但大致等效的算法,因为在Theano中更实用:同时向前馈送两个不同的批次,并根据彼此对它们进行分类。↩