• 自动代码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、
  • 相关阅读:
    基于Web的美食分享平台的设计与实现——HTML+CSS+JavaScript水果介绍网页设计(橙子之家)
    JavaScript基本数据类型
    windows (win11) vscode配置WSL(ubuntu)终端完美解读
    实验6 8255并行接口实验【微机原理】【实验】
    搭建Facebook直播网络对IP有要求吗?
    B. Boboniu Plays Chess
    [buuctf.reverse] 121-125
    内核调试环境:buildroot/debootstrap制作文件系统、编译内核、QEMU模拟
    springboot毕设项目成都医学院学生实习管理系统的设计与实现2761g(java+VUE+Mybatis+Maven+Mysql)
    Kafka实时数据即席查询应用与实践
  • 原文地址:https://blog.csdn.net/qq_30232405/article/details/126562491