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


他们使用了第二个Transformer模型将问题描述作为输入,但不是尝试生成代码来解决问题,而是用Transformer生成测试案例输入,并为每个问题抽样50个测试案例输入 。现在,他们不尝试生成输入与输出对,而只是试图产生一些与问题相关的现实输入 。所以,AlphaCode可能必须根据问题所在,生成字符串、二进制数或数字列表等 。

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

文章插图
图注:Tim Pearce对AlphaCode在测试时的三个阶段进行讲解
为什么这是个好主意?因为他们认为如果两个脚本对所有 50 个生成的测试所返回的答案是相同的,那么它们就可能使用相同的算法,并且可能不想浪费两个提交来尝试这两个脚本 。
所以,他们在这 50 个生成的输入上编译并运行大约 1000 个脚本 。然后,他们根据这 50 个虚构输入的输出对脚本进行聚类 。接着,他们会从每个聚类中选择一个示例脚本 。如果十个脚本中的任何一个通过了所有隐藏测试,那么这些脚本就是最终的10个脚本,他们也就成功地解决了编码问题,否则就是失败 。这就是 AlphaCode 在测试时的工作方式 。
清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的

文章插图
这其中涉及到对Transformer模型的训练,可以看下文 。
5
对数据集进行预训练与微调
AlphaCode 使用的是当今深度学习中相当标准的预训练微调过程 。
这里有两个数据集:第一个数据集是由各种编程语言组成的公共 Github 存储库,包含 715 GB 海量代码,用于预训练阶段,目的是让Transformer学习一些非常通用的知识,比如代码结构和语法 。
清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的

文章插图
第二个数据集要小得多,只服务于 AlphaCode 的目标,用于微调 。该数据集是从一些编码挑战网站上抓取的,包括Codeforces 。他们稍后会在数据集上进行测试,包含问题描述测试用例和人工编写的解决方案 。这些是数据集 。现在,我们该怎么处理它们?
清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的

文章插图
6
Transformer模型的训练过程
首先说一下预训练阶段 。
他们抓取了一些 github 代码,并随机选择所谓的枢轴点(pivot point) 。
清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的

文章插图
枢轴点之前的所有内容都会被输入编码器,而解码器的目标是重建枢轴点以下的代码 。
清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的

文章插图
编码器仅输出代码的向量表示,可用于整个解码过程 。
【清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的】解码器以自回归方式运行:首先预测代码的第一个标记 。然后,损失函数只是预测的 softmax 输出和真实令牌(token)之间的交叉熵 。第一个真正的令牌会成为解码器的输入,然后预测第二个令牌,并且当要求解码器预测代码令牌的意外结束时,重复此过程直到代码结束 。
现在,这些损失通过解码器和编码器反向传播,尽管事实证明:只为编码器添加第二个损失很重要 。
这被称为掩码语言,可以高效地建模损失 。将输入到编码器中的一些令牌清空 。作为一种辅助任务,编码器尝试预测哪个令牌被屏蔽 。一旦预训练任务完成,我们就进入微调任务 。
在这里,我们将问题描述的元数据和示例输入投喂到编码器中,并尝试使用解码器生成人工编写的代码 。这时,你可以看到这与编码器-解码器架构强制执行的结构非常自然地吻合,损失与预训练任务完全相同 。
还有一个生成测试输入的Transformer 。这也是从同一个 github 预训练任务初始化而来的,但它是经过微调来生成测试输入,而不是生成代码 。
7
Transformer架构
DeepMind 团队对各种大小的模型进行了实验 。经实验,较大规模的模型往往表现更好 。编码器和解码器本身由多头注意力层组成,且这些层非常标准 。
清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的

文章插图
8
其他技巧
该论文有许多进步之处 。在这里,我不打算全部介绍,只想强调一个我认为很酷炫的点,就是标签和评级增强,以及问题描述 。
清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的

文章插图
我们总是将元数据作为Transformer的输入 。这包括问题的编程语言难度等级 。一些问题的标签与解决方案在训练时是否正确?他们显然知道这些字段的值是什么,但是在测试时他们并不知道什么是酷炫的,那就是他们实际上可以在测试时将不同的内容输入到这些字段中以影响生成的代码 。例如,你可以控制系统将生成的编程语言,甚至影响这种解决方案 。


推荐阅读