当前位置: 首页 > 科技观察

清华博士后用了10分钟讲解了AlphaCode背后的技术原理,原来程序员不是那么容易被取代的!

时间:2023-03-17 01:44:55 科技观察

本文转载自雷锋网。如需转载,请在雷锋网官网申请授权。前不久,DeepMind团队发布了一款可以自动生成竞赛级代码的人工智能系统——AlphaCode,号称“媲美普通程序员”。一经发表,在国内外人工智能界引起巨大轰动。-论文地址:https://storage.googleapis.com/deepmind-media/AlphaCode/competition_level_code_generation_with_alphacode.pdf-数据集:https://github.com/deepmind/code_contests根据DeepMind的博客,AlphaCode被称为“世界上最“强算法平台”在Codeforces上经过了10个5000个用户解决的挑战测试,AlphaCode能够在这10个挑战中以与人类完全相同的格式自动输入代码,生成大量可能的答案,然后筛选出可行的答案通过像人类程序员一样跑代码和检查,最终取得了人类程序员中排名前54%的好成绩,换句话说,AlphaCode的代码能力堪比几乎一半参加过的程序员(2300人)在Codeforces上测试,按照初级程序员2万元的月薪计算,AlphaCode预计每年可为全球人力资本家节省5.52亿的人力成本ar,让一半的程序员失业……不过,DeepMind团队当时也明确指出:AlphaCode目前只适用于竞技类。编程比赛。不可否认,这是继DeepMind发布AlphaGo、AlphaZero和AlphaFold之后的又一研究突破,大大增加了其Alpha系列的传奇色彩。不过,与这个系列的其他作品相比(比如AlphaGo战胜围棋世界冠军),AlphaCode的表现似乎并不突出。目前在清华大学朱军手下从事博士后研究的TeaPearce对AlphaCode和DeepMind的技术原理非常感兴趣。仔细阅读了这篇31页的论文后,我做了一个短视频并发布在了Youtube上。我从系统概述、测试阶段、数据集的预训练和微调、Transformer模型的训练过程和Transformer架构等方面详细分析了AlphaCode。更详细地解释。视频地址:https://www.youtube.com/watch?v=YjsoN5aJChA和OpenAI开发的GPT-3一样,AlphaCode也是基于Transformer模型,但前者侧重于语音生成,后者侧重于顺序文本(如代码)分析。下面AI科技评论就此短视频进行了简单梳理:1AlphaCode的代码问题目前,AlphaCode的目标编码问题集中在特定的比赛类型上,在Codeforces等网站上参与编码挑战。测试用例的简短描述和示例为挑战者提供了与正确预期输出相匹配的输入。简而言之,这些挑战的目标是编写一些代码,为示例测试用例和一组隐藏的测试用例提供预期的输出。如果您的代码通过了所有测试,那么您就解决了问题。根据DeepMind的说法,AlphaCode在Codeforces网站举办的编程挑战赛中取得了与普通用户相当的成功率。2AlphaCode系统概述那么,AlphaCode的工作原理是什么?在DeepMind团队发表的文章“Competition-LevelCodeGenerationwithAlphaCode”中,他们给出了高层次的概述(下)。如图所示,AlphaCode的核心组件仍然是Transformer语言模型,其余的个别组件也都是旧的。图例:AlphaCode的系统图3中使用的协议我们先来看看AlphaCode在测试过程中是如何工作的。首先要知道的是,在解决写代码的问题时,AlphaCode使用了一个非常具体的协议(protocol),这个协议决定了系统的流水线。根据该论文,DeepMind团队获准使用问题中包含的尽可能多的示例测试用例。但是,他们确实将测试限制在10个已提交的隐藏测试发送案例。AlphaCode的4个测试阶段AlphaCode的测试时间分为三个独立的阶段。他们首先使用了一个大规模的Transformer模型,将问题描述示例测试和一些关于问题的元数据作为输入,然后从模型中抽样生成大量潜在的解决方案。产生大量潜在解决方案的原因首先是大多数脚本无法由某些人甚至编译器编译。因此,在第二阶段和第三阶段,他们主要对这100万个潜在代码脚本进行“减法”,在给定协议的前提下,挑选出10个他们认为可能有用的解决方案。而且他们的做法也很简单,就是对example测试用例中的100万个代码脚本进行测试,然后排除掉大约99%的测试失败的脚本,这样脚本的数量就减少到了数千个。但是,该协议要求它继续缩小到10个解决方案。因此,他们采取了一种非常聪明的方法:他们使用了第二个Transformer模型,将问题描述作为输入,但他们没有尝试生成代码来解决问题,而是使用Transformer生成测试用例输入并为每个问题采样50输入测试用例。现在,他们不再尝试生成输入和输出对,而是尝试生成一些与问题相关的实际输入。因此,AlphaCode可能需要根据问题生成字符串、二进制数或数字列表等。图例:TimPearce在测试期间解释了AlphaCode的三个阶段。为什么这是个好主意?因为他们认为如果两个脚本对所有50个生成的测试返回相同的答案,那么他们可能使用相同的算法,并且可能不想浪费两次提交尝试两个脚本。因此,他们在这50个生成的输入上编译并运行了大约1000个脚本。然后,他们根据这50个虚构输入的输出对脚本进行聚类。接下来,他们从每个集群中选择一个示例脚本。如果这十个脚本中的任何一个通过了所有的隐藏测试,那么这些脚本就是最后的10个脚本,它们成功地解决了编码问题,否则它们就失败了。这就是AlphaCode在测试时的工作方式。这就涉及到Transformer模型的训练,见下图。5预训练和微调数据集AlphaCode在当今的深度学习中使用相当标准的预训练和微调过程。这里有两个数据集:第一个数据集是由各种编程语言组成的公共Github仓库,包含715GB的海量代码,用于预训练阶段,目的是让Transformer学习一些非常通用的知识,比如代码结构和语法。第二个数据集要小得多,仅用于AlphaCode的目的,用于微调。这个数据集是从一些编码挑战网站上抓取的,包括Codeforces。他们稍后在数据集上进行测试,其中包含描述问题的测试用例和人工编写的解决方案。这些是数据集。现在,我们如何处理它们?6Transformer模型的训练过程首先说一下预训练阶段。他们抓取一些github代码并随机选择他们所谓的枢轴点。枢轴点之前的所有内容都被输入编码器,解码器的目标是重构枢轴点以下的代码。编码器只是输出代码的向量表示,可以在整个解码过程中使用。解码器以自回归方式运行:它首先预测代码的第一个标记。损失函数就是预测的softmax输出和真实标记之间的交叉熵。第一个真标记成为解码器的输入,然后解码器预测第二个标记,当解码器被要求预测代码标记的意外结束时,重复此过程直到代码结束。现在,这些损失通过解码器和编码器反向传播,尽管事实证明只为编码器添加第二个损失很重要。这称为掩码语言,可以有效地模拟损失。清除一些输入编码器的标记。作为一项辅助任务,编码器试图预测哪个标记被屏蔽。预训练任务完成后,我们将继续进行微调任务。在这里,我们将问题描述的元数据和示例输入提供给编码器,并尝试使用解码器生成人工编写的代码。此时,您可以看到这非常自然地符合编码器-解码器架构强制执行的结构,并且损失与预训练任务完全相同。还有一个生成测试输入的Transformer。这也是从相同的github预训练任务初始化的,但它经过微调以生成测试输入而不是代码。7TransformerArchitectureDeepMind团队试验了各种尺寸的模型。实验上,规模较大的模型往往表现更好。编码器和解码器本身由多头注意力层组成,这些层是非常标准的。8其他提示本文有许多进步。在这里,我不会一一列举,只是想强调一点我认为很酷的地方,那就是标签和评级的增强,以及问题描述。我们总是将元数据作为Transformer的输入。这包括问题的编程语言难度级别。一些问题的标签和解决方案在训练过程中是否正确?他们显然知道这些字段的值是什么,但他们在测试时不知道的是,很酷的是他们实际上可以在测试时将不同的东西放入这些字段中以影响生成的代码。例如,你可以控制系统生成的编程语言,甚至影响这个解决方案。它试图生成答案,例如是尝试动态编程方法还是进行详尽搜索。他们在测试时发现有用的是,当他们对100万个解决方案的初始池进行采样时,将其中的许多字段随机化。通过在这个初始池中具有更多多样性,其中一个代码脚本更有可能是正确的。9结语以上是TeaPearce对AlphaCode工作原理的解释。他从AlphaCode的工作出发,谈了自己的思考:为什么DeepMind团队在这些编码问题上所达到的性能水平远低于围棋(AlphaGo)或星际争霸(AlphaZero)游戏中的超人水平系统?TeaPearce的分析是,从自然语言描述中编写代码本质上比玩游戏更难,但这也可能是因为游戏中可用的数据要少得多。你想模拟多少数据就模拟多少,编码问题的数量是有限的。最后,TeaPearce提出了一个问题:AI难写代码的原因可能是什么?未来AI的代码水平如何超越人类的最优水平?