colah 深度学习系列长文(一)
本文 AI100 已获得作者授权,转载需获同意。
【AI100 导读】神经网络的本质,是特征提取的抽象过程,其数学本质是对高维度数据进行降维分类,发现统计规律。而大多数人对于这个降维过程很难理解,本文用非常简单的图像和动画形式,用最接近人类思维的方式,描述了这个过程,可谓一目了然。本文作者是多伦多大学和谷歌大脑的研究学者,数学狂热爱好者,擅长深入浅出地描述复杂的数学原理,表达数学之美。
最近,由于深度神经网络(deep neural networks)在计算机视觉等众多领域取得了突破性成果,大家对深度神经网络的热情十分高涨,兴致满满。
但是,关于深度神经网络,仍然存在很多值得注意的地方,其中之一就是很难完全理解神经网络真正的运行过程。如果某个神经网络得到了充分的训练,那么相应地,运行结果也会很好。然而,要想了解这一结果的具体实现过程,是非常困难的。如果该神经网络的效果不好,往往很难找出出现问题的真正原因。
一般来说,要想真正理解深度神经网络是非常困难的。但是,如果从低维深层神经网络(low-dimensional deep neural networks)入手进行研究的话,会相对容易得多,因为低维深层神经网络的每一层上只有一小部分的神经元。事实上,我们可以通过可视化的方法,完全理解神经网络的运行和训练过程。这会让我们更加直观地理解神经网络的行为,并且将神经网络与具体拓扑结构(topology)联系起来。
由此产生了许多有趣的事情,其中就包括讨论将数据集进行分类的神经网络复杂程度的基本下限。
一个简单的例子
让我们从非常简单的数据集开始:同一平面上的两条曲线。神经网络通过学习,对点进行分类,使相应的点要么属于下图中的蓝线,要么属于红线。
为了更加明显的观察该神经网络的行为或者是分类算法,最直接的办法是观察其对所有可能的数据点的分类过程。
我们从只包含一个输入层和一个输出层的神经网络开始讨论,这可能是神经网络中最简单的一类。这类神经网络仅仅是利用一条直线将两类数据相互分离。
这类神经网络并没有多少意思。对于现代神经网络而言,输入层和输出层之间通常还有很多层,我们将其称为“隐藏层”。现代神经网络至少含有一层隐藏层。
一个简单神经网络图(来自维基百科)
和以前一样,我们可以通过观察该神经网络内不同点之间的相互作用来观测该神经网络。它对数据的分类,根据的是一条更加复杂的曲线,而不仅仅是一条直线。
在每一层上,神经网络对数据进行转换,同时生成新的向量表示。我们可以通过这些向量表示观察相应的数据,同时也可以看到神经网络对数据的分类过程。当我们到达最后的向量时,神经网络将在数据中画一条线(在更高维的深层神经网络中,这将是一个超平面)。
在先前的可视化过程中,我们用“原始”向量表示法查看数据。这种方法,相当于在观察输入层。现在,我们将着重观察经过第一层变换后的数据。这样做,等同于观察隐藏层的情况。
每个维度对应于相应某层神经元的激发状态。
隐藏层能够学习向量表示,使得数据线性可分
连续可视化图层
通过文章先前部分提出的方法,我们学会了利用每一层的向量表示来理解神经网络。这使我们得到一个向量的离散列表。
其中,比较困难的部分是,如何理解从一个向量到另一个向量的变化过程。但是好在神经网络具有诸多良好的性质,使这一问题非常容易解决。
神经网络中存在各种各样不同的层。下面我们将具体的讨论一下其双曲正切层(tanh layer)。一个双曲正切层 tanh(Wx+b) tanh(Wx+b) 包括:
通过权重矩阵W进行线性变换。
转换向量 b。
Tanh的逐点应用。
我们可以将其视为连续变换,如下:
其他的标准层与之极为类似,都含有一个仿射变换(affine transformation)过程,接着就是单调激活函数的逐点应用。
我们可以将该技术应用到对更加复杂的神经网络的理解中。例如,在下面的例子中,神经网络就是利用四个隐藏层对两个相互之间轻微缠绕的螺旋进行分类的。经过一段时间后,我们可以看到,为了对数据进行分类,“原始”向量通过学习变换成了更高层的向量。一开始,两个螺旋是相互缠绕的状态,但到最后却是线性可分的。
另一方面,在下面的神经网络中,利用的也是多层的方法,但是却未能成功分离两个缠绕程度更大的螺旋。
这里需要明确指出的是,因为我们用的是低维神经网络,所以这些任务具有一定的挑战性。如果我们用的是结构更加复杂的神经网络,那么这些任务就十分简单了。
(在ConvnetJS的基础上,安德烈·卡帕西(Andrej Karpathy)已经做出了很好的演示。ConvnetJS能够让你在运用可视化的训练的时候,交互式地探索数据。)
双曲正切层的拓扑
每一层都能不断延伸并可随意变换形状,但是却不能切割、打断或折叠。直观地来讲也就是,我们能够看到其保留了拓扑的性质。例如,如果一个数据集先前曾被关联的话,将来也会被关联(反之亦然)。
与上述过程类似同时又不影响拓扑的转换叫做同构(bijections)。他们在形式上是双连续函数。
定理:在权重矩阵W是非奇异的情况下,具有N维输入和N维输出的映射是同构(尽管我们需要注意其定义域和值域)。
证明:让我们一步一步地考虑这个问题:
我们假设权重矩阵W含有一个非零的行列式。接着,我们假设其为双射线性函数,是线性反演的。因此乘上W就可以得到同构。
已知,转化过程是同构。
双曲正切函数tanh(也包括sigmoid函数和softplus函数,但是不包括ReLU函数)是连续函数,连续线性反演。如果注意定义域和值域的话,它们也是双射的。将其逐点加以应用,就是同构。
因此,如果W 含有一个非零的行列式,我们的层就是同构。
如果我们将众多这样的图层任意组合在一起,这一结果还将会持续。
拓扑结构和分类
设想一个含有A、B两个类的二维数据集,A⊂R,B⊂R。
A为红色,B为蓝色。
A={x|d(x,0)<1/3}A={x|d(x,0)<1/3}
B={x|2/3<d(x,0)<1}B={x|2/3<d(x,0)<1}
条件:不考虑神经网络的深度,在神经网络的某层中,必须含有三个或三个以上的隐藏单元,才能对数据集进行归类。
之前曾经说过,用sigmoid函数或softmax 层进行分类相当于是在努力找到一个超曲面(或者是一条直线),将A和B从最后的向量表示中分离。如果只有两个隐藏层,神经网络在拓扑结构上无法按照这种方法分离数据,注定会失败。
在接下来的可视化演示中,我们将会观察到隐藏向量以及一个分类线在神经网络训练过程中的变化情况。我们可以观察到,它会努力迭代更新,达到分类的目的。
最终,它收敛于局部极小值。尽管如此,实际上它的归类准确性大致只有80%左右。
这个例子中只有一个隐藏层,这就注定了不管怎样,它最终会是失败的。
证明:要么每一层都是同构的,要么该层的权重矩阵含有行列式 0。如果是同构的,那么A仍被B包围,直线无法将它们分离。但是假设它有一个行列式是0:那么数据集的某些维可以取零。因为我们正在使原始数据集发生同构, A被B包围,数据集任一维度上取零,都将意味着A和B在某种程度上相互交融,不可能将其分离。
如果我们添加第三个隐藏单元,问题便迎刃而解了。神经网络将会学习下面的向量:
通过这些向量,我们可以用一个超曲面将数据集归类。
为了更好地了解这个分离过程,我们可以考虑一个更为简单的数据集,这个数据集是一维的:
A=[−13 ,13 ] A=[−13,13]
B=[−1,−23 ]∪[23 ,1]
只有在隐藏单元多于2个的情况下,我们才能将该数据集成功归类。但是如果该神经网络层含有两个隐藏单元,我们就能以更能拟合实际情况的曲线展现数据,也能用一条直线对数据进行分类:
发生了什么?当x>−1/2时,其中一个隐藏层被激活;在x>1/2时,另一个隐藏层会被激活。当第一个隐藏层而不是第二个被激活时,我们可以知道我们处在A状态。
流形假设
这与图像数据等这些真实的数据集有关系吗?如果你真的有在很严肃的对待流形假设的话,我认为这是值得考虑一下的。
流形假设是说,原始数据可以在嵌入空间中形成低维流形。无论是从理论上来讲,还是从实验上来看,都能证明这一点是确信的。如果你相信的话,那么分类算法就是将相互混合的流形分开的基础过程。
在先前的例子中,一个类被另一个类完全包围。然而,狗的图像流形很难被猫的完全包围。但是,还存在一些更加可信的实际拓扑场景,会存在一定的问题。接下来我们将会对其进行讨论。
链接和同伦(Homotopy)
下面介绍另一种有趣的情况:这里有两个相互链接的圆环,我们用A和B表示:
这与之前我们考虑过的数据集非常类似,如果不运用n+1维的方法,该数据集很难被分离,我们将这个n+1维称之为第四维。
链接(link)属于纽结理论的研究范围,是拓扑学的一个分支。有时候,当我们看到一个链接时,我们并不能马上判断出这个链接是否为非链接(unlink)(尽管很多部分纠结在一起,但是通过连续的形变,能够分离)。
一个相对简单的非链接
如果一个神经网络运用的层只拥有3个隐藏单元,那么它就是一个非链接关系。(问题:从理论上来讲,能把那些只拥有三个隐藏单元的神经网络层全部归结为非链接吗?)
根据纽结理论,对神经网络产生的向量的连续可视化,不仅仅是一个很好的动画演示过程,在这一过程中,它将那些链接解开。在拓扑结构中,我们将其称之为存在于原始链接与被分离部分的ambient isotopy。
从形式上来看,介于流形A和B之间的ambient isotopy 相当于一个连续的函数F:[0,1]×X→Y。这样一来,每一个Ft都是从X到值域的同构。F0是恒等函数,F 1 将A映射到B中。也就是说,Ft 不断的在从A映射到自身以及从A映射到B这两个映射过程中转化。
定理:在输入和神经网络层的向量之间存在ambient isotopy:a) W并不是奇异的,b) 我们愿意对隐藏层的神经元进行重新排列,c) 隐藏层多于一个。
证明:这一次我们继续分别考虑每个阶段的神经网络:
线性变换是最难的一部分。为了使得线性转换成为可能,我们需要W来得到正行列式。我们假设这个正行列式不为0。我们也假设,如果其为负行列式,我们可以通过切换其中两个隐层神经元来改变它的符号。这样一来,我们可以保证行列式始终是正的。正行列式矩阵空间的路径是相互连通的,因此存在p:[0,1]→GL n (R),所以p(0)=Id 并且p(1)=W。我们可以在恒等函数和W转换之间频繁转换,x→p(t)x 、x→p(t)x。在这个不断转换的矩阵p(t)中,在每个时间点t都乘以x。
我们可以在恒等函数和b转换之间持续转化,x→x+tb。
我们可以在恒等函数和σ逐点应用之间持续转化,x→(1−t)x+tσ(x) 。
我在想,程序自动发现这些ambient isotopies的过程以及证明诸多链接的等价性以及证明链接可以分离的过程,可能是非常有意思的。了解神经网络能否打败最先进的技术,将会十分有趣。
(很显然,决定节点是否重要的是其复杂度。这对神经网络来说不是个好兆头。)
我们讨论的这类链接目前在现实数据中是不存在的,但是有更高维的情况存在类似的链接。总之,这样的链接看起来似乎可以在现实数据中存在。
链接和节点都是一维流形,但是我们需要4维的流形才能将它们解开。类似地,我们可能需要更高维的空间以解开n维流形。所有的n维流形都能在2n+2 维空间得以解开。
(我对纽结理论所知甚少,非常需要了解目前的维度和链接方面的知识。如果我们知道某个流形能够被嵌在n维空间,我们还有什么限制呢?)
简单的方法
每个神经网络自然而然的需要努力将流形相互分离,并且需要尽可能的延展流形。虽然这可能不会接近真实的解,但是它能达到相对较高的分类精度以及局部最小值(极小值)。
在其尽可能延展的区域,我们知道有时,它将以高阶导数和近似间断点(near-discontinuities)的形式出现。收缩性惩罚(Contractivepenalties)用于惩罚数据所在的层的衍生,是应对上述事情发生的最自然的方式。
从尽力解决拓扑问题的角度来看,这些极小值是完全没有用处的。拓扑问题或许会为解决上述那些问题提供极好的动力。
另一方面,如果我们仅仅是关心要取得良好的分类结果的话,那么,这就似乎与我们并不关心这个分类结果没什么两样了。如果有一点点的数据流形与其他部分的流形相互缠绕,那么对我们来说,是不是一个问题呢?似乎,即使存在这样的问题,我们也应当能够得到良好的分类结果。
(我的直觉告诉我,试图在这一问题上作弊的做法不是个好主意:很难想象,这条路会走的通。尤其是在最优化问题中,这时极小值非常重要,这时如果不考虑它的话并不能真正解决那些有可能导致坏结果的问题。)
操控流形需要更好的层吗?
关于标准的神经网络层我考虑的越多——也就是,仿射变换(affine transformation)后紧跟一逐点激活函数(point-wiseactivation function )——越不对它抱有幻想。很难想象的到,仿射变换和逐点激活函数对于操控流形是非常好用的。
将一个与众不同的激活层与传统的层相结合,或许会是有意义的?
我认为学习一个带有方向的、我们想改变的流形的向量场是非常自然的事情:
接着,在它的基础上对空间进行变形:
我们可以在固定的点学习向量场(从训练集中取一些固定的点作为锚点),并且以某种方式相互插值。上面的向量场的几何表示形式如下:
在上述这个公式中,v0和v1 都是向量并且f0(x)和f1(x)都是n维高斯函数。这里,我曾受到过一点儿径向基函数(radial basis functions)的启发。
K-Nearest Neighbor层
与此同时,我也在想,线性可再分性很可能是巨大的、不需要理由的。在某种程度上,运用k-NN(k-nearest neighbors)算法可以说是非常理所当然的事情。然而,k-NN算法的成功运用在很大程度上取决于归类数据的向量表示。因此,在运用k-NN算法之前,需要获得良好的向量表示。
首次实验时,我训练了一些MNIST 网络(都是2层卷积神经网络,没有例外),其测试误差约为1%。接着,我丢弃了最后的softmax层,同时应用k-NN算法。我能够不断的降低测试误差,最终测试误差为0.1-0.2%。
尽管如此,这里似乎仍然有错误的地方。神经网络仍然在努力对数据进行线性分类,但是由于我们在测试阶段使用了k-NN算法,其错误率有所降低。
因为存在距离加权的缘故,k-NN算法并不能识别当下起作用的向量。类似的,我们可以训练出一个网络直接用于k-NN算法归类。训练出的网络相当于nearest neighbor层,可以作为softmax的替换。
我们并不想让每个mini-batch(训练集的一个子集)中整个的训练集做前馈(feedforward),因为这会造成特别大的计算量。这里,我认为有一个比较好的办法就是,基于其他mini-batch的元素,对当下mini-batch里的元素进行归类,给予每个mini-batch一个加权 1/(距离来自分类目标)。
不幸的是,即使是复杂高级的结构,k-NN算法的测试误差也只能降低到5-4%而已——如果是简单一点的结构,结果会更加糟糕。然而,我并没有在超参数方面花费很多的心思。
而且,从美学上来讲,我真的非常喜欢这个方法,因为这种方法使得我们想让神经网络实现的结果看起来更加的合理。相比其他流形上的点,我们想让同一流形上的点更加靠近,与可被超曲面分离的流形截然相反。这应当符合扩大不同类别的流形、缩小自身流形的要求。流形需要简单化。
结论
由于数据的拓扑性质(例如链接等),在不考虑深度的情况下,这可能会让低维神经网络的线性分类成为不可能。即使从技术上来看存在线性可分的可能性(例如螺旋),那也将会非常困难。
为了更加准确的分类,我们有时候需要用到较宽的层。更进一步地讲,传统的神经网络层似乎并不十分擅长控制流形。即使我们巧妙地为其设置权重,也很难得到我们想要的转换。新层或许是非常有用的补充,尤其是那些受到机器学习中流形驱动的层。
本文作者 Christopher Olah 目前在Google Brain,致力于研究分布式系统和并行计算、机器智能、自然语言处理的领域,并且从事深度学习的基础研究,另外,Christopher Olah 还会写一些在线文章,提供人工智能领域的在线教程。
编译:AI100
原文链接:http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/