OpenAI Codex 论文精读【论文精读】

OpenAI Codex论文精读
Copilot 辅助驾驶员
代码自动补全,不同语言
补充测试样例
提供不同实现,案例

使用OpenAI Codex
论文:Evaluating Large Language Models Trained on Code
BIB:
@article{chen2021evaluating,
title={Evaluating Large Language Models Trained on Code},
author={Chen, Mark and Tworek, Jerry and Jun, Heewoo and Yuan, Qiming and Ponde, Henrique and Kaplan, Jared and Edwards, Harri and Burda, Yura and Joseph, Nicholas and Brockman, Greg and Ray, Alex and Puri, Raul and Krueger, Gretchen and Petrov, Michael and Khlaaf, Heidy and Sastry, Girish and Mishkin, Pamela and Chan, Brooke and Gray, Scott and Ryder, Nick and Pavlov, Mikhail and Power, Alethea and Kaiser, Lukasz and Bavarian, Mohammad and Winter, Clemens and Tillet, Philippe and Such, Felipe and Cummings, Dave and PlAPPert, Matthias and Chantzis, Fotios and Barnes, Elizabeth and Herbert-Voss, Ariel and Guss, Will and Nichol, Alex and Babuschkin, Igor and Balaji, Suchir and Jain, Shantanu and Carr, Andrew and Leike, Jan and Achiam, Josh and Misra, Vedant and Morikawa, Evan and Radford, Alec and Knight, Matthew and Brundage, Miles and Murati, Mira and Mayer, Katie and Welinder, Peter and McGrew, Bob and Amodei, Dario and McCandlish, Sam and Sutskever, Ilya and Zaremba, Wojciech},
year={2021}
}
原文:https://arxiv.org/pdf/2107.03374.pdf
对于大的语言模型在代码上评估他的性能
在Arxiv上提交时间是2021年7月14号
比之前blog早一个月

作者上面,惯例一大堆作者,打星号的是共同一作,因此不知道谁是主要贡献者

从篇幅上比较长,有35页,格式上用的是ICML版面
第一章导言,一页,第二章讲它评估的框架,用什么评估的方式,以及数据集长成什么样子,第三章讲主体模型,在Github上如何收集了一个大的数据集训练了一个GPT类似的模型,并且评估了他的性能。第四章讲它之前收集到的数据和他真正用来评估的数据集之间是有区别的,所以收集了一个跟他评估数据集更像更好的数据集,并在上面做微调然后来提升整个算法的性能以及他的一些实验结果
第五章讲的是另外一个应用,之前是告诉函数的注释和签名生成函数的实现,这里是告诉函数的实现,把文档生成出来。
第六章讲的是模型的一些局限性
第七章比较长,讲工作所带来的的可能性的影响
第八节相关工作,第九节是结论

摘要:介绍一个Codex,一个基于GPT的语言模型
使用GPT模型然后使用Github上公开的代码做了微调
GPT的卖点是不做微调,使用在其他应用上就可以做微调不用担心创新度
只调查了Python,Github在数据集上面更加好一些
提出了一个HumanEval数据集用来衡量模型的好坏
说我们的模型可以解决28.8%的问题,相比之下GPT3解决不了任何问题
还有一个GPT-J是另外一个前人的工作能够解决11.4%
发现了一个特别简单有效的方法,不断地sampling
就是你给我函数的注释,把同样的模型跑100遍,得到100个不一样的结果,只要其中的一个可以解决问题就算解决
如果允许采样100个这样子的结果的话,那么就能提升70.2%,即解决数据集中70.2%的问题
最后讲他找了一些局限性,分析了一下他的一些影响
没做特别大的改动就是把GPT在一个新的数据集上训练了一下去解决一个新的应用,效果比较好
用机器学习解决新问题,不用太关心创新或者他们解决的是什么问题,解决的是不是很好

导言

他们在做GPT3的时候发现能解决一些简单的代码问题,但用来写更复杂的代码就比较难,因为GPT3训练的数据中没有含特别多的代码
在GPT3中讲局限性的时候也提到过他不能去做在训练数据里没怎么出现过的这种任务
所以他们觉得如果将GPT3在公开的代码上重新训练一下的话,可能在代码能力上面会有所提高,所以把这个东西叫做codex
所以他的模型在本质上和GPT没有太多区别,只是训练数据变了,权重就不一样了,所以这一套权重叫做codex

这篇文章关注的是从python的docstrings
python的文档是写在一个有三个双引号开始的函数下面的一个docstrings里面,然后有三个双引号结束
换算成别的语言的话就是放在函数前面的那些注释了,然后他根据你的docstrings生成出来的代码之后
然后通过单元测试来验证他的正确性
和自然语言别的生成不一样,比如在做机器翻译的时候,给一个英文翻译成法语的时候怎样验证正确性一般看是不是正确。
但这里编程语言是给机器用的所以用机器来验证正确性就行了
为此造了一个新的数据集叫做human eval
里面有164个编程的问题,一些简单的语言理解,算法、数学和简单的编程面试的问题,数据量不是很大,问题相对简单,和之后DeepMind做的工作相比,其验证集在困难性上要低一点

如果要解决一个问题,会生成很多个答案,然后看其中是否有任何一个答案能够通过我们所有的单元测试,比如图片分类中考虑top5的精度,也就是一个图片给5个最有可能的预测,只要其中有一个预测命中标号,即认为分类是正确的
这里说如果只能生成一个答案的话,使用120亿个参数的模型呢,能达到28.8%的精度,一个3个亿参数的模型即bert large那个大小的模型,能够达到13.2%的精度,但是作为对比别的方法,GPT-J使用一个60亿的参数也只能到达11.4%的精度,所有之前训练的GPT几乎不能解决任何问题,因为他们的训练数据集是来自Github上所有抓下来的代码
但是他们的评估就根据一些写好的注释来预测你的实现,所以他们这样还是有一定的区别
为了进一步提升他的模型的性能,又收集了一个数据集,这个数据集跟他们要评估的这种方式更加相近一点,在上面微调的模型叫做codex-s,
如果只使用一个答案的情况下也能从前面的28.8%提升到37.7%。

允许生成100个答案的情况下,生成一个这些答案的概率就变成了77.5%,
性能

评估框架
正确性判断
机器学习经常用的一个评估方法叫做BLEU score
看的是你生成的序列和真正的标号序列在一些子序列上的相似度,是一个模糊的匹配,不需要一模一样,但在代码上面BLUE分数会有他的问题,即使在子片段上跟我真实的标号很近也不代表是一个合法的代码,能够产生合法的结果

用的是一个pass@k的参数,k表示可以生成k个不同的结果,只要有一个结果能够通过所有测试就认为通过,k很大的时候,这个值不一定能返回出来这个模型的好坏,因为在真实给人用的时候,给用户返回出一大堆的代码,要告诉用户置信度是怎样子,要对结果进行排序,用户也就看前面几个结果,排序算法是关键但这个分数并没有反映出排序的好坏


验证集

平均每个问题7.7个测试,实现需要手动实现

数据收集

方法

生成答案的时候得判断什么时候该停
核采样
采样是每一次在做序列生成的时候,假定之前有一个序列去决定序列的最后一个是谁,在任何一个时刻,可以把当前的序列放进模型,模型可以预测对所有的候选词他的概率是多少
softmax的输出决定你下一个词,最简单的就是把概率最大的词留下来,就是softmax值最高的那个词留下来作为当前序列后面的那一个,然后一直做下去
但不能保证全局全优,还有每次得到一个确定的输出,不管运行多少遍得到同一个结果

模型大小和测试损失的关系

概率采用总采样最好的那几个词
允许采样多少次和在用不同温度时的好处
排序的算法 单元测试 随着采样数的增加精度也随着上升

和前人工作对比,APPS数据集

监督微调

做一个训练集合这个集合跟Human eval这些问题很相近的话模型性能是否还能提升
从各种编程比赛中把赛题取出来

从CI持续集成里面取,服务

问题过滤

实线经过微调

文档生成

模型局限性

1.样本有效性不是很够,需要看很多的代码才可以写比较简单的代码
2.当Docstrings很长是,代码质量会打折
3.做数学不是特别好

模型影响主要针对安全性考虑
1.人可能会过度依赖模型生成的代码,有可能存在Bug
2.misalignment,模型可能干你想让他干的事情,但不按你的意思来,有偏差,或者可以干出来但干别的,当模型很复杂,参数特别大的时候能干的很多,但如果告诉一个Docstring他可能按自己喜好来
即你想要写的代码在训练集里不怎么常见,但模型给了一个看上去还正确,但有些细微不一样的地方的代码,很难把它找出来
3.偏见,因为这个模型是使用github上的代码,但github上男性用户居多,很有可能带有性别偏见,比如注释里脏词比较多
4.经济上和人力市场上的影响,可能很多程序员要失业,如果生成代码总喜欢使用某一些特别的包,会导致某一些特别的工具被用的更多,如果模型被大量使用会导致这些包的使用率发生变化
例如OpenAI做了一个新框架,然后他的模型都是生成自己框架的代码,如果大量使用就没有Pytorch,tensorflow
5.安全上,它也可能用来写病毒或者恶意软件,而且一次写很多不同恶意软件,会导致杀毒软件,安全团队很难做出有效的一个防御
6.环境上,比较耗电,需要很多资源
7.法律上,模型用的是github公开代码,涉及fair use
如果对公共设施有好处,法律认为没有问题(国外)
但如果将模型商业化就不那么适用
有0.1情况出现将别人代码完全抄过来的情况,实际上copliot抄袭代码概率挺高
对用户来说不知道代码是否是照搬过来,可能涉及代码专利保护,需要非常小心
总结,从github上爬了一些代码训练了一个GPT模型
准备了146题实验效果,主要花精力在准备数据而不是改模型,还有需要分析模型,
没有创新,有效性一般,但做的问题比较大