网页视频抓取脚本(AlphaCode到底是怎么练成的?博士后TimPearce解析AlphaCode系统架构、「解题」原理、训练流程)
优采云 发布时间: 2022-02-20 13:20网页视频抓取脚本(AlphaCode到底是怎么练成的?博士后TimPearce解析AlphaCode系统架构、「解题」原理、训练流程)
AlphaCode 是如何产生的?
春节期间,DeepMind 的编程版 AlphaGo-AlphaCode 一度火爆到刷屏。它可以编写普通程序员水平的计算机程序,在 Codeforces 网站 的 10 个挑战中排名前 54.3%,击败了 46% 的参赛者。
这一成绩给程序员群体带来了不小的压力,仿佛纺织工人被纺织机器淘汰的历史正在重演。
那么,AlphaCode 为何如此强大?在最近的一段 YouTube 视频中,清华大学朱军博士后 Tim Pearce 详细分析了 AlphaCode 的系统架构、“问题解决”原理和训练流程。
原视频地址:
AlphaCode 到底是做什么的?
如前所述,DeepMind 研究人员在 Codeforces 挑战中对 AlphaCode 进行了测试。Codeforces 是一个拥有各种编程主题和各种竞赛的在线编程平台。它类似于国际象棋中使用的 Elo 评级系统,每周共享编程挑战和问题排名。与程序员在构建商业应用程序时可能面临的任务不同,Codeforces 的挑战更加独立,需要对计算机科学中的算法和理论概念有更广泛的理解,通常是逻辑、数学和编码专业知识的非常专业的组合。
下图是其中一个竞赛题的示例,包括竞赛题的描述、输入输出示例等。挑战者的任务是根据这些内容编写一段代码,使输出符合要求。
下面是 AlphaCode 编写的代码:
对于 AlphaCode,这只是一个适度的挑战。
在十个类似的挑战中,研究人员将问题输入 AlphaCode。然后,AlphaCode 会生成大量可能的答案,并通过运行代码和检查输出来筛选它们,就像人类竞争对手一样。“整个过程是自动的,无需手动选择最佳样本,”AlphaCode 论文的联合负责人 Yujia Li 和 David Choi 说。
为什么 AlphaCode 如此强大?
下图是AlphaCode的概念图。这是一个精心设计的系统,主要构建块是基于 Transformer 的语言模型。但本质上,没有一个组件是全新的。
“考场”上的 AlphaCode
我们先来看看上面的系统在测试时是如何工作的。
在解决编码问题时,AlphaCode 使用一种非常具体的协议,它决定了整个系统的管道。协议规定他们可以无限使用示例测试用例,因为这些是作为问题的一部分给出的。但是在提交隐藏测试用例时,他们将提交次数限制为 10 次(最多 10 次)。
在测试过程中,AlphaCode 经历了三个阶段。
在第一阶段,他们使用一个大型 Transformer 模型,该模型将问题描述示例测试和字符串中有关问题的一些元数据作为输入。然后他们从这个模型中取样,产生了大量的潜在解决方案。所以第一阶段有 100 万个可能的代码脚本。
在第二阶段,他们用示例测试用例测试了生成的 100 万组代码,其中 99% 没有通过测试,可以排除。这使可行代码集的数量减少到 1000 个左右(取决于问题的难度)。
在第三阶段,他们使用了第二个 Transformer 模型。该模型将问题描述作为输入,但不是尝试生成代码来解决问题,而是生成测试用例输入(每个问题 50 个输入)。也就是说,他们没有选择生成输入和输出对,而是一些与问题相关的实际输入。因此模型可能想要生成字符串、二进制数或序列(取决于问题的类型)。
这种方法有多好?他们推断,如果两个脚本在所有 50 次测试中返回相同的答案,那么它们可能使用了相同的算法。这避免了浪费两个提交来测试两个脚本。所以在第二步得到 1000 组脚本后,他们根据这 50 个生成的测试输入的输出对脚本进行聚类,然后从每个聚类中挑选一个示例脚本,一共 10 个。如果 10 个脚本中的一个通过所有隐藏的测试,他们成功解决了编程问题,否则他们失败了。
以上是测试中AlphaCode的工作原理,使用了两个Transformer模型。那么这两个模型是如何训练的呢?
AlphaCode 训练
AlphaCode 的训练分为两个阶段:预训练和微调。这个过程涉及两个数据集:第一个是一个公共的 GitHub 存储库,由各种编程语言组成,用于进行高达 715GB 数据的预训练;第二个是从各种编程挑战中采集的网站(包括 codeforces)采集用于微调的问题,包括问题描述、测试用例和人类程序员编写的答案。
有了数据集,下一步就是训练。
在预训练阶段,他们从 GitHub 上抓取一些代码并随机选择他们所谓的“枢轴点”。
直到枢轴点的所有内容都将被输入编码器,*敏*感*词*的目标是重建枢轴点以下的代码。编码器输出代码的向量表示,然后可以在整个解码过程中使用。
*敏*感*词*以自回归方式工作。它从预测代码的第一个标记开始。损失函数是预测的softmax输出和真实token之间的交叉熵。然后,第一个真实令牌成为*敏*感*词*的输入,然后预测第二个令牌。重复此过程,直到要求*敏*感*词*预测一个特殊的代码结束标记。现在,这些损失通过*敏*感*词*和编码器反向传播,但编码器添加第二个损失非常重要。这称为掩码语言建模损失:您将输入编码器的一些标记留为空白,作为一项附带任务,编码器将尝试预测哪个标记被掩码。
预训练结束后,微调步骤来了。在本次会议中,他们将问题描述元数据和示例的输入输入到编码器中,并尝试使用*敏*感*词*生*敏*感*词*工编写的代码。正如您在这一点上所看到的,这与编码器-*敏*感*词*架构所规定的结构非常自然地吻合。此阶段的损失与预训练中的损失完全相同。此外,这里还有第二个 Transformer 来生成测试输入。这也由相同的 GitHub 预训练任务初始化,但经过微调以生成测试输入而不是代码。
除了上面提到的一般训练步骤和架构之外,AlphaCode 还借鉴了其他近期论文的一些经验教训。蒂姆·皮尔斯(Tim Pearce)指出了其中一个更好的:
AlphaCode 的元数据条件
除了问题描述之外,研究人员总是将元数据作为 Transformer 的输入,包括编程语言、问题的难度级别、关于问题的一些标签以及解决方案是否正确等。在训练时,模型显然知道这些字段的值是什么,但在测试时,它们不知道。非常有趣的是,他们可以在测试时在这些字段中输入不同的内容来影响生成的代码。例如,您可以控制系统将生成的编程语言,甚至影响它尝试生成的解决方案的类型,例如是尝试动态编程方法还是执行穷举搜索。
他们在测试中发现,在对前 100 万个代码脚本进行采样时,随机化很多字段非常有帮助。因为,通过增加原创样本池的多样性,正确答案的概率会增加。
以上就是 Tim Pearce 对 AlphaCode 的所有分析。他认为,DeepMind 团队在这项工作上确实取得了一些进展。但他更不解的是:为什么他们在这些编程问题上的成绩远不如在围棋、星际争霸等游戏中取得的超人成绩?Tim Pearce 最初的猜测是编程问题更难,数据更难获取,因为在游戏中你可以无限制地生成大量模拟数据,但在编程问题中你不能这样做。