大约十年前开始,深度神经网络在计算机视觉等领域取得了突破性成果,引起了极大的兴趣和关注。
然而,仍有一些人对此表示忧虑。原因之一是,神经网络是一个黑匣子:如果神经网络训练得很好,可以获得高质量的结果,但很难理解它的工作原理。如果神经网络出现故障,也很难找出问题所在。
虽然要整体理解深层神经网络很难,但可以从低维深层神经网络入手,也就是每层只有几个神经元的网络,它们理解起来要容易得多。我们可以通过可视化方法来理解低维深层神经网络的行为和训练。可视化方法能让我们更直观地了解神经网络的行为,并观察到神经网络和拓扑学之间的联系。
接下来我会谈及许多有趣的事情,包括能够对特定数据集进行分类的神经网络的复杂性下限。
1
一个简单的例子
让我们从一个非常简单的数据集开始。下图中,平面上的两条曲线由无数的点组成。神经网络将试着区分这些点分别属于哪一条线。
要观察神经网络(或任何分类算法)的行为,最直接的方法就是看看它是如何对每个数据点进行分类的。
我们从最简单的神经网络开始观察,它只有一个输入层和一个输出层。这样的神经网络只是用一条直线将两类数据点分开。
这样的神经网络太简单粗暴了。现代神经网络通常在输入层和输出层之间有多个层,称为隐藏层。再简单的现代神经网络起码有一个隐藏层。
一个简单的神经网络,图源维基百科
同样地,我们观察神经网络对每个数据点所做的操作。可见,这个神经网络用一条曲线而不是直线来分离数据点。显然,曲线比直线更复杂。
神经网络的每一层都会用一个新的表示形式来表示数据。我们可以观察数据如何转化成新的表示形式以及神经网络如何对它们进行分类。在最后一层的表示形式中,神经网络会在两类数据之间画一条线来区分(如果在更高的维度中,就会画一个超平面)。
在前面的可视化图形中,我们看到了数据的原始表示形式。你可以把它视为数据在「输入层」的样子。现在我们看看数据被转化之后的样子,你可以把它视为数据在「隐藏层」中的样子。
数据的每一个维度都对应神经网络层中一个神经元的激活。
隐藏层用如上方法表示数据,使数据可以被一条直线分离(即线性可分)
2
层的连续可视化
在上一节的方法中,神经网络的每一层用不同表示形式来表示数据。这样一来,每层的表示形式之间是离散的,并不连续。
这就给我们的理解造成困难,从一种表示形式到另一种表示形式,中间是如何转换的呢?好在,神经网络层的特性让这方面的理解变得非常容易。
神经网络中有各种不同的层。下面我们将以tanh层作为具体例子讨论。一个tanh层,包括:
-
用“权重”矩阵 W 作线性变换
-
用向量 b 作平移
-
用 tanh 逐点表示
我们可以将其视为一个连续的转换,如下所示:
其他标准层的情况大致相同,由仿射变换和单调激活函数的逐点应用组成。
我们可以用这种方法来理解更