Hero Image
约翰·冯·诺依曼的一生

年表 190312 月 28 日生于布达佩斯,父亲是银行家。 1913父亲获封贵族头衔,儿子从此成为“冯·诺依曼”。 1921从布达佩斯的路德派中学毕业,尤金·维格纳是他的同学。 192319 岁时发表序数的定义。 1926在苏黎世获得化学工程文凭,在布达佩斯获得数学博士学位。 1927成为柏林大学最年轻的 Privatdozent(编外讲师)。 1928发表极小极大定理,奠定博弈论的基础。 1930移居普林斯顿。1933 年成为高等研究院最早的教授之一。 1932出版《量子力学的数学基础》。 1943开始在洛斯阿拉莫斯参与原子弹计划。 1944与奥斯卡·摩根斯特恩合著出版《博弈论与经济行为》。 1945写出 EDVAC 报告,描述存储程序计算机。 1946与斯坦尼斯瓦夫·乌拉姆一起发展蒙特卡洛方法。 1952IAS 计算机投入运行。 1955被任命为原子能委员会委员。发现自己患了癌症。 19572 月 8 日在华盛顿去世,终年 53 岁。 ◀ 上一站 沿路线走一遍 下一站 ▶ 1903–1921 布达佩斯12 月 28 日出生,父亲是银行家。在路德派中学读书,与尤金·维格纳是同学。 1921–1923 柏林在父亲的坚持下学习化学,同时在布达佩斯注册攻读数学博士。 1923–1926 苏黎世在苏黎世联邦理工学院获得化学工程学位。上过乔治·波利亚的课,波利亚后来说他是自己唯一害怕的学生。 1926–1927 哥廷根与大卫·希尔伯特一起研究数学基础和新的量子力学。 1927–1930 柏林成为柏林大学最年轻的编外讲师。1928 年发表极小极大定理。 1930–1957 普林斯顿先任普林斯顿大学教授,1933 年起任高等研究院教授,与爱因斯坦和哥德尔为同事。在那里建造了 IAS 计算机。 1943–1955 洛斯阿拉莫斯担任原子弹计划的顾问。与乌拉姆一起创立蒙特卡洛方法。 1955–1957 华盛顿担任原子能委员会委员。1957 年 2 月 8 日因癌症在沃尔特·里德医院去世。 请启用 JavaScript 以查看地图。各站列在下方。 从布达佩斯到华盛顿,途经苏黎世、哥廷根、柏林、普林斯顿和洛斯阿拉莫斯。 地图:© OpenStreetMap 贡献者

Hero Image
艾伦·图灵的一生

年表 19126 月 23 日生于伦敦。父母住在印度。 1926进入舍伯恩寄宿学校。 1930挚友克里斯托弗·莫科姆去世。 1931进入剑桥大学国王学院。 193522 岁当选国王学院院士。 1936写出《论可计算数》。前往普林斯顿。 1938在普林斯顿获得博士学位,回到剑桥。 1939开始在布莱切利园破译恩尼格玛。 1940第一台机电式“炸弹机”投入运行。 1945进入国家物理实验室,设计 ACE。 1948转到曼彻斯特大学。 1950发表关于模仿游戏的论文。 1952发表形态发生理论。因同性恋被定罪。 19546 月 7 日在威姆斯洛去世,终年 41 岁。 ◀ 上一站 沿路线走一遍 下一站 ▶ 1912 伦敦6 月 23 日生于梅达韦尔。父母住在印度,他由英格兰南部的一户寄养家庭抚养长大。 1926–1931 舍伯恩在寄宿学校结识克里斯托弗·莫科姆。这位朋友 1930 年的去世,使他开始思考心灵与物质的关系。 1931–1936 剑桥在国王学院学习,22 岁成为院士,写出《论可计算数》。 1936–1938 普林斯顿在阿隆佐·丘奇门下读博士。丘奇曾经由另一条路得到了同样的结果。 1939–1945 布莱切利园战争期间领导破译德国海军恩尼格玛的小组,并设计了机电式“炸弹机”。 1945–1947 特丁顿在国家物理实验室设计 ACE,一台存储程序计算机。 1948–1954 曼彻斯特为最早的计算机之一编程,提出模仿游戏,研究形态发生。1954 年 6 月 7 日在附近的威姆斯洛去世。 请启用 JavaScript 以查看地图。各站列在下方。 从伦敦到曼彻斯特,途经普林斯顿和布莱切利园。 地图:© OpenStreetMap 贡献者

Hero Image
图灵机:用铅笔、纸带和规则来计算

1936 年还没有任何计算机。英语里的 computer 指的是一个人:以计算为职业、用铅笔和纸在保险公司、天文台和政府部门里做算术的人。图灵就从这个人出发。他问:一个人在计算时真正在做什么?然后把一切不重要的东西都去掉。 计算的人还剩下什么 图灵在《论可计算数》中的推理,几乎就是一串简化: 纸可以换成一条分成格子的纸带,因为方格纸上的计算可以一格一格地抄到一行上。 每格里放一个符号,取自一张有限的清单:数字、字母、空白。 计算的人每次只看少数几格。看一格就够了:看几格,就是先看一格,再看它旁边那格。 计算的人有一种心理状态,比如“我在做加法”或“我在进位”。这样的状态只有有限多个。 每一步只取决于当前状态和正在读的符号。这一步就是写下一个符号、向左或向右移动一格、改变状态。 剩下的就是一台机器:一条纸带、一个能读能写的头,以及一张规则表。表的每一行说:“在某某状态下,读到某某符号,就写下这个,移到那边,进入某某状态”。 一台加 1 的机器 我们来造一台把二进制数加 1 的机器。手算 $1011+1$ 时,从右往左:最后一个 1 变成 0,“进一”;倒数第二个 1 也变成 0,再进一;接下来的 0 变成 1,计算结束。结果是 $1100$,也就是 $11+1=12$。 机器做的正是这件事,只需要一个状态“加”,外加终止状态“停机”。读写头从最后一位开始: 状态 读到 写下 移动 下一状态 加 1 0 向左 加 加 0 1 不动 停机 加 空白 1 不动 停机 第一行就是进位:把 1 换成 0,继续向左。第二行在遇到 0 时结束计算。第三行处理所有数字都是 1 的情形,比如 $111+1=1000$:读写头走到数字左边的空白处,在那里写下新的 1。 请启用 JavaScript 以使用这个交互图形。完整的推理见正文。 为什么这么简陋? 图灵机看上去简陋得可笑。它不能一次把两个数相加,除了纸带之外没有记忆,每次只走一格。但这种简陋是有意为之。图灵想要一个关于“机械计算”的定义,它要简单到没有人会怀疑一个人能执行它,同时又要普遍到涵盖任何计算。

Hero Image
停机问题:没有机器能回答的问题

1928 年,德国人大卫·希尔伯特提出了一个挑战,他称之为 Entscheidungsproblem,即“判定问题”:找到一种机械程序,对任何用逻辑语言写出的数学命题,都能在有限时间内回答它是真是假。如果这样的程序存在,数学就会变成一条流水线:只要写下问题,摇动手柄即可。 希尔伯特相信答案是肯定的。八年后,图灵和美国人阿隆佐·丘奇各自用不同的方法证明,答案是否定的。 一个更简单的问题 图灵没有正面进攻希尔伯特的问题。他先找到一个更朴素、却没有任何机器能回答的问题。今天人们这样讲述它: 给定一个程序和一个输入,这个程序终究会停机,还是会永远运行下去? 有时候很容易知道。把一个数加 1 的程序立刻就停。一个毫无出口地数 $1,2,3,\ldots$ 的程序永远不停。但有些很短的程序,谁也不知道答案。例如下面这个程序,它检验著名的哥德巴赫猜想——每个大于 2 的偶数都是两个素数之和: 从 $n=4$ 开始。 如果 $n$ 不是两个素数之和,就停机。 否则,把 $n$ 加 2,回到第 2 步。 这个程序停机当且仅当猜想不成立。知道它会不会停,就等于解决一个自 1742 年以来悬而未决的问题。一种判定程序是否停机的通用方法,可以一举解决这个问题以及许多其他问题。 证明 用反证法,假设存在一台机器 $P$ 能完成这项工作。它接收一个程序 $M$ 的描述和一个输入 $x$,并且总能在有限时间内回答: $$P(M,x)=\begin{cases}\text{“停机”}&\text{若 }M\text{ 在输入 }x\text{ 上停机},\\ \text{“不停机”}&\text{若 }M\text{ 永远运行}.\end{cases}$$有了 $P$,再造一台新机器——唱反调的 $D$。它接收一个程序 $M$ 的描述,然后这样做: 问 $P$:当 $M$ 收到它自己的描述作为输入时会怎样; 如果 $P$ 说“停机”,$D$ 就进入无限循环; 如果 $P$ 说“不停机”,$D$ 就停机。 致命的问题来了:当 $D$ 收到它自己的描述时,会怎样? 如果 $D(D)$ 停机,那么 $P$ 对 $D(D)$ 的回答是“不停机”,$P$ 错了。 如果 $D(D)$ 不停机,那么 $P$ 的回答是“停机”,$P$ 又错了。 两种情况下 $P$ 都出错。所以机器 $P$ 不存在。$\blacksquare$

Hero Image
可计算数:几乎每个数都无法计算

1936 年那篇论文的标题说的不是机器,而是数:《论可计算数》。图灵这样定义它们:如果存在一台机器,能一位接一位地写出一个实数的所有数字,而且永远不写错,这个实数就是可计算的。 哪些数是可计算的 学校里出现的数几乎都是可计算的。 分数: $\frac17=0.142857142857\ldots$ 机器做长除法,永远重复这个循环。 根式: $\sqrt2=1.41421356\ldots$ 为了找出下一位,机器从 0 试到 9,看哪个最大的数字添上之后,所得的数平方仍不超过 2。 $\pi$ 和 $e$: 有些级数能把它们逼近到任意精度,例如 $e=1+\frac1{1!}+\frac1{2!}+\frac1{3!}+\cdots$,借助这些级数,机器迟早能写出任何一位数字。 看起来,似乎每个“真正的”数都是可计算的。惊人之处就在这里:几乎没有一个是。 机器可以数得过来 每台图灵机都由一张有限的规则表描述。这张表可以用固定的字母表写成一段文字,因而也可以写成一个整数,图灵称之为描述数。只要把每个符号换成一个数字即可。 于是机器可以排成一张清单:描述数最小的那台,下一台,依此类推。许多数不描述任何机器,许多机器也不写出任何数,但这无关紧要。要紧的是:可计算数可以排成一张清单 $c_1,c_2,c_3,\ldots$ 用术语来说,它们是可数的。 实数数不过来 1891 年,格奥尔格·康托尔证明了实数不能排成一张清单。证明用的就是对角线。假设有一张列出 0 到 1 之间全部实数的清单: $$\begin{aligned} r_1&=0.\underline{5}\,1\,3\,9\ldots\\ r_2&=0.2\,\underline{7}\,0\,4\ldots\\ r_3&=0.8\,8\,\underline{1}\,6\ldots\\ r_4&=0.3\,0\,2\,\underline{2}\ldots \end{aligned}$$改动对角线上的数字来构造一个数 $d$:遇到 5 就写 6,遇到其他数字就写 5。这里 $d=0.6555\ldots$ 这个 $d$ 在第一位与 $r_1$ 不同,在第二位与 $r_2$ 不同,在第 $n$ 位与 $r_n$ 不同。它不在清单上。所以没有任何清单能包含全部实数。 把两个事实放在一起:可计算数能排成清单,实数不能。于是有实数落在所有机器之外,而且它们占了绝大多数。如果你随机挑一个实数,它是可计算数的概率为零。 一个能定义却算不出来的数 可以给一个不可计算的数起名字。写下 $0.d_1d_2d_3\ldots$,其中如果清单上的第 $n$ 台机器在空白纸带上会停机,就令 $d_n=1$,否则令 $d_n=0$。这个数定义得清清楚楚。但如果有一台机器能写出它的各位数字,它就解决了停机问题,而这是不可能的。这是一个存在着、却永远没有人能写出来的数。 练习:用一用对角线清单开头是 $0.1234\ldots$、$0.5555\ldots$、$0.9090\ldots$、$0.3141\ldots$。用“5 变 6,其余变 5”的规则,写出对角线数的前四位。 对角线是 $1,5,9,1$。改动后:$1\to5$,$5\to6$,$9\to5$,$1\to5$。这个数是 $0.5655\ldots$,它在对角线那一位与这四个数各不相同。

Hero Image
冯·诺依曼结构:EDVAC 报告

1945 年在宾夕法尼亚大学完成的 ENIAC 是当时世界上最快的电子计算机:它用近一万八千只电子管,每秒做五千次加法。但要换一种计算,就得在面板上重新接线、重新拨动开关,这是一组程序员要干好几天的活。 两名程序员在操作 ENIAC 的控制面板,宾夕法尼亚大学摩尔学院,约 1946 年。United States Army · Wikimedia Commons · 公有领域 ENIAC 的工程师 J. 普雷斯珀·埃克特和约翰·莫奇利已经在规划下一台机器 EDVAC,打算把程序存放在存储器里。冯·诺依曼开始参加他们的会议,并在 1945 年 6 月写了一份文本,用一种抽象的、几乎是生物学的语言,谈论“器官”和“神经元”,把小组的想法组织起来。 《EDVAC 报告初稿》的扉页,日期为 1945 年 6 月 30 日。John von Neumann · Wikimedia Commons · 公有领域 计算机的组成部分 《EDVAC 报告初稿》描述的计算机包括: 运算器,进行计算; 控制器,逐条读取指令并让它们得到执行; 存储器,同时存放数和指令,全都写成二进制数字串; 输入和输出设备。 决定性的新意在第 3 项。由于程序存放在与数据相同的存储器里,换一种计算就是改动存储器里的数,而不是改动导线。程序甚至可以计算并修改自己的指令。这就是 1936 年图灵的通用机的思想,落实到了电子管和水银延迟线上。 四行的程序 设想一个有八个位置的存储器,编号从 0 到 7,再加一个叫累加器的寄存器:

Hero Image
通用机:程序也是数据

每台图灵机只做一件事。加 1 的机器就加 1;写 $\frac17$ 的机器就写 $\frac17$。要做别的计算,就得换一台机器。在 1936 年,这是常态:机械计算器、穿孔卡片制表机和潮汐预测机都是为一项任务而造的,换任务就意味着换机器或重新接线。 在同一篇论文里,图灵证明了这并非必要。 读机器的机器 任何机器的规则表都可以作为文字写在纸带上。于是图灵描述了一台特殊的机器 $U$——通用机,它这样工作: 在纸带上接收一台机器 $M$ 的描述,后面跟着一个输入 $x$。 在描述中查找与 $M$ 当前状态以及 $M$ 正在读的符号相对应的规则。 在代表 $M$ 的纸带的那部分上执行这条规则,记下新状态,回到第 2 步。 这样,只要收到任何一台机器的规则表,$U$ 就能一步一步地模仿它。用符号写: $$U(\langle M\rangle,x)=M(x)\quad\text{对每台机器 }M\text{ 和每个输入 }x.$$代价是慢:$M$ 的每一步,$U$ 都要用许多步去查找和抄写。但 $U$ 能算的,恰恰是所有机器合起来能算的。 程序放进内存 实际的推论就是存储程序的思想。不必为每项任务造一台机器,只造一台,任务作为数据输入,放在存数字的同一个内存里。换任务就变成了换文字。你在手机上打开一个应用时正是如此:设备总是那一台,变的是它读的描述。 更进一步:如果程序是数据,一个程序就可以读、写、修改别的程序。编译器和操作系统做的就是这件事;从某种意义上说,停机问题证明中那台接收自身描述的机器 $D$ 也是如此。 Pilot ACE,图灵设计的缩小版,在国家物理实验室建成,1950 年投入运行。它现在陈列于伦敦科学博物馆。Philafrenzy · Wikimedia Commons · CC BY 2.0 从纸上到金属 战后,1945 至 1946 年,图灵在国家物理实验室写出了一台存储程序计算机——ACE(自动计算引擎)——的完整设计。这个设计很大胆:用水银延迟线做内存,每秒一百万个脉冲,甚至设想机器可以编程修改自己的指令。官僚作风和工程师的短缺拖慢了建造。缩小版的 Pilot ACE 直到 1950 年才运行起来,有一段时间它是世界上最快的计算机之一。 与此同时,在曼彻斯特,弗雷德里克·威廉姆斯和汤姆·基尔伯恩于 1948 年 6 月 21 日,在一台绰号**“宝贝”**的机器上运行了第一个存放在电子内存中的程序。几个月后图灵来到曼彻斯特,参与了此后几台机器的工作。

Hero Image
归并排序:靠合并来排序

给列表排序是计算机做得最多的工作之一:登记簿里的姓名、搜索结果中的价格、选举结果。1945 年,EDVAC 还只存在于纸上,冯·诺依曼想表明,他报告中的机器不只适合做算术,于是亲手写了一个给列表排序和合并的程序。这是为存储程序计算机写的最早的程序之一,而他所用的方法,今天叫作归并排序,仍是使用最广泛的方法之一。 合并两个有序列表 基本步骤是把两个已经有序的列表合并起来。只要看两个列表各自的第一个元素,取出较小的那个,然后重复: $$[2, 5, 9] \text{ 和 } [3, 4, 10] \;\longrightarrow\; [2, 3, 4, 5, 9, 10].$$每次比较都把一个数放到正确的位置上。合并总共有 $n$ 个元素的两个列表,至多需要 $n - 1$ 次比较。 分而治之 为了给任意列表排序,冯·诺依曼把它分成每块 1 个元素(每块自然已经有序!),把相邻的块合并成每块 2 个,再合并成 4 个、8 个,依此类推: 请启用 JavaScript 以使用这个交互图形。完整的推理见正文。 有 $n = 2^k$ 个元素时,共有 $k = \log_2 n$ 轮,每轮至多比较 $n$ 次。总数至多为 $$n \log_2 n.$$朴素的方法先找最小的元素,再找第二小的,依此类推,需要比较 $\frac{n(n-1)}{2}$ 次。对 $n = 16$,这是 $120$ 次对至多 $64$ 次。对一百万个姓名,差别是大约两千万次比较对五千亿次比较:几秒钟对几天。 方格纸上的程序 冯·诺依曼 1945 年关于排序的手稿被唐纳德·克努斯重新发现并加以分析,他在《计算机程序设计艺术》中描述了这份手稿。由于 EDVAC 还不存在,冯·诺依曼亲手算出程序要运行多少步,并满意地得出结论:这台机器排序会比 IBM 的穿孔卡片分类机,即当时的专用机器,更快。

Hero Image
恩尼格玛:1.59×10²⁰ 个密钥和一个缺陷

一台三转子的恩尼格玛,陈列于美国国家安全局的国家密码学博物馆。上部是转子,中间是灯板,下面是键盘,最前面是接线板。National Security Agency · Wikimedia Commons · 公有领域 恩尼格玛看上去像一台装在木箱里的打字机。操作员在键盘上按下一个字母,灯板上就亮起另一个字母。第二个操作员记下亮起的字母,这串字母再用摩尔斯电码通过无线电发出去。在另一端,一名操作员用一台同样设置的同型机器,敲入密文,就能在灯板上读出原文。 在键与灯之间,电流穿过一座迷宫:接线板、三个内部交叉布线的转子、一个把电流送回去的反射器,再经过三个转子,再经过接线板。而且每按一次键,第一个转子就转一格,整座迷宫随之改变。 数一数密钥 德国人信任恩尼格玛,是因为可能的设置数量庞大。我们用帕斯卡教给我们的组合数学,为 1939 年的陆军型号数一数。 转子。 从一盒 5 个转子中选出 3 个,顺序有关: $$5\cdot4\cdot3=60.$$初始位置。 每个转子从 26 个字母中的某一个开始: $$26^3=17\,576.$$接线板。 十根连线把字母两两相连,互相交换。用 26 个字母组成 10 对,有多少种方法?把 26 个字母排成一排,有 $26!$ 种排法,用前 20 个字母两两配对。最后 6 个不接线,它们的顺序无关紧要:除以 $6!$。10 对之间的顺序无关紧要:除以 $10!$。每对内部的顺序无关紧要:除以 $2^{10}$。结果是 $$\frac{26!}{6!\cdot10!\cdot2^{10}}=150\,738\,274\,937\,250.$$总数。 相乘: $$60\cdot17\,576\cdot150\,738\,274\,937\,250\approx1.59\times10^{20}.$$大约 1.59×10²⁰ 个密钥,还没算转子的字母环。每秒试一百万个密钥,也要大约五百万年才能全部试完。 缺陷 反射器有一个实际的好处:同一种设置下,机器既能加密也能解密。但它也带来了一个先天缺陷:由于电流总是从不同的路径返回,没有一个字母能被加密成它自己。A 永远不会变成 A。 这看起来微不足道,却是决定性的。密码分析员知道,许多电报含有可以预料的词,他们称之为 crib,“提示词”:早上 6 点的天气预报以 WETTERVORHERSAGE 开头,许多报告写着 KEINE BESONDEREN EREIGNISSE,“无事可报”。要找出提示词在密文中的位置,只需把它沿着密文滑动,凡是某个字母与它下方密文字母相同的位置,统统排除。 Q F Z W R W I K T Y R E S X B F O G K U H Q W E T T E R V O R H E R S A G E ← S 对 S:不可能 W E T T E R V O R H E R S A G E ← 没有重合:可能 在第一个位置,提示词中的 S 会落在密文的 S 上,而恩尼格玛从不这样做:这个位置被排除。往后四格,没有字母重合,这个位置仍是候选。

Hero Image
蒙特卡洛方法:掷骰子来计算

1946 年,冯·诺依曼在洛斯阿拉莫斯的同事、波兰数学家斯坦尼斯瓦夫·乌拉姆正在从脑炎中康复,靠玩单人纸牌打发时间。他想知道一局牌能打通的概率是多少。用组合数学去算,复杂得毫无希望。但还有另一个办法:玩上几百局,数一数有多少局打通了。有了计算机,就可以玩上几千局。 乌拉姆把这个想法告诉了冯·诺依曼,后者立刻看出了它的威力:同样的窍门可以用于他们在洛斯阿拉莫斯面对的问题,即中子在炸弹或反应堆中的路径,每个中子都会随机地偏转、被吸收或增殖。不去解方程,而是模拟成千上万个中子,用抽签决定每个中子遇到什么,然后取平均。尼古拉斯·梅特罗波利斯用蒙特卡洛赌场给这个方法命名,乌拉姆的一位叔叔常去那里赌钱。 斯坦尼斯瓦夫·乌拉姆手持 FERMIAC,这是恩里科·费米的一辆小推车,能在纸上画出由人手随机选出的中子路径:一台机械的蒙特卡洛装置。Los Alamos National Laboratory · Wikimedia Commons · 公有领域 1948 年,最早的模拟在 ENIAC 上运行。大部分代码是由冯·诺依曼的妻子克拉拉·丹·冯·诺依曼编写的,她是历史上最早的程序员之一。 用随机点计算 π 最简单的例子:随机抽取点 $(x, y)$,$x$ 和 $y$ 都在 $0$ 和 $1$ 之间。一个点落在四分之一圆 $x^2 + y^2 \le 1$ 内的概率是面积之比,$\frac{\pi/4}{1} = \frac{\pi}{4}$。因此 $$\pi \approx 4 \times \frac{\text{落在里面的点数}}{\text{抽取的点数}}.$$ 请启用 JavaScript 以使用这个交互图形。完整的推理见正文。 估计值改进得很慢。典型误差按 $\frac{1}{\sqrt{n}}$ 的方式减小:要多得一位小数,就需要一百倍的点。计算 $\pi$ 有好得多的方法。但在有许多变量的问题里,比如中子在三维空间中带着能量、方向和碰撞类型的路径,蒙特卡洛往往是唯一可行的方法,因为它的误差与维数无关。 制造偶然 计算机是确定性的机器。“随机”数从哪里来?1949 年,冯·诺依曼提出了平方取中法:取一个四位数,把它平方,把结果写成八位数,取中间四位。这就是下一个数。他完全清楚这不是真正的随机: 任何考虑用算术方法产生随机数字的人,当然都处于罪孽之中。 — 约翰·冯·诺依曼,《与随机数字有关的各种技术》(1951) 这个序列最终会重复或者落到零。但它很快,而且结果可以重现,便于核对计算。今天使用的生成器要好得多,但冯·诺依曼的原则依然成立:人们对生成器的要求不是真正的随机,而是通过问题所需的统计检验。 练习:平方取中从 $1234$ 出发,用平方取中法生成三个数。 $1234^2 = 1\,522\,756$,写成八位数 $01522756$:中间是 $5227$。$5227^2 = 27\,321\,529$:中间是 $3215$。$3215^2 = 10\,336\,225$:中间是 $3362$。序列开头是 $1234, 5227, 3215, 3362, \ldots$

Hero Image
模仿游戏:机器能思考吗?

我提议考虑这样一个问题:“机器能思考吗?” — 艾伦·图灵,《计算机器与智能》(1950) 图灵 1950 年发表在哲学期刊《心灵》上的论文就这样开头。紧接着的下一句,他就放弃了这个问题。要回答它,就得定义“机器”和“思考”,而任何定义都会变成没完没了的文字之争。图灵提议把它换成另一个问题,后者的好处是可以检验。 游戏规则 原来的游戏有三个参与者:一个男人、一个女人和一个提问者,分处不同的房间。提问者只能通过书面消息与另外两人交流,必须判断出谁是男人、谁是女人。男人设法骗他,女人设法帮他。 现在把男人换成一台机器。问题变成:当参与者之一是机器时,提问者出错的频率是否一样?如果机器对答得如此之好,以至于提问者无法把它和人区分开,图灵提议我们就把它是否“真的”在思考这一争论放到一边。这就是模仿游戏,今天称为图灵测试。 文中甚至给出了一段对话示例。问到“34957 加 70764 等于多少”,机器停了大约 30 秒,回答“105621”。正确答案是 105721。在论文后面,图灵解释说,一台善于玩这个游戏的机器会时不时故意算错,好显得像人。 预言 图灵并没有说当时的机器能通过测试。他用数字做了一个预言: 我相信,大约五十年后,将可以给存储容量约为 10⁹ 的计算机编程,让它们把模仿游戏玩得如此之好,以至于一个普通的提问者在五分钟的提问之后,作出正确识别的机会不超过 70%。 — 艾伦·图灵,《计算机器与智能》(1950) 这里的“$10^9$”指二进制位(比特)的容量。用今天的话说,$10^9$ 比特是 $\frac{10^9}{8}=1.25\times10^8$ 字节,大约 125 兆字节:比任何手机的内存都小。图灵在内存上估计得很准,在时间上则偏保守:令人信服的人机对话直到二十一世纪二十年代才随着大语言模型出现,而它们使用的内存是他设想的几千倍。 反驳 论文有一半篇幅在回应反驳。举几个例子: **神学的反驳:**思考是不朽灵魂的功能,上帝把灵魂赐给了人而没有赐给机器。图灵回答说,如果上帝愿意,也可以赐给机器一个灵魂。 数学的反驳:图灵定理和哥德尔定理表明,有些问题没有机器能回答。图灵同意,但指出没有任何迹象表明人类就没有类似的局限。 洛芙莱斯夫人的反驳:1843 年,阿达·洛芙莱斯写道,巴贝奇的分析机“丝毫不能自行创造什么;它只能做我们知道如何命令它去做的事”。图灵回答说,机器常常让他吃惊,而一台能够学习的机器会做出程序员没有预见的事。 最后这个回答最有先见之明。在论文结尾,图灵建议,与其给一个成人的大脑编程,不如给一台“儿童机器”编程,再用奖励和惩罚去教育它。寥寥几行,就是机器学习的思想。 证明你不是机器人 CAPTCHA——网站上那个显示扭曲字母或红绿灯照片的小方框——是反过来的图灵测试。这个名字是英文“用于区分计算机和人类的全自动公开图灵测试”的缩写。出题的是机器,需要证明自己是人的是你。 练习:10⁹ 比特有多少?如果每页 2000 个字符,每个字符占 8 比特,$10^9$ 比特能装下多少本 500 页的书? 一本书是 $500\cdot2000\cdot8=8\times10^6$ 比特。$10^9$ 比特能装 $\frac{10^9}{8\times10^6}=125$ 本书。图灵认为,一座小图书馆的内存就足以像人一样交谈。 练习:70% 是什么意思?如果提问者在两个参与者之间随便猜,猜对的概率是多少?“不超过 70%”是什么意思? 随便猜,有 50% 的机会猜对。“不超过 70%”的意思是:五分钟后,普通的提问者至少在 30% 的游戏中出错——机器骗过了很多人,虽然不是所有人。 来源: Alan Turing, “Computing Machinery and Intelligence”, Mind, 59(1950),第 433–460 页 · Ada Lovelace,为梅纳布雷亚关于分析机文章的译文所作的注释(1843)· The Turing Test, Stanford Encyclopedia of Philosophy。