共计 5826 个字符,预计需要花费 15 分钟才能阅读完成。
迄今,人们对神经网络的一大疑虑是,它是难以解释的黑盒。本文则次要从实践上了解为什么神经网络对模式识别、分类成果这么好,其本质是通过一层层仿射变换和非线性变换把原始输出做扭曲和变形,直至能够非常容易被辨别不同的类别。实际上,反向流传算法(BP) 其实就是依据训练数据一直地微调这个扭曲的成果。本文用多张动图十分形象地解释了神经网络的工作原理,相干内容也可参考知乎网友的探讨:
https://www.zhihu.com/questio…
作者 | Christopher Olah
起源 | Datawhale
翻译 | 刘洋
校对 | 胡燕君(OneFlow)
大概十年前开始,深度神经网络在计算机视觉等畛域获得了突破性成绩,引起了极大的趣味和关注。
然而,仍有一些人对此示意忧愁。起因之一是,神经网络是一个黑匣子:如果神经网络训练得很好,能够取得高质量的后果,但很难了解它的工作原理。如果神经网络呈现故障,也很难找出问题所在。
尽管要整体了解深层神经网络很难,但能够从低维深层神经网络动手,也就是每层只有几个神经元的网络,它们了解起来要容易得多。咱们能够通过可视化办法来了解低维深层神经网络的行为和训练。可视化办法能让咱们更直观地理解神经网络的行为,并察看到神经网络和拓扑学之间的分割。
接下来我谈判及许多乏味的事件,包含可能对特定数据集进行分类的神经网络的复杂性上限。
1
一个简略的例子
让咱们从一个非常简单的数据集开始。下图中,立体上的两条曲线由有数的点组成。神经网络将试着辨别这些点别离属于哪一条线。
要察看神经网络(或任何分类算法)的行为,最间接的办法就是看看它是如何对每个数据点进行分类的。
咱们从最简略的神经网络开始察看,它只有一个输出层和一个输入层。这样的神经网络只是用一条直线将两类数据点离开。
这样的神经网络太简略粗犷了。古代神经网络通常在输出层和输入层之间有多个层,称为暗藏层。再简略的古代神经网络起码有一个暗藏层。
一个简略的神经网络,图源维基百科
同样地,咱们察看神经网络对每个数据点所做的操作。可见,这个神经网络用一条曲线而不是直线来拆散数据点。显然,曲线比直线更简单。
神经网络的每一层都会用一个新的示意模式来示意数据。咱们能够察看数据如何转化成新的示意模式以及神经网络如何对它们进行分类。在最初一层的示意模式中,神经网络会在两类数据之间画一条线来辨别(如果在更高的维度中,就会画一个超平面)。
在后面的可视化图形中,咱们看到了数据的原始示意模式。你能够把它视为数据在「输出层」的样子。当初咱们看看数据被转化之后的样子,你能够把它视为数据在「暗藏层」中的样子。
数据的每一个维度都对应神经网络层中一个神经元的激活。
暗藏层用如上办法示意数据,使数据能够被一条直线拆散(即线性可分)
2
层的间断可视化
在上一节的办法中,神经网络的每一层用不同示意模式来示意数据。这样一来,每层的示意模式之间是离散的,并不间断。
这就给咱们的了解造成艰难,从一种示意模式到另一种示意模式,两头是如何转换的呢?好在,神经网络层的个性让这方面的了解变得非常容易。
神经网络中有各种不同的层。上面咱们将以 tanh 层作为具体例子探讨。一个 tanh 层 \(tanh(Wx+b) \),包含:
- 用“权重”矩阵 W 作线性变换
- 用向量 b 作平移
- 用 tanh 逐点示意
咱们能够将其视为一个间断的转换,如下所示:
其余规范层的状况大致相同,由仿射变换和枯燥激活函数的逐点利用组成。
咱们能够用这种办法来了解更简单的神经网络。例如,上面的神经网络应用四个暗藏层对两条略有互缠的螺旋线进行分类。能够看到,为了对数据进行分类,数据的示意形式被一直转换。两条螺旋线最后是纠缠在一起的,但到最初它们能够被一条直线拆散(线性可分)。
另一方面,上面的神经网络,尽管也应用多个暗藏层,却无奈划分两条互缠水平更深的螺旋线。
须要明确指出的是,以上两个螺旋线分类工作有一些挑战,因为咱们当初应用的只是低维神经网络。如果咱们应用宽度更大的神经网络,所有都会很容易很多。
(Andrej Karpathy 基于 ConvnetJS 制作了一个很好的 demo,让人能够通过这种可视化的训练交互式地摸索神经网络。)
3
tanh 层的拓扑
神经网络的每一层都会拉伸和挤压空间,但它不会剪切、割裂或折叠空间。直观上看,神经网络不会毁坏数据的拓扑性质。例如,如果一组数据是间断的,那么它被转换示意模式之后也是间断的(反之亦然)。
像这样不影响拓扑性质的变换称为同胚(homeomorphisms)。模式上,它们是双向连续函数的双射。
定理:如果权重矩阵 W 是非奇怪的(non-singular),而神经网络的一层有 N 个输出和 N 个输入,那么这层的映射是同胚(对于特定的定义域和值域而言)。
证实:让咱们一步一步来:
- 假如 W 存在非零行列式。那么它是一个具备线性逆的双射线性函数。线性函数是间断的。那么“乘以 W”这样的变换就是同胚;
- “平移”变换是同胚;
- tanh(还有 sigmoid 和 softplus,但不包含 ReLU)是具备间断逆(continuous inverses)的连续函数。(对于特定的定义域和值域而言),它们就是双射,对它们的逐点利用就是同胚。
因而,如果 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:
这是怎么做到的呢?当 x >-(1/2)时,其中一个暗藏单元被激活;当 x >1/ 2 时,另一个暗藏单元被激活。以后一个暗藏单元被激活而后一个暗藏单元未被激活时,就能够判断出这是属于 A 的数据点。
5
流形假说
流形假说对解决真实世界的数据集(比方图像数据)有意义吗?我认为有意义。
流形假如是指天然数据在其嵌入空间中造成低维流形。这一假如具备实践和试验撑持。如果你置信流形假如,那么分类算法的工作就能够归结为拆散一组相互纠缠的流形。
在后面的示例中,一个类齐全突围了另一个类。然而,在真实世界的数据中,狗的图像流形不太可能被猫的图像流形齐全突围。然而,其余更正当的拓扑状况仍然可能会引发问题,下一节将会详谈。
6
链接与同伦
上面我将谈谈另一种乏味的数据集:两个相互链接的圆环面(tori),A 和 B。
与咱们之前谈到的数据集状况相似,如果不应用 n + 1 维度,就不能拆散一个 n 维的数据集(n+ 1 维度在本例中即为第 4 维度)。
链接问题属于拓扑学中的纽结实践。有时候,咱们看到一个链接,并不能立马判断它是否是一个断链(unlink 断链的意思是,尽管它们相互纠缠,但能够通过间断变形将其拆散)。
一个较简略的断链
如果暗藏层只有 3 个暗藏单元的神经网络能够对一个数据集进行分类,那么这个数据集就是一个断链(问题来了:从实践上讲,所有断链都能够被只有 3 个暗藏单元的神经网络分类吗?)。
从纽结实践的角度来看,神经网络产生的数据表示模式的间断可视化不仅仅是一个很好的动画,也是一个解开链接的过程。在拓扑学中,咱们称之为原始链接和拆散后的链接之间的盘绕同痕(ambient isotopy)。
流形 A 和流形 B 之间的盘绕同痕是一个连续函数:
每个 \(F_{t} \)是 X 的同胚。\(F_{0} \)是特征函数,\(F_{1} \)将 A 映射到 B。也就是说,\(F_{t} \)一直从将 A 映射到本身过渡到将 A 映射到 B。
定理:如果同时满足以下三个条件:(1)W 为非奇怪;(2)能够手动排列暗藏层中神经元的程序;(3)暗藏单元的数量大于 1,那么神经网络的输出和神经网络层产生的示意模式之间有一个盘绕同痕。
证实:咱们同样一步一步来:
- 最难的局部是线性转换。为了实现线性转换,咱们须要 W 有一个正行列式。咱们的前提是行列式为非零,如果行列式为负,咱们能够通过调换两个暗藏神经元将其转化为正。正行列式矩阵的空间是门路连贯的(path-connected),这就有
因而,\(p(0)=Id \),\(p(1)=W \)。
通过函数 \(x \rightarrow p(t)x \),咱们能够间断地将特征函数过渡到 W 转换,在工夫 t 在每个点将 x 与间断过渡的矩阵 \(p(t) \)相乘。 - 能够通过函数 \(x \rightarrow x + tb \) 从特征函数过渡到 b 平移。
- 能够通过函数 \(x \rightarrow (1-t)x + t \sigma (x) \)从特征函数过渡到 \(\sigma \)的逐点利用。
我猜可能有人会对上面这个问题感兴趣:能不能研发出可主动发现这种盘绕同痕(ambient isotopy)的程序,还能主动证实某些不同链接的等效性或某些链接的可分离性。我也很想晓得神经网络在这方面能不能战胜目前的 SOTA 技术。
尽管咱们当初所谈的链接模式很可能不会在事实世界的数据中呈现,但事实的数据可能存在更高维度的泛化。
链接和纽结都是 1 维的流形,但须要 4 个维度能力将它们拆散。同样,要拆散 n 维的流形,就须要更高维度的空间。所有的 n 维流形都能够用 2n+ 2 个维度拆散。
7
一个简略的办法
对于神经网络来说,最简略的办法就是将互缠的流形间接拉开,而且将那些缠结在一起的局部拉得越细越好。尽管这不是咱们谋求的根本性解决方案,但它能够实现绝对较高的分类精度,达到一个绝对现实的部分最小值。
这种办法会导致试图拉伸的区域呈现十分高的导数。应答这一点须要采纳膨胀惩办,也就是惩办数据点的层的导数。
部分极小值对解决拓扑问题并无用处,不过拓扑问题或者能够为摸索解决上述问题提供好的思路。
另一方面,如果咱们只关怀获得好的分类后果,那么如果流形有一小部分与另一个流形相互缠绕,这对咱们来说是个问题吗?如果咱们只在乎分类后果,那么这仿佛不成问题。
(我的直觉认为,像这样走捷径的办法并不好,容易走进死胡同。特地是,在优化问题中,寻求部分极小值并不能真正解决问题,而如果抉择一个不能真正解决问题的计划,就终将不能获得良好的性能。)
8
选取更适宜操纵流形的神经网络层?
我认为规范的神经网络层并不适宜操纵流形,因为它们应用的是仿射变换和逐点激活函数。
或者咱们能够应用一种齐全不同的神经网络层?
我脑海中浮现的一个想法是,首先,让神经网络学习一个向量场,向量场的方向是咱们想要挪动流形的方向:
而后在此基础上变形空间:
咱们能够在固定点学习向量场(只需从训练集中选取一些固定点作为锚),并以某种形式进行插值。下面的向量场的模式如下:
其中 \(V_{0} \)和 \(V_{1} \)是向量,\(f_{0}(x) \)和 \(f_{1}(x) \)是 n 维高斯函数。这一想法受到径向基函数的启发。
9
K- 近邻层
我的另一观点是,对神经网络而言,线性可分性可能是一个过高且不合理的要求,或者应用 k 近邻(k-NN)会更好。然而,k-NN 算法很大水平上依赖数据的示意模式,因而,须要有良好的数据表示模式能力让 k -NN 算法获得好后果。
在第一个试验中,我训练了一些 MNIST 神经网络(两层 CNN,无 dropout),错误率低于 1%。而后,我抛弃了最初的 softmax 层,应用了 k -NN 算法,屡次结果显示,错误率升高了 0.1-0.2%。
不过,我感觉这种做法仍然不对。神经网络依然在尝试线性分类,只不过因为应用了 k -NN 算法,所以可能稍微修改一些它所犯的谬误,从而升高错误率。
因为(1/distance)的加权,k-NN 对于它所作用的数据表示模式是可微的。因而,咱们能够间接训练神经网络进行 k -NN 分类。这能够视为一种“最近邻”层,它的作用与 softmax 层相似。
咱们不想为每个小批量反馈整个训练集,因为这样计算成本太高。我认为一个很好的办法是,依据小批量中其余元素的类别对小批量中的每个元素进行分类,给每个元素赋予(1/(与分类指标的间隔))的权重。
遗憾的是,即便应用简单的架构,应用 k -NN 算法也只能把错误率升高至 4 -5%,而应用简略的架构错误率则更高。不过,我并未在超参数方面下太多时间。
但我还是很喜爱 k -NN 算法,因为它更适宜神经网络。咱们心愿同一流形的点彼此更凑近,而不是执着于用超平面把流形离开。这相当于使单个流形膨胀,同时使不同类别的流形之间的空间变大。这样就把问题简化了。
10
总结
数据的某些拓扑个性可能导致这些数据不能应用低维神经网络来进行线性拆散(无论神经网络深度如何)。即便在技术可行的状况下,例如螺旋,用低维神经网络也十分难以实现拆散。
为了对数据进行准确分类,神经网络有时须要更宽的层。此外,传统的神经网络层不适宜操纵流形;即便人工设置权重,也很难失去现实的数据转换示意模式。新的神经网络层或者能起到很好的辅助作用,特地是从流形角度了解机器学习启发得出的新神经网络层。
(原译文:https://mp.weixin.qq.com/s/Ph…;
原文:http://colah.github.io/posts/…)
欢送下载体验 OneFlow v0.8.0 最新版本:https://github.com/Oneflow-In…