在最近与这一代最具独创性的思想家之一乔沙·巴赫 ( Joscha Bach ) 的谈话中,他做出了令人吃惊的断言,即移动并发与通用人工智能不一致。在这种情况下,移动并发意味着当代理(又名计算过程)可以相互发现时发现的一种并发,这是通信拓扑(谁知道谁以及谁在与谁交谈)正在发展。该模型与计算元素像主板上的组件一样焊接在一起的模型非常不同。移动并发更像是 Internet 或电话网络,初次见面的人会在其中了解彼此的网站、电子邮件地址和电话号码。 Joscha 的论点是大脑只是可塑的,即神经元之间的连接只在学习过程中发生变化,而不是在一般计算过程中发生变化。
乔沙·巴赫 ( Joscha Bach ) 是他那一代最具独创性的思想家之一,他做出了令人吃惊的断言,即移动并发与通用人工智能不一致
我对这个命题的回应是,它假设大脑不在大脑硬件上运行的逻辑计算模型中。毕竟, Java 虚拟机(JVM) 是一种与其运行的硬件截然不同的计算模型。 Haskell的计算模型是计算概念的一种更显着的变化,而不是体现在通常托管光荣的 Haskell 编译器 ( GHC ) 的硬件中的模型。为什么头脑不这样组织呢?借用 Joscha 的形象比喻,为什么心智不会作为一种寄宿在大脑硬件上的殖民化计算模型出现?如果是的话,rho-calculus 的一种实现 rholang 首先托管在 Intel 和 AMD 芯片上,它们的计算模型与 rho-calculus 捕获的模型非常不同。
特别是, rho-calculus确实为移动并发计算提供了直接支持。在 rho 演算中执行的进程社会之间的通信拓扑是动态的。在计算过程中,这个社会中谁知道谁可以与谁交谈会发生变化。这种思考 rho-calculus 的方式预示着我的论点,即有充分的理由假设像 rho-calculus 这样的模型可能已经在人脑的硬件上寄宿并殖民了,事实上,任何支持心理理论。
为了提出这个论点,我想做一些区分,并不是每个计算机科学家,更不用说每个开发人员了。我区分了代码、数据和计算。任意代码可以被视为一些数据,它是某种类型的数据结构的实例,其中表达或托管计算模型。例如,您可以使用通过上下文无关文法(例如,格式良好的 Haskell 程序的文法)表达的术语语言来托管图灵完备的计算模型,例如Haskell 。然而,我们知道上下文无关文法不是图灵完备的。怎么会这样?比图灵完备模型表现力差的东西怎么能代表图灵完备计算呢?
它切入了句法和语义之间区别的核心。术语语言的语法表示程序的句法,而不是计算的动态,即代码的语义。取而代之的是,计算的动态性是由规则(对语法进行操作)与特定语法片段(即表示人们想要实现的计算的某些代码)的交互作用产生的。在 lambda 演算(Haskell 所基于的计算模型)中,计算的主力是称为 beta 归约的规则。此规则表示函数通过用数据替换代码中出现的变量的行为来对数据进行操作。它所操作的数据是函数应用于数据的句法表示,但它不是对应于将函数应用于数据的计算。当 beta reduction 对语法进行操作时,就会发生这种计算,将其转换为一段新的语法。这种区别是表达能力低于图灵完备的模型(例如,上下文无关语法)如何能够承载图灵完备计算。
比图灵完备模型表现力差的东西怎么能代表图灵完备计算呢?它切入了语法和语义之间区别的核心。术语语言的语法表示程序的语法,而不是计算的动态,即代码的语义。
不强调这一点,但同样的区别也发生在 Java 和 JVM 中。 JVM 中的计算动态通过对虚拟机中的寄存器组合以及代码表示形式进行操作的规则发生。盯着一段 Java 代码的 Java 程序员并不是在看计算。离得很远。 Java 程序的语法是一个窗口,可以了解根据代码运行时 JVM 寄存器的状态而产生的可能不同计算的整个范围。这两种评估形式之间的区别,即 lambda 演算中的 beta 缩减与 JVM 的转换,非常重要,我们将回到它。
不过,就目前而言,思考代码和计算之间这种区别的一种方法是通过与物理学的类比。传统上,物理定律通过三件事来表达:物理状态的表示(将其视为程序的语法),说明状态如何随时间变化的运动定律(将其视为对语法起作用的规则) ;和初始条件(将其视为您要运行的特定代码段)。从这个角度来看,物理学被视为一种特殊用途的编程语言,其执行以特定方式对应于物理世界基于我们对它的观察而演化的方式。物理学是可测试的,因为它让我们运行一个程序,看看从某个初始状态到它通过运动定律达到的状态的演化是否与我们的观察相符。特别是,当我们看到物理世界的配置与我们的初始状态相匹配时,它是否经历了一个与我们的运动定律所要求的相匹配的进化过程,并且它是否以我们的运动定律所要求的状态着陆它应该?物理具有这种形状的事实是我们可以在代码中有效地表示它的原因。
物理类比将 lambda 演算、π 演算或 rho 演算等计算模型与 JVM 转换等模型形成鲜明对比。当您盯着一段 Java 代码时,您并没有了解它的行为所需的所有信息。根据 JVM 的状态,同一段 Java 代码的行为可能大不相同。相比之下,上述计算演算将形式与功能结合起来。你在表达式中看到的就是你得到的。从物理学的角度来看,作为一名科学家,你唯一需要逆向工程的是运动定律,也就是计算规则。您不必猜测一堆隐藏状态。
一旦我们看到了代码和计算之间的区别,那么代码和数据之间的区别就相对直观了,尽管有些微妙。计算机程序中的数据也只是语法。从这个意义上说,它与代码没有什么不同,代码也只是语法。每个 Lisp 程序员都明白代码就是数据,数据就是代码。甚至 Java 也支持一种元编程,其中 Java 代码可以作为 Java 对象进行操作。问题是,代码和数据之间有真正的分界线吗?
答案是肯定的。数据是具有非常特定属性的代码;例如,代码总是可证明地运行到终止。并非所有代码都这样做。事实上,图灵对Entscheidungs问题的著名解决方案向我们表明,一般而言,我们无法知道程序何时会因为语言具有某种表达能力(即图灵完备性)而停止。但是,表达力较低的语言,图灵完备语言拥有合适的子语言或片段,这些子语言或片段的表达力低于整个语言。数据驻留在允许证明与一段语法关联的计算将停止的语法中。同样,数据驻留在允许证明计算将只享受有限分支的语法中。
程序员不会这样想数据,看到数据就知道了。但是在像 lambda 演算这样没有配备内置数据类型的计算模型中,一切,甚至像计数或布尔值,真和假,都被表示为代码。挑选出哪些代码构成数据,哪些代码构成通用程序与能够检测代码何时具有我们上面讨论的各种属性有关。一般来说,有些类型的系统可以检测这样的属性。同样,这是一个微妙的问题,但幸运的是,我们不需要了解所有的细微之处,也不需要了解数据和代码的分界线到底在哪里,只要有一条就行了。
总之,代码和数据都只是表示一种规则或许多规则将运行的状态的语法。数据以比代码更缺乏表现力的句法片段来表达,赋予它代码并不总是喜欢的明确或有限的特征。计算是当一些规则与状态表示相互作用时产生的进化过程。现在,这一切与 AI、思维甚至 rho-calculus 有什么关系?
rho-calculus 具有计算和代码之间区别的句法表示。它有一个操作,表示将计算打包为一段代码,以便可以对其进行操作,将其转换为新代码。它还具有将一段代码转回计算的操作。哇哦,你可能会说,那是下一级 sh!t。但是,正如我们提到的,Lisp 程序员和 Java 程序员长期以来一直在进行这种元编程。他们必须。原因与规模有关。在没有自动化支持的情况下,人类团队不可能管理涉及数百万行代码的代码库。他们使用计算机程序编写计算机程序。他们使用计算机程序来构建计算机程序部署。元编程是当今世界的必需品。
史密斯的论点是内省,即头脑审视自己的过程的能力,是智力的一个关键特征。对于一些人来说,这甚至是智力的决定性特征。
但早在上世纪 80 年代,AI 还处于早期阶段,一位名叫Brian Cantwell Smith的研究人员进行了一项观察,引起了我以及 AI 和 AI 相关领域的许多其他人的共鸣。史密斯的论点是,内省,即心灵审视心灵自身过程的能力,是智力的一个关键特征。对于某些人来说,这甚至是智力的决定性特征。为了使这种他称之为计算反射的内省思想具体化,Smith 设计了一种名为 3-Lisp 的编程语言,它具有与 rho-演算相同的运算符。具体来说,3-Lisp 具有将计算具体化为代码的语法,以及将代码反映回运行计算的语法。
现在,有充分的理由怀疑当今开发人员面临的规模问题与将我们的反思、内省能力建模为推理生物的问题之间存在联系。特别是,在存在计算反射的情况下,管理表示我们自己的推理的复杂性变得容易处理。我们可以将我们所有的算法技巧应用于我们自己推理的表示以获得更好的推理。这一观察结果在进化生物学家称之为心智理论的背景下得到了放大。
具体来说,内省源于通过计算模拟他人行为而获得的进化优势,特别是你自己物种的成员。如果爱丽丝发展出模仿芭芭拉行为的能力,并且芭芭拉与爱丽丝非常相似(在同一物种、同一部落,甚至是同一大家庭结构),那么爱丽丝就非常接近能够模仿爱丽丝的行为。而当 Barbara 与 Alice 交互时,Alice 需要对 Barbara 的行为进行建模,那么 Alice 就直接参与对 Alice 的行为进行建模。将其提升到一个规模,爱丽丝可以为她的家庭单位或她的部落的行为建模,这才是真正有趣的地方。稍后会详细介绍,但就目前而言,我们可以看到关于计算反射的某些东西与在该词的两个意义上改进大规模推理有关:(复杂性规模)通过将推理应用于自身来改进推理,以及(社会规模) 改进关于大量推理代理的推理。
事实上,史密斯关于计算反射及其在智能和编程语言设计中的作用的思想启发了 rho-calculus 的设计,它以具体化和反射作为原始计算运算符。然而,3-Lisp 和 rho-calculus 分道扬镳之处在于 3-Lisp 显然是顺序的。它无法合理地表示一个由自主计算过程组成的社会,这些过程在相互作用和协调的同时独立运行。但在心智理论的背景下,这正是推理者需要做的。他们需要一个明确的社会背景模型,该模型由独立行动的自主代理人组成,同时也进行沟通和协调。
大约在史密斯发展他的计算反思思想的同时,马文·明斯基正在发展他著名的心灵社会论文。我对明斯基提议的看法是,思想类似于美国国会或任何其他审议机构。它由一群独立的代理人组成,他们都在争夺不同的资源(例如来自税基的资金)。我们认为有意识的决定更像是一群独立、自主的主体之间长期审议过程的结果,这些过程通常远低于有意识的经验。但是,审议过程会产生有约束力的投票,而有约束力的投票就是有意识的决定。
这种将大部分计算置于有意识推理之外的观点,如何才能与认为心灵本质上是反射性的观点相协调? rho-calculus 是为回答这个问题而设计的。
rho-calculus 表示计算代理只有六种形状:
请注意其中三个构造如何使用符号 x。其中两个使用 x 就好像它是代理之间通信的通道,其中一个使用 x 就好像它是对一段代码的引用。 rho-calculus 袖手旁观的一个魔术是通道是对一段代码的引用。这需要一点时间来适应,但它是随着时间而来的。
作为爱丽丝社会背景的外部观察者,我们可以将其行为记为每个人行为的平行组合。在 P1 | 的符号中P2 | …… | Pn 其中 Pi 是爱丽丝社会背景下第 i 个个体的模型。现在,Alice 的行为模型需要表示她自己的行为的平行组合,以表示对其的推理。在符号中是@( P1 | P2 | … | Pn )。
有了这么多关于 rho 演算的信息,我们就可以回到我们对爱丽丝的叙述,并找到她发展社会和内省智能所面临的所有挑战的简洁表述。作为爱丽丝社会背景的外部观察者,我们可以将其行为记为每个人行为的平行组合。在符号中,这是 P1 | P2 | …… | Pn,其中 Pi 是爱丽丝社会背景下第 i 个个体的模型。现在,Alice 的行为模型需要表示她自己的行为的平行组合,以表示对其的推理。在符号中是@( P1 | P2 | … | Pn )。为了让 Alice 将这些数据放在她可以访问的某个地方,她将模型放在通道 x!( P1 | P2 | … | Pn ) 上,当她需要检索它时,她执行
for( y <- x )AliceThinkingAboutHerColleagues( y ) | x!( P1 | P2 | … | Pn )
rho-calculus 中的主力计算规则,在本质上与 lambda 演算的 beta 归约非常相似,是这样的表达式演变为
AliceThinkingAboutHerColleagues( @( P1 | P2 | … | Pn ) )
所以,现在爱丽丝对她同事的想法有一个明确的他们行为的表示可供爱丽丝使用。有了它,她可以通过模拟P1的行为来模拟同事的行为| P2 | ... | Pn 通过对@( P1 | P2 | ... | Pn ) 的操作。我们可以模拟爱丽丝观察她同事的实际行为,表达方式如爱丽丝 | P1 | P2 | ... | Pn。爱丽丝可以将她的模拟与她的观察结果进行比较。事实上,我们可以建模的任何东西都可供爱丽丝使用,既可以运行也可以具体化为数据,并将代码和她对它的模拟与她观察到的社会环境的实际行为进行比较。这包括爱丽丝自己的行为。
这可能过得有点快,但想想看。这是爱丽丝同时对她的社会背景和她自己进行建模所需的最小操作集。特别是,当 Alice 自己的行为将这些线程具体化为数据并且她的处理与该数据交互时,线程对 Alice 来说是“有意识地可用”的。这个论点是 rho-calculus 设计考虑的一部分。它是最小的计算模型,它调和了史密斯关于计算反思的论点与明斯基关于心灵社会的论点,这种社会符合进化生物学对有机体的心灵理论。任何较小的事情都会错过情况的关键组成部分。
这个论点就是为什么像 rho-calculus 这样的计算模型在爱丽丝大脑的硬件上找到购买是合理的。她需要这个模型的所有元素来与她的物种的其他成员竞争,这些成员同样竞相模仿其社会环境的行为。这就是为什么,与 Joscha 的立场截然相反,我认为移动并发是通用人工智能的核心。
非常感谢 Ralph Benko 准确无误的精明编辑评论!