CodeX论文精读

论文:《Evaluating Large Language Models Trained on Code》

下载地址:https://arxiv.org/pdf/2107.03374.pdf

简介

Copilot的核心技术:给定函数名和功能描述,可以自动进行代码补全,或者给定代码,给出相关文档

作者团队收集了Github上所有的不重复的python代码,总计179GB,并进行了简单过滤(去掉了过大的文件(>1MB)和过长的代码(>100行或单行超过1000个字符)),在数据集上面训练了一个GPT3模型

效果

作者团队手动编写了164个函数(避免数据泄漏),每个函数包括代码、文档以及单元测试,平均每个问题包括7.7个测试样例,用于评估模型。Codex 12亿参数的模型能解决28.8%的问题,3亿参数的模型能解决13.2%的问题,作者团队又收集了一个跟测试集差不多的数据集用于模型微调,微调以后,得到Codex-S可以解决37.7%的问题。而使用 repeated sampling,即运行一百次模型,只要有一个输出解决了问题就算成功的话,那么Codex-S能解决77.5%的问题(CodeX能解决70.2%),而如果选择100个输出中概率最高的输出,则能解决44.5%的问题。

细节

1. 目标函数没有使用BLEU(困惑度),因为代码不同于自然语言,即使特别相似,但仍然可能不是一个合法的语句,作者使用pass@k来评估模型,即生成n个输出(n>k),从中随机抽取k个输出,输出通过单元测试的概率

稳定实现

2. 输出代码的测试在沙盒中进行

3. 在GPT3原有模型上微调并不能取得更好的效果,但会加速收敛

4. 当模型输出‘\nclass’, ‘\ndef’, ‘\n#’, ‘\nif’, or‘\nprint’等语句时,模型会终止推理,输出结果

5. 使用nucleus sampling(核采样):选择概率总和p=95%的前k个输出用于评估模型

6. 对输出做softmax得到概率之前,会除以一个超参数Temperature,来调节不同输出之间的概率差距,当pass@k中的采样数k越大时,T越大效果越好

7. 收集了跟测试集类似的数据集用于微调,1)从各种比赛中收集赛题(大约一万个),2)从Continuous Integration中收集了约40000个函数和单元测试,并过滤(CodeX对每个问题生成一百个输出,如果能解决通过测试用例则保留该样本,反之则去掉(不能通过表示该问题太难或测试用例有问题)),在这个数据集上继续训练,训练方式相同,只是该数据集有“标准答案”,得到模型Code-S

8. 使用收集到的github数据集,重新训练一个GPT3模型用于反向生成文档,Codex-D,评测Codex-D模型好坏的方式是,一是人阅读文档评测模型好坏,二是使用生成的文档重新生成代码,看能否通过单元测试

模型局限性

1. 样本有效性不够,需要训练很多的代码,模型才能输出比较简单的实验

2. Prompt应该怎么写才能获得比较理想的代码,作者找了13 basic building block(对字符串做一些简单的操作:如改变大小写、变换位置等),将文档块任意串起来,发现文档越长,生成代码的质量越差,说明docstring不宜过长

3. 对于精确、复杂的数学问题很难生成正确的代码

模型潜在的影响

1. 过度依赖:

人可能会过度依赖生成的代码,如果使用者不仔细审查代码,可能会给程序带来潜在的问题

2. Misalignment:模型足够复杂的时候,可能能输出期望的代码,但如果给定一个docstring,可能只能输出一个跟训练数据风格相似,看上去正确,但并不是期望的代码

3. github男性用户居多,所写的代码可能包含性别偏见

4. 市场和经济:

很多程序员可能会失业?

如果训练数据里的代码对于某些包使用较多,可能导致某些特别的工具使用率增多

5. 安全:

可能某些人用它写病毒和恶意软件

6. 训练这样一个模型需要使用很多资源

7. 法律:

使用的是公开代码,fair use(对公共社会有好处的话并没有什么问题),但用于商业行为可能会有法律风险

生成的代码可能跟别人一模一样,可能存在抄袭别人具有版权或者专利保护的代码的风险

总结

作者爬了很多github的代码,训练了一个GPT3的模型,为了评估模型的效果,准备了146到题用于测试,发现大概能解决大概30%的题,效果还不错,为了进一步提高分数,又收集了一个跟测试集相似的数据集,在上面微调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值