当前位置: 华文星空 > 体育

【简要笔记】deepmind新工作:alphacode

2022-02-06体育

今天上午被alphacode刷屏了,都在说以后找不到工作了,被激起了好奇心。粗略看一下这个工作。

论文的preprint在这儿:https:// storage.googleapis.com/ deepmind-media/AlphaCode/competition_level_code_generation_with_alphacode.pdf

背景

alphacode 这个工作主要是提出一个方法,可以生成代码用于 codeforce 的题目。类似的工作近几年有不少,比如 Evaluating large language models trained on code,Program synthesis with large language models。alphacode 的区别在于它是在竞赛任务上做的,并且精度不错。

方法

方法不复杂,paper里面这张图概括得很好,分为4个步骤

  1. pretrain:在github的数据集上做pretrain。模型就是BERT,pretrain方法也差不多。
  2. fine-tune:在 codeforce 数据集上做 fine-tune,这个模型是标准的基于 transformer 的 encoder-decoder 结构,encoder输入是题目的描述(也包括:题目的tags、solution使用的语言、题目中的样例),decoder的输出对应的ground-truth是一个solution,可以是对的,也可以是错的。
  3. 用训练完的模型 sample 大量的 solution 出来,并且做过滤和聚类。过滤是为了去掉无法通过样例的代码(会干掉绝大部分),聚类是为了让实现不同但输出相同的代码只提交一次(节约提交的budget)。聚类中,还需要一个独立训练的生成测试数据的模型。这个步骤是针对竞赛题设计的,从这个步骤看,直接用生成的代码直接run错误的概率很高。
  4. 从聚类最大的类开始挑选,选出10个solution来提交。

注意 :alphacode 并不像 alphazero/master 一样在environment(对于alphacode来说是 codeforce 平台)上反复试错,它只是收集历史比赛数据做训练。

几个重要技巧

  1. Tempering:训练的时候在 logit 之后调整 temperature,它是往小于1去调,具体方法如下。
截图自 」Softmax Tempering for Training Neural Machine Translation Models「

2. Value conditioning & prediction:在 encoder 的输入中,补充很多信息,比如:RATING、TAGS、solution的语言、solution是否是正确的。注意:在 sample 环节的时候TAGS、语言可以用于提升多样性,solution 则都填「正确」。例子如下图所示。

原文的 figure5

3. GOLD:loss 选择 policy gradient 的 loss,物理意义上是希望一个 solution 能从否到尾都是正确的,而不是前一半对后一半错(竞赛中对一半其实就是错),也就是为了让模型更加focus在准确(precision)而非召回(recall)。

原文的公式(1)

实验可以看原文,而且很多公众号上来就贴了实验结果,不再赘述。

总结

  1. 总体来看,方法并不惊艳,甚至没有用 codeforce 平台离线反复提交获取更多训练数据的环节,只是用了历史数据。
  2. 这个实验结果,不确定和 codeforce 本身会有一些重复题目有没有关系(论文里面做了一些对比来观察模型是否是复制粘贴训练集,但不能完全回答这个问题)。
  3. 非常针对 codeforce 竞赛题的机制来做了独特设计(尤其是采样和选择子集的部分),距离通用代码生成还比较远(比如1-2年?)。
  4. 应用场景:简单的代码任务,取代一部分人工。但有个疑问,如果 ML 方法可以生成正确运行的代码了,那为什么不用这个方案直接解决问题,完全可以跳过代码生成的步骤。