尽管神经网络的优异表现让人印象深刻,但这种优异变现却似乎是神秘难解的。神经网络中的权重和偏移是自动发现的。而这意味着我们没法对网络怎样工作给出一个直截了当的解释。对于分类手写文字的网络,我们可以找到某种方法去理解其工作原理吗?如果知道了这些原理,我们可以让神经网络表现得更好吗?

为了让问题表现得更尖锐,假设再过几十年之后,神经网络最终实现了真正意义的人工智能(AI),我们就最终理解那样的智能神经网络了吗?也许这个神经网络依然对于我们来说是个“黑匣子”,其中的权重和偏移我们都没法理解,因为这些参数都是通过学习自动获得的。早年研究AI的人员希望通过努力创建某种人工智能来帮助人们理解人类“智能”的原理或者人脑的工作方式。然而,最终结果可能是,我们最终对人脑和人工智能的工作方式都理解不了!

为了强调这些问题,让我们回到本章一开始对人工神经元所做的解释,即,它是一种衡量凭据重要性(weighing evidence)的手段。假设我们利用它来决定一张图是否是人脸:

Credits: 1. Ester Inbar. 2. Unknown. 3. NASA, ESA, G. Illingworth, D. Magee, and P. Oesch (University of California, Santa Cruz), R. Bouwens (Leiden University), and the HUDF09 Team. Click on the images for more details.

kangaroo

nstein_crop

hubble

我们可以采用识别手写数字一样的方法来处理这个问题,即,将图片的像素值作为神经网络的输入,而将某个神经元的最终输出作为结果来表示“是的,这是一张脸” 或者 “不是,这不是人脸”。

假设让我们来做这件事,但是不采用学习算法。取而代之,我们将试图选择恰当的权重和偏移参数,手工设计一个网络。我们具体将怎么办呢?让我们暂时将整个神经网络都忘掉,一种启发性的办法是我们可以将这个问题细化为以下“子问题”:是不是有个眼睛在图片的左上方?是不是有另一个眼睛在图片的右上方?是不是有个鼻子在中间?是不是有张嘴在中下方?是不是有头发在顶上?如此等等。

如果这些问题的许多答案都是 “是的”,或者仅仅是 “很可能是”,那么我们就可以得出结论:这张图片很可能是人脸。与此相反,如果这些问题的绝大多数答案都是“不是”,那么这张图片就很可能不是人脸。

当然,这仅仅是种大体上的启发性方法,并且也有很多缺陷。比如说,这个人也许是个秃子,因此没有头发。也许我们只能看到脸的一部分,或者是从某个特殊视角看到的脸,因此脸部的某些特征可能是模糊的。不过,这种启发性的思路依然暗示着:如果我们可以用神经网络来解决这些“子问题”,那么我们也许可以通过将解决这些“子问题”的网络合并起来,来建立一个可以实现人脸识别的神经网络。这里有一种可能的网络结构,其中方框标记的是解决“子问题”的网络。注意:我们并不是真打算用这个方法来解决人脸识别问题,而是将其作为一种对理解神经网络工作方式建立某种直观印象和感觉的手段。下面是网络结构:

tikz14

这些子网络似乎也应该可以进一步细化。假设我们来考虑这个问题:“是不是有个眼睛在图片的左上方?” 这个问题可以被进一步细化为如下“子问题”:“是不是有眉毛?”;“是不是有睫毛?”;“是不是有瞳孔?”;如此等等。当然,这些问题其实应该也包含相关的位置信息,例如:“眉毛是在左上方,并且在瞳孔上方吗?” 。不过,为了简化表述,我们认为对于“是不是有个眼睛在图片的左上方?”这个问题,我们可以进一步细化为:

tikz15

这些问题当然可以通过多层结构(multiple layers)被一步一步更加细化。直到最终,我们要通过子网络来解决的问题如此简单,以至于可以在像素级别上很容易地回答它们。比如说,这些问题可能是:某种很简单的形状是否出现于图片某个特定的位置上。这些问题可以由直接与图片像素相连接的神经元来回答。

最终的结果是,神经网络通过一系列的“多层结构”将一个复杂的问题:“图片上有没有人脸?”逐步简化为在像素级别就可以轻易回答的简单问题。其中靠前的结构层用来回答关于输入图片的非常简单而具体的问题,靠后的结构层用来回答较复杂而抽象的问题。这种多层结构,即有两个或更多“隐藏层”(hidden lyaers)的网络,被称为深度神经网络。

当然,我前面并没有说该怎样将一个问题逐渐一步一步细化为“子网络”。并且,通过手工设计来决定网络中的权重和偏移显然行不通的。因此,我们将通过训练数据,采用学习算法来自动决定网络中权重和偏移参数,当然也决定了问题的概念层次结构。在上世纪八九十年代,研究者们试图用“随机梯度下降法” 和 “逆传播”(backpropagation)算法来训练深度神经网络。不幸的是,除了某些特殊的结构,他们没有成功。这些网络可以学习,但是非常之慢,以至于没有实用性。

2006年以来,一系列的新技术被发展出来,让深度神经网络的学习成为可能。这些深度学习的技术同样是基于“随机梯度下降法” 和 “逆传播”,但是引入了一些新的办法。这些新技术让训练更深(也更大)的神经网络成为现实——人们现在一般可以训练有5到10个“隐藏层”的神经网络。并且对于许多问题,这些深度网络的表现要远远好于浅的网络,即,只有1个“隐藏层”的网络。其中的原因,当然是因为深度网络可以建立起一个复杂的概念层次结构。这有点像编程语言通过模块化设计和抽象出类来实现一个复杂的计算机程序。深度网络和潜网络的区别有点像一种可以调用函数的编程语言和不能调用函数的编程语言之间的区别。在神经网络中,抽象方式可能和编程语言有所不同,但其重要性确是一样的。