今年12月,就在OpenAI的ChatGPT势头正盛之际,曾经拿下半数程序员的AlphaCode登上了Science的封面!论文链接:https://www.science.org/doi/10.1126/science.abq1158说到AlphaCode,想必大家都不陌生。早在今年2月,它就悄悄参加了著名的Codeforces上的10场编程比赛,一举击败了一半的人类编码员。我们都知道在程序员中很流行这样的测试——编程竞赛。在比赛中,主要考验的是程序员通过经验进行批判性思考并针对不可预见的问题创造解决方案的能力。这体现了人类智能的关键,而机器学习模型往往很难模仿这种人类智能。但是DeepMind的科学家打破了这个规则。YujiALi等。使用自监督学习和编码器-解码器转换器架构开发了AlphaCode。AlphaCode的开发是在国内完成的。虽然AlphaCode也是基于标准的Transformer编解码器架构,但DeepMind对其进行了“史诗般”的增强——它使用基于Transformer的语言模型以前所未有的规模生成。代码,然后巧妙地筛选出一小部分可用程序。具体步骤为:1)Multi-queryattention:让每个attentionblock共享key和valueheader,同时结合encoder-decoder模型,使AlphaCode的采样速度提高了10倍以上。2)Maskedlanguagemodeling(MLM):通过在encoder中加入MLMloss,提高模型的求解率。3)Tempering:使训练分布更尖锐,从而防止过拟合的正则化效应。4)价值调节和预测:通过区分CodeContests数据集中正确和错误的问题提交来提供额外的训练信号。5)ExamplaryOff-StrategyLearningGeneration(GOLD):通过将训练重点放在每个问题最可能的解决方案上,让模型为每个问题生成正确的解决方案。好吧,结果大家都知道了。凭借1238的Elo分数,AlphaCode让自己在这10场比赛中排名前54.3%。纵观前6个月,这个成绩已经达到了前28%。要知道,为了达到这个排名,AlphaCode必须“过五关斩六将”,解决各种结合批判性思维、逻辑、算法、编码和自然语言理解的新问题。从结果来看,AlphaCode不仅解决了CodeContests数据集中29.6%的编程问题,而且其中66%的问题在第一次提交时就解决了。(投稿总数限制为10个)相比之下,传统Transformer模型的求解率比较低,只有个位数。对于这个结果,就连Codeforces的创始人Mirzayanov都非常惊讶。毕竟,编程竞赛考验的是发明算法的能力,这一直是AI的弱点,也是人类的强项。我可以肯定地说AlphaCode的结果超出了我的预期。一开始我很怀疑,因为即使是简单的竞赛题,算法不仅需要实现,还需要发明(这是最难的部分)。AlphaCode使自己成为许多人类的强大对手。我迫不及待地想看看未来会怎样!——MikeMirzayanov,Codeforces创始人那么,AlphaCode能抢走程序员的饭碗吗?当然不是。AlphaCode只能完成简单的编程任务。如果任务变得更复杂,问题更“不可预见”,那么只会将指令翻译成代码的AlphaCode将束手无策。毕竟1238的分数,从某种角度来说,相当于一个刚学编程的中学生的水平。这个水平对真正的编程高手来说是不构成威胁的。但毫无疑问,此类编码平台的开发将对程序员的生产力产生巨大影响。甚至,整个编程文化可能会发生改变:或许,在未来,人类只需要负责制定问题,而生成和执行代码的任务就可以交给机器学习。编程比赛有什么难的?我们知道,虽然机器学习在生成和理解文本方面取得了长足进步,但大多数人工智能目前仅限于解决简单的数学和编程问题。他们会做的就是检索和复制现有的解决方案(相信最近玩过ChatGPT的人都会对此深有体会)。那么为什么人工智能学习生成正确的程序如此困难呢?1.要生成解决给定任务的代码,需要搜索所有可能的字符序列,其中只有一小部分对应于有效的正确程序。2.对一个角色的编辑可以完全改变程序的行为,甚至导致程序崩溃,而且每个任务都有许多截然不同的有效解决方案。对于难度极高的编程竞赛,AI需要理解复杂的自然语言描述;它需要对以前从未见过的问题进行推理,而不是简单地记住代码片段;它需要掌握各种算法和数据结构,并准确地完成长达数百行的代码。此外,为了评估它生成的代码,AI对一组详尽的隐藏测试执行任务,检查执行速度和边缘情况的正确性。(A)问题1553D,难度适中,1500分;(B)AlphaCode生成的题解以这道1553D题为例,参赛者需要想办法利用有限的输入集,将一串随机重复的s和t字母转换成另一串相同的字母。参赛者不能只输入新字母,必须使用“退格”命令删除原字符串中的几个字母。比赛具体情况如下:对此,AlphaCode给出的解决方案如下:此外,AlphaCode的“解题思路”不再是黑框,还可以展示代码和高亮位置注意力。AlphaCode的学习系统在参加编程竞赛时,AlphaCode面临的主要挑战是:(i)需要在巨大的程序空间中搜索,(ii)只有大约13,000个示例任务可供训练,以及(iii)每个Issue提交都是有限的。为了应对这些问题,AlphaCode整个学习体系的构建分为三个环节,预训练、微调、采样和评估,如上图所示。预训练在预训练阶段,使用GitHub上收集的715GB人类代码快照对模型进行预训练,并使用交叉熵next-token来预测损失。在预训练过程中,代码文件被随机分为两部分,第一部分作为编码器的输入,训练模型去掉编码器生成第二部分。这种预训练为编码学习了强大的先验知识,从而可以在较小的数据集上进行后续特定于任务的微调。微调在微调阶段,模型在DeepMind创建并命名为CodeContests的2.6GB竞争性编程问题数据集上进行了微调和评估,用于公开发布。CodeContests数据集包括问题和测试用例。训练集包含13,328个问题,每个问题平均有922.4个提交的答案。验证集和测试集分别包含117和165个问题。在微调期间,自然语言问题陈述被编码到程序注释中,使其看起来更类似于预训练期间看到的文件(可以包括扩展的自然语言注释),并且使用相同的下一个标记预测损失。采样为了选择提交的10个最佳样本,使用过滤和聚类来使用问题陈述中包含的示例测试来执行样本,并删除未通过这些测试的样本。过滤掉近99%的模型样本,对剩余的候选样本进行聚类,对由单独的transformer模型生成的输入执行这些样本,并将在生成的输入上产生相同输出的程序归类为一种类型。然后,从10个最大的集群中各选出一个样本进行提交。直觉上,正确的程序表现相同并形成大集群,而错误的程序以多种方式失败。评估上图显示了模型性能如何随着更多样本量和10@k指标的计算而变化。从采样结果的性能评估中,研究人员得出以下四个结论:1.分辨率随着样本量的增加呈对数线性增长;高坡度;3.求解速度随着计算量的增加呈对数线性增长;4.样本选择对于解决率的缩放至关重要。纯粹的“数据驱动”毫无疑问,AlphaCode的推出代表着机器学习模型的发展迈出了实质性的一步。有趣的是,AlphaCode不包含有关计算机代码结构的明确内置知识。相反,它依赖于一种纯粹的“数据驱动”方法来编写代码,即通过简单地观察大量现有代码来学习计算机程序的结构。文章地址:https://www.science.org/doi/10.1126/science.add8258从根本上说,AlphaCode在竞争性编程任务上优于其他系统的原因归结为两个主要属性:1.训练数据2.候选人的后处理解决方案但是计算机代码是一种高度结构化的介质,程序必须遵守定义的语法,并且必须在解决方案的不同部分产生明确的前置条件和后置条件。但是AlphaCode在生成代码时使用的方法与生成其他文本内容时完全一样——一次一个token,只是在整个程序写完后才检查程序的正确性。给定适当的数据和模型复杂性,AlphaCode可以生成连贯的结构。然而,这个顺序生成过程的最终配方深埋在LLM的参数中,仍然难以捉摸。不过,不管AlphaCode是否真正“理解”编程问题,它在编程竞赛中确实达到了人类的平均水平。“解决编程竞赛的问题是一件非常困难的事情,需要人类具备良好的编码能力和解决问题的创造力。AlphaCode能够在这个领域取得进步让我印象深刻,我很高兴看到我们看到如何该模型利用其对语句的理解来生成代码,并指导其随机探索来创建解决方案。-PetrMitrichev,谷歌软件工程师和世界级竞技程序员AlphaCode在编程竞赛中排名前54%,展示了深度学习模型在需要批判性思维的任务中的潜力。这些模型优雅地利用现代机器学习将问题的解决方案表达为代码,回到几十年前AI的符号推理根源。而这仅仅是个开始。未来会诞生更强大的解决问题的AI,或许这一天不远了。
