导语
AlphaCode是DeepMind在CodeX发表后紧随其后发表的一篇工作,该工作相比于CodeX可以接收更加长的输入和程序竞赛级别的题目难度,并在在线评测中打败了一半的人类参赛者。
- 会议: arxiv
- 链接: arxiv.org/pdf/2203.07…
- 学习资料:OpenAI Codex 论文精读【论文精读】,跟李沐学AI,哔哩哔哩
1 简介
代码生成是一个有挑战性的任务,最近的一些工作在这方面取得了令人印象深刻的表现,但这些工作如CodeX只能处理简单的任务描述和简短的解决方案,远远没有现实世界编程的全部复杂性。
编程竞赛的题目则具有较高的复杂性,解决这类问题需要理解复杂的自然语言描述,推理以前未见过的问题,掌握广泛的算法和数据结构,并精确地实现跨越数百行的解决方案。最著名的国际大学生编程大赛(ICPC)和国际信息学奥林匹克竞赛(IOI)等活动被广泛认为是计算机科学领域最负盛名的比赛之一,吸引了来自世界各地的数十万参与者。使用人类从这种经过战斗考验的竞争中发现具有挑战性的问题,可以确保对捷径的鲁棒性,并为智能的许多方面提供有意义的基准。
本文提出了一个用于解决竞争性编程问题的代码生成系统AlphaCode。通过使用大型Transformer语言模型来生成代码,在选定的GitHub代码上对它们进行预训练,并对我们策划的竞争性编程问题进行微调。对于每一个看不见的问题,我们生成一个大的程序样本集,根据问题描述中的示例测试的执行结果对它们进行筛选,然后对剩余的样本进行聚类,以获得一个小的候选样本集,以便提交进行评估。在Codeforces编程竞赛平台上,AlphaCode被估计取得了1238分,超过了72%的人类参赛者。
2 问题建立
2.1 编程竞赛
一个编程竞赛的题目样例如下图所示:
相比于之前CodeX那种简单的题目,这里的难度和复杂度提高了很多。图3给出了AlphaCode给出的解法,可以看到还是非常的长的一段文本。
2.2 评估
评价指标采用 n@k,即“每个问题通过𝑘个样本的𝑛次提交解决的问题的百分比”(可以类比于CodeX那里的Pass@k,但这里的n是Pass@中的k)。
3 数据集
有两个数据集:
- 预训练数据集
- 微调数据集
3.1 预训练数据集
AlphaCode的预训练数据也是采样自Github,只不过它采样的时间比CodeX晚一年,而且采样的语言种类也多一些,最后得到了715.1GB的数据(CodeX应该是150GB左右)。
3.2 微调数据集
既然要做程序竞赛,那么微调数据集就要和其格式尽量相同,作者从Codeforce网站上爬取了一些数据作为辅助的微调数据集,并且命名为CodeContents,其统计指标如下:
表2展示了一些数据集中的质量。有时,模型生成的代码并不一定是完全正确的,但由于测试样例覆盖不全,导致“Flase Postive”现象的出现。 SlowRate则是说模型生成的可能是低效的算法,但由于测试样例中不存在大量数据的情况,导致没法判断出来的比例。作者比较了自己提出的CodeContents和之前的数据集的比较,可以看到作者提出的数据集(CodeContents Raw)在没有添加生成的隐藏样例时,FP也是很高的,在补充到200个左右的测样样例后,FP就会大大下降。
4 模型
4.1 模型架构
采用Encoder-Decoder的基础Transformer架构。表3展示不同size的AlphaCode模型的参数情况。这里可以看到,作者改进了Attention head中的Query和KV的数目,他们不相等。而且,Encoder和Decoder的数据也是不相等的。
编码器的长度是1536,解码器的长度是768也是非对称的。使用SentencePiece作为Tokenizer,词表大概有8000个token左右。
4.2 预训练
预训练时,解码器使用标准cross-entropy next token prediction loss,编码器使用masked language modeling loss。MLM loss对于提高编码器的表示学习能力至关重要。
4.3 微调
在微调阶段,作者使用了三个新的技术:
- Tempering:
作者使用了一个小的温度 T=0.2
For high temperatures (τ→∞), all [samples] have nearly the same probability and the lower the temperature, the more expected rewards affect the probability. For a low temperature (τ→0+), the probability of the [sample] with the highest expected reward tends to 1.
from Wikipedia article on softmax function
- Value conditioning & prediction:
作者同时利用了训练样例中的不正确的解,只是在训练时会加入一个前置字符串CORRECT SOLUTION等,如下图所示:
- GOLD:
这是一个离线的强化学习方法,旨在让模型更加关注于正确的一个解。
4.4 大规模采样
AlphaCode提供了三种采样的策略:
- 生成一半Python,一半C++
- 通过修改图5中的提示,得到不同的解
- 采用更高的温度,生成更加多样的解
同时,作者也使用了CodeX中提到的TopK输出和nucleus sampling,发现没有太大必要去做。
4.5 过滤
作者使用程序题目中提供的样例输入和样例输出进行测试,如果测试通过则认为正确。这样就可以过滤掉99%的问题。
4.6 聚类
额外采用一个之前预训练好的一模一样的模型,这个模型在Fine-tune时用来生成一些测试样例(不一定正确),然后让模型生成过滤后的程序来接收这些测试样例,得到输出后,根据输出的结果进行聚类,每个类中的程序可以认为是语义相似的,只需要将聚类按大小排序,然后从大到小作为最终的提交次序来提交。
5 实验
在Codeforce平台上的成绩如下图所示:
最终的测试结果如下表所示:
一些不同设置的实验结果如下图所示:
可以看到,采样越多,效果越好;模型size越大,效果越好,且有参数量指数增长,性能线性增长的趋势。
作者还对比了不同模型的结构对于模型预测的影响:包括只用decoder、标准的Multi-head attention等。整体Performance没有太大变化,但是作者采用的这种是最快的。
下表展示了预训练的数据集对最终结果的影响:
最后,作者展示了不同技术加进去后的提升情况,
下图会更直观一些
6 分析
- 作者分析了模型会不会“抄袭”某些代码片段。
2. 作者分析了机器生成的代码中有一些无用的代码片段。
- 对问题的描述是不是很敏感:主要是说如果你把问题描述更加精简了,模型的性能会提升。这也说明,模型理解长文本可能还有待提升。其次,对标签的敏感程度,作者尝试了标签随机化,效果最好。
- 验证损失并没有太多的用:验证损失增加,Performance上升
7 相关工作
写的还是比较详细的,有兴趣的同学可以细读一下。
8 影响
略
本文转载自: 掘金