Evaluating Large Language Models Trained on Code

基本信息 标题: Evaluating Large Language Models Trained on Code 作者: Mark Chen、Jerry Tworek、Heewoo Jun、Qiming Yuan等 作者单位: OpenAI, Anthropic AI, Zipline 期刊/会议: arXiv 发表时间: 2021年7月14日 DOI: 2107.03374 开源地址: GitHub 关键词: 代码生成, 代码评估, 代码理解 研究背景(Background) 对于代码生成任务由于语言模型的推动最早的研究在1963、1971年就开始了(Experiments with a heuristic compiler、Toward automatic program synthesis),最近的有基于掩码语言模型(masked language modeling)和跨度预测(span prediction)改编用于训练其编程对应物的有CodeBert和PyMT5。OpenAI在GPT3发布的时候,就已经可以通过文档注释(docstrings)生成python代码了,但是能力还是比较有限。 研究目标(Research Objectives) 提出一种评估大型语言模型生成代码能力的方法,包括pass@k指标和HumanEval数据集。 提出Codex,通过对GPT-3进行微调。 提出Codex-S,通过有监督微调Codex。 提出Codex-D,通过训练docstring生成模型。 评估框架 (Evaluation Framework) 作者定义了pass@k指标,以及HumanEval数据集,用于评估Codex的性能。 功能的正确性(Functional Correctness) 评估生成质量可以通过匹配的方式:精确匹配或模糊匹配(如BLEU得分)。然而有研究揭示了基于匹配的代码评估指标的不足。如论文CodeBLEU: a Method for Automatic Evaluation of Code Synthesis中发现BLEU在捕捉代码特有的语义特征方面存在问题,并建议对分数进行几个语义的修改。更加根本的问题是,基于匹配的方式无法评估庞大的并且复杂的代码。近期无监督的代码翻译或伪代码到代码的翻译相关问题也转向了功能性准确性的评估,如果样本通过了测试用例,那么就认为生成的代码是正确的。作者认为这种方式应用到代码生成的评估中是合理的。评估功能正确性最有说服力的理由是程序员常使用这种方式进行评估(单元测试)。 Kual等人在2019(SPoC: Search-based Pseudocode to Code)就用了pass@k,对于每个问题生成k个代码样本,如果其中有一个样本通过了单元测试就认为问题已得到了解决,并计算解决问题的总比例。然而作者认为以这种方式计算pass@k会有很高的方差,而且计算量大。相反,为了评估pass@k,我们给每个任务生成n个样本(n > k, 论文中使用n = 200, k = 100), 统计通过单元测试的正确样本数c(c <= n),并计算无偏估计量。其中 $\text{pass@}k := \mathbb{E}_{\text{Problems}} \left[ 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}} \right]$。 ...

January 1, 2025 · 2 min · 404 words · Rex