怎样抓取网页数据( AI科技评论报道不久前发布一个可以自动生成竞赛级代码的人工智能系统 )
优采云 发布时间: 2022-02-12 09:24怎样抓取网页数据(
AI科技评论报道不久前发布一个可以自动生成竞赛级代码的人工智能系统
)
AI Technology Review 报道称,不久前,DeepMind 团队发布了一款可以自动生成竞赛级代码的人工智能系统——AlphaCode。
-论文地址:
-数据集:
根据 DeepMind 的博客,AlphaCode 在号称“世界上最强大的算法平台”的 Codeforces 上针对 5000 名用户解决的 10 个挑战进行了测试。AlphaCode 能够自动在这 10 个挑战中以与人类完全相同的格式输入代码,生成大量可能的答案,然后像人类程序员一样筛选代码并检查可行的答案,最终达到人类排名程序员在前 54% 中取得了不错的成绩。
换言之,AlphaCode 的编码能力与参加过 Codeforces 测试的几乎一半的程序员(2300 名)相当。按照一个初级程序员月薪2万元的算法,AlphaCode预计每年为全球人力资本家节省5.52亿的人工成本,让一半的程序员失业……
不过,DeepMind 团队当时也明确表示:AlphaCode 目前只适合竞技编程比赛。
不可否认,这是 DeepMind 发布 Alpha Go、AlphaZero 和 AlphaFold 之后的又一研究突破,大大增加了其 Alpha 系列的传奇色彩。但相比系列中的其他作品(比如AlphaGo击败世界围棋冠军),AlphaCode的表现似乎并不出众,
Tea Pearce 目前在清华大学朱军手下做博士后,对 AlphaCode 的技术原理非常感兴趣。在仔细阅读了 DeepMind 的 31 页论文后,他制作了一个短视频并在 YouTube 上发布。,数据集的预训练和微调,Transformer模型和Transformer架构的训练过程等维度对AlphaCode的细节进行了更详细的讲解。
视频地址:
与 OpenAI 之前开发的 GPT-3 一样,AlphaCode 也是基于 Transformer 模型,但前者侧重于语言生成,而后者侧重于对顺序文本(如代码)的解析。
以下AI技术回顾简要整理短视频:
1
AlphaCode 的代码问题
目前,AlphaCode 的目标编码问题专注于特定的竞赛类型,参与 Codeforces 的 网站 等编码挑战,其中这些挑战包括对问题的简短描述和带有测试用例的示例,为挑战者提供匹配的输入正确的预期输出。
简而言之,这些挑战的目标是编写一些代码,为示例测试用例和一组隐藏的测试用例提供预期的输出。如果您的代码通过了所有测试,那么您已经解决了问题。
据 DeepMind 称,AlphaCode 在 Codeforces网站 组织的编码挑战中取得了与普通用户相当的成功率。
2
AlphaCode 系统概述
那么,AlphaCode 究竟是如何工作的呢?
在 DeepMind 团队发表的文章《Competition-Level Code Generation with AlphaCode》中,他们给出了高层次的概述(下)。如图所示,AlphaCode 的核心组件依然是 Transformer 语言模型,剩下的个别组件也老了。
图注:AlphaCode系统图
3
使用的协议
让我们先来看看 AlphaCode 在测试期间是如何工作的。
首先要知道的是,在解决编写代码的问题时,AlphaCode 使用了一个非常具体的协议,而该协议决定了系统的管道。根据论文,DeepMind 团队被允许使用尽可能多的示例测试用例,因为这些测试用例也收录在问题中。
但是,他们确实将测试限制为 10 个提交的隐藏测试发送案例。
4
AlphaCode 在测试阶段
AlphaCode 的测试时间分为三个独立的阶段。
他们首先使用了一个*敏*感*词*的 Transformer 模型,该模型将问题描述示例测试和有关该问题的一些元数据作为输入,然后从模型中进行采样以生成大量潜在的解决方案。首先生成大量潜在解决方案的原因是大多数脚本无法由某人编译,甚至无法由编译器编译。
因此,在第二阶段和第三阶段,他们主要“减去”了 100 万个潜在的代码脚本,并在给定协议的前提下,选择了 10 个他们认为可能有用的解决方案。而且他们的做法也很简单,就是对样本测试用例中的100万个代码脚本进行测试,然后剔除大约99%的测试不通过的脚本,从而将脚本数量减少到数千个。
但是,该协议要求它继续缩小到 10 个解决方案。所以他们采取了一个非常聪明的方法:
他们使用第二个 Transformer 模型将问题描述作为输入,但他们没有尝试生成代码来解决问题,而是使用 Transformer 生成测试用例输入,并为每个问题抽取 50 个测试用例输入。现在,他们不再尝试生成输入和输出对,而是尝试生成一些与问题相关的实际输入。因此,AlphaCode 可能必须根据问题生成字符串、二进制数或数字列表等。
图例:Tim Pearce 在测试过程中解释了 AlphaCode 的三个阶段
为什么这是个好主意?因为他们认为如果两个脚本为所有 50 个生成的测试返回相同的答案,那么他们可能使用相同的算法,并且可能不想浪费两个提交来尝试两个脚本。
因此,他们在这 50 个生成的输入上编译并运行了大约 1000 个脚本。然后,他们根据这 50 个虚构输入的输出对脚本进行聚类。接下来,他们从每个集群中选择一个示例脚本。如果十个脚本中的任何一个通过了所有隐藏测试,那么这些脚本就是最后的 10 个脚本并且它们成功解决了编码问题,否则它们失败。这就是 AlphaCode 在测试时的工作方式。
这涉及到 Transformer 模型的训练,如下图所示。
5
预训练和微调数据集
AlphaCode 使用当今深度学习中相当标准的预训练微调过程。
这里有两个数据集:第一个数据集是由各种编程语言组成的公共 Github 存储库,收录 715 GB 的海量代码,用于预训练阶段,目的是让 Transformer 学习一些非常通用的知识,例如代码结构和句法。
第二个数据集要小得多,仅用于 AlphaCode 的微调目标。该数据集是从几个编码挑战网站 中提取的,包括 Codeforces。他们稍后在收录问题描述测试用例和人工编写的解决方案的数据集上进行测试。这些是数据集。现在,我们如何处理它们?
6
Transformer模型的训练过程
让我们先谈谈预训练阶段。
他们抓取了一些 github 代码并随机选择了所谓的枢轴点。
枢轴点之前的所有内容都输入编码器,*敏*感*词*的目标是重建枢轴点以下的代码。
编码器仅输出代码的向量表示,可在整个解码过程中使用。
*敏*感*词*以自回归方式运行:它首先预测代码的第一个标记。那么,损失函数就是预测的softmax输出和真实token之间的交叉熵。第一个真正的令牌成为*敏*感*词*的输入,然后*敏*感*词*预测第二个令牌,并且当要求*敏*感*词*预测代码令牌的意外结束时,重复此过程直到代码结束。
现在,这些损失通过*敏*感*词*和编码器反向传播,尽管事实证明:只有在编码器上增加第二个损失很重要。
这称为掩码语言,可以有效地对损失进行建模。清空一些输入到编码器中的令牌。作为一项辅助任务,编码器尝试预测哪个标记被屏蔽。一旦预训练任务完成,我们将继续进行微调任务。
在这里,我们将问题描述元数据和示例输入提供给编码器,并尝试使用*敏*感*词*生*敏*感*词*工编写的代码。此时,您可以看到这与编码器-*敏*感*词*架构强制执行的结构非常自然地吻合,损失与预训练任务完全相同。
还有一个生成测试输入的 Transformer。这也是从相同的 github 预训练任务初始化的,但经过微调以生成测试输入而不是生成代码。
7
变压器架构
DeepMind 团队尝试了各种尺寸的模型。实验表明,较大的模型往往表现更好。编码器和*敏*感*词*本身由多头注意力层组成,这些层非常标准。
8
其他技巧
这篇论文有很多进步。我不打算在这里全部介绍,只是为了强调我认为很酷的一点,即标记和评级增强,以及问题描述。
我们总是将元数据作为 Transformer 的输入。这包括问题的编程语言难度级别。一些问题标签和解决方案在训练时是否正确?他们明明知道这些字段的值是什么,但他们不知道在测试时有什么厉害之处,那就是他们实际上可以在测试时在这些字段中键入不同的东西来影响生成的代码。例如,您可以控制系统将生成的编程语言,甚至影响该解决方案。
它试图生成答案,例如是尝试动态编程方法还是进行详尽的搜索。他们在测试时发现有用的是,当他们对 100 万个解决方案的初始池进行抽样时,他们随机化了许多字段。通过在这个初始池中具有更多的多样性,其中一个代码脚本更有可能是正确的。
9
结论 以上是 Tea Pearce 对 AlphaCode 工作原理的解释。他从在 AlphaCode 的工作谈起自己的想法:为什么 DeepMind 团队在这些编码问题上的表现水平远低于围棋(AlphaGo)或星际争霸(AlphaZero)游戏中的超人级别系统? Tea Pearce 的分析是,从自然语言描述中编写代码本质上比玩游戏更困难,但这也可能是因为游戏中可用的数据要少得多。您可以根据需要模拟尽可能多的数据,并且编码问题的数量是有限的。最后,Tea Pearce 提出了一个问题:人工智能难以编码的原因可能是什么?未来,人工智能的代码水平如何超越人类的最优水平?欢迎在评论区留言讨论。
参考链接:
1.
2.
3.
4.