随着大模型成为 AI 开发新范式,将大语言模型集成至编程领域、完成代码生成与补全任务成为重要趋势之一。业界出现了一些引人瞩目的代码大模型,比如 OpenAI 的 CodeX、谷歌 DeepMind 的 AlphaCode、HuggingFace 的 StarCoder 等等。
在国内,去年 7 月底,华为诺亚方舟实验室语音语义实验室联合华为云 PaaS 技术创新实验室推出了其代码大模型 PanGu-Coder。与 Codex 和 AlphaCode 相比,该模型在代码生成的一次通过率(PASS@1)指标上大幅超越同等参数规模的模型,甚至优于规模更大的模型。除了英文外,PanGu-Coder 在中文上表现出色。
(资料图)
PanGu-Coder 模型大小和配置。
根据对 PanGu-Coder 的相关内测表现,它不仅熟悉常见算法,而且能熟练地使用各种 API,求解高等数学问题也不在话下。
一年过去了,PanGu-Coder2 终于来了,论文已在 arXiv 上提交。此次华为云、中国科学院和北京大学的研究者联合带来了更强大的代码生成大模型。
论文地址:https://arxiv.org/pdf/2307.14936.pdf
为了增强预训练代码大模型的生成性能,各种各样的方法被提出并应用,比如监督微调、指令调整、增强学习(RL)等。在本文中,针对现有基于 RL 方法所存在的问题并进一步挖掘代码大模型的潜力,研究者提出了一种全新的 RRTF 框架,它的全称为 Rank Responses to align Test&Teacher Feedback,成功地在代码大模型上应用自然语言 LLM 对齐技术。
就其思路而言,RRTF 框架有别于以往的 CodeRL 和 RLTF,而是遵循了 RLHF(基于人类反馈的强化学习)的思路,使用排序响应(代替奖励模型的绝对值)作为反馈,实现了更简单和高效的训练方法。
研究者将 RRTF 应用于开源的 StarCoder 15B 上,并推出了一个在所有已发布代码大模型中实现最佳性能的 PanGu-Coder2。该模型在 OpenAI HumanEval 基准上实现了 62.20% 的 pass@1 指标,相较 PanGu-Coder 3亿参数版本的 17.07% 有了显著提升。
不仅如此,在 CoderEval 和 LeetCode 基准上的广泛评估结果表明,PanGu-Coder2 超越了以往所有的代码大模型。
方法概览RRTF 框架
研究者们提出了一个更简单但是功能强大的框架 RRTF,它将几种前沿技术无缝结合,包括指令调优、Evol-Instruct 方法以及强化学习。本次方法的核心理念是:利用测试信号和人类偏好共同作为反馈,对响应进行排序,从而引导模型生成更高质量的代码。
因此,受最近大型自然语言模型与指令微调取得的进展启发,研究者提出了这一新的训练范式,即 RRTF 框架。框架概览如下图所示。
RRTF 包括以下三个步骤:采样、排序和训练。
采样阶段:通过 Evol-Instruct 生成的 prompt 对响应性进行采样。排序阶段:根据单元测试和启发式偏好对不同来源的响应进行排序。训练阶段:使用 prompt 三元组和被选用 / 被拒绝响应的相应分数来训练代码大模型。模型架构
基于具有 Multi-Query-AttentionShazeer 的 decoder-only Transformer,研究者训练出一个15B 参数的 PanGu-Coder2。同时利用 FlashAttention 来减少计算量和内存占用。因此,该模型的最大长度可以扩展到 8192。下表 1 显示了该模型的详细超参数。
训练语料库
由于手动收集高质量语料库耗时耗力,研究者遵循 Evol-Instruct 技术来构建其训练语料库。具体来讲,他们基于 Alpaca 20K 数据集,并迭代进化该数据集中的编程问题,从而获得新的编程问题。prompt 如下图 2 所示。
针对这些问题,研究者从不同模型中采样了答案。总的来说,他们收集了一个包含 100K 个有答案编程问题的原始语料库,并把它称为指令和解答方案对(instruction and solution pairs)。然后利用一些手动定义的规则在原始语料库上进行数据预处理,将其规模缩小至 68K。
更重要的,为了防止数据泄露,研究者花大力气调查了其 68K 数据集与 HumanEval 基准之间的潜在重叠。经过细致的调查,他们确信其实验中无数据泄露,进一步验证了 PanGu-Coder2 的有效性。
实现细节
研究者选择 StarCoder 15B 作为基础模型,并以 512 的全局批大小对其进行 6 epoch 训练。图 3 展示了单个训练样本的格式。除了在 prompt 中添加一对三引号外,研究者只使用从响应中提取的代码片段进行训练。
实验及评估研究团队进行了一系列的实验来评估 PanGu-Coder2 的性能。
性能
该研究将 PanGu-Coder2 与现有的代码大模型在 Python 代码生成方面进行了性能比较。下表 2 显示了在 HumanEval 基准上的比较结果。
在所有闭源模型中,PanGu-Coder2 排名第二。与 PaLM-Coder 和 LaMDA 等大模型相比,PanGu-Coder2 虽然规模较小,但性能却更好。值得注意的是,PanGu-Coder2 的表现优于 OpenAI 的 GPT-3.5,但与 GPT-4 仍有差距。
表 3 展示了贪婪解码的比较结果。在所有基准测试中,PanGuCoder2 都取得了最好的成绩。值得注意的是,PanGu-Coder2 不仅在 HumanEval 上超过了 WizardCoder 和 StarCoder,而且在 CoderEval 和 LeetCode 上也超过了这两个模型。
表 2 和表 3 的实验结果可以得出以下结论:
在开源模型中,PanGu-Coder2 在 HumanEval 上以 61.64% pass@1 达到了 SOTA。尽管 PanGu-Coder2 的规模较小,但其性能却优于 PaLM-Coder 和 LaMDA 等更大规模的模型。PanGu-Coder2 是实验中唯一同时在 HumanEval、CoderEval 和 LeetCode 上都达到最佳性能的模型。如下图 4 所示,整体准确率随着数据集大小的增加而增加:
在训练计算量方面,无论数据集大小如何,准确率可能会在训练开始时急剧下降或持平。大约 2 个 epoch 后,训练曲线变得更加稳定,准确率随着损失的减少而持续上升。3 个 epoch 后,准确率达到最佳,而 4 个 epoch 后,准确率变得更加稳定,显示出收敛的迹象。这表明,PanGu-Coder2 模型大约需要 3-4 个 epoch 才能完全捕捉到数据集中的知识,而之后的训练步骤对提高模型能力的帮助可能微乎其微。
用例研究
为了对模型进行实证研究并分析未来的工作方向,该研究比较和分析了三个模型的成功和失败案例:基础模型 StarCoder、指令调整模型 WizardCoder 和 PanGu-Coder2 模型。下图 5 显示了三种模型在贪婪解码(greedy decoding)和核采样(nucleus sampling)方面的异同:
图 5 还表明 PanGu-Coder2 和 WizardCoder 可以互补:虽然 PanGu-Coder2 解决了大部分问题,并且其中一些问题是 WizardCoder 无法解决的,但也有一些问题只能通过 WizardCoder 解决。此外,还有一些问题即使采样 200 次,这三个模型也都无法解决。
该研究选择 StarCoder、WizardCoder 和 PanGu-Coder2 生成的几个具有代表性的示例代码作为案例进行研究,以对 PanGu-Coder2 的优缺点进行评估。
如下图 6 所示,PanGu-Coder2 能够熟练地理解编程问题的逻辑,而 WizardCoder 和 StarCoder 在这方面有所欠缺。这一观察结果表明,PanGu-Coder2 通过该研究提出的排名反馈,有效地在编程问题陈述和代码解决方案之间建立了细致的映射。
如下图 7 所示,在某些情况下,PanGu-Coder2 和 StarCoder 的性能差于 WizardCoder,WizardCoder 可能受益于使用大量丰富注释代码指令进行训练。在某种程度上,这一观察表明,引入注释数据可能会在训练过程中产生积极效果。
此外,下图 8 给出了一个复杂的编程挑战,StarCoder、WizardCoder 和 PanGu-Coder2 都给出了错误的代码解决方案。这一观察结果表明,目前代码大模型在处理复杂编程要求方面仍达不到人类的熟练程度,还有一些改进的空间。
推理优化
GPU 内存消耗和推理速度是模型实际部署和使用的关键因素,因此该研究使用 CTranslate2 和 GPTQ 两种量化技术来进行实验,研究模型推理的优化策略。下表 4 展示了使用不同量化技术优化的模型的 GPU 内存消耗、推理速度和 HumanEval 性能。