作者:Christopher Olah,发表于2014年4月6日
译者:树石
这篇文章用图形化的动态方式,形象的解释了神经网络领域的概念,以及相应转化的数学含义。对于理解神经网络很有帮助,所以树石将本文翻译过来。
本文前面部分的论述清晰明了,后面关于流形和拓扑的探讨相对晦涩难懂。
译者在人工智能领域水平有限,有翻译不当的地方请高手指正。
由于简书的富文本不支持数学公式,树石不得不将翻译文稿又转化成Markdown文本,额外花费了不少时间。
最近,由于在诸如计算机视觉领域取得了突破性成果,深层神经网络引起了广泛的关注和兴趣。
然而,该领域仍然存在一些顾虑。比如,要了解神经网络能够做什么相当具有挑战性。如果一个网路被训练得很好,输出高品质的结果,但了解它是如何做到的具有挑战性。如果网络出现故障,也很难理解什么地方出了错。
虽然通常理解深层神经网络的行为比较困难,探索低维度深层神经网络相对容易的多——在每一层只有几个神经元的网络。事实上,我们可以通过创建可视化效果来理解网络的行为和对网络的培训。这种方法将让我们获取对神经网络行为的深层直觉,并观察到神经网络和拓扑学之间的联系。
另外,还探讨了一些有趣的事情,包括对某些数据集进行分类的神经网络的最低复杂性。
一个简单的例子
让我们从一个非常简单的数据集开始:在一个平面上的两条曲线。该网络将学习如何将线上的点归类为这一个还是另外一个。
将神经网络(或任何分类算法)的行为可视化,显而易见的方法是简单地看它是如何对每一个可能的数据点进行分类。
我们将先从最简单的神经网络开始,只有一个输入层和一个输出层的网络。这样的网络只是试图通过画一条线将两个类数据的分离。
诸如此类的网络不是很有趣。现代神经网络一般在输入和输出之间,具有称为“隐藏”层的多个层次。至少包含一个隐藏层。
与以前一样,我们可以通过查看它对其领域不同点进行的处理来观察这个网络的行为。数据分割通过一条曲线来完成,而不是直线。
通过神经网络的每一层,数据被转换,创建了一个新的表示(represention)。我们可以看一下在这些表示中的数据以及网络是如何划分他们的。当我们到达最后一层的表示时,网络只需要绘制一条线(或者,在更高维度里绘制一个超平面)。
在前面的可视化中,我们看到其“原始”表示的数据,你可以将其视为输入层。现在我们将看看经过第一层转化后,你可以认为这是我们看到了隐藏层。
每个维度对应于该层中神经元的兴奋。
层的连续可视化
在上一节中所概述的方法,我们知道通过查看每层的表示来了解网络。这给了我们一个离散的表示列表。
最棘手的部分是了解我们是如何从一个表示到另一个的。值得庆幸的是,神经网络层具有很好的性能,使这一点变得很容易。
神经网络由多种不同类型的层构成。我们将谈论一个具体的例子:双曲正切层(tanh)。一个双曲正切层tanh(Wx+b)由以下组成:
1、由“权重”矩阵W的线性变换;
2、由矢量b的转换;
3\双曲正切函数的逐点应用。
我们可以观察到这是一个连续变换,具体如下:
这个故事和其它标准层大体相同,由一个映射变换之后单调激活函数的逐点应用。
我们可以用这种技术来了解更复杂的网络。例如,下面的网络划分两个被略微缠结的螺旋,使用四个隐藏层。随着时间的推移,我们可以看到它的“原始”表示转移到更高层次为了对数据进行分类。而螺旋最初是纠结的,最终他们是线性可分的。
另一方面,以下的网络,也是使用多个层,分类两个螺旋没有成功,反而更加缠结。
这里值得明确指出,这些任务将变得有些困难,如果我们使用的是低维神经网络。如果我们使用更广泛的网络,这一切都将是相当容易的。
(Andrei Karpathy有很好的演示基于ConvnetJS,让您可以交互式地浏览网络,就像上面的这种可视化培训!)
双曲正切层的拓扑
每一层都会拉伸和挤压空间,但它永远不会切割、断裂和褶皱它。直观地说,我们可以看到它保留了拓扑性质。例如,一组数据将在转化后保持连接,如果它之前是连接的(反之亦然)。
这样的转换,不影响拓扑结构,被称为同胚。在形式上,他们是连续函数的双向映射。
定理:具有N个输入和N个输出的层是同胚,如果权重矩阵W是非奇异的。(虽然需要小心它的值域和范围。)
证明:让我们一步步考虑:
1、假设W所有因子都是非零的。那么它是具有线性可逆的双射线性函数。线性函数是连续的。所以,乘以W是同胚。
2、转化(Translation)也是同胚的。
3、双曲正切(以及S型函数、softplus,但非ReLU)是连续可逆的连续函数。他们是双向映射,如果我们小心考虑定义域和值域。逐点应用它们也是同胚的。
因此,如果W所有因子都是非零的,我们的层就是同胚的。∎
这一结果始终正确,如果我们将任意多个这些层组合在一起。
拓扑和分级
考虑包含两个类的二维数据集
![][01]
[01]: http://latex.codecogs.com/svg.latex?,A,B\subset\mathbb{R}^2
A = {x | d(x,0) < 1/3}
B = {x | 2/3 < d(x,0) < 1}
声称:无论深度,没有3个或更多的隐藏层的神经网络是无法将此数据集进行分类的。
如前面提到的,用一个S形函数或SOFTMAX层分类相当于试图找到一个超平面(或在这种情况下是一条线)在最终表示中分隔A与B。只有两个隐藏层的网络对于分离这组数据在拓扑上是无能的,并注定要失败。
在下面的可视化图中,我们观察到网络训练隐藏的表示,通过试图使用一条直线来分类。我们可以看到,它在努力学习某种方式来做到这一点是不断挣扎而且困难重重。
最后,它被拉到一个相当低效的拟合。虽然它实际上能够实现〜80%分类精度。
这个例子只有一个隐藏层,但无论如何它都会失败。
证明:要么每层是一个同胚,要么该层的权重矩阵具有0因子。如果该层是同胚的,A被B所环绕,一个直线不能将它们分开。但是,假设它具有一个0因子:那么数据集将在某些轴上崩塌。因为我们正在处理的东西同胚于原始数据集,A被B所包围,在任一轴崩塌于意味着我们将有一些A中的点和B中的点混合,从而无法完成A与B的区分。∎
如果我们增加第三个隐藏层,问题就变得微不足道。神经网络学习以下表示:
用这个表示,我们可以用一个超平面分开数据集。
为了更好的理解这是怎么做到的,让我们考虑一个更简单的一维数据集:
![][02]
[02]: http://latex.codecogs.com/svg.latex?,A=[-\frac{1}{3},,\frac{1}{3}]
![][03]
[03]: http://latex.codecogs.com/svg.latex?,B=[-1,-\frac{2}{3}]\cup[\frac{2}{3},1]
如果不使用两个或多个隐藏单元层,我们不能将此数据集进行分类。但是,如果我们使用一个带有两层的网络,我们就学会将数据转化成一个很好的曲线,让我们能用一条线将数据分开:
发生了什么?一个隐藏单元学习当x>-1/2时兴奋,另一个单元学习当x>1/2时兴奋。当第一个兴奋,而不是第二个时,我们知道数据属于A。
流形假说
这个假说和现实世界的数据集相关吗,比如图像数据?如果你认真对待流形假说,我觉得他值得思考。
流形假说是指自然数据在它的嵌入空间构成了较低维度的数据流形。同时具有理论和实验的理由相信这一假说是真的。如果你相信这一点,那么分类算法的任务是从根本上分离一堆纠结的流形。
在前面的例子中,一个类完全被另一个类包围。然而,这似乎并不可能,比如狗的图像流形完全被猫的图像流形包围。因为我们将在下一节中看到其他更合理的拓扑情况。
链接和同伦
另一个有趣的数据集要考虑的是两个链接的tori,A和B。
就像之前的数据集,这个数据不能被分离,如果不使用n+1维,即4个维度。
链接在结点理论(knot theory)中被讨论,拓扑学的一个领域。有时,当我们看到一个链接,并不能一眼看出它是否真正相连(一堆被缠结在一起的事情,但可以通过连续变形分开)。
如果仅仅使用3个层次的神经网络就能够对其进行分类,那么它就是一个未链接(unlink)。(问:理论上是否能将所有未链接都通过只有3个层次的网络进行分类?)
从这个结的角度看,我们通过神经网络产生的连续可视化不仅仅是一个漂亮的动画,它是解开链接的程序。在拓扑学中,我们把它称为原始链接和分离环之间一个环境同痕(an ambient isotopy)。
形式上,流形A和B之间的一个环境同痕是一个连续函数F:[0,1]× X→Y,使得每个Ft是一个从X到它自己范围的同胚,F0是一个标识函数,并F1是从A到B的一个映射。也就是,Ft是从A到自身的映射到从A到B的映射的连续转换。
定理:在输入和网络层之间具有环境同痕,如果:
a)W是非特异的,
b)在隐藏层可以置换神经元,以及
c)有超过1个的隐藏层。
证明:同样,我们分别考虑网络的每个阶段:
1、最难的部分是线性变换。为了使这成为可能,我们需要W的因子都为正。通过交换两个隐藏的神经元,我们可以翻转符号,以保证所有的因子为正。正因子的矩阵空间是道路连通的(path-connected),所以存在p:[0,1]→GLn(R^5),使得p(0)=Id,p(1)=W。我们可以从标识函数不断转型到W,通过函数x→p(t)x,乘以x在每个时间点t通过不断转换矩阵p(t).
2、我们可以从标识函数不断转型到b,通过函数x→x+tb。
3、我们可以从标识函数不断转换到逐点数据σ使用函数:x→(1-t)x+tσ(x)。∎
我想这也许是十分有趣的,通过程序自动发现这样的环境同痕并自动证明某些链接的等价性,或者某些环节是可分离的。这将很有趣知道,如果神经网络是否可以各种情况。
(显然,确定结点是否重要是一个NP,这不太适用于神经网络。)
我们已经谈到的这类链接,到目前为止似乎不太可能是现实世界的数据,但他们是更高维的生成。这似乎是合理的。
链接和结点是1维流形,但我们需要4个维度才能够解开他们。类似地,可能需要更高维度的空间,以便能够解开n维流形。所有n维流形可在2n+2维度上解开。
(我对于结点理了解不多,确实需要更多地了解维度和链接。如果我们知道一个流形可以被嵌入到n维空间,而不是流形的维度,我们有什么限制? )
简单的方法
很自然的想法,一个神经网络试图直接将流形从纠结尽可能薄的部分拉出。虽然这不会在任何情况下都是一个好的解决方案,但是大多情况它可以实现较高的分类准确率,到达一个诱人的最低点(local miminum)。
它试图拉伸具有高延展性的空间,并锐化靠近中断处。我们知道这些事情发生。压缩的处罚,在对数据点衍生层的处罚,都是很自然的做法。
由于这些局部最小点对于解决这种拓扑问题完全无用,拓扑问题值得很好的探索。
在另一方面,如果我们只关心取得了良好的分类结果,好像我们可能并不关心。如果很小的一个数据流形的点陷入另一个流形,会是一个问题吗?看起来我们应该能够得到很好的分类结果,尽管有这个问题。
(我的直觉是,像这样欺骗自己是一个坏主意:这是很难想象它不会是死路一条。特别是,针对一个局部最小很重要的优化问题,选择这种方式不能真正解决问题,这似乎是糟糕的表现。)
更好的操作流形的网络层?
我越思考标准的神经网络层 - 即用映射变换后逐点激活功能 - 我就越不抱幻想。很难想象,他们能够很好地操纵流形。
也许这可能是有意义的,我们采用一个非常不同的层,而不是传统的神经网络层?
非常自然的感觉是,通过一个矢量场的学习,我们希望流形移动方向:
然后再对他变形空间:
人们可以学会在固定点的矢量场(只是需要从训练集合选取一些固定点作为锚),并以某种方式介入。上面的矢量场的形式是:
![][04]
[04]: http://latex.codecogs.com/svg.latex?,F(x)=\frac{v_0f_0(x)+v_1f_1(x)}{1+f_0(x)+f_1(x)}
其中,v0和v1是矢量,F0(X)和F1(X)是n维高斯函数。这一点来自于径向基函数(radial basis functions)的灵感。
K近邻层
我也开始觉得线性可分可能是一个巨大的,也可能不合理的,神经网络的需求。在某些方面,非常自然的会想到使用K-近邻(K-NN)。然而,K-NN的成功在很大程度上取决于它所分类的数据表示(represention),因此,人们在K-NN之前,需要一种良好的表示。
作为第一个实验中,我训练了一些MNIST网络(两层卷积网,没有下降现象)到达〜1%测试误差。然后我放弃了最后的SOFTMAX层而使用K-NN算法,我能够始终如一地降低0.1-0.2%的测试误差。
不过,这并不完全觉得是正确的事情。该网络还在试图做线性分类,但由于我们使用K-NN测试,它能够从它所犯的错误中恢复一些。
K-NN有区别于相对于它的网络层次,因为会用到(1 /距离值)加权。因此,我们可以直接训练网络K-NN分类。这可以被认为是一种“k-NN”层替SOFTMAX。
我们不希望为每个小批量数据遍历整个训练集,因为这将非常消耗计算资源。我认为一个很好的办法是根据小批次的其它元素对每个小批次的元素进行分类,赋予每一个元素(1 /从分类目标的距离)的权重。
可悲的是,即使有完善的体系结构,采用K-NN只下到5-4%检测错误 - 使用简单的架构会得到更坏的结果。不过,我已经很少把努力放在高维参数上了。
不过,我真的很喜欢这个方法,因为它好像就是我们“要求”网络运行的更加合理。我们希望在同一流形的点比其它的点更加接近,相对于由一个超平面被分离的其他流形。这相对需要拉伸不同类别流形之间的空间,同时收缩每一个流形。这感觉就像是在简化问题。
结论
具有拓扑性质的数据,例如链接,可能导致无法使用低维网络进行线性分类,无论深度有多大。即使在技术上是可能的情况下,例如螺旋,也是非常具有挑战性的。
为了使神经网络准确的分类数据,多个层次有时是必要的。此外,传统的神经网络层似乎并不能很好的处理流形数据;即使我们巧妙的手工设置权重,想要紧凑的表达我们想要的转换也是非常困难的。新建层次,特别使用流形相关的机器学习,可能是有用的补充。
(这是一个发展中的研究项目。相关研究信息会在网上公布。我会很高兴听听您对这些想法的反馈:您可以发表评论。对于错别字,技术错误,或任何澄清,我们鼓励你发一个请求在GitHub上。)
致谢
谢谢Yoshua Bengio,迈克尔·尼尔森,达里奥 Amodei,埃利安娜洛奇,雅各布斯坦哈特和Tamsyn Waterhouse的意见和鼓励。