hengyuan
2023/02/24阅读:25主题:嫩青
CodeX
“模型和数据都没有开源
1.Dataset
1.1 Training
1.1.1 Coarse Github Dataset
Github 上2020年5月之前的 1MB 以下的 py 文件代码,然后把那些平均代码长度大于 100,代码行数大于 1000 的文件给过滤掉,最终得到 159 GB 的数据
-
注意,他们的数据集也是从 Github 上面来的,而且只用了 Python .py 后缀的文件代码
1.1.2 Standalone functions
因为发现很多 .py 文件里面其实并不是在写函数代码,而是放了一个 Configuration 的信息,设置是纯字符串的数据,这些对模型帮助写代码是没有帮助的,会影响模型的效果,所以又重新从两个渠道获得 Standalone functions 数据集
-
Problems from Competitive Programming: 就是像 Leetcode 这样的编程题网站,他们从不同的编程题网站上搜集了数据,但是具体哪些编程网站论文里面没有说,编程题上的测试样例便是 unitest 了 -
Problems from Continuous Integration: 这个是持续集成的概念,比如现在 Github 每个人一个分支去开发一个功能,现在要把所有的功能的分支都合并到一起,但是在合并的时候就可能会出现不同分支之间存在冲突的情况,所以就需要用 CI tool 来自动进行测试,看分支之间是不是存在冲突 (比如 Github 上的 travis and tox 这两个 CI tool),CI 测试函数的输入和输出都是唯一确定的,和编程题很像,所以也被拿来用了。这里他们使用的是 sys.setprofile 的方式来 trace 得到 CI function 里面一些 step 的输出来作为 unitest
1.1.3 Filter Standalone functions
-
虽然上面收集了很多 Problems 的训练数据,但是数据的质量并没有得到比较好的评估,所以他们先用最初 Coarse Github 数据集训练得到的一个 CodeX-12B 来进一步地从上面这两个 Problem 数据集筛选出高质量的 Problem 数据集, 具体的方式就是把之前的每个 Problem 都让模型去解答 (生成 100 个候选),如果没有一个候选结果能过 unitest 的话,那么这个 Problem 就被过滤掉 (因为他比较难),然后最终再用这个 filtered 的数据再重新微调一下得到一个叫做 CodeX-S 的模型。
1.2 Evaluation
他们提出了一个专门的 evaluation HumanEval 数据集,包含 164 个人工手写的编程问题,其中每个编程问题包括函数头、docstrings、函数体和几个 unit tests。具体的例子如下
-
论文中强调,这个数据集是人自己去写的,不是从 existing resource 上面 copy 得到的
2.Tasks
2.1
-
第一个任务就是给函数头 (e.g., def quicksore ...) 和 docstring 让模型生成函数体 -
针对基于函数头和 docstring 生成函数体的这个场景,评测的时候是用 unitest 去测试得到准确性 (就是看执行出来的结果是不是对的)
2.2
-
第二个任务就是给函数头和函数体然后让模型去生成 docstring -
针对基于函数头和函数体生成 docstring 的场景,评测的时候采用的是人工评测的方法,看生成出来的 docstring 是否能比较好的表达代码想表达的意思
3.Method
CodeX 的结构和 GPT-3 的结构完全一样,而且论文中尝试了用 code dataset 从头 Pre-train 以及 fine-tuning on GPT-3 两种方式,并发现两种方式的效果其实差不多,但是在 GPT3 上 fine-tuning 的话收敛的速度会快很多,所以最终用的都是这个方法。
Codex 的 Tokenizer 在 GPT-3 的基础上做了一些改进,因为在 Python 语言中有很多不同类型的空格,因此,论文中在 GPT-3 的分词器中加入了额外的一些 token 来表示不同长度的空格
4.Released Models
-
CodeX 模型参数量有12M、25M、42M、85M、300M、679M,2.5B 和 12B (最主要的是这个 120 亿的模型)。
-
CodeX-S 和 CodeX-D 都只有 120亿的
-
CodeX: 在 Coarse Github Dataset 上进行训练,任务:由函数头和 docstring 生成对应的函数体;
-
CodeX-S: 在CodeX基础上,在 Filter Standalone functions 上进行 Fine-tune,任务:函数头和 docstring 生成对应的 Python 函数体代码的任务;
-
CodeX-D: 与CodeX任务相反,由 Python 函数代码 (函数头和函数体)生成 docstring,也是在 CodeX 的基础上进行 Fine-tuning
作者介绍