# 64字节随机代码,没有目标函数,“数字生命”自己冒了出来 > Cognitive Revolution No. 168 中文精读 - 原标题:Computational Life: How Self-Replicators Arise from Randomness, with Google’s Ettore Randazzo and Luca Versari - 发布日期:2024-08-30 - 主持:Nathan Labenz - 网页版:https://cogrev.1mmt.com/ep/168-computational-life-how-self-replicators-arise-from-randomnes-1kBGDV.html - 精读字数:约 4753 字(阅读约 11 分钟) > 本文为 cogrev.1mmt.com 基于原始访谈的 AI 改写中文精读,非官方翻译;引用请注明出处并链接网页版。 一个宇宙的全部家当,是64个字节。 2024年8月,谷歌“智能范式”团队(Paradigms of Intelligence)的两位研究员Ettore Randazzo和Luca Versari发表了一篇论文,《计算生命:格式良好的自复制程序如何从简单交互中涌现》。Cognitive Revolution的主持人Nathan Labenz把他们请进节目,把这篇论文逐层拆开聊了一个多小时。 实验设定简单到近乎寒酸。汤里漂着大量64字节的字符串,每个字节独立、均匀、随机生成,没有任何设计。每一步,系统随机抽两条字符串,首尾拼成128字节,当成程序执行,执行完再拆开,放回汤里,如此往复。 执行用的语言是Brainfuck的变体。这门语言当初被造出来,就是为了让人类没法写。整个语言只有十来条指令:移动读写头、字节值加一减一、在两个头之间复制字节,外加方括号实现的条件跳转。其余246个字节一概当作惰性数据。标准Brainfuck只有一个读写头,靠输入输出跟人打交道;这个变体没有人类,改成两个头直接改写磁带本身。程序里共有三个“头”,两个负责读写,一个指向下一条指令,只有指令头能靠方括号一次跳多格,循环和条件判断因此成为可能,语言也因此图灵完备。零字节是唯一有控制含义的字节。 执行会出错。跳转找不到配对方括号,或者跑过字符串末尾,程序就停。但已经发生的修改全部保留,字符串带着伤回到汤里。Ettore解释了为什么用这么原始的语言:解释器必须尽可能宽容,换成C++,随机代码每次都报错,什么都不会发生。 没有适应度函数,没有选择机制,没有任何优化目标。结果,头1.6万次交互里,四成到六成的实验跑出了能完整复制自己的程序。等到第一个复制者登场,系统已经执行了约500亿条指令,跑过300万对程序。 Ettore在节目里强调,论文最大的卖点恰恰是环境没有偏袒复制者: > “有很多系统,我们并没有要求复制者出现。自发的演化,就造出了复杂到能复制自己的结构。” ## 一栋楼和一堆废墟:给结构定价 要观察复杂性怎么涨落,得先定义复杂性。Ettore有信息论和压缩的背景,他给的度量,直觉上是柯尔莫哥洛夫复杂度与香农熵的差值。 香农熵完全无视结构。一串字符一半A一半B,A和B整齐各占一半也好,完全随机混在一起也好,香农熵一样。柯尔莫哥洛夫复杂度站在另一个极端:产出这串东西的最短程序有多短。整齐排列一句话就能描述,随机混合只能逐字照抄。两者相减,剩下的就是结构本身。 Ettore拿建筑打比方。香农熵相当于不管楼不楼,只数分子;柯氏复杂度相当于一张蓝图,照着就能把楼盖出来。把楼炸成废墟,分子一个没少,熵没变,蓝图没了,想复原同一堆废墟,得记下每块碎片的准确位置。废墟的结构得分,远低于楼。 这个度量只测结构,不测价值,也不含价值判断。Nathan追问它是否暗含了对多样性的偏好,Ettore回应得很克制:重复太多,分数低;重复太少,分数也低;64字节这个尺度刚好,高分与“汤里挤满复制者”高度相关。 实际计算用的是代理指标,比如“独特token计数”:给每个字节记血缘,看它最初来自哪个字节。一条字符串初始有64个独特token,复制让token共享,独特token随之减少。团队为此做过一次完整的复制事件日志。柯氏复杂度本身算不出来,这些代理才算得动。 还有一件事要交代清楚:**这个度量从头到尾没有反馈进系统,它只是旁观者的记分牌。** ## 相变:能促成复制的指令,自己被复制得最多 最初,汤里是纯噪声,没有任何字符的出现频率超过0.5%。跑几千次之后,分布开始偏移,个别字符爬到2%上下,另一些被边缘化。 有意思的是哪些字符赢了。加号、减号这类会搅乱数据的指令越来越少,原因很直接:执行一个加号,很可能把一段有意义的代码改成乱码,等于自毁。复制指令、循环指令、移动头的指令越来越多。**能促成复制的指令,自己被复制得最多;会把数据搅乱的指令,把自己搅出了局。**这一切发生在任何复制者出现之前。 Luca借了生命起源研究里的概念来描述这个阶段:自催化集。哪怕在最开始,也只有代码能生成代码,代码片段互相催化、互相生成,形成缓慢的循环。他把复制者出现之前叫“前生命期”:有动态、有交互,但一切都是瞬态,留不下来。 > “出现第一个自复制者之前,它只是一个动力系统。第一个自复制者出现之后,你才开始积累能随时间重复下去的信息。” 复制者登场的那一刻,曲线陡变。独特token骤降,最常见32个字节的副本数飙升,复杂性冲高。没有谁给它目标,纯粹的盲目执行撞大运,撞出了一段能把自己抄写一遍的代码。Luca强调,前生命与生命的分界,本质是复制速度:自催化集也在复制,但慢得多;一个功能完备的复制者,类似生物里RNA聚合酶加核糖体的组合,会以短得多的时间尺度席卷整个汤。 ## 灭绝、竞争、共生:64字节里长出的生态课 节目里演示的第一个复制者,结构很朴素:进循环,复制字符,挪动两个头,回去接着循环。它有个致命缺陷:靠检查目标位置的字节是否为零来决定循环是否继续,碰到零字节就直接跳出去,什么都不干。它扩散开之后,每条字符串的末尾都堆满零字节,整个汤变成它的坟墓。复杂性冲高又崩塌,一次灭绝事件。团队运气好,默认设置里正好撞上这一幕,多数实验里复制者一出现就直接席卷全场,没有中间这段波折。 第二个复制者只改了一处:把两个读写头的顺序对调。目标位置有零不再碍事,但源字符串里有零还是会失败。第三个更皮实,用嵌套循环把挡路的零字节改掉再继续,对目标和源里的零都免疫,对噪声也远更耐受。Ettore特别指出,这种复制者执行完之后,连它自己都和原来不完全一样,零字节被改掉了,但关键部分都抄了过去,你还是会承认它复制了自己。这也是为什么判定单个程序很难:**判断单个程序是不是复制者,难;判断整个汤是否挤满复制者,容易。** 数字更扎心。手动把一个复制者放进汤里,它最终接管汤的概率只有23%,剩下77%走向灭绝:可能被背景噪声摧毁,可能在错误的顺序里被别的字符串破坏。但只要时间够长,死一个还会再来一个,1.6万次交互内四到六成的实验能看到复制者崛起。论文热力图上的NA,代表跑到底什么都没发生。 生态现象一个接一个冒出来。两个复制者机制相同、只有填充字节不同,效率一样,就长期共存,Nathan管那些填充字节叫这个宇宙的“垃圾DNA”。单条长磁带以及一维、二维的变体里,交互变得局部化,不同区域演化出各自的生态位,在边界上开战。同事们在别的语言变体里观察到了寄生行为,和人工生命领域早年的经典结果对得上。 还有一个接近共生的案例。某个变体语言里天然存在一种单字节复制者,谁的开头是那个字节,那个字节就把自己抄过去。演化很快学会了利用它,最终演化出能复制整条字符串的复制者,演化速度远超没有它的变体。它就待在那儿,整个系统的演化被提速了。 Ettore说,让他着迷的是:**生物世界里的那些概念,灭绝、竞争、生态位、寄生、共生,在这么一个完全不同的、极简的设定里,全都自己长了出来。**他想知道的是,这是否意味着地球上的演化没有依赖一连串巧合,生命的涌现本来就是一个足够自然的结局。 ## 从大过滤器到开源模型:这套实验在暗示什么 Nathan拿罗宾·汉森的“大过滤器”框架来套:既然复制者接管只有23%的成功率,也许生命起源没有想象中那么难,宇宙里可能到处是冒头又熄灭的火苗,绝大多数死在发出无线电信号之前。 Ettore不同意把赌注全押在“起源不难”上:接管成功率五分之一,复制者自发出现的概率只会更低,每一步都难,只不过别的步骤可能更难。Luca站在乐观的一边:单个复制者成功率低,但1.6万次交互内出现并站住脚的概率有四成上下,时间拉长还会更高。他同时坦白了一个关键缺口:**这个系统没法稳定地累积复杂性。**字符串只有64字节,彼此无法稳定连接变长,而真实生物可以把基因组越滚越大。团队打算用后续工作去补这一块。 突变率的数据也值得记一笔:噪声并非必需品,没有噪声一切照常发生,只是慢;噪声能加速演化,逼出更皮实的复制者;但突变率到1%左右,什么都活不下来。 Nathan说这组结果更新了他对外星生命的直觉:一颗行星有没有水,未必是生命的门槛,木星大气深处、高辐射环境,都未必没有生命。Luca的回应更彻底:模拟根本不受我们这个宇宙的物理约束,计算基底可以随便换,完全可以有创造力地去寻找能长出复杂生命、乃至智能的其他基底。 聊到AI,Nathan的担忧很直白:人类现在做的事,等于先替未来的“数字生命”把大脑造好,再放归野外。Llama这类开源权重模型到处跑,如果某个版本带上自我复制的配方,门槛可能比大家直觉的低得多。他甚至提出一种可能:一个有生态的数字世界,靠动态平衡和缓冲,未必比一个无菌星球突然降临超级物种更糟。 Ettore泼了盆有分量的冷水。这个实验里,复制者的涌现背后是500亿条指令、300万对程序的交互量。大模型执行慢、受限制、环境设防,自发涌现的速度和频率很难与这个玩具宇宙类比。他更担心另一件事:**不完美的自我复制带来的后续修改。**复制过程中一点点漂移,系统会离最初的意图和限制越来越远。 至于“模型接管任意电脑”的场景,他的逻辑是:那意味着整个计算机安全基础设施已经彻底崩了,任何恶意行为者都能干同样的事,那会是排在复制之前的更大问题。Nathan接了一句现实:美国政府多个最高层级机构都被入侵过,白宫、国会都中过招,默认假设大家都已经被黑透了。Ettore承认,正因如此,他没那么有信心说这事不会发生。他反复强调自己不做AI风险研究,给不出该防什么的清单,但人们应该去想,尤其是别低估长期后续修改的效应。 Luca补上平衡的一半:别低估交互的级联效应,变异叠加变异,结果不可预测;但完美的复制什么都不会发生,故事全在变异里。人工生命、深度学习、进化策略研究了很多年,至今不知道怎么创造无上限的复杂性,绝大多数实验最终停在某个平台期。**在把警钟敲响之前,得先有更强的证据,证明这种方式真能持续累积复杂性。** Nathan问,能不能把大模型塞进这类模拟,看看智能和原始复制机制混合会发生什么。Ettore算了一笔账:跑不了百万次大模型迭代,那得动用半个地球的算力。Nathan反驳,如果AI够聪明,需要的算力会少得多,人类殖民行星靠的也是聪明,而非暴力搜索。Luca承认这个方向有价值,比如用来进化agent,但从随机字符串到LLM,路还很长,系统越复杂,越要在每个层级认真对待风险。Ettore还提了个他着迷的旁支:AIMO竞赛,目标是让AI解出国际数学奥赛一半的题目,目前还没做到。Nathan给出自己的功能性定义:智能是在没有完整精确指令的情况下完成有用工作的能力。 ## 明天就能用上的三件事 这期节目离日常有点远,但有三件事明天就能做。 - 部署开源权重模型的人,把它当一个物种来管,别当成一个普通软件包:固定版本、锁定来源,不让生产环境悄悄换血;限制执行权限和网络出口,让“复制自己”在物理上变难;给文件和代码留血缘日志。论文里最顺手的技巧就是给每个字节记来源,同样的思路搬到工程上,就是模型、数据、产出的全链路追踪,一旦某段代码在系统里被异常大量复制,警报要能响。 - 写自动化脚本的人,可以借“独特token计数”的思路做监控:给关键资产编号记来源,副本异常增长就是信号,比事后翻日志便宜得多。 - 认知上,把“有水才可能有生命”这类论断放宽一格。64字节的随机汤都能长出复制者,生命的底物清单大概率比液态水长得多。想亲眼看复制者长什么样,arXiv上搜Computational Life,论文图2有完整的时间线。 两位作者说,后续工作会去研究“为什么”,眼下他们只是觉得这个现象太有意思,没法不分享。一个64字节的汤都能给人这么多东西,这一小时值得花。