良好编程的秘诀可能是忽略我们所知道的关于编写代码的一切。至少对于AI来说。
这看起来很荒谬,但 DeepMind 的新编码 AI 在竞争激烈的编程竞赛中击败了大约 50% 的人类编码员。从表面上看,这些任务听起来相对简单:每个编码员都会遇到一个日常语言问题,参赛者需要编写一个程序来尽快解决该任务——希望没有错误。
但这对 AI 程序员来说是一个巨大的挑战。智能体需要首先理解任务——这是人类自然而然的事情——然后为棘手的问题生成代码,即使是最优秀的人类程序员也面临挑战。
人工智能程序员并不是什么新鲜事。早在 2021 年,非营利研究实验室 OpenAI 就发布了Codex ,这是一个精通十几种编程语言并适应自然日常语言的程序。 DeepMind 的 AI 版本(称为AlphaCode)之所以与众不同,部分原因在于它不需要什么。
与以前的 AI 编码器不同,AlphaCode 相对幼稚。它没有任何关于计算机代码语法或结构的内置知识。相反,它的学习有点类似于幼儿掌握他们的第一语言。 AlphaCode 采用“仅数据”方法。它通过观察大量现有代码来学习,最终能够灵活地解构和组合“单词”和“短语”(在本例中为代码片段)以解决新问题。
当受到 CodeContest(竞争性编程的战斗折磨)的挑战时,AI 解决了大约 30% 的问题,同时击败了一半的人类竞争对手。成功率看似微不足道,但这些都是非常复杂的问题。例如,OpenAI 的 Codex 在面对类似基准时取得了个位数的成功。
“这非常令人印象深刻,他们能够在一些非常具有挑战性的问题上取得的表现,”麻省理工学院的 Armando Solar-Lezama 博士说,他没有参与这项研究。
AlphaCode 解决的问题与日常应用相去甚远——可以把它看作是学校里一场复杂的数学锦标赛。人工智能也不太可能完全接管编程,因为它的代码错误百出。但它可以接管平凡的任务,或者提供开箱即用的解决方案来避开人类程序员。
也许更重要的是,AlphaCode 为设计 AI 编码器的新方法铺平了道路:忘记过去的经验,只听数据。
“这个程序有机会创建正确的代码,这似乎令人惊讶,”卡内基梅隆大学和匹兹堡博世人工智能中心的 J. Zico Kolter 博士说,他没有参与这项研究。但 AlphaCode 显示的是,当“给定适当的数据和模型复杂性时,连贯的结构就会出现”,即使人工智能是否真正“理解”手头的任务还有待商榷。
编码语言
AlphaCode 只是利用 AI 生成更好程序的最新尝试。
编码有点像写食谱。每项任务都需要多层次的准确性:一个是程序的整体结构,类似于食谱的概述。另一个是用极其清晰的语言和语法详细说明每个过程,比如描述每个步骤要做什么,每种成分需要加入多少,在什么温度下使用什么工具。
这些参数中的每一个——比如,制作热巧克力的可可——在计算机程序中被称为“变量”。简而言之,程序需要定义变量——假设“c”代表可可。然后它将“c”与其他变量混合,例如牛奶和糖的变量,以解决最后一个问题:制作一杯热气腾腾的热巧克力。
困难的部分是将所有这些转化为人工智能,尤其是在输入一个看似简单的请求时:给我一杯热巧克力。
早在 2021 年,Codex 就首次涉足人工智能代码编写领域。该团队的想法是依靠 GPT-3,该程序以其在解释和模仿人类语言方面的实力风靡全球。它后来发展成为ChatGPT ,这是一个有趣且不那么邪恶的聊天机器人,可以进行令人惊讶的复杂和愉快的对话。
那么有什么意义呢?与语言一样,编码完全是关于变量、句法和结构的系统。如果现有算法适用于自然语言,为什么不使用类似的策略来编写代码呢?
人工智能编码人工智能
AlphaCode 采用了这种方法。
人工智能建立在称为“大型语言模型”的机器学习模型之上,该模型是 GPT-3 的基础。这里的关键方面是大量数据。例如,GPT-3 从数字书籍和维基百科文章等在线资源中获取了数十亿个单词,开始“解释”人类语言。 Codex 接受了从 Github(一个流行的在线软件库)抓取的超过 100 GB 的数据的训练,但在遇到棘手的问题时仍然失败了。
AlphaCode 继承了 Codex 的“核心”,因为它的运行方式也类似于大型语言模型。但有两个方面使它与众不同,科尔特解释说。
首先是训练数据。除了在 Github 代码上训练 AlphaCode 之外,DeepMind 团队还根据之前的两个数据集构建了一个来自 CodeContests 的自定义数据集,挑战超过 13,500 个。每个都附带了对手头任务的解释,以及跨多种语言的多个潜在解决方案。结果是针对手头的挑战量身定制的庞大训练数据库。
“可以说,对于任何 ML [机器学习] 系统来说,最重要的一课是它应该接受与它在运行时看到的数据相似的数据的训练,”Kolter 说。
第二招是人多势众。当 AI 逐段(或逐个令牌)编写代码时,很容易编写无效或不正确的代码,从而导致程序崩溃或输出古怪的结果。 AlphaCode 通过为单个问题生成超过一百万个潜在解决方案来解决这个问题——数量比以前的 AI 尝试还要多。
作为健全性检查并缩小结果范围,AI 通过简单的测试用例运行候选解决方案。然后它将相似的聚类,因此它只从每个聚类中确定一个来接受挑战。这是最具创新性的一步,康奈尔大学的凯文埃利斯博士说,他没有参与这项工作。
该系统运行良好。当面临一组新问题的挑战时,AlphaCode 用两种计算语言(Python 或 C++)吐出潜在的解决方案,同时剔除离谱的解决方案。当与 5,000 多名人类参与者进行对抗时,人工智能的表现优于大约 45% 的专业程序员。
新一代人工智能程序员
虽然还没有达到人类的水平,但 AlphaCode 的优势在于其完全的独创性。
AlphaCode 没有复制和粘贴以前训练代码的部分,而是提出了巧妙的片段,而没有在其“阅读材料”中复制大块代码或逻辑。这种创造力可能是由于其数据驱动的学习方式。
AlphaCode 缺少的是“机器学习模型中与……生成代码相关的任何架构设计,”Kolter 说。编写计算机代码就像建造一座复杂的建筑:它是高度结构化的,程序需要明确嵌入上下文的定义语法来生成解决方案。
AlphaCode 什么都不做。相反,它生成的代码类似于大型语言模型生成文本的方式,编写整个程序,然后检查潜在的错误(作为一名作家,这感觉奇怪地熟悉)。人工智能究竟是如何做到这一点的仍然是个谜——这个过程的内部运作被埋藏在它至今难以理解的机器“思想”中。
这并不是说 AlphaCode 已经准备好接管编程。有时它会做出令人头疼的决定,例如生成一个变量但不使用它。还有一个危险是,它可能会从有限数量的例子中记住小模式——一群抓我的猫等于所有的猫都是邪恶的——以及这些模式的输出。 Kolter 解释说,这可能会将它们变成随机鹦鹉,它们是不了解问题但可以鹦鹉学舌或“盲目模仿”可能解决方案的 AI。
与大多数机器学习算法类似,AlphaCode 也需要很少有人可以利用的计算能力,即使代码是公开发布的。
尽管如此,该研究暗示了自主人工智能编码器的替代路径。与其赋予机器传统的编程智慧,我们可能需要考虑这一步并不总是必要的。相反,与处理自然语言类似,AI 编码器成功所需的只是数据和规模。
Kolter 说得最好:“AlphaCode 投了骰子。数据集是公开的。让我们看看未来会怎样。”