自动代码Copilot背后的模型

之前,我已经介绍过Github发布的自动代码Copilot的使用方法,感兴趣的可以看这篇文章:
Copilot要收费了?

今天主要介绍一下github copilot中主要用到的代码生成框架Codex。它主要是由Github和OpenAI联合开发的模型框架,具体链接如下:

https://openai.com/blog/openai-codex/?utm_campaign=Connect%20the%20dots&utm_medium=email&utm_source=Revue%20newsletter

1.引入

Codex主要利用的是GPT-3模型。同时为了评估模型的有效性,研究人员还设置了一个评估数据集:HumanEval。在这个评估数据集下,在GPT-3模型不能够解决任何一个问题,GPT-J模型能够解决11.4%的问题,而Codex模型能够解决28.8%的问题。

同时,在模型中重复采样是一种有效策略,可以为模型多次提供工作解决方案。使用这种方法,能够解决了70.2%的问题。

2.评估框架

代码的生成模型主要通过将样本与参考解进行匹配来进行基准测试,匹配可以是精确的,也可以是模糊的(如BLEU分数)。然而,最近的工作暴露了基于匹配的代码度量的缺陷。可以看出,BLUE是一个模糊匹配的过程,只要意思对了,BLUE的分数就会提高。但是编程是一个比较特殊的问题,一个小的差别可能就会带来灾难性的影响。

因此,论文中提出了自己的度量标准 p a s s @ K pass@K pass@K k k k表示从每一个问题中生成的代码样本中选择的答案。论文中,生成 n n n个代码样例,同时计算 c c c个代码能够通过单元测试:
在这里插入图片描述

3.评估数据集

论文中新构建了评估数据集,称为HumanEval,数据地址如下:
https://github.com/openai/human-eval
在这里插入图片描述

其中包含了164个手写编程问题,数据集中包含“评估语言理解”、“推理”、“算法”和“简单数学”。如下图所示:
在这里插入图片描述

每个问题包含:

  • 签名
  • 代码功能解析
  • 主体

这些编程为题都是手写而来,这是因为模型在训练的时候用到了大量的Github仓库代码,因此可能会包含很多解答方法,因此需要重新手写编程问题。

4.模型方法

  • 数据集

训练数据集于2020年5月从GitHub上托管的5400万个公共软件库中收集,其中包含179 GB的独特Python文件。删除了可能是自动生成的、平均行长度大于100、最大行长度大于1000或包含少量字母数字字符的代码文件。过滤后,最终数据集总计159GB

  • 方法

由于Codex是根据自然语言提示进行评估的,Codex直接使用GPT-3模型进行训练。

为了最大限度地利用GPT中的文本表示,论文中使用基于GPT-3文本分词器。由于GitHub代码中单词的分布与自然文本的分布不同,因此该标记器在切割代码时不是很有效。效率低下的最大来源是对空格进行编码,因此论文添加了一组额外的标记来表示不同长度的空格。这种做法,可以减少大约30%的token。

同时,在生成代码的时候,当遇到“\nclass”, “\ndef”,“\n#”,"\nif”,“\nprint”时,则停止。

5.实验结果

模型参数与损失值之间成指数关系:模型指数上涨,损失之线性下降:
在这里插入图片描述

在计算softmax的时候,会除上一个T。当T越大时,候选词语概率值较为接近。当T越小时,候选词概率值则较为远离。当在生成的代码例子抽取K个出来,K的个数越大时,T会相应变大。反过来说,如果近抽取1个例子,这个例子应该是最有代码性,概率值最大的代码例子。
在这里插入图片描述

为了验证BLUE的评估标准是否有效,论文中在评估集合上给出了正确和错误代码的BLUE分数。可以发现,正确代码和错误代码的BLUE分数值相差不大,说明BLUE分数在代码生成中没有评估效果。
在这里插入图片描述

6.总结

整体来说,Codex本质上就是使用了GPT-3模型作为预训练模型,然后进行微调。同时也人工定义了164个编程问题,作为评估数据集。同时还提出了新的评估指标 p a s s @ k pass@k pass@k,并论证了BLUE指标对代码生成的局限性。
从数据层面上,因为采集了Github上的代码,因此可能会存在潜在的代码作者的追究专利的问题。

我是leo,欢迎关注我的公众号“算法一只狗”,我们下期再见~
在这里插入图片描述

7.参考

  1. https://zhuanlan.zhihu.com/p/527342486
  2. https://blog.csdn.net/yanguang1470/article/details/125862215
  3. Evaluating Large Language Models Trained on Code、

猜你喜欢

转载自blog.csdn.net/qq_30232405/article/details/126562491