AI News HubLIVE
站内改写4 分钟阅读

AI即计算

本文认为,人工智能(尤其是大语言模型)应被理解为一种计算形式,而非人造智能体。文章探讨了循环、组合性和代理框架在实现计算中的作用,引入了“Verplankalkül”作为非正式编程语言的概念,并分析了将计算结构整合到训练中的未来方向。

来源Hacker News AI作者: snoren

我们最初通过ChatGPT产品中的大语言模型(LLM)接触AI时,它就像一个神谕:你提问,神谕回答,交易完成。然而,随着我们迈向代理AI的辉煌未来,这种描述越来越不适用——代理AI以某种方式执行操作,甚至进行计算。

机器学习的原始框架是函数逼近。这一框架固然准确,但未能捕捉当前阶段的本质,机器学习已演变为更应被称为“人工智能”的东西。我记得当我对机器学习同事抱怨特定模型无法进行通用计算时,他们投来疑惑的目光。当时我们在讨论词嵌入——Word2Vec刚出现,在连续语义空间中对词语进行操作的可能性显而易见。然而,缺乏超越简单概念算术的组合性,语义空间仅是有趣的,或许对搜索有用,但远不足以进行有意义的计算。一本组织良好的字典仍然只是字典。

过去我常问的一个面试问题(从未被满意回答过)是:如何将可变大小的输入压缩到固定大小向量中,并通过神经网络而不遭遇梯度消失?循环神经网络是众所周知的非解决方案。Transformer彻底回答了这个问题:你根本不需要这样做(即压缩到固定大小向量)。你维持一个随输入增长的表示,代价是计算复杂度呈二次增长。从此,我们不再受制于神经网络虽在理论上可以是通用函数逼近器,但原始设计并未处理可变大小数据或可变计算量的事实。

朴素函数逼近给出了映射,但忽略了代数组合性的固有尺度。非正式地说,计算就是代数组合性的化身。这个差异在需要后者之前可能显得学究气。

循环与组合性

LLM显然可以计算。按“正确”理解,计算通过遵循形式语言的规则建模——LLM只是将此概念扩展到遵循非正式语言的非正式规则。这可能不符合逻辑学家约一百年前制定的严格定义,但很可能比我们通常认为的更好地捕捉了他们试图定义的精神。

与我们所熟悉的物理计算机一样,语言模型受限于有限的上下文和记忆。它们是不完美的模型。(一个有趣的旁注是:不完美在于理论还是实现?)

关于计算史值得记住的事实是:我们做过的最强大(甚至过度强大)的事情是引入任意循环。原始递归函数已经很了不起——你可以在有界递归内计算大量内容,并保证每次调用终止。但决定性的飞跃,打开完全可计算景观的是无界迭代:μ算子、WHILE循环、能够说“继续直到条件满足”而不承诺何时完成。

现在考虑语言模型单次前向传递在计算上究竟是什么。具有固定上下文窗口和有限精度算术的Transformer计算从输入序列到输出分布的有界函数。架构是固定深度的电路,而非具有无界工作内存的机器。每个token关注先前的token,但计算在由层数、上下文窗口和实现约束决定的固定操作次数后终止。这不是批评——这种约束使训练易于处理。但在询问这些系统结构上能做什么时,这是需要清晰认识的事实。单次前向传递并非具有任意深度的计算——它是非常复杂的有界函数应用。

这就是代理AI在技术上变得有趣的地方,而不仅仅是产品类别。使计算强大的循环正在被引入——只是被引入在框架层。模型被调用,产生输出,输出修改某些状态(文件、工具调用结果、内存存储、计划、测试日志),然后模型以更新的上下文再次被调用,而模型本身保持不变。计算发生在包装器中。框架提供了模型本身无法实现的WHILE循环。

这也解释了为什么代理框架看起来如此经典。上下文压缩、子代理和可发现上下文指向原始论点:只要拥有非指数算法,一旦达到原始设置针对特定工作负载的极限,你总是可以添加更多——更多内存、更多处理能力和机器。目前,我们使用的只是参与者模型、树、Unix文件系统和操作系统状态、外壳以及执行任意代码的能力。几乎没有额外的机器学习花招。

这凸显了当前AI的基本计算特性。LLM在执行计算(尽管是非正式定义的)方面,比做人们历史上与AI关联的另一件事——模仿、冒充甚至成为一个人——要好得多。记忆、持续学习、关心任何事、拥有持久意向性——这些可能在短局部上下文中可模拟,但在中尺度下更引人注目的是它们的缺失。而在这个时代,像我这样的程序员仍然对这些系统在我(一个真实的人)定义、预谋和设定的任务上能完成的事情感到由衷惊讶。

我们今天的AI更像是非正式计算而非人造人——我们现在实例化非正式计算的能力正在凸显这一区别,就像GOFAI时代的国际象棋计算机向我们展示了形式推理与实际智能之间的微妙差异。

熵即摩擦

对随机系统循环的标准反对意见是错误会累积。有时这正是你得到的。在确定性程序中,循环执行你所写的内容。在随机解码器中运行数百步,通过语义空间的轨迹可能漂移、卷曲或发散,这在经典软件中没有干净的对等物——第三步的幻觉可能影响后续一切。朴素地说,你应该预期在长代理运行中出现灾难性退化。

但经验记录比加性误差模型预测的更有趣。当有外部反馈时,长代理运行有时会自我修正——模型写代码、运行测试、看到失败、更新任务表示并修复错误。它搜索、发现矛盾证据并修改计划。失败的工具调用产生错误消息流回上下文,模型进行调整。熵是真实的,但并不总是单调递增。测试、工具、搜索结果、执行轨迹和持久状态约束了轨迹——它们通过迫使系统与真实世界碰撞来防止任意漂移。

所以熵问题是真实的,但并非硬墙。它更像是摩擦——降低性能、设定实际限制并需要工程关注,但不阻止有用的长时计算发生。

训练循环

更难的问题是将计算结构整合到优化层面而非框架层面意味着什么。目前,循环存在于梯度之外。模型主要训练于下一个token预测或指令遵循,而循环和状态管理发生在推理时,在训练过程从未见过的脚手架中——模型必须从其训练分布泛化到架构上不同于其明确优化的任何执行上下文,而它的表现比预期更好。

但存在明显的错配——梯度下降的强大之处在于它在确切的训练分布上找到结构。如果你关心的分布是多步代理执行——带状态的过程、循环、错误恢复、回溯、工具使用——那么在该分布上训练,计算结构内建而非附加,应该产生质上更好的结果。优化压力将应用于正确的地方。

有实际原因使得这尚未大规模实现。循环、有状态执行的训练基础设施比固定上下文下一个token预测复杂得多——计算在长展开中而非孤立前向传递中扩展糟糕,跨数十或数百步的信用分配确实困难。你需要知道哪些早期决策导致了后来的成功或失败,而信号会迅速稀释。这些是真正的障碍,而非借口。

因此我们默认了更清晰的分解:在下一个token预测上训练模型,事后添加循环,并希望能力泛化。这一希望已部分得到证实。“部分”是关键词。我们尚未拥有一个其内部表示被迭代、失败、自我修正和成功跨长计算轨迹的经验深刻塑造的模型。循环仍然主要存在于Python文件、外壳工具、编排代码和提示约定中。我们训练了转换器,然后将其包装在程序中。

Verplankalkül

这引出了编程语言——一个与计算紧密交织且我深爱的话题。Andrej Karpathy以指出英语现在是最大的编程语言而闻名。在很多时候我同意,或者至少:一个可计算的、以计算为中心的英语子集。但让我们仔细分析。英语不是形式语言。它没有严格的语法,没有形式定义的计算语义。要捕捉与编程语言等价的东西,我们需要重新措辞。

为此,我想介绍一种新型编程语言,我称之为Verplankalkül——一个混成词。Konrad Zuse,制造了第一台可编程计算机的人,将他的第一种编程语言命名为Plankalkül,字面意思是“计划演算”。德语口语词verplant意味着混乱、凌乱——字面意思是“计划错误”。因此Verplankalkül:混乱的计划演算。一种非正式编程语言。