财新传媒
位置:博客 > 集智俱乐部 > 冯·诺依曼:探寻计算的“原力”

冯·诺依曼:探寻计算的“原力”

译 | 东方和尚
 
人类对人工智能的探索基于这样一种基本假设:我们所在宇宙中的一切过程,无论是有生命的还是无生命的都是可计算的。因此,原则上讲,冯·诺依曼体系结构的计算机可以模拟任何的物理过程。通过阅读这篇文字你会发现,其实计算可以分为模拟计算和数字计算两种类型。所谓的模拟计算就是需要我们构造一种非数字化的物理过程来对真实物理过程进行模拟。例如,飞行模拟的风洞试验就是基于这种模拟计算的。在具体的应用中,不同的模拟方法会给我们带来完全不同的效果。那么,目前火爆的人工神经网络更适合运用哪种模拟方法呢?让我们跟随冯·诺依曼的脚步,来探究计算的“原力”。
 
全书纲要:
冯·诺依曼的遗产:寻找人工生命的理论根源
第一部分:复杂自动机的组织与理论
第一堂课:一般意义的计算机
第二堂课:控制与信息理论
第三堂课:信息的统计理论
第四堂课:大数之道
第五堂课:复杂自动机的一些考量——关于层次与进化的问题
 
在翻译过程中,做了以下的添加和修改:
1、为了方便阅读,为原文进行了分段,并加上了段标题;
2、为了让读者感觉更亲切,加上了若干副插图。
3、为原文添加了大量的评论,东方和尚的评论和张江老师的评论都会标注出来,另外,因为这本书是冯·诺依曼的助手 Arthur W. Burks(遗传算法之父 John Holland 的博士生导师),所以在“【】”之中的文字是编者加的注解。大家要注意分辨。
 
女士们、先生们,我将会为大家讲五次课,对大家的热情欢迎我预表谢意,希望我的课能够满足各位的兴趣。本课程的内容是有关自动机的,我们将要研究高度复杂的自动机会表现的行为,以及巨大的复杂度所带来的具体困难。我们会简单地对比人工自动机和生命,因为很容易想到,生命在其能力的限制范围内,可以看作自然的自动机。因此,我们必得考虑两者之间的类似和区别,还要考虑到是不是我们的技巧太过笨拙,不能够深入地洞察生命和自动机的关系(这也是很正常的),要考虑生命和机器之间的区别,究竟有多大程度上是本质的。今天我主要谈谈人工自动机,具体来说,我们只谈一类——计算机器。我会说一说计算机在不久以前、现在以及将来所起到的作用[40]。
 
计算机的作用
 
之所以从计算机讲起,有两个原因,一是出于我个人对于从数学角度研究自动机的兴趣,计算机器是最有趣的也是最关键的自动机。二是除了数学角度以外,具有非常高的复杂度的自动机所表现的性质,本身也是一个极重要的问题。在所有的复杂自动机中间,我们最有把握理解的,就是计算机器。在计算机中,虽然牵涉到的复杂度非常大,但是过程的性质基本上还是纯粹数学的,故相比于自然界,我们能够更好的掌握它们。因此,通过先研究计算机而不是其他类型的自动机,我们就可以更好地了解我们知识的范围和局限。你们将会看到,对于复杂自动机的讨论远非完善,所以我们的一个主要结论就是现在急需一个指导理论。我们先从数学的角度来谈谈计算机起到的作用。当然,计算机在数学领域中的关键地位是毋庸置疑的。数字计算在数学的很多领域,在工程设计中都有重要作用。如果计算的速度可以进一步提高的话,计算机一定会在工程中大显身手的。
 
有一点容易被忽视,在物理,尤其是理论物理中间,数学方法同样是非常重要的。尽管这类物理数学往往像纯数学一样抽象和偏重分析,然而物理对于计算的要求并没有降低。比如在现代量子理论中间,有很多领域需要高效的迭代计算。如果能够得到量子方程的积分解的话,很多化学实验就可以转化为纯粹的数学计算来处理。量子力学和量子化学提出了越来越多的复杂难题,比如多电子原子、多个共价键的分子结构等等日益增长的计算问题。因此,随着计算能力的每一次增长,都会为理论计算开启新的化学应用领域。这个问题我不会讲太细,但是我会大概地告诉大家在数学中,计算机能够起到什么样的功效。在纯数学中间,在对于一个问题作真正有效的分析并给出证明之前,我们必须先对其有一定的感性认识才行。在大多数的情况下,直觉往往是正确的,要靠直觉来寻找解决问题的关键。这时候就有一个鸡和蛋的困境:除非你对问题有了一些感性认识,你很难真正发挥数学工具的力量;但是如果你没有什么数学上的突破,对这个问题就不会有多少认识。科学上的进展就是这样理论和实际相互推动而产生的,有时候是依靠天才的奇思妙想或者非凡的运气才能打破困境,但是也有时候,困境无论如何也无法解开,好几代人都无法取得突破。
 
非线性问题就是这样的一个老大难问题,19 世纪科学的巨大进展,包括现代的分析数学主要还是在线性领域取得的。我们对于非线性的现象非常缺乏经验,对于大多数的非线性微分方程,还是一筹莫展。不但从未取得成功,连其中困难何在,我们也一无所知。唯一有些进展的那些非线性领域,都应归功于相当特殊的原因,例如一些常见的物理现象可以和数学问题联系在一起,因此我们就能够通过物理方法来解决数学问题。科学家从中发现了许多同传统线性数学毫无对应的各种类型的奇点,它们是不可能像传统复分析理论中那样处理的。因此有理由认为,非线性问题需要运用全新的数学工具才能解决。非线性微分方程引出的一个典型新发现,就是对不可压缩且没有粘性的流体进行力学分析,最后发现了冲击波的成因。在一个似乎只存在连续解的问题中间,我们却突然发现了至关重要的非连续解,如果忽视它们,我们就根本无法证明解的唯一存在性。而且,我们原先通过其他数学分析得到的解的规律等知识,被这些特殊的解所彻底动摇了。
 
 还有一个很好的例子,就是粘性流体的湍流现象。在湍流中间,本来具有完美对称性的方程突然发生了对称破缺,而破缺之后突然得到了方程最重要的解。如果我们想要深入研究的话,重要的不是找到问题最简单的解答,而是要用统计方法来分析大量完全不同的系列解,得到它们的统计上的共同特征。这些统计特征才是问题的真正根源,就是这些统计特征导致了具体情况下的那些奇异解的存在。在所有的这些问题中,靠数学分析取得进展是很难的,湍流的问题已经存在了60 年了,此问题的分析进展仍然乏善可陈[41]。
 
在这个领域中间,几乎所有正确的数学结论都是以一种综合的方式来自实验。如果能够以上述的方式计算出某些方程解来,我们就可以对问题的性质得到很多启发。在很多纯数学领域中,严格推理和模糊直觉混合在一起,阻挡我们去认识真理,而几乎所有的进展,都是通过非数学的物理实验才得到的。虽然以数学传统来说,计算并非其专长;现在看来数学计算却比物理实验更加接近数学的核心,而且更灵活,更能够起到作用。
 
两类计算机
 
请让我简单介绍一下计算过程和计算机的概念。众所周知,有两类计算机:超模拟计算机和数字计算机,我将分别叙述。大致说来,模拟计算就是当你对一个物理过程感兴趣的时候,正好有另外一个比较简单的过程被同样的数学方程所支配,你就可以研究那个比较简单的过程,也就是用物理方式来模拟物理过程。当然,两者只是相似,而并非完全相同,否则就没有必要作计算了。
 
最简单的模拟计算仅仅是对于比例尺的改变,在一些问题上可以这样做;稍微复杂的模拟则不仅仅改变比例,还要调节其他的参数。举例来说,在风洞实验中间,我们用按比例缩小的模型来做模拟,但是缩小的不仅仅是零件的长度,还需要对音速也做出修改,降低音速的唯一办法就是降低温度。那么,就必须确定我们研究的现象同温度无关,这样的话,通过在低温下进行模拟,就可以用很小的零件达到常温下的大型零件的同样实验结果。风洞也就成了一台“模拟计算机”。这样说也许有些不恰当,因为风洞不仅仅可以用来做模拟计算,但是在一大半的情况下,风洞的确就是被当作一台模拟计算机使用的。在另一些时候,我们可能找不到一个恰当的,具有同样的数学方程的物理过程来模拟我们的问题,因此就很难做这样的模拟计算。但是仍然有机会找到几个不同的过程,跟问题“部分相同”,例如有三个过程,它们合在一起就可以得到全部的答案。再进一步的话,有时候可以把问题用加减乘除拆成更加简单的子问题。
 
【冯·诺依曼接下来讲到加减乘除的模拟运算,包括电子和机械的对应过程,数字是如何表达的等等问题。他说“四则运算虽然是算术的基本运算,但却不一定是计算机,特别是模拟计算机的基本运算”。他接下来解释一台“微分分析机”是怎样通过累加和减法把两个数乘起来的。参见《计算机和人脑》3-5 节[42]】
 
【冯·诺依曼继续谈到数字计算机,他说在近10 年内纯数字电路发展很快,比模拟电路重要得多。他还提到不同类型的数字机器(齿轮、继电器、真空管、神经细胞),这些零件的速度(包括反应速度和恢复速度),以及功率放大的需要。他强调了控制机制中基本逻辑运算的功能(比如察觉到相同),尤其是“已知的最精巧的控制机制,也就是人类的神经系统”。(参见《计算机和人脑》7-10,30,39-47)。下面是复杂度的定义问题。】
 
计算机器的复杂性
 
测量自动机的复杂度是一个困难的问题。一种合理的方法或许是用真空管的数量来代表计算机的复杂度。这有点模糊,因为现在的真空管是两个小真空管组合起来的组件,两者容易混淆。还有一个原因就是计算机器包括真空管以外的零件:电阻、电容、电感等等,但是它们对于真空管的比例是基本确定的,因此用真空管的数量来估计复杂度大小也是合理的。今天最大的计算机大约包括两万个真空管。这台机器的设计同未来的计算机可能有很大区别,因此未必型。大多数人预计,下一代的计算机会比这更小,大约有  2-5 千个管子。因此,计算机的复杂度大概在 1  万的尺度。让我们同自然生物做个比较吧:不同生物的神经单元数量差异很大。人类的神经元的数量大约为 100  亿,这个数字之大,已经超出了我们的经验范围。故很难估计用 10  亿个开关电路能否实现像人类这么复杂的行为。没有人知道人作为生命究竟是怎么一回事,也没有人 看到过 100  亿个开关电路,因此我们很难比较两件未知事[43]。让我再提一点关于计算机的事情。如果我们能够高速地重复一个基本操作,比如每秒开关一个真空管100  万次,这不等于说能够每秒进行 100  万次数学运算。有各种标准可以用来估计计算机的运算速度,一般地说,可以用每秒进行的乘法次数来估计。这里乘法是指在机器精度允许内,对两个全长度的数做乘法计算。一般认为精度应该达到小数点后  10、20 或者 14 位。一台合理设计的机器,如果其元件每秒可以操作 100 万次,做一次这样的乘法约需 1  毫秒。不管你怎样设计一台计算机,机器的效率也不可能达到  100%。这是因为,如果机器做一次乘法需要千分之一秒的话,以现有的水平,不可能让机器一直“吃饱”,以至于能够持续不断地做乘法。还有很多其他工作要做,比如决定需要计算什么数字,得到这些数字,处理运算结果,决定下一步做什么,是重复做乘法还是做别的事等等。这就像在草稿纸上做加法很类似,用完一张纸需要换一张,只不过我们现在更换的不是纸张。从逻辑角度看,现在计算机的效率大约仅仅为  1/10 强一点。这是说,如果把你要做的事情用程序编写出来的话,大约只有 1/10  的代码才是真正的运算如乘法。由于乘法相对于其他操作较慢,在一台设计的合理平衡的计算机上,大约四分之一到一半的时间是用来做乘法的。所以,如果计算机需要  1 毫秒做一次乘法的话,一秒钟你可以做 500 次乘法。
 
一个人操作一台手摇计算器,每分钟大概可以做 2 次同样长度的乘法。因此计算机的速度比人要快 10 万倍。不过要进一步提高计算速度,大概现有的技术就非要发生革命变化不 可了[44]。这样强大的计算能力,在数学上究竟有什么用处呢?我相信有很好的理由去不断的提升计算能力,10  倍、100 倍、1000  倍乃至一百万倍的速度都不算多。我们有很多问题,只有通过闻所未闻的高速计算才能解决。【冯·诺依曼举了一些例子,如原子和分子量子波函数的力学计算(随着电子数目的增加,组合导致计算难度指数增长),以及湍流的计算问题。】虽然有点离题,但是我估计未来的计算机多半不会被用来制作数学用表。计算机不是用来产生大量信息的。毕竟,你需要信息是因为你觉得自己能够理解信息。如果计算机在信息的产生和处理上面有瓶颈的话,更大的瓶颈是在人的理解能力上。大量的信息对我们没有什么实际用处。
 
真正困难的问题往往是那些很简单的,输入数据很少的问题。你想知道的只是几个数字组成的一条大致的曲线,或者一个答案。甚至就要一个“是”或者“不是”的回答,比如一个东西是不是稳定,湍流是否出现等等。这里的关键是,要把  80 个数字组成的输入转换成20 个数字组成的输出,我们不感兴趣的那个中间过程却非要牵涉数以亿计的数字计算不可。计算过程是先膨胀再收缩的,从  100 个数字开始,到同时用到几千个数字的,分很多步的中间过程,到最后结束的 10 个数字。这个计算量的范围,在实际工作中间是很容易碰到的。
 
你可能已经注意到,我把计算过程用到的数字总量,和同时用到的数字量区别了开来。这可能是现代计算机技术里最让人头疼的问题。对于人类来说,这也同样是一个大问题:记忆。正如大家所知,所有的自动机都包括两部分,通用开关组件(也就是自动机实际进行逻辑处理的那部分电路)和内存(用来储存信息,主要是储存计算的中间步骤,这些数据随着计算不断地被更新)。
 
关于内存
 
计算机中的核心部分,也就是算术电路和控制电路的设计方法,早已广为人知。但是内存相关的问题却相对更关键,牵涉面也在不断的扩大。对于人类,我们知道对应于开关计算的部件就是神经元,而且已经了解了一些神经元的运作机制。但是在人身上,对应于计算机内存的是什么东西呢?我们却一点概念也没有。人类需要记住很多东西,因此对记忆的需求一定是很大的。可是以我们的有限经验来判断,记忆不太可能位于神经系统中,而且我们对它的认识也是非常含糊的。因此,无论是计算机还是人类,自动机的动态部分(开关路)都比静态的内存要简单。
 
【冯·诺依曼接下来谈测量内存容量的方法。他建议用对状态数(所有选择的数量)取以 2为底的对数来得到内存容量。参见他的《冯·诺依曼文集》5.3[41]-3[42]。因此,一张普通打印纸的容量为 2 万个基本内存单元,这也是当时计算机装备的内存大小。】
 
这说明了计算速度的真正代价在哪里。大型计算机是很贵的机器,造一台计算机要很长时间,而且使用起来也十分麻烦。但是这样的一台计算机的内存却仅仅只有一张纸而已!一台这样的计算机运行半个小时,计算量相当于  20 个人两三年的工作。但是如果你把 20  个人关在一个房间里面做三年的计算,给他们每人一台手摇计算器,并规定:在三年中间,所有人的计算都要合用一张草稿纸,可以用橡皮擦掉以前的计算,但不准超过一张纸的限度。这时候,他们的工作瓶颈就很明显。为了用好这一张纸,需要做精细的计划,这是很困难的,虽然处理输入输出也不容易,但是主要的麻烦是内存实在是太少了!内存瓶颈直接影响了计算科学的发展[45]。这是非常不经济的状况。因为高速计算往往伴随着大量内存的占用,为了节约内存,你不得不牺牲计算效率。一个包含一千个数字的计算机内存是一个巨大的电路,需要好几年才能开发出来。现在,这样的内存都还在实验阶段,而且都很贵、很复杂,但是这仅仅相当于一张草纸。为什么计算必须占用内存是因为每次乘法大约需要五到八次的内存读写
 
【每一次乘法计算都需要占用内存中间的一些位置,乘法的结果也要存到内存中去。还有其他的算术计算,也需要读写内存。另外,控制这些算术运算的指令本身也来自内存。】
 
因此,除非你的内存读写速度能达到  0.1 微秒,一次乘法需要大大超过 1 微秒的时间才能完成[46]。相比  之下,在一本书上读出内容需要几秒钟,在一张草稿纸上写字则需要几分之一秒钟,因此, 按照比例,计算机至少需要 0.1  微秒的内存读写速度,才能避免瓶颈,否则就不得不牺牲计 算效率。在把人工自动机和自然的生命进行比较的时候,我们还不知道一件事情:大自然在进化过程中,是否曾经遇到过像内存不足这种性质的困难?抑或生命已经进化出了一套先进得多的记忆机制。鉴于人类发明了外部储存设备,也就是图书馆等等,我们有理由怀疑自然的内存实现也同我们现有的高速内存那样笨重。但是对此我们仍一无所知[47]。在我结束这堂课之前,我总结一下:计算机上的内存可以用两个参数来描述:容量和读写速度。
 
【冯·诺依曼说,当时的技术还难以同时实现大容量和高速读写。所以只能用内存分级的办法,一级内存具有最快的读写速度,但不是很大。二级内存则大很多,也慢很多。计算最常用的数字存储在一级内存中间,如果在一级内存中没有,就从二级内存调用。同样,也可以有更大更慢的三级内存,等等。内存可以是电子管、也可也是磁带,打孔卡片等等。参见《计算机与人脑》33-37】
 
参考文献
[40]译者注:冯·诺依曼是在 1949 年授课的,其时计算机刚刚发明不久,故读者须重视理论分析而不必在意具体 细节,下同。
[41]译者按:到今天,又过了 60 年,湍流问题还是“乏善可陈”,统计特征的提取似乎也没有多大作用,这个问题很深。
[42]译者按:多处脚注提到《计算机和人脑》,这本书的内容不多,同这一章也很类似,早已由商务出版社出版,请读者自行参考
[43]译者按:60 年后的今天,普通 2G 的内存就包含了 160 亿个电容单元,故你现在用的电脑就有 100 亿以上的开关电路,但是它同当年的 ENIAC,并没有本质区别,跟生命则毫无类似:量变不一定导致质变。
[44]译者按:现代计算机的计算速度用   MIPS 标志,可以认为 MIPS 接近于每秒做的百万乘法次数,最新的 IntelI7 CPU,MIPS 已经超过了 10   万,也就是每秒可以做千亿次乘法,大型机的运算速度已远远超过了千万亿,然而这样巨大的计算能力似乎并没有带来什么奇迹:量变未必导致质变。
[45]译者按:今天的内存比同样容量的草稿纸更加便宜,这个瓶颈早已消失。
[46]译者按:现在的内存读写速度是 0.1 纳秒级别,跟容量一样,提高了 1 百万倍以上
[47]译者按:现在知道,人类记忆是通过大脑神经元突触之间的可塑性联系实现的,包括短期和长期记忆。
 
推荐 4