迄今为止对神经网络的一大疑虑是它们是莫名其妙的黑盒子。这篇文章主要是从理论上理解为什么神经网络在模式识别和分类方面表现如此出色。其本质是通过层层仿射变换和非线性变换对原始输入进行扭曲变形,直到可以很容易地区分为不同的类别。.事实上,反向传播算法(BP)实际上是在训练数据的基础上不断微调这种失真的效果。大约从十年前开始,深度神经网络在计算机视觉等领域取得了突破性成果,引起了人们极大的兴趣和关注。然而,一些人仍然表示担忧。一个原因是神经网络是一个黑盒子:如果神经网络训练得好,可以获得高质量的结果,但很难理解它是如何工作的。如果神经网络出现故障,也很难查明哪里出了问题。虽然很难从整体上理解深度神经网络,但从低维深度神经网络开始理解它们会容易得多,即每层只有几个神经元的网络。我们可以使用可视化方法来了解低维深度神经网络的行为和训练。可视化方法可以让我们更直观地理解神经网络的行为,观察神经网络与拓扑结构之间的联系。接下来是很多有趣的东西,包括能够对特定数据集进行分类的神经网络复杂性的下限。1.一个简单的例子让我们从一个非常简单的数据集开始。下图中,平面上的两条曲线是由无穷多个点组成的。神经网络会尝试区分这些点属于哪条线。观察神经网络(或任何分类算法)行为的最直接方法是查看它如何对每个数据点进行分类。我们从最简单的神经网络开始,它只有一个输入层和一个输出层。这样的神经网络只是简单地将两类数据点用一条直线分开。这样的神经网络太简单粗暴了。现代神经网络通常在输入层和输出层之间有多个层,称为隐藏层。即使是最简单的现代神经网络也至少有一个隐藏层。一个简单的神经网络,图片来源维基百科我们再次观察神经网络对每个数据点做了什么。如您所见,该神经网络使用曲线而不是直线分隔数据点。显然,曲线比直线更复杂。神经网络的每一层都以新的表示形式表示数据。我们可以观察数据如何转化为新的表征,以及神经网络如何对它们进行分类。在最后一层的表示中,神经网络在两类数据之间画一条线(如果是更高维度,则画一条超平面)。在前面的可视化中,我们看到了数据的原始表示。你可以把它想象成数据在“输入层”的样子。现在让我们看看转换后的数据是什么样子的。您可以将其视为数据在“隐藏层”中的样子。数据的每个维度对应神经网络层中一个神经元的激活。隐藏层使用上述方法来表示数据,使得数据可以被直线分隔(即线性可分)。2.层的连续可视化在上一节的方法中,神经网络的每一层都使用不同的表示来表示数据。这样,每一层的表示都是离散的,不连续的。这就让我们很难理解,从一种表示到另一种表示,中间是怎么转换的?幸运的是,神经网络层的性质使这很容易理解。神经网络中有多个层。下面我们将以tanh层为例进行具体讨论。tanh层包括:具有“权重”矩阵W的线性变换、具有向量b的平移以及tanh的逐点表示。我们可以将其视为连续变换,如下所示:对于其他标准层也是如此,从模拟派生它由投影变换和单调激活函数的逐点应用组成。我们可以使用这种方法来理解更复杂的神经网络。例如,下面的神经网络使用四个隐藏层来分类两个稍微交织在一起的螺旋。可以看出,为了对数据进行分类,数据的表示不断变换。两个螺旋最初纠缠在一起,但最终它们可以被一条直线分开(线性可分)。另一方面,下面的神经网络虽然也使用了多个隐藏层,但无法划分两个更交织的螺旋。需要明确指出的是,上述两个螺旋分类任务存在一些挑战,因为我们现在只使用低维神经网络。如果我们使用宽度更宽的神经网络,一切都会容易得多。(AndrejKarpathy基于ConvnetJS做了一个很好的demo,让人可以通过这种视觉训练来交互探索神经网络。)3.tanh层的拓扑神经网络的每一层都会拉伸和挤压空间,但不会切割、分裂或折叠空间。直观上,神经网络不会破坏数据的拓扑属性。例如,如果一组数据是连续的,那么它在转化为表示之后也是连续的(反之亦然)。像这样不影响拓扑性质的变换称为同胚。形式上,它们是双向连续函数的双射。定理:如果权重矩阵W是非奇异的(non-singular),神经网络的一层有N个输入和N个输出,那么这一层的映射是同胚的(对于特定域和值域)。证明:让我们一步一步来:1.假设W有一个非零行列式。那么它是一个具有线性逆的双射线线性函数。线性函数是连续的。那么像“乘以W”这样的变换是同胚;2.“平移”变换是同胚;3.tanh(以及sigmoid和softplus,但不包括ReLU)是具有连续逆函数的连续函数。(对于特定的域和范围),它们是双射,它们的逐点应用是同胚。因此,如果W具有非零行列式,则该神经网络层是同胚的。如果我们将这些层随机组合在一起,这个结果仍然成立。4.拓扑和分类我们来看一个二维数据集,其中包含两类数据A和B:A是红色,B是蓝色解释:要对这个数据集进行分类,神经网络(不管深度)必须有包含3个或更多隐藏单元的层。如前所述,使用sigmoid单元或softmax层进行分类相当于在最后一层的表示中找到一个将A和B分开的超平面(在本例中为一条线)。如果只有两个隐藏单元,神经网络就无法在拓扑上以这种方式分离数据,也就无法对上述数据集进行分类。在下面的可视化中,隐藏层转换了数据的表示,直线是分界线。可以看到分界线在不断的旋转和移动,但是还是不能很好的把A和B两类数据分开。这样的神经网络无论经过怎样的训练,都无法很好地完成分类任务。最终只能勉强达到局部极小值,达到80%的分类准确率。上面的例子只有一个隐藏层,由于只有两个隐藏单元,所以无论如何都会分类失败。证明:如果只有两个隐藏单元,要么本层的变换是同胚的,要么本层的权重矩阵的行列式为0。如果是同胚,A仍然被B包围,A和B无法分开一条直线。如果行列式为0,则数据集将在某个轴上折叠。因为A被B包围,在任何轴上折叠A都会导致一些A数据点与B混合,从而无法区分A和B。但是如果我们添加第三个隐藏单元,问题就迎刃而解了。此时,神经网络可以将数据转化为如下表示:此时可以用一个超平面来分离A和B。为了更好地解释它是如何工作的,我们以一个更简单的一维数据集为例:要对该数据集进行分类,必须使用由两个或更多隐藏单元组成的层。如果你使用两个隐藏单元,你可以用一条漂亮的曲线来表示数据,这样你就可以用一条直线将A和B分开:这是怎么做到的?那时,其中一个隐藏单位被激活;那个时候,另一个隐藏单位被激活了。当上一个隐藏单元被激活而下一个隐藏单元没有被激活时,可以判断这是一个属于A的数据点。5.流形假设对于处理现实世界的数据集(如图像数据)是否有意义?我认为这是有道理的。流形假设是指自然数据在其嵌入空间中形成低维流形。这一假说有理论和实验支持。如果您相信流形假设,那么分类算法的任务归结为分离一组纠缠流形。在前面的示例中,一个类完全包围了另一个类。然而,在现实世界的数据中,狗的图像流形不太可能完全被猫的图像流形包围。然而,其他更合理的拓扑情况仍可能导致问题,这将在下一节中讨论。6.Linksandhomotopy接下来说说另一个有趣的数据集:两个linkedtori,A和B。和我们前面讲的数据集情况类似,不使用n+1是不可能分离一个n维数据集的维度(在这种情况下,n+1维度是第4维度)。链接问题属于拓扑学中的纽结理论。有时候,当我们看到一个链接时,我们不能立即判断它是否是一个坏链接(unlinkbrokenlink是指它们虽然相互纠缠在一起,但可以通过不断的变形将它们分开)。一个更简单的断链如果一个隐藏层只有3个隐藏单元的神经网络可以对一个数据集进行分类,那么这个数据集就是一个断链(问题:理论上所有的断链都可以通过只用Neuralnetworkclassificationwith3个隐藏单位?)。从纽结理论的角度来看,神经网络产生的数据表示的顺序可视化不仅是一个漂亮的动画,而且还是一个解开链接的过程。在拓扑学中,我们称其为原始链接和分离链接之间的环境同位素。流形A和流形B之间的环绕同态是一个连续函数:每一个都是X的同胚。是将A映射到B的特征函数。即不断地从映射A到自身过渡到映射A到B。定理:如果同时满足以下三个条件:(1)W是非奇异的;(2)隐藏层神经元顺序可手动排列;(3)隐藏单元的个数大于1,则神经网络的输入和神经网络层之间产生具有环绕迹的表示。证明:我们也是一步步来的:1.最难的部分是线性变换。要实现线性变换,我们需要W具有正行列式。我们的前提是行列式不为零,如果行列式为负,我们可以通过转置两个隐藏神经元将其变为正。正行列式矩阵的空间是路径连通的(path-connected),因此有,通过该函数,我们可以将特征函数连续过渡到W变换,将时间t的每个点的x与连续过渡的矩阵相乘。2.可以通过函数从feature函数过渡到b翻译。3、可以通过函数从特征函数过渡到函数的逐点应用。我猜有人可能会对以下问题感兴趣:是否可以开发一个程序来自动发现这种环境同位素,并自动证明一些不同链接的等价性或一些链接的可分离性。我也很想知道神经网络是否可以在这方面击败当前的SOTA技术。虽然我们所说的联动形式很可能不会出现在现实世界的数据中,但现实世界的数据中可能存在更高维的泛化。链接和节点都是一维流形,但需要4维来将它们分开。同样,要分离n维的流形,需要更高维的空间。所有n维流形都可以被2n+2维分开。7.一种简单的方法对于神经网络,最简单的方法就是直接把缠绕在一起的流形拉出来,缠绕的部分越细越好。虽然这不是我们追求的根本解决方案,但是可以达到比较高的分类准确率,达到比较理想的局部极小值。这种方法会在您尝试拉伸的区域产生非常高的导数。解决这个问题需要收缩惩罚,这是惩罚数据点的层的导数。局部极小值对于解决拓扑问题没有用处,但拓扑问题可能为探索和解??决上述问题提供很好的思路。另一方面,如果我们只关心获得好的分类结果,那么如果流形的一小部分与另一个流形纠缠在一起对我们来说是不是一个问题?如果我们只关心分类结果,这似乎不是问题。(我的直觉是,像这样走捷径是不好的,会走死胡同。特别是在优化问题中,找到局部最小值并不能真正解决问题,选择一个不能真正解决问题的解决方案,你最终将无法获得良好的性能。)8.选择一个更适合操纵流形的神经网络层?我认为标准神经网络层不适合操纵流形,因为它们使用仿射变换和逐点激活函数。也许我们可以使用一个完全不同的神经网络层?我想到的一个想法是,首先,让神经网络学习一个向量场,其方向是我们想要移动流形的方向:然后基于此对空间进行变形:我们可以在固定点学习向量场(只需从训练集中选择一些固定点作为锚点)并以某种方式进行插值。上面的向量场具有以下形式:其中,和是向量,和是n维高斯函数。这个想法受到径向基函数的启发。9.K-NearestNeighborLayer我的另一个观点是线性可分性可能是对神经网络的过度和不合理的要求,也许使用k-NearestNeighbors(k-NN)会更好。然而,k-NN算法在很大程度上取决于数据的表示。因此,需要良好的数据表示才能使k-NN算法取得良好的效果。在第一个实验中,我训练了一些错误率低于1%的MNIST神经网络(双层CNN,无dropout)。然后,我舍弃了最后的softmax层,使用了k-NN算法,多次结果表明错误率降低了0.1-0.2%。但是,我觉得这种做法仍然是错误的。神经网络仍然是尝试线性分类,但是因为有了k-NN算法,它可以稍微纠正一些它犯的错误,从而降低错误率。由于(1/distance)的权重,k-NN在其操作的数据表示方面是可微的。因此,我们可以直接训练神经网络进行k-NN分类。这可以被认为是一种“最近邻”层,其作用类似于softmax层。我们不想为每个小批量反馈整个训练集,因为这在计算上会很昂贵。我认为一个好的方法是根据mini-batch中其他元素的类别对mini-batch中的每个元素进行分类,给每个元素赋予权重(1/(与分类目标的距离))。不幸的是,即使使用复杂的架构,使用k-NN算法也只能将错误率降低到4-5%,使用简单的架构甚至更高。但是,我并没有在超参数上投入太多精力。但我还是喜欢k-NN算法,因为它更适合神经网络。我们希望同一流形的点彼此更接近,而不是坚持用超平面将流形分开。这相当于缩小单个流形,同时使不同类别的流形之间的空间变大。这简化了问题。10.汇总数据的某些拓扑特性可能会阻止使用低维神经网络(无论神经网络的深度如何)对这些数据进行线性分离。即使技术上可行,例如螺旋,低维神经网络也很难实现分离。为了准确地对数据进行分类,神经网络有时需要更宽的层。此外,传统的神经网络层不适合操纵流形;即使手动设置权重,也很难获得理想的数据变换表示。新的神经网络层,尤其是那些受到从多方面角度理解机器学习启发的神经网络层,可能会有所帮助。
