前言
尽管我们的神经网络表现出令人印象深刻的性能,但这种性能在某种程度上是神秘的。网络中的权重和偏差是自动发现的。这意味着我们并没有立即能够解释网络如何实现其功能。我们能否找到某种方式来理解我们的网络是如何对手写数字进行分类的原则?而且,鉴于这些原则,我们能做得更好吗?
假设几十年后神经网络导致了人工智能(AI)。我们会理解这样的智能网络是如何工作的吗?也许对于我们来说,这些网络将是不透明的,其中的权重和偏差我们不理解,因为它们是自动学习的。在人工智能研究的早期,人们希望建立人工智能的努力也会帮助我们理解智能背后的原则,也许是人类大脑的运作方式。但也许结果将是,我们最终既不理解大脑,也不理解人工智能的工作原理!
思维模式
为了解决这些问题,让我们回顾一下我在本章开头给出的对人工神经元的解释。假设我们想确定一张图像是否显示了一个人脸:
我们可以像对待手写识别问题一样来解决这个问题——使用图像中的像素作为神经网络的输入,网络的输出是一个单一的神经元,指示“是,这是一张脸”或“不,这不是一张脸”。
假设我们这样做,但我们不使用学习算法。相反,我们要尝试手动设计一个网络,选择适当的权重和偏差。我们应该如何做呢?暂时忘记之前学过的神经网络,我们可以使用的一种启发式方法是将问题分解为子问题:图像左上角是否有眼睛?图像右上角是否有眼睛?中间是否有鼻子?底部中间是否有嘴巴?顶部是否有头发?等等。
如果这些问题的答案中有几个是“是”,甚至只是“可能是”,那么我们会得出结论,该图像很可能是一张脸。相反,如果大多数问题的答案是“否”,那么该图像很可能不是一张脸。
当然,这只是一个粗略的启发式方法,它有许多缺陷。也许这个人是秃头,所以他们没有头发。也许我们只能看到脸的一部分,或者脸是倾斜的,所以一些面部特征被遮挡了。尽管如此,这个启发式方法表明,如果我们可以使用神经网络解决这些子问题,那么也许我们可以通过组合这些子问题的网络来构建一个用于人脸检测的神经网络。以下是一个可能的架构,其中矩形表示子网络。请注意,这并不是解决人脸检测问题的现实方法;相反,它是为了帮助我们建立对网络功能的直觉。以下是架构:
有可能子网络可以进行分解。假设我们正在考虑这个问题:“左上角有眼睛吗?” 这可以分解成诸如:“有眉毛吗?”;“有睫毛吗?”;“有虹膜吗?”等问题。当然,这些问题实际上应该包括位置信息,“眉毛在左上方,虹膜上方吗?”之类的内容,但我们保持简单。现在,用来回答“左上角有眼睛吗?”这个问题的网络可以分解为:
这些问题也可以进一步分解,通过多个层次进行。最终,我们将使用回答问题的子网络,这些问题简单到可以轻松地在单个像素级别上回答。例如,这些问题可能是关于图像中特定点处非常简单的形状的存在或缺失。这样的问题可以由连接到图像中原始像素的单个神经元来回答。
最终结果是一个网络,将一个非常复杂的问题——这张图片是否显示了一张脸——分解成可以在单个像素级别回答的非常简单的问题。它通过一系列许多层次来实现,早期的层次回答关于输入图像的非常简单和具体的问题,而后期的层次则构建起了越来越复杂和抽象的概念的层次结构。具有这种多层结构(两个或更多隐藏层)的网络被称为深度神经网络。
当然,我还没有说明如何进行这种对子网络的递归分解。手动设计网络中的权重和偏差显然是不切实际的。相反,我们希望使用学习算法,让网络可以从训练数据中自动学习权重和偏差,从而形成概念的层次结构。20世纪80年代和90年代的研究人员尝试使用随机梯度下降和反向传播来训练深层网络。不幸的是,除了一些特殊的架构之外,他们并没有取得太大成功。网络会学习,但学习速度很慢,实际上往往太慢以至于无法使用。
从2006年开始,一套技术已经被开发出来,使深度神经网络能够进行学习。这些深度学习技术基于随机梯度下降和反向传播,但也引入了新的思想。这些技术使得能够训练更深(和更大)的网络——现在人们经常训练具有5到10个隐藏层的网络。而且,事实证明,在许多问题上,这些网络表现得比浅层神经网络(即只有一个隐藏层的网络)要好得多。当然,原因在于深度网络能够构建起复杂的概念层次结构。这有点像传统编程语言使用模块化设计和抽象概念来实现复杂计算机程序的创建。将深层网络与浅层网络进行比较,有点像将具有函数调用能力的编程语言与没有这种能力的简化语言进行比较。在神经网络中,抽象形式与传统编程中的不同,但同样重要。