第三章 神经网络——萃取隐蔽相关性
第三章 神经网络——萃取隐蔽相关性
导读
在了解了机器学习各个流派的方法后,本书的主角“神经网络”现在闪亮登场。本章将深入介绍神经网络学习的原理和在商业上应用最多的几种形态,以及它们的适用范围。有了这些基础,我们才可以真正理解AlphaGo Zero是怎样发现神迹般的暗知识的。对于只想了解AI商业前景的读者,也可以先跳过这一章,读完后面描述机器学习神奇应用的章节后再回来弄懂它是如何工作的。
从感知器到多层神经网络
1943年,心理学家沃伦·麦卡洛克(Warren McCulloch)和数理逻辑学家沃尔特·皮茨(Walter Pitts)提出并给出了人工神经网络的概念及人工神经元的数学模型,从而开了人类神经网络研究的先河。世界上第一个人工神经元叫作TLU(Threshold Linear Unit,即阈值逻辑单元或线性阈值单元)。最初的模型非常简单,只有几个输入端和输出端,对权值的设置和对阈值的调整都较为简单。
1957年,一个开创性的人工神经网络在康奈尔航空实验室诞生了,它的名字叫作感知器(Perceptron),由弗兰克·罗森布莱特(Frank Rosenblatt)提出,这也是首次用电子线路来模仿神经元。他的想法很简单,如图3.1所示:将其他电子神经元的几个输入按照相应的权重加在一起,如果它们的和大于一个事先给定的值,输出就打开,让电流通向下一个神经元;如果小于这个事先给定的值,输出就关闭,没有电流流向下一个神经元。
1960年,斯坦福大学教授伯纳德·威德罗(Bernard Widrow)和他的第一个博士生马尔西安·泰德·霍夫(Marcian Ted Hoff)提出了自适应线性神经元(ADaptive LInear NEurons,ADLINE)。他们第一次提出了一种可以自动更新神经元系数的方法(机器自我学习的原始起点):用输出误差的最小均方去自动迭代更新神经元权重系数,直至输出信号和目标值的误差达到最小。这样就实现了权重系数可以自动连续调节的神经元。自适应线性神经元最重要的贡献是第一个使用输出信号和目标值的误差自动反馈来调整权值,这也为后面神经网络发展历史上里程碑式的反向传播算法奠定了基础。
图3.1感知器的电子线路
这个单层的神经网络也被称为自适应信号处理器,被广泛应用在通信和雷达当中。霍夫后来加入英特尔,在1971年设计了世界上第一个微处理器Intel 4004。威德罗教授也是笔者20世纪80年代后期在斯坦福大学的博士生导师。笔者曾经在他的指导下做过神经网络的研究工作。图3.2是笔者2016年和他讨论神经网络未来发展时的合影,笔者手中拿的那个黑盒子就是他1960年做出的ADLINE单层神经网络。这个盒子到今天还在工作,美国国家博物馆曾经想要这个盒子做展品,但威德罗教授回答说“我还要用它来教学”。
图3.2笔者和自己当年斯坦福大学的博士导师,神经网络鼻祖之一威德罗教授的合影
威德罗教授在1962年还提出过一个三层的神经网络(Multi-Layer Adaptive Linear Neurons,MADALINE),但没有找到一个能够用于任意多层网络的、简洁的更新权重系数的方法。由于单层网络有广泛应用而多层网络的运算速度太慢(当时的电脑运算速度是今天的100亿分之一),所以在MADALINE之后没有人去继续深入探讨多层网络。
由于缺少对人脑工作模式的了解,神经网络的进展一度较为缓慢,而它进入快速发展期的一个触发点则是医学领域的一个发现。1981年,诺贝尔生理学或医学奖颁发给了美国神经生物学家大卫·胡贝尔(David Hubel)、托尔斯滕·威塞尔(Torsten Wiesel)和罗杰·斯佩里(Roger Sperry)。前两位的主要贡献是发现了人类视觉系统的信息处理采用分级方式,即在人类的大脑皮质上有多个视觉功能区域,从低级至高级分别标定为V~V5等区域,低级区域的输出作为高级区域的输入。人类的视觉系统从视网膜(Retina)出发,经过低级的V1区提取边缘特征,到V2区的基本形状或目标的局部,再到高层V4的整个目标(例如判定为一张人脸),以及到更高层进行分类判断等。也就是说高层的特征是低层特征的组合,从低层到高层的特征表达越来越抽象和概念化。至此,人们了解到大脑是一个多层深度架构,其认知过程也是连续的。
神经网络学习的本质是大量神经元通过复杂的连接形成记忆。因为分析简单且容易用电子元件实现,一开始人工神经网络就如图3.3那样由一层一层组成。其实人脑的神经元连接非常复杂,没有这么一层一层的清晰和有秩序。但我们目前并没有弄清楚人脑神经元的连接方式,先从简单的假设入手是科学的一般方法。
图3.3一个多层神经网络(其中每个方块代表一个神经元)
20世纪80年代,神经网络的另一个重大突破是当时在加利福尼亚州大学圣迭戈校区任教的美国心理学家大卫·鲁梅哈特(David Rumelhart)和在卡内基梅隆大学任教的计算科学家杰弗里·辛顿(Jeffrey Hinton)提出的多层神经网络,以及一个普遍的自动更新权重系数的方法。前面说过,威德罗教授在1962年提出过一个三层的神经网络,但功亏一篑,没有找到一个简洁的任意多层网络权重系数的更新方法。这个问题在1986年被鲁梅哈特和辛顿解决了。他们借鉴了单层神经网络中威德罗-霍夫(Widrow-Hoff)反馈算法的思路,同样用输出误差的均方值一层一层递进地反馈到各层神经网络去更新系数。这个算法就是今天几乎所有神经网络都在用的“反向传播”算法。“反向传播”听上去很“高大上”,实际上就是在自动控制和系统理论里面多年一直在用的“反馈”,只不过在多层网络中反馈是一层一层递进的。因为一个多层的神经网络要通过成千上万次“用输出误差反馈调整系数”,所以运算量非常大。在20世纪80年代的计算能力限制下,神经网络的规模非常小(例如三层,每层几十个神经元)。这种小规模的神经网络虽然显示了神奇的能力(例如能够识别0~9一共10个手写体数字),但仍然无法找到真正的商用。
从第一个电子神经元感知器的发明(1957年)到神经网络的大规模应用(2012年)整整经历了55年的艰辛探索,许多天才科学家不顾嘲讽和失败,坚信这条路是对的。图3.4是在这个探索旅程中做出重大贡献的科学家。
图3.4 1940—2010年基于神经网络的AI发展史上做出突破性贡献的科学家
图片来源:https://beamandrew.github.io/deeplearning/2017/02/23/deep_learning_101_part1.html。
神经网络模型:满是旋钮的黑盒子
在这一节中,我们用最简单的方法介绍机器学习的机理。像图3.3这样一个多层神经网络的左端是输入端,即要识别的信息从这里输入。例如要识别一幅图像,每个输入Xi就是这张图像的一个像素的灰度值(为了简单起见我们假设图像是黑白的,如果是彩色的,我们可以想象三个这样的网络重叠起来用)。从输入层的每个神经元到下一层的每个神经元都有一个连接,从输入层的第i个神经元到下一层第j个神经元的连接有一个乘法因子Wij。每一层到下一层都类似。在输出端,每根线对应一个识别出来的物体。我们可以把每个输出想象成一个灯泡。当机器发现输入是某个物体时,对应该物体的灯泡就在所有输出灯泡里最亮。
像这样一个多层次的神经网络是如何“学习”的呢?我们可以把这个多层网络看成一个黑盒子。盒子外面有许多可以调节的旋钮,如图3.5所示。
图3.5机器学习:调节黑盒子外的旋钮
我们的第一个任务是训练这个黑盒子能够识别图像中的物体。例如在图3.5中,输入端有两张图,一张汽车图片和一张猫的图片。我们训练的目的是只要输入各种汽车的图片,机器就能告诉我们“这张图是汽车”(对应“汽车”这个物体的输出端的灯泡最亮)。同样,只要我们输入猫的图片,机器就告诉我们“这张图是猫”(对应“猫”的灯泡最亮)。训练的过程是这样的:我们先指定输出的一个灯泡最亮对应于识别出了汽车,第二个灯泡最亮对应猫,等等。我们先找到足够多的汽车图片(例如1万张,训练图片越多,训练出的机器判断越准确),一张一张给机器“看”(实际训练是一组一组地给机器看)。在机器没有训练好时,当我们输入一张汽车图片时,输出的灯泡会乱亮。我们此时耐心地调节那些旋钮直到只有对应“汽车”的灯泡亮为止。然后我们输入下一张汽车图片,也调到只有对应汽车的灯泡亮为止,如此一直到1万张。然后我们再输入第一张猫的图片,调节旋钮直到对应“猫”的灯泡亮为止,也如此一直到1万张猫的图片都输入完为止。如果我们让机器学习1 000种物体的图片,那我们对每种物体图片都要如此操作,让输出端对应这种物体的灯泡最亮。所以在机器学习中,“训练”是最耗时的。在训练过程中,这些训练用的图片我们事先知道是什么内容,或者叫作“标注”过的图片。当训练结束后,第二步是测试。也就是拿一些不在训练集里面的图片让机器辨认,如果机器都能辨认出来,这部机器就算训练好了,可以交付使用了。一旦训练测试结束,机器的参数集就不改变了,也就是所有的旋钮都固定不动了。只要是输入训练过的种类,机器都应该能识别出来。
如果一部机器要识别1 000种物体的图片,就要至少有1 000个输出端(每个输出端对应一种物体)。假设图片分辨率是100×100=10 000像素(很低的分辨率),如果这部机器只有三层神经网络(深度最浅的“深度”学习网络),输入端和中间层之间,中间层和输出之间的连接就有10 000×10 000+10 000×1 000=1.1亿个。也就是这部机器有1亿多个旋钮。截至2017年,最大的神经网络已经号称有上万亿的参数,即上万亿个旋钮。这么多旋钮显然无法用人工去调节。
雾里下山:训练机器模型
幸运的是数学上200年前就有了“自动”调节旋钮的办法。这个办法叫作“最陡梯度法”,或者通俗地叫作“雾里下山法”。当我们训练一个机器学习模型时,我们事先知道每一张图片是什么物体(汽车、猫等已经标注的图片),我们输入汽车图片时,要求只有对应“汽车”的那个灯泡最亮。在我们调节旋钮之前,灯泡的亮和灭都是混乱的,和我们的要求有很大误差。这些误差是由旋钮的值决定的。如果把这些误差画成一幅图像,就像图3.6一样有很多山峰,误差就是山峰的高度,图像的横轴和纵轴就是旋钮的值。
图3.6用“最陡梯度法”寻找误差最小的“山谷”
图片来源:维基百科。
当我们输入第一张图片时,我们可能站在一个随机的位置,例如某一座山峰的山顶或半山腰,我们的任务就是走到最低的一个谷底(误差最小)。我们此时相当于在大雾中被困在山里只能看见眼前的山坡,一个最笨的办法就是“最陡下降法”:站在原地转一圈,找到一个最陡的下山方向往这个方向走一步。在这个新的位置上,再转一圈找到最陡的下山方向再走一步,如此循环,一直走到山脚为止。
在“最陡下降法”中每次转圈找最陡下山方向相当于用误差函数的偏微分方程求梯度。简单地讲,旋钮的每一步的调节值是可以算出来的。这样我们根据输出的误差一步一步地算出旋钮的调节值,直到满意为止。这种根据误差回头调节旋钮的方法也叫“反向传播算法”,意思是用输出误差一层一层地从输出端向输入端把各层的权重系数算出来。
AlphaGo的“上帝视角”
有了上面的基础,我们现在就可以理解为什么AlphaGo这么厉害。围棋棋盘有19×19=361个交叉点,每个交叉点可以二选一:白子或黑子。这样所有的摆法就是2,或者10。人类2 000年来一共保留下来的围棋残局中盘大约3 000万个。人类下过的棋局相当于大海里的一滴水(即使剔除那些明显没有意义的摆法)。一位棋手即使每天下2盘棋,50年内天天下,一生也只能下36 500盘棋。图3.7是一张“雾里下山”的示意图。下棋的终极目标相当于在群山中找到最低的谷底(对应于最理想的走法)。如果所有可能的走法是绵延几千里的群山,人类棋手2 000年来就相当于一直在同一个小山坳里面打转转。第一位棋手偶然的棋路会影响他的徒弟,以后的徒子徒孙都始终在这个小山坳附近徘徊。而机器学习像个“神行太保”,以比人快百万倍的速度迅速扫遍群山,很快就能找到一个远离人类徘徊了2 000年的更低的山谷(可能还不是绝对最低,但比人类徘徊处低)。这也是连棋圣聂卫平都连呼“看不懂”AlphaGo棋路的原因。(见图3.7)
图3.7机器学习可以迅速扫过群山找到最低处
这个原理可以用于解决许多类似的问题。这类问题的特点是变量非常多,可能解是天文数字,例如经济和社会决策、军事行动策划等。
局部最优:没到山底怎么办
“雾里下山法”会遇到一个问题,就是会走进一个不是最低的谷底而且再也走不出来了。用一维函数能清楚地看到这个问题。图3.8是有两个“谷底”:A点和B点的一维函数。当下山走到A点时,只要每次的步伐不是特别大,不论往左还是往右再移动,总是会回到A点。这在数学上叫“局部最小值”,而B点才是“全局最小值”。
图3.8有两个谷底的一维函数
但是如果我们从一维扩展到二维,就有可能从一个“局部最小值”中逃逸。在图3.9中,假设函数1是一个沿X轴切下去的一维函数,A点就是函数1的一个“局部最小值”。如果一个小珠子只能沿着X轴滚动,就会陷在A点出不来。但在图中的二维曲面上,小珠子只要沿着Y轴方向挪动一点,就到了C点,而从这个C点出发就能到达整个曲面的“全局最小值”B点。当误差函数的维数增加时,这种从“局部最小值”逃逸的机会就会增大。我们无法画出三维以上的图像,但我们可以想象每个“局部最小值”附近都有许多“虫洞”可以方便逃逸。维数越高,这种虫洞就越密集,就越不容易陷在一个“局部最小值”里。
图3.9从一维空间扩展到二维空间,误差函数找到“全局最小值”的概率增大
如果图3.9不够直观,我们可以用一个数字阵列来表达。首先假设地形是一个一维函数,每个数字表示它的海拔高度。在图3.10中,有两个最小的海拔高度0和5,但是无论从哪一边开始下山,每走一步的话,都会被困在高度5这个“局部最小值”里出不来,无法走到“绝对最小值”0。
图3.10地形函数的数字阵列
但是,如果将这个地形叠加为二维函数,仍然用数字表示海拔高度,我们可以看到,无论从哪一边开始下山,每走一步,当在一维函数中走到“局部最小值”5以后,在另外一个维度的函数中,则可以继续走到更低的海拔,直到到达“全局最小值”0。同样地,维度越多,在某一个维度到达“局部最小值”后,可以选择的其他维度和路径就越多,因此被困在“局部最小值”的概率就越低。(见图3.11)
图3.11将地形叠加为二维函数
深度学习——化繁为简
为什么深度学习有许多层神经元?这是因为世界上许多信息和知识是可以通过分层表达的。例如人脸是很复杂的一幅图像,但人脸可以先分解成五官,五官的复杂程度就比人脸低了,五官又可以进一步分解为线条。深度学习就是用一层神经元去识别一个层级的信息。在图3.12中,左图是第一层网络来识别人脸上的线条,中间的图是第二层网络在识别出线条的基础上识别出器官,右图是第三层网络在识别出器官的基础上识别出长相。同样一个时间序列的信息,例如语音也可以分解为递进的层级:句子、单词、音节等。分层的最大好处是大大降低计算量,把原来的N次计算变为m×logN次计算,这里m是层数。
除了将要处理的信息表达为层级以外,另外一种降低计算量的方法是将“一大块”信息分解为许多小块来处理。例如想要在一张像素很大的图片中识别出一个小三角形,我们只需拿着这个小三角形的模板在大图中滑动比较即可。例如一张图的像素是1 000×1 000=1 000 000,如果拿一个1 000×1 000像素的模板去比较,计算量大约是1 000 000×1 000 000。如果这个三角形的大小是10×10,我们用10×10“模板滑动法”,计算量只要10×10×1 000 000,是原来的万分之一。
图3.12深度学习神经网络学习得到的不同层次的特征
图片来源:维基百科。
机器要处理的信息有些是空间信息,例如图片,有些是时间信息,例如语音。针对不同的信息,神经网络的结构不同。最常见的有两种,第一种是处理空间信息的卷积神经网络(Convolutional Neural Network,CNN),第二种是处理时间信息的循环神经网络(Recurrent Neural Network,RNN)。下面我们一一介绍。
化整为零的卷积神经网络
“卷积”这个词什么意思待会咱们再讲,但现在可以告诉你的是,目前人工智能和机器学习制造的奇迹,从下围棋到自动驾驶再到人脸识别,背后全是卷积神经网络。能知道卷积神经网络的工作原理,你就和周围大部分读了几本人工智能的书的人不是一个档次了。虽然大部分人不会从事人工智能的专业工作,但卷积神经网络解决问题的思路会让我们拍案叫绝。第一个提出卷积神经网络的是前面说的神经网络教父杰弗里·辛顿教授的博士后学生,一位叫岩拉孔(Yan LeCun)的法国人,现在任Facebook(脸书)人工智能研究所主任,和辛顿同为神经网络四大天王之一。
降低运算量就是降低成本
神经网络每一层的每一个神经元都和后面一层的每一个神经元相连接。如果第一层有1万个神经元,第二层也有1万个,这两层之间的连接就有1亿个。如果像微软那个一举超过人脸识别图像能力的ResNet(深度残差网络)有152层,这些连接就有151亿个。也就是说我们要调整的黑盒子上有151亿个旋钮。为了识别10种动物,要给训练机器看10万张动物图片,一张图片就要算151亿次乘法和加法,10万张至少是1 500万亿次运算。这才是识别10种动物的训练运算量,如果要训练识别1万种动物呢?用今天的最快的CPU(电脑中央处理器)或GPU(图形处理器),也要算几个月甚至几年。对计算量要求更大的是识别,识别一张图片要算150亿次不难,但Facebook上每天上传的何止几亿张照片?降低运算量就意味着降低成本。
降低运算量的第一招就是把问题分类,如果只处理某一类问题,针对这些问题的共同特点,就有可能简化算法。我们知道,人从外界获得的信息90%以上是视觉信息,视觉信息主要是图像,视频也可以分解成快速闪过的图像。那图像有什么特点呢?一幅图像的信息量很大,但不管是风景还是人物,画面上总有大部分区域没有什么变化,像天空。引起你注意的东西往往都是一小块,例如人的眼睛、天空中的鸟、地上的花。这个叫作图像中信息的局域性。图像的第二个特点是可以分解为更简单的元素,例如风景分解为天空、大地、植物、动物,人物分解为五官。卷积神经网络就是利用图像的以上两个特点进行了大幅度的运算简化。
以人脸识别为例,要识别一个人,先要抓住他的特征,比如浓眉大眼高鼻梁。第一步就是把五官找出来。其实警察抓犯罪嫌疑人早就用了这一招。警察局的画师会问目击者犯罪嫌疑人的性别、年龄、身高、种族等,然后问目击者犯罪嫌疑人的五官长什么样,目击者能描述的五官种类非常有限,大眼睛、小眼睛,最多加个单眼皮、双眼皮、高鼻梁、塌鼻梁,根据目击者的描述画师画出一幅人脸,然后目击者再说眼角朝下,没这么大,画师再不断改,直到目击者觉得和记忆基本相符。人脸那么复杂根本无法用语言描绘,但如果变成五官的组合描绘起来就简单多了。假设每个五官都能分10种,就能组合出1万种脸来,再加上年龄、性别、种族就能组合出几十万张脸,这样把从70亿人中找一张脸的任务就分解成了从10种眼睛中找出一种眼睛,再从10种鼻子中找出一种鼻子这样简单得多的任务。
卷积神经网络是怎样工作的
卷积神经网络就是用的警察局这一招。假如我们现在要从分布在北京大街小巷的摄像头的视频中发现100个重要的犯罪嫌疑人,第一步是用这些犯罪嫌疑人的已有照片来训练机器。训练的第一步就是要从这些照片中提取五官的特征。因为五官在一张照片中只占一小块,那我们就做个找五官的小模板,专业术语叫滤波器,用这个小模板在要处理的图像上从左扫到右,从上扫到下,看看能否发现眼睛,另外一个小模板负责发现鼻子等。什么叫“发现鼻子”?就是负责发现鼻子的小模板是一张像鼻子的图案,这个图案扫到鼻子处时重合度最大。什么叫提取特征?就是一开始这个鼻子图案是个随机图案,像是随手那么一画,扫一遍下来发现没有什么重合度,那就变一变这个图案,最后变得和犯罪嫌疑人的鼻子很像时,重合度就会最大。等负责找出鼻子、眼睛、嘴巴等的模板图案都和犯罪嫌疑人的吻合后就算训练成功了。以后你输入一张照片,机器就可以飞速地告诉你这个是不是犯罪嫌疑人。
在机器学习中,是机器自己寻找特征。一开始机器并不知道要找哪些特征。所以这些小模板并不知道它们要找鼻子或眼睛。这些小模板从开始的一个随机图形到最后一定会演变成五官吗?答案是如果五官是人脸上最重要的特征,这些小模板到最后一定会演变成五官。但神奇的是机器还能发现我们人类都没注意到的人脸上的重要特征。假如我们多加一个小模板变成六个,这六个中会有五个各自对应一个器官,还有一个就会找到一个新的特征,如两眼之间的距离,或者口鼻之间的距离,等等。所以小模板越多,抓到的特征就越多,识别就越准确。
现在你要问,这个小模板发现鼻子和前面讲的神经网络黑盒子的调旋钮是什么关系?其实这个小模板就是一组旋钮,一个有5×5=25个像素的小模板就相当于25个旋钮,每个像素的颜色浓度对应着一个旋钮的某个位置,调旋钮就是让小模板里的图案越来越像犯罪嫌疑人的鼻子。我们之前讲过,这个“调旋钮”不是人工调的,是算出来的。
现在我们可以看看到底省了多少计算量,如果一张图片是1 024×1 024≈100万像素,每个像素对应一个接收神经元,每层有100万个神经元,这样一个全连接的神经网络每一层要有100万×100万=1万亿次计算。现在只要五个小模板,每个负责找到五官中的一个。每个小模板把图片上下左右扫一遍的计算量是5×5×100万=2 500万次,5个模板就是1.25亿次。计算量变成了原来的万分之一!
我现在可以告诉你什么叫“卷积”,上面说的小模板把图片上下左右横扫一遍发现重合度的过程就叫卷积。你看这个唬人的黑科技名词其实就是这么简单的一回事。
上面是对卷积神经网络的基本原理的一个通俗解释。对于想更深入了解的读者可以看附录1中一个典型卷积网络的精确描述。从附录1中可以看出卷积神经网络不仅是一个高阶的非线性网络,也是一个无法用方程式表达的函数。给定一个训练数据集,最后这些数据之间的相关性都会凝结在网络参数里。或者说神经网络是数据相关性的“萃取器”。但萃取了哪些相关性?为什么萃取这些相关性则是人们未必能理解的。比如人脸识别,机器抓取的用于识别的人脸特征可能是人类不熟悉的那些特征,甚至完全没有意识到的特征。对于那些人类感官无法感受的复杂数据集,比如一个核电厂成千上万个子系统产生的数据以及它们之间的相关性,那更是人类完全无法理解的。
卷积神经网络能做哪些事
首先,几乎所有的图像类的处理,如图像分类、人脸识别、X光读片,都适合用卷积神经网络。图像分类最著名的大赛就是斯坦福大学李飞飞教授创办的ImageNet(计算机视觉系统识别项目,是目前世界上图像识别最大的数据库)大赛。这个大赛提供1 000种不同物体的几百万张图片让参赛者训练自己的模型,参赛时给大家一些新的图片让参赛者识别,看谁的识别准确率最高。2012年辛顿的学生亚历克斯·克里捷夫斯基(Alex Krizhevsky)第一次用一个5层的卷积神经网络就把多年徘徊在74%的准确率一举提高到84%,震惊了业界。到2015年微软的152层ResNet把准确率提高到了96%,超过了人类的准确率95%。从那以后进展就越来越小。有些公司组织大量的人力,采集更多的训练图片,尝试更多的小模板,更精心地微调那些旋钮,最后能达到比现有结果好0.1%,然后就可以宣称自己是世界第一了。但这个世界第一意义不大,因为没有在网络结构上和算法上有任何创新,当时人家一个研究生Alex一举提高10个百分点,你扑上去几十上百人提高0.1个百分点,不算本事。对不懂卷积神经网络的投资人、股民、政府官员来说,这块“世界第一”的牌子还挺唬人的。但读到这里你以后就不会被忽悠了。
更有用的是通过识别一张图片中所有的物体,甚至发现物体之间的关系来“理解”这张图片。譬如机器看完一张图片后会说出来“蓝天白云下,一位戴草帽的年轻妈妈在草地上教孩子学走路,她们的小狮子狗在旁边卧着”。
X光读片也是卷积神经网络一个很好的应用。假如要在胸片中发现早期肺癌,就需要拿大量已经确诊的早期肺癌片子来训练机器,这样训练好的机器就可以快速地发现肺癌。随着X光仪、CT机等医疗成像设备的普及,有经验的读片医生非常稀缺。特别是在小城市、县城、乡村更缺乏这样的好医生。如果机器读片能够达到甚至超过北京、上海大医院有经验的医生,将是普惠医疗的一个巨大进展。我们在第六章会专门讲AI在医疗健康领域的应用,包括X光读片的现状和挑战。
卷积神经网络虽然应用很广,但它解决不了一些重要的问题,如股票预测和自然语言理解。下面我们就介绍可以解决这类问题的另一个很牛的网络。
处理序列信息的循环神经网络
为什么需要循环神经网络
卷积神经网络可以处理图像分类和识别。图像信息处理的特点是一张图像的所有信息同时给你,而且下一张图像和上一张图像可以完全没有关系,就像是吃一盘饺子,先吃哪个后吃哪个都无所谓。但自然界还有另外一类信息和图像不同,信息的先后顺序很重要,不能前后颠倒,像自然语言、股票曲线、天气预报数据等。和图像信息的另一个不同之处在于这些信息是连续产生的,无法分成一块一块的,像一次喝进去一瓶啤酒,你无法清楚地分成几十“口”,你就是这么咕嘟咕嘟连着灌下去的。我们把图像这样不分先后的信息称为“空间信息”,把连续的、有先后顺序的称为“时间信息”或“序列信息”。卷积神经网络每次能处理的信息都是个固定的量,所以不适合处理连续发生的信息。
于是,一种不同的神经网络——循环神经网络就应运而生了,它的结构比卷积神经网络还复杂。但循环网络背后的直觉和道理不难懂,其实掌握一门学科最重要的是理解背后的直觉,有些研究生、工程师可以背很多方程式,写很多程序,但对背后的直觉并不清晰,这就大大限制了他们的想象力和创造力。我们这本书的目的不是要把大家训练成工程师,而是通过弄懂背后的道理来对这个未来的大潮流有高屋建瓴的理解,从而产生全局性的把握。
在介绍循环神经网络之前,我们先看个例子。譬如我们在下面的句子里猜词填空:“我是广东人,会讲_____话。”在这里如果我们没有看到第一句“我是广东人”就很难填空。这就是一个典型的根据前面出现的信息对后面可能会出现的信息的预测。循环神经网络就特别适合处理这类问题。这个网络有两个特点,分别对应时间序列信息的两个特点:一是输入端可以接收连续的输入,二是可以记住信息的先后顺序。
循环神经网络背后的直觉
现在我们看看循环神经网络如何做这样的预测。像其他神经网络一样,第一步是训练机器。我们先一句一句地训练,比如训练的第一句就是“我是上海人,会讲上海话”。一开始训练机器时,给机器一个“我”字,机器会乱预测,比如预测出下个字是介词“但”,可“我但”没意义。机器和训练样本一比知道自己错了,就去调黑盒子上的旋钮,一直调到机器会在“我”后面预测出“是”来。训练就是这样给机器读大量的各种各样的句子,当机器读了很多以“我”开始的句子时,就会发现“我”后面一定是动词,特别是关系动词或能愿动词,像“我是”“我要”。但“我”后面可以有很多动词,“我想”“我吃”“我喝”,到底选哪个呢?这就需要更前面的信息了。所以循环神经网络要存储前面的信息。当机器读了很多“我是上海人,会讲上海话”“我是河南人,会讲河南话”这类的句子后,就会慢慢发现规律,这时候你让它填“我是广东人,会讲_____ 话”的空时,它就把我是“什么”人那个“什么”给填进去了。
这时候你会问,这好像不用这么复杂的神经网络吧,只要统计每个词后面出现的词的概率,然后预测哪个概率最高不就得了?过去的确是这么做的,但效果不好,像我们前面举的例子,“我”后面的可能性太多了。那你会接着说:“我们也统计前面更多的字不就得了?”那我问你,统计前面多少个字呢?要不要把词组和短句也作为一个单位来统计?但词组和短句多得数不清,你怎么教会机器认识哪些是词组?你会发现越深究问题就越多,而且问题变得无穷复杂,以至于都不知道该提取哪些特征。而神经网络可以自动找到那些人类找不到的或者根本没意识到的前后信息之间的相关性。就像我们之前讲到卷积神经网络不仅能找到人脸的五官特征,还能找到人平时不注意的其他特征如两眼间距等。
有兴趣的读者可以看附录2里面关于循环神经网络的技术介绍。从附录2里可以看出由于循环神经网络里有反馈回路,整个网络更是一个高度非线性、无法解析表达的网络。循环网络萃取出的数据在时间上的相关性更是人类无法感受和理解的暗知识。因为人脑非常不善于存储很长一段时间的信息。
循环神经网络的神奇应用
循环神经网络的第一个重要应用是机器翻译。机器翻译最早是语言学家手工写一大堆语法,然后根据单词出现的顺序用语法把它们组织起来。这是典型的“专家系统”。我们前面讲过,这样的手工系统无法应付千变万化的自然语言。后来的机器学习翻译就是前面说过的统计方法,统计大量的句子中每个字出现在另外一个字之后的频率,然后挑选最可能出现的那个字。我们前面也说了这种方法的局限性。现在最新、最牛的机器翻译,从谷歌、Facebook、微软到百度统统都是用循环神经网络。翻译和前面的填空例子相比,多了可用的信息。例如英文“I am Chinese,I can speak mandarin”可以翻译成中文“我是中国人,会讲普通话”,机器翻译除了可以根据前面出现的中文词预测后面的中文词之外,还可以根据整个英文句子和整个中文句子之间的对应关系来提高预测的准确性。这就是目前最广泛使用的“编码器-解码器”翻译模型。这里用两个循环神经网络,一个网络先把整个英文句子的结构信息都压缩到一个字符中,然后第二个网络在一个字一个字地预测时可以根据这个包含了整个句子的结构信息做辅助判断。机器翻译正处在技术突破的边缘,一旦突破将给我们的生活带来巨变。
机器学习不仅在科学技术的进步上大显神威,也开始进入人文领域。循环神经网络第二个有意思的应用是写诗。我们会在第六章中详细介绍。同样的道理,还可以写小说。只要让机器大量阅读一位作者的著作,机器就会学会这个作者的文字风格,甚至可以写出海明威风格的《红楼梦》,或者曹雪芹风格的《老人与海》。
循环神经网络很神奇,但我们下面要介绍的“强化学习”更神奇。
AlphaGo与强化学习
机器学习迄今为止最让人类惊奇的表现就是下围棋。下围棋的问题是当我每走一步时,如何使得最终赢棋的概率最大?如果我不走150步,只走两步,每步双方只随机选5种走法,我走第一步有五种选择,对方对我这五种选择的每一种又有五种选择,我走第二步一共有5×5×5=125种选择。但通常走完两步离终局还很远,那我从走完第二步的这125个位置上各派出一批“侦察兵”,每个“侦察兵”蒙着头一条道走到黑,看到岔路任选一条,尽快走到终局,如果猜对了,给这个出发点加一分,猜错了,减一分。从每个位置上派出的“侦察兵”越多,从这125个出发点到终局的赢率就越准确。这个“有限出发点,随机侦察”的方法有个唬人的专业名字叫“蒙特卡洛树搜索”。蒙特卡洛是摩纳哥的赌场区,所以蒙特卡洛就是“随机”的意思。
但这种下棋策略只能勉强达到一二段的业余水平,与围棋大师相比还差得很远。为什么?
因为“侦察兵”往前走时随机选岔道实际上是随机地替对方选了走法。我们不禁会想到:见到岔路随机选多笨,完全可以根据阳光、藓苔、足迹这些东西做个判断。“侦察兵”很委屈地说:我怎么知道该怎样判断?AlphaGo寻思说:“人类2 000多年下了那么多盘棋,咱能不能先学学?”这时候AlphaGo祭出了大法器,就是我们前面讲过的卷积神经网络。
卷积神经网络最适合处理图像,经过大量图片的训练后,你给它个新的图片,它告诉你是猫、狗、汽车的概率分别有多少。对于下棋,问题转化成:给个中盘,要判断哪种走法赢的概率最大。在人类下过的棋局中,每个中盘都对应着一个走法。现在可以把一个中盘看成一幅图像,把对应的走法看成与这个图像对应的物体。现在找到中盘最好的走法就相当于判断这幅图像最像哪个物体。那我就拿人类下过的棋局来训练AlphaGo里负责走子的卷积神经网络——决策网络。现在把3 000万个人类走过的中盘输入给决策网络,调整决策网络上的旋钮,一直到这个网络的走法和人的走法类似。现在AlphaGo已经是七八段的水平了,但还打不过大师,为什么?虽然现在“侦察兵”每一步都是按人类的走法,但“侦察兵”的每一步只是替对方随机选一个。如果能让对方的选择也按人类的走法,这条路对弈下去就更逼真了。AlphaGo这时候拔了身上一根毫毛,吹口仙气儿,“变!”又“变”出一个一模一样的AlphaGo。哥俩都是八段,再大战百万回合,又摸索出很多原来人类没有探索过的捷径,又产生了很多数据,继续训练决策网络,没多长时间就打败了李世石,再练一阵子,在网上打出Master的旗号,横扫天下高手,无一失手,直至把柯洁挑下马。
前面介绍的无论是卷积神经网络还是循环神经网络都需要大量的训练数据,这也叫“监督学习”。在“监督学习”中通常有唯一或明确的答案,猫就是猫,狗就是狗。但生活中还有一类问题是没有明确答案的。例如我们学习骑自行车,没有人能说清楚正确姿势是什么,不管你姿势多难看,骑上去不摔倒就是对的。这类问题的特点是答案不唯一但知道结果的对错。这种通过每次结果的反馈逐渐学习正确“行为”的算法就叫“强化学习”。在强化学习算法中有一个“奖惩函数”,不同的行为会得到不同的奖惩。譬如我们在楼里打电话时,如果信号不好,我们就拿着手机,边走边问对方“能听到吗?”。我们得到的信息并不能直接告诉我们哪里信号最好,也无法告诉我们下一步应该往哪个方向走,每一步的信息只能让我们评估当前的状况是更好还是更差。我们需要走动、测试,以决定下一步应该往哪儿走。AlphaGo的随机树搜索就是强化学习,通过派出“侦察兵”来测试某种走法的赢率。赢了加一分,输了减一分,这就是强化学习中的奖惩函数,存储各种走法输赢积分的网络也叫“价值网络”。哥俩对战就是站在人类肩膀上的强化学习。所以AlphaGo是监督学习和强化学习的混合方式。
在AlphaGo的学习过程中,人类的3 000万中盘仅仅把它领入门而已,进步主要靠哥俩自己厮杀。相当于你去学围棋,一开始跟着你爸学,你爸就是个业余选手,你两个星期就跟你爸学不了什么了,以后都要靠自己琢磨了。AlphaGo也一样,想清楚这点,干脆从零开始,人类2 000多年积累的东西也许就是老爸那点业余水平,学不学无所谓。AlphaGo Zero横空出世了,这个“Zero”就是从零学起的意思。AlphaGo Zero从一开始就是哥俩自娱自乐,和AlphaGo不同的是,在下每一步棋之前,不需要随机地选125个出发点了,而是根据当前的小路“记号”和打分先在这个中盘选一个最可能赢的走法和“双胞胎弟弟”试走一次到终局,试走过程中每一步双方都用同一个决策网络指导如何走子。这个决策网络的功能很简单:给我一个中盘,我告诉你所有走法的赢率,这样一次到终局后就对从这个走法出发的路是否能赢多了点信息。一路上边走边做记号,第一,记住有没有走过这条路;第二,等到了终局后根据输赢再记下这条路的好坏。这个“做记号”就是不断更新价值网络。这样在同一个中盘哥俩试走了几万次到终局,基本摸清哪条路好走,哪条路不好走,也就是对于这个中盘我已经估摸出了所有走法的赢率。此时,我用几万次试走出来的赢率来更新决策网络。更新的方法就是用这个中盘做网络的输入,调试网络权重系数让输出的各走法赢率接近试走测出来的赢率。这一切做完后再根据测出的赢率郑重地正式走一步棋。哥哥下完一步该弟弟走了,弟弟的程序和哥哥完全一样,也是先试走许多次,用测出来的赢率更新决策网络,再根据测出来的赢率走子。以后哥俩就这么不断重复下去。AlphaGo Zero诞生后的第一局的第一个中盘,哥俩完全是乱下,但第一盘走完就多了一点点知识,哥俩用这点可怜的知识走第二盘就比第一盘靠谱了一点点,架不住计算能力强大,AlphaGo Zero每秒钟可以走8万步,平均一盘棋不到400步,所以哥俩一秒钟相当于下200盘棋。每盘长进一点,到第7个小时,也就是相当于下了500万盘棋后就下得像模像样了。一天半后,也就是相当于下了2 600万盘棋后就超过了战胜李世石的AlphaGo Lee。3天后,AlphaGo Zero就和AlphaGo Lee打了个100:0。AlphaGo Lee一共学了3 000万个中盘,大致相当于3 000万/400=8万盘棋,这时AlphaGo Zero已经相当于下了5 100万盘棋。21天后就打败了横扫天下无敌手的AlphaGoMaster,到40天后哥俩已经妥妥地称霸天下,独孤求败。到这里,AlphaGo团队终于松了口气,放下了原先的一个最大担忧:如果不让人类引进门,从零学起,这哥俩会不会在野地里瞎逛,在林子里迷路,像梦游一样原地绕大圈,永远都走不出来。这证明了在强化学习中只要每一步都知道对错,有惩罚奖励,哥俩很快就会放弃那些明显不通的绝大部分的道路,很快就会找到一条正路。AlphaGo用了1 200个CPU,176个GPU,而AlphaGo Zero只用了4个TPU(张量处理单元)。计算资源的大幅度下降主要来自算法的精简,不需要用人类数据训练了。由此可见,在不同的应用场景下,数据并非都那么重要。在下围棋这件事上,人类的经验反而拖了后腿。AlphaGo Zero给我们最重要的启示是柯洁说的那句话,“人类下了2 000年围棋,连边儿都没摸着”。非常原始的机器在自己摸索了36个小时后,就超过了全人类2 000年来摸索积累的全部围棋知识。
现在请大家思考三个问题:
为什么AlphaGo Zero从零学起反而比人强?
AlphaGo Zero再从头学一遍,功力还和原来一样吗?
AlphaGo Zero是不可战胜的吗?
神经网络悖论
读者到这里会发现一个悖论:神经网络是模仿人脑,怎么能够发现和掌握人脑无法掌握的知识?我们知道目前的半导体芯片中的人工神经网络只是对大脑的一个简单模仿,无论是在神经元数量还是在连接的复杂性上都远不如人脑。到底是什么原因使得人工神经网络能够在发现隐蔽的相关性方面远超人脑,创造出如此多的神迹呢?
第一个原因是人的感官和机器的“感官”相比实在太差。人的感官在几亿年的进化中主要是为了在自然界中觅食和求偶。所以只能感受到部分外部世界信息。比如眼睛只能看到光谱中的可见光这一小段,无法“看见”从无线电波到毫米波再到远红外的电磁波,也无法“看见”从紫外线到X射线再到伽马射线。人的耳朵也听不到20赫兹以下的亚声波和20 000赫兹以上的超声波。不仅如此,人类的视觉和听觉对强度的分辨率非常粗糙,只能分出数量级。人类的触觉、嗅觉、味觉分辨率更是粗糙。而机器的“感官”,就是各类物理、化学、生物类的传感器则比人的感官精密得多。不仅可以“感受”到人类感受不到的信息,对信息的分辨率也远超人类。如果有办法把这些传感器信号不经过人类感官直接输入大脑,人类大脑也能和机器一样发现数据间复杂隐蔽的相关性吗?大脑能处理高分辨率的外界信息吗?我们可以合理地推测出大脑的进化应该和感官相匹配。如果感官只能提供低分辨率信息,大脑处理高分辨率信息的能力就是一种浪费,这种功能要么不可能演化出来,要么即使偶然变异出来也会被进化无情地消灭。
第二个原因是电子神经元比生物神经元的传输信号速度快,准确度高。由于人脑神经元在突触部分的信号是通过化学分子传导的(细胞膜内外带电的离子浓度差造成电压差),每秒钟大约只能传导400次信号。而电子神经元间的传输速度就是芯片上不同晶体管之间的传输速度,比人脑神经元要快几万倍。人脑神经元突触之间的传输非常不可靠,平均每次传输的成功率只有30%(这种随机性也许是意识“涌现”的重要条件之一),而电子神经元之间的传输可靠性几乎是100%。人脑神经元由于结构复杂,不同神经元之间的电信号会互相干扰,而电子神经元之间的干扰可以忽略不计。所以人脑神经元是一个慢腾腾的老出错的系统,而电子神经元是一个高速的精密系统。
第三个原因是目前还没有办法获得大脑内部每一个神经元的连接强度。即使我们有办法把外界传感器信号直接输入大脑,大脑也可以处理这些信息,这些信息也只能被雪藏在一个人的脑子里,成为无法沟通、无法传播、无法记录的默知识。但电子神经网络中的每一个神经元之间的连接强度,也就是两个神经元连接的权重系数都是可以存储、提取的。所以机器获得的暗知识是可以传播、复制、记录的。
所以对这个悖论的回答是,人工神经网络虽然是模仿大脑,但它具备了人类没有的三个优势:能“感受”人类感受不到的信息,与人脑相比又快又准,每一个神经元的状态都是可测量的。
神经网络五大研究前沿
之前介绍的几种神经网络都是目前商用中的主流算法,但机器学习的潜力还远没有被挖尽,现在每年关于机器学习的论文还在呈指数级增长,在研究型的大学里任何关于机器学习的课程都爆满。可以预期在今后3~5年中还会不断有新的算法突破,下面介绍的都是目前炙手可热的研究方向,每一个方向的突破都会产生巨大的商业价值。
非监督学习
在前述的机器学习算法中,我们总有一个训练数据集合,即“标注数据”,如所有汽车图片都会标注上“汽车”,所有猫的图片都会标注上“猫”等。这样在训练的输出端,我们就知道结果是否正确,因此可以用正确结果和输出结果的差来训练机器(调整各层的权重系数),就像一个妈妈教孩子认识东西,这类算法叫“监督学习”。在机器学习中还有一种算法不依赖于“标注数据”,叫“非监督学习”,像一个孩子在没人教的情况下自己学习。非监督学习最常用的情形是分类,例如一个孩子见过许多猫和狗后,如果大人不告诉孩子这两种动物的名字,孩子也许不知道名字,但慢慢会知道猫和狗是两种不同的动物。在商业上有很多应用,例如在营销上面可以根据人群的不同属性将其划分成不同人群进行精准营销;在社交媒体上面,可以根据人们之间的互动次数,划出每个人的朋友圈子;在医疗诊断上面可以根据不同症状之间的相关性更精确地预测还未发现的疾病;等等。
增量学习和连续学习
目前的机器学习算法都是“离线训练”,先用一大堆数据训练模型,训练完测试好就拿去做识别用,在识别过程中,这个模型是固定的。如果发现了新的情况,有了新的训练数据,就要把新数据和原来的老数据合在一起重新训练这个模型,训练完还要重新测试才能使用。许多互联网巨头每个月都要训练几十万个模型,目前的计算量主要在训练上。增量学习就是当有新数据时,只用新数据训练原来的模型,使机器在原有的识别功能之上增加新的识别功能。连续学习就是能够边识别边学习。这两种学习算法都还在研究的早期阶段。
生成对抗网络
监督学习的最大问题之一就是需要大量人工标注的数据。在很多情况下,要么没有数据,要么标注的工作量太大。生成对抗网络(Generative Adversarial Network,GAN)解决了这个问题。因此GAN成为目前最炙手可热的非监督学习算法之一。
GAN减少深度学习训练所需的数据量的方法是:从少量的已有数据出发去创造出更多的新的标注数据——多数情况下是图像数据。
图3.13是GAN的示意图,图中有两个深度神经网络:G和D,其中G是生成网络,D是鉴别网络。生成网络的任务是根据一组真实、有限的数据(例如一组图片)生成更多类似但不同的数据。然后把这些生成的数据和真实数据混在一起喂给鉴别网络。鉴别网络的任务是使用很少的真实数据训练后,分出哪些是真实数据哪些是生成数据。如果生成网络生成的数据能被鉴别网络认出来不是真实数据,就说明生成网络模仿得不够真实,需要继续调整网络参数,目的是让鉴别网络分不出来。如果鉴别网络分不出来真假,就说明鉴别网络不够好,需要继续调整参数分出真伪。这样“道高一尺,魔高一丈”地持续对抗下去,两个网络就越来越好:生成网络模仿得越来越真,鉴别网络越来越“火眼金睛”。当两个网络打得难解难分时,生成网络生成出来的数据就和真实数据无法分辨。当缺乏足够多的真实数据时这些生成数据就可以用于神经网络的训练了。
图3.13生成对抗网络
可以把这个过程想象为一个警察和假币伪造者之间的比拼,伪造者想把假币做得像真的,警察希望看到任何钞票时都能鉴别出真伪。两个对抗网络也在彼此学习,也就是说,当一个网络努力去鉴别假币时,另一个网络就能把假币做得越来越真。
另一个例子是生成对抗网络可以模仿名画。经过训练之后的最终结果是,一个网络可以像凡·高、毕加索一样作画,另一个网络能以你闻所未闻的洞察力鉴别画作。这对于医疗等领域来说非常重要,在这些领域中,由于隐私的需要,可用的数据非常有限。GAN可以填补缺失的数据,自行制作完全“臆造”的病患数据,而这些数据在用于训练AI时和真实数据同样有效。深度生成模型有广泛的应用,包括密度估计、图像降噪(从低分辨率或高噪音的图像中生成高品质图像)、图像修复(从部分残缺的图像中恢复完整图像)、数据压缩、场景理解、表征学习、3D场景搭建、半监督分类或分级控制等。
相比判别模型(例如CNN),生成模型更厉害的原因如下:
(1)能够从数据中识别并表现出隐藏的结构,例如三维物体的旋转、光强、亮度或形状等概念。
(2)能够想象世界“可以是什么样”,而不是仅仅展现世界“已经是什么样”。
(3)通过拟合并生成近似真实的场景,可以预见未来。
迁移学习
迁移学习的一个例子是当一个神经网络学会了中文翻译成日文,再让它学德文翻译成英文时就比从头训练要花的时间少得多。这里面的道理在于语言的结构有很多相似的地方,一旦掌握了这些结构,学习下一个就快了。这和人的技能学习类似。可以想象,只要两种任务的结构有相似之处,就可以用迁移学习的方法。
学习如何学习
学习如何学习也叫“元学习”。目前所有的神经网络都是为了一个单一任务而被设计和训练的。换一个不同的任务,例如从识别图片换成学下棋,原来的机器就完全不工作了。目前的所谓“元学习”并非让机器和人一样掌握举一反三的能力,而是让同一个机器适应更多种类的工作。一个办法是训练时用多个种类的任务来训练。另一个办法是把机器分为两个层次:学习任务的机器和观察学习过程的机器。如果后者能够领悟出不同任务之间的相关性,就可以更快地学习新任务。
神经网络可以有许多不同的结构,例如不同的层数、不同的连接方式,等等。把这些结构看成一个可能的空间,让机器自己在这个空间中寻找对给定问题的最佳结构。
深度学习的局限性
上面介绍了一些目前最热的神经网络,例如卷积神经网络、循环神经网络、强化学习、生成对抗网络等,它们有很多神奇的地方,在实际中也得到了相当广泛的应用。但神经网络也好,深度学习也好,都不是万能的,它们有其自身的局限性。
神经网络的一个局限性是,需要依赖特定领域的先验知识,也就是需要特定场景下的训练,说白了就是神经网络只会教什么学什么,不会举一反三。神经网络的这个局限性,是因为神经网络的学习本质上就是对相关性的记忆,也就是说神经网络将训练数据中相关性最高的因素作为判断标准。打比方说,如果一直用各个品种的白色狗来训练神经网络,让它学会“这是狗”的判断,神经网络会发现这些狗最大的相关性就是白色,从而得出结论:白色=狗。在这种情况下,让这个神经网络看见一只白猫,甚至一只白兔子,它仍然会判断为狗。机器学习的这种呆板行为,用专业术语描述叫“过度拟合”。如果想让神经网络变得更聪明,就必须用各种颜色、各个品种、是否穿衣服等各种场景下的狗来训练神经网络,如此它才有可能发现不同的狗之间更多的相关性,从而识别出更多的狗。人类则不同,一个两三岁智力发育正常的孩子,在看过几只狗之后,就能认出这世上几乎所有的狗了。无须大量标注数据和特殊场景的训练,只需要少量的数据,人脑就可以自己想清楚这个过程。在这方面,目前的神经网络和人脑相比,还有很大的差距。
再如前面提到的汽车和猫的例子,如果一直用正常的汽车来训练这个神经网络,那么当神经网络突然看到图3.14的时候,很有可能无法把它认作汽车,而觉得它更像猫。
这个问题在自动驾驶领域显得尤为突出,由于道路交通状况的复杂性,各种交通指示标志的多样性,想把所有的道路交通场景都训练到显然是不可能的。2016年特斯拉第一起自动驾驶致死的事故也和这个原因有关。
图3.14机器学习会把这辆汽车当成猫
神经网络的另一个局限性是无法解释结果为什么是这样,因为人类无法理解暗知识,所以更无法解释。对于神经网络这个“满是旋钮的黑盒子”,每个旋钮为什么旋转到那个位置,而不是多一点或者少一点,都是无法解释的。这个不可解释性在许多涉及安全和公共政策的领域都是很大的问题。例如,医疗涉及人的健康和生命,医生的诊断需要根据极为严谨的医学逻辑,因此医疗对于人工智能的可解释性要求远高于其他行业,极少有医院或医生敢把无法解释的诊断结果用在患者身上。然而由于神经网络自身不具备医学逻辑,其输出的结果也缺乏医学上的解释性,因此目前人工智能在医学上的应用,无论是影像识别还是辅助诊断,都需要专业医生的复核,距离取代医生还有较大的距离。
人工智能之所以有上述两个局限性,主要是因为目前的神经网络只有相关性的学习能力,没有因果推理能力,更无法把一步一步推理的过程表现出来。因此,想要克服这两个局限性,我们需要有因果推理能力的人工智能。要实现这件事情,人工智能需要做的,不仅是识别场景,还需要将识别出来的场景和它具体的功能以及想做的事情结合起来,从而实现合理的逻辑推理。
让我们看看人脑是如何理解一个场景的。当人进入一个新的房间时,会很自然地对这个房间的大小,里面各个物品的大小、位置等有一个大致的认识。之后,人脑会把识别出的场景和物品,与其功能一一匹配,例如,床是用来躺的,而且是一张双人床可以躺两个人,椅子是用来坐的,杯子是用来喝水的,等等。然而值得注意的是,上述的几何重建和功能推理,其精度是和具体任务相结合的。例如,人一开始看到杯子,会匹配它喝水的功能,并看到它放在桌子上,判断距离自己两三米远,这个距离判断是非常不精确的。然而当人真的需要喝水时,喝水成为一个任务,人在走过去拿杯子的过程中,不断地、更加精确地判断自己和杯子的距离,直到非常精确地拿到杯子。这个过程就是一个典型的任务驱动的场景识别和功能推理。
此外,人类对于功能的推理,并非会拘泥于具体的物体,而是能抽象出这个物体和功能有关的物理特性,从而匹配其功能。仍然以喝水为例,如果房间里没有杯子,但是有一个瓢、一个盘子、一根擀面杖,人会很自然地选择瓢作为喝水的工具(如果连瓢都没有则可能选择盘子),因为瓢可以作为容器的物理特点和杯子是一致的。而且,选择了瓢之后,人拿瓢的动作,喝水的动作,都会和拿杯子不一样,这同样是由杯子和瓢不同的物理特性决定的。由此可见,人对于物体的功能推理,是会根据任务的要求,抽象其物理特性,从而推理它的功能并完成任务,因此人工智能的场景识别和功能匹配,是需要基于场景和物体的物理特性来完成的,而不仅仅是识别和标定具体功能。
这种基于任务驱动的因果推理和当前的神经网络的对比如下。(见表3.1)
表3.1神经网络和任务驱动的对比
资料来源:朱松纯,《正本清源》,2016年11月刊登于《视觉求索》。
目前在这个方面探索的代表人物是加州大学洛杉矶校区(UCLA)的图灵奖获得者朱迪亚·珀尔(Judea Pearl)教授以及他的同事朱松纯教授。他们认为可以建立一个基于常识之上的“概率决策图”,也叫“概率语法图”。这个模型把人类的常识和世界模型都包含进来,又采用贝叶斯原理,可以像人类一样不需要许多数据就能学会,在处理许多问题上效率远高于神经网络。在高科技领域,硅谷一家由斯坦福大学教授威德罗的弟子创办的人工智能公司Vicarious得到了著名风险投资人蒂尔(Peter Thiel)、特斯拉创始人马斯克、脸书创始人扎克伯格(Mark Zuckberg)和亚马逊创始人贝佐斯(Jeff Bezos)的投资。他们也是采用了概率决策图的方法。虽然目前他们是少数派,但也许若干年后会异军突起,就像神经网络坐了50年“冷板凳”今天突然一飞冲天一样。