当今这个世界,随着计算机普及到我们工作生活的每一个角落, 「计算」这个概念也是耳熟能详,但是,我们真的理解什么叫计算吗?我们中国人经常说,「了解历史才能展望未来」, 我认为,这个道理对于计算同样适用,也就是说:「只有了解了计算的历史,才能真正理解计算的未来」。我相信,这本书不只适用于计算机的从业者,也适合任何能对人类社会发展有帮助的行业的人。
在这本《计算进化史》中,作者非常巧妙地利用了一些故事,来阐述深刻而抽象的数学原理。比如,在讲到 「谓词逻辑」的时候,作者讲了一个故事:一个法国探险家在南太平洋上发现了一个与世隔绝的小岛,岛上的居民居然会讲法语,探险家推断这些居民是法国船只在海难后幸存者的后代,所以会说法语。但是,探险家在和岛上居民交流过程中,听居民说他们会捕捉天上飞的鱼来当食物,这些鱼有两个翅膀、两个爪子和一个尖嘴,探险家就懵了,怎么可能有这种鱼?但是,随着和居民的进一步沟通,探险家明白了,当地居民说的「鱼」,其实就是「鸟」,只不过因为这些居民使用的语言发展和法语的语言发展走了不同的轨迹,所以对一个名词的含义发生了南辕北辙的偏差。名词只是符号, 有了「有两个翅膀、两个爪子和一个尖嘴」这样的谓词逻辑,就能够表述清楚这个名词真正的含义。书中还有很多类似通过故事讲道理的手法,大家阅读的时候可以一一体会。
在《计算进化史》中,还出现了很多历史人物,有些人名耳熟能详,比如亚里士多德、阿基米德,他们奠定了数学的基础;有的是普通人不熟悉,但是在行业中鼎鼎大名的人物,比如阿隆佐·邱奇和阿兰·图灵,这两位是我们计算机学科的祖师爷;还有很多其他数学家,他们的贡献也许不为大众所知,但是因为他们每个人的努力,才构建起当今数学的高楼大厦。阅读这本书,可以让我们随着计算的发展史,重温这些历史人物的心路历程。
接下来,让我来介绍一下这本书的要点,可以总结为三个部分:
第一个要点,推理和计算的关系。
第二个要点,计算和算法的关系。
第三个要点,计算能否实现数学证明。
我们先来讲第一个要点,推理和计算的关系。
数学史的开端,通常被认为是公元前 5 世纪,古希腊数学家创建了算术和几何,奠定了古代数学两大分支的基础。但实际上,最早有迹可循的「数学」活动在公元前 2500 年的古巴比伦时代就发生了,现代考古学家在巴比伦文明所在的美索不达米亚发现了一块泥板,泥板上记录了这样一份账:如果有 1,152,000 份粮食,每人分 7 份,可以分给多少人?结果是 164,571。可见,古巴比伦人已经能够在社会活动中运用除法这样的计算了,考古学家进一步发现,其实这还只是冰山一角,实际上古巴比伦人不仅掌握了加减乘除这些运算,还掌握了解二次方程、丈量三角形、圆形面积的能力。
既然古巴比伦人的计算能力这么强,那为什么依然是两千年后的古希腊才被认为是数学史的开端呢?
因为古巴比伦人并没有解决「无穷」这个问题。书中举了这么一个例子:有这么一个问题,要求画出一个等腰直角三角形,让这个三角形的三条边的长度都是自然数。如果按照古代巴比伦人的计算方法,当然可以通过丈量和计算的方法,来判断一个等腰三角形的三条边是否满足「都是自然数」的条件。如果真的这么做,运气好的话,很快遇到一个满足条件的直角三角形,那就找到了答案,如果找不到的话,那么,就找另一个直角等腰三角形来计算。如此周而复始,直到找到那个答案,当然,还有一个可能,就是找不到匹配条件的等腰直角三角形,那就无穷尽地尝试下去。
问题就在这里,我们可以画出无穷多的等腰直角三角形,而计算一次只能判定一个三角形,那么我们能够用计算来实现证明吗?要是对于一个结果是正确的定理,足够多次的计算也许能够找到答案;但是,如果这个定理也许根本就不成立,计算也就永远无法下结论。
古希腊的毕达哥拉斯学派从另一个角度思考了这个问题。他们利用推理,而不是计算,证明了一个等腰直角三角形不可能三条边都是自然数。这个证明过程并不复杂,不超过两页的描述,就能避免无数次无谓的计算验证。
从这个简单的例子就可以看出,相对于计算,推理拥有无与伦比的优势,因为它能够解决通用的问题,而通用的问题具备无穷种可能。这是推理的一个巨大优势。所以,虽然计算在人类历史中由来已久,但在古希腊之后,计算在数学领域中就难有立锥之地。
在这里值得一提的是,和古希腊数学家正好相反,我国古代数学家的兴趣集中在计算上。中国古代数学问题的核心,就是对实际问题的解释和再利用。注意这里的「解释」往往不包括证明和推理。正因为缺少推理,我国古代数学体系发展始终没有超出初等数学的范围,不能不说是一个遗憾。
好的,上面为你讲的是第一个要点 「推理和计算」的关系,接下来我们来说第二个要点,就是计算和算法的关系。 算法的英文是 Algorithm,这个词源其实是一个人名。这里要说到一个有趣的故事,在公元前九世纪,阿拉伯阿拔斯王朝诞生了一位伟大的数学家,名叫穆罕默德•本•穆萨•阿尔•花剌子模(Muhammad ibn Msa al Khwarizmi),他出版了一本名为《代数学》的书,这本书里介绍了印度人发明的十进制计数法,以及以此为基础的算数知识。后来,意大利数学家斐波那契将这本书引入欧洲,印度人发明的 0 至 9 这十个符号的计数法从这里开始,就被误认是阿拉伯人所创造的。意大利人在翻译阿拉伯人花剌子模的著作时,把作者的名字音译成了拉丁语 Algorismus,同时就将书中讲解的算数方法也叫作了 Algorismus。后来,这个词被英语吸收,就成为了 Algorithm,含义就是算法。从这个故事可以看出,计算和算法天生就有很强的关联。
那么,计算和算法是不是一回事呢?
其实并不完全一样,至少现代意义上的算法和计算是有差别的,这还是要从计算在 20 世纪初的发展说起。
虽然最近两千多年间,推理一直都压制着计算,但是,我们都知道,随着计算机的发展,计算在人类社会的影响达到前所未有的地位,而这一飞跃,就开始于 20 世纪初。
20 世纪 30 年代,有两个人几乎同时独立缔造了可计算性理论,从而奠定了现代计算理论的基础,这两个人就是阿兰·图灵和阿隆佐·邱奇。 图灵创造了图灵机,邱奇创造了兰布达演算。用通俗的语言来表达,图灵机就是一个打孔机根据一个指令来运作,如果根据这组指令最终能够解决一个问题,那么这个问题就是「可计算的」;邱奇的兰布达演算则是从另一个角度考虑,他认为一个问题如果能够用函数表达式的方式来表达,那么这个问题就是 「可计算的」。
无论是图灵机,还是兰布达演算,其实都是一种算法的表达形式,这就引出了我们的问题:计算和算法有什么关系?
算法是一系列运算,和计算很类似。但是,算法和计算有一个很显著的区别,就是算法必须是要能结束的。如果一个计算过程会无穷尽地继续下去,这就不叫一个算法。 图灵机和兰布达演算都比较偏理论,不容易理解,如果你去阅读计算机界泰斗高德纳的著作《计算机编程艺术》,可以找到对算法的通俗描述:算法由若干有限序列的指令组成,必须满足下面四个性质:第一,它有输入,由外部提供数据给这组序列;第二,它有输出,也就是说算法至少产出一个数据返回给外部;第三,它有确定性,组成算法的每条指令都是明确的、清晰的、无歧义的;第四,它具备有限性,算法中每条指令的执行次数是有限的,所有指令执行的时间也是有限的。
体会一下上面这四个算法的性质,可以注意到「有限性」是非常重要的一条,也就是说,算法一定能够「完结」,一个可能永不停止的运算过程,并不是一个算法。
也正因如此,并不是所有程序,都符合算法的要求。有些程序是永远不停止运行的,比如老一代的操作系统,除非切断电源,不然会永远一直运行下去。不过,操作系统中每一个小的具体任务依然是算法的体现,比如展示具体某个目录内容。新一代的操作系统接受指令关闭自己,只不过一个小小的修改,就满足了算法的定义,可见,程序和算法并没有绝对的对立。
算法是现代计算机科学的基础之一,我们在用计算机解决一个问题的时候,其实都应用了某种算法。但是我们要清楚,并不是所有的问题都可以被算法解决。
举个例子,著名的哥德巴赫猜想,用文字表述就是:「任一大于 2 的偶数,都可以写成两个质数之和。」
怎么用算法证明或者推翻这个猜想呢?我们可以设定运算,从 3 开始,找到相加为 4 的两个质数,然后处理 6 ,然后处理 8 ,依次类推……给定一个数字 N,找到相加之和为 N 的两个质数,这是一个算法,因为 N 的大小是明确的,需要寻找的质数个数不超过 N,这个算法肯定可以结束。但是,哥德巴赫猜想的证明过程却不会完结,就算你找到一个超级大的偶数 N 的两个质数和,那也还有 N+2 呢,等你找到了 N+2 的质数和,还有 N+4 呢……永远没有穷尽,所以,算法是不可能证明哥德巴赫猜想的。
我们需要知道,算法并不是万能的。
上面为你讲的是第二个要点「计算和算法的关系」,接下来我们来说第三个要点,也就是最后一个要点:计算能否取代推理。
早些年的时候,「大数据」也是一个被经常炒作的词汇,似乎「大数据」可以彻底改变人类生活;这几年,人工智能(AI)的风头很劲,甚至有人预测,未来人工智能会让大部分人都失业。其实,「大数据」也好,人工智能也罢,归根结底,都是计算,都是利用电脑在进行计算,而不是进行推理。
简单说来,现在的大数据和人工智能,并不能像公元前 5 世纪古希腊毕达哥拉斯的一个学生那样,用三言两语证明一个等腰直角三角形三条边不可能都是自然数。大数据和人工智能所能够做的,是通过消耗大量的电能和运算能力,经过长时间计算,最后得出这么一个结论:「嗯,从 A 到 B 范围内,我们没有发现一个等腰直角三角形的三条边都是自然数,但是 A 和 B 范围之外的,我们还没有计算,所以我们不确定。」
当然,对于实际情况,通过大量计算得出局部范围的结论,也已经足够了,但我们决不能被这点成绩蒙蔽了双眼,觉得只要计算能力足够强大就可以无所不知无所不晓了。
从《计算进化史》中描述的数学发展史可以看出,在过去几千年间,数学家们反复论证计算和推理的关系,不断有突破性发现。但是,直到现在,还没有任何基础理论证明,计算可以完全取代推理。注意,这里说的是「完全取代」,目前计算机科学中的人工神经网络,可以说部分代替推理。
所谓人工神经元网络,就是模拟人类大脑中的神经元构成的计算系统。人脑中包含大量的神经元,每个神经元都只是一个细胞,只能做很简单的应激反应,但是,这些神经元细胞会伸出一些小爪子,称为突触,神经元之间通过突触连接起来,每个神经元通过突触,从其他神经元接收到信号之后,再把信号传给其他神经元。不同神经元对信号的处理不一样,这样一个巨大的网络结构,就是我们大脑的运行机理。
你可能会问,那怎么保证这个巨大网络功能正常呢?
靠的是对这个神经元网络的训练。实际上,人类的成长过程就是训练自己大脑神经元网络的过程,我们从婴儿时期学习走路,信号穿过大脑中的神经元细胞来协调我们的肢体,如果我们走得稳了,那么就是正向反馈,会加强对应神经元之间的链路;如果我们摔倒了,那就是负向反馈,会削弱对应神经元之间的链路,通过这样反复的训练,最终神经元之间的关系越来越优化,最终我们熟练掌握走路的技巧。简单的行走技能是这样训练的结果,复杂的技能,比如写作和驾驶汽车,一样也是训练神经元细胞构成的网络的结果。
人工神经元网络,就是用电脑去模拟人脑的神经元网络所得到的结果,通过大量数据反复训练,让人工神经元网络自我进化,从而也能够「学习」到某种技能。这种训练过程有两个特点:第一,需要大量的计算能力,对电脑的训练的过程,就是计算的过程;第二,最终训练的结果并不是传统算法概念上的一组指令,换句话来说,最终结果是不包含「推理」的,没人能够解释清楚为什么最终神经元网络是这样的结构。
我们可以根据两个维度来划分人类大脑需要解决的问题,一个维度从是否需要统计计算能力,可以分为「可统计计算」和「不可统计计算」;另一个维度从是否需要推理能力,可以分为「可推理」和「不可推理」。
这样一来,人类知识可以分为四个象限:第一象限「可计算」而且「可推理」,第二象限「可推理」但是「不可计算」,第三象限「可计算」但是「不可以推理」,还有第四象限既「不可以计算」也「不可推理」,总共四种。
先说第一象限,「可计算」而且「可推理」的这种问题。这种问题是非常传统的问题,现在的计算机已经完全可以胜任这部分工作。
第二个象限,「可推理」但是「不可计算」的问题。虽然还有传统的机器学习研究者在这个方向上努力,但是发展不温不火,因为不能利用计算能力,需要推理的话离不开人脑,在没有重大理论突破之前,这个方向的计算机化不会有什么起色。
第三个象限,「可计算」但是「不可以推理」的问题。深度学习和人工神经元网络近几年有很大突破,像 AlphaGo 这样的超级人工智能,重点不是它对围棋的精髓道理有多深的认识,而是通过反复训练,它就是知道下哪一步棋胜率更高,这没有任何推理可言,完全得益于计算。
第四象限,既「不可以计算」也「不可推理」的问题。一个很好的例子就是艺术创作,虽然现在有一些人工智能宣称也能进行艺术创作,但是本质上是利用计算和统计能力来「照虎画猫」,说到底依然是模仿,不可能取代人类的创造。
由此可见,所谓大数据和人工智能会取代人类工作,实在是杞人忧天,就像人类在发现原子核的秘密之前不可能造出原子弹,数学界如果没有基础理论的重大突破,计算无法取代推理,人工智能就不可能在智力上取代人类。
不过,《计算进化史》也讲得很明白,我们不能断言,在未来计算也不会取代推理。自动化证明兴起,相对于几十年前,已经有长足进步。虽然自动化证明不能做到一切,但是就在目前阶段,不必奢求让机器完全取代人类的思维,而是寻求机器和人类的合作。人类来作证明,机器来验证其中可能存在的微小错误,这可能才是推理和计算和谐相处的道路。
数学家们依然在努力,也许有一天,计算可以取代推理,那就真是一个巨大的革新,会不会有那么一天呢?让我们拭目以待。
这就是我跟你分享的最后一个要点。
好了,《计算进化史》这本书讲得差不多了,接下来,让我们总结一下。
我们首先了解什么叫作计算,进而探讨了计算和推理这两个数学问题的关系。然后,我们讲述了一种特殊的计算——「算法」的作用,算法存在局限性,但是能够解决现实中很多问题。最后,我们说到了计算能否取代推理,由此讨论了人工智能对人类的影响。
我想起我有一个研究算法的朋友,他对数学研究很深,也需要对计算机非常了解,他曾经对我说:「搞计算机是用具象思维来思考抽象的东西,但是数学做深了的话,就必须能用抽象的思维思考抽象的东西。」
这个朋友的话让我深有感触,因为我的职业是软件架构师,经常需要和别人讨论计算相关的设计问题,当需要表述一个复杂问题的时候,三言两语讲不清楚,怎么办呢?这时候,我们就会画一张图,所谓一图胜千言。但是,对于涉及到数学的算法问题,画图往往就不行了,我们只能利用公式来表达,那些矩阵、向量、公式,在现实世界中没有可以用来比喻的图形,就像我朋友说的,数学的语言本身就是抽象的,而不是具象的。这本《计算进化史》最精彩的一点,就是能够把抽象晦涩的数学概念用生动的故事来讲清楚。
当读完了这本书后,我个人的感受,可以归结为一句话:路漫漫其修远兮,吾将上下而求索。
我对这本《计算进化史》的推荐,就讲到这里。
以上的讲述内容,是基于 2017 年 2 月人民邮电出版社出版的《计算进化史》,希望我的推荐,能够帮助你更好的理解这本书。
愿每一本好书都能让我们成长。