写点什么

PanGu-Coder2:从排序中学习,激发大模型潜力

  • 2023-09-06
    广东
  • 本文字数:5290 字

    阅读完需:约 17 分钟

PanGu-Coder2:从排序中学习,激发大模型潜力

本文分享自华为云社区《PanGu-Coder2:从排序中学习,激发大模型潜力》,作者: 华为云软件分析 Lab 。


2022 年 7 月,华为云 PaaS 技术创新 Lab 联合华为诺亚方舟语音语义实验室推出了代码大模型 PanGu-Coder,随后发布了华为的代码智能生成助手 CodeArts Snap。时隔一年之后,PanGu-Coder2 终于来了。此次华为云、中国科学院和北京大学的研究者联合带来了更强大的代码大模型 PanGu-Coder2,提出了一种高效且通用的方法来激发大规模预训练模型的代码生成能力,该模型在多个评测数据集上均取得了当前百亿级代码大模型中最好的效果。其技术报告《PanGu-Coder2: Boosting Large Language Models for Code with Ranking Feedback》已在 arXiv 上公开:https://arxiv.org/abs/2307.14936。华为云 CodeArts Snap 插件也即将上线基于 PanGu-Coder2 的百亿级代码生成服务,为 Snap 用户提供更全面的语言支持、更智能的代码生成、更准确的补全建议。

背景


代码生成或程序合成技术,一直是软件工程(SE)和人工智能(AI)领域学术研究中的热点,并因其巨大的商业价值而备受工业界关注。近两年来,得益于人工智能研究在自然语言处理(NLP)和程序语言处理(PLP)方面取得的成果,大语言模型将代码生成从学术研究逐步推向实际落地。一方面,以 Tabnine(产品:Tabnine/Codota)、硅心科技(产品:AiXCoder)等为代表的小型创业公司迅速成立并获得投资,产品敏捷迭代,用户快速增长;另一方面,以微软(产品:Copilot)、亚马逊(产品:CodeWhisperer)、华为云(产品:CodeArts Snap)为代表的大公司也开始大力投入,纷纷发挥自身优势,发布了具有各自差异化特性的代码生成产品。总之,从创业投资和头部公司的动向来看,大模型技术驱动的代码智能生成,已经成为最具高价值和可行性的人工智能落地应用之一。


大规模预训练语言模型(LLM)已经成为代码智能生成事实上的主流技术,业界的代码大模型百花齐放,如 OpenAI 的 CodeX、谷歌 DeepMind 的 AlphaCode、HuggingFace 的 StarCoder,Meta 的 Code LlaMa,华为的 PanGu-Coder 等等。相比于前大模型时代的技术,虽然大模型的代码生成能力已有长足进步,但仍存在较大的提升和进步空间。以 OpenAI 提出的 Benchmark HumanEval 为例,在 164 道由人类开发者编写的简单编程任务上,大部分模型的单次生成通过率仍在 50%以下。而众多开发者实际使用后的反馈也表明,在真实的业务开发中,自动生成的代码多数情况下仍需要仔细审查和修改才能使用。


为了进一步提升代码大模型的生成性能,各种各样的方法被提出,如多阶段预训练、监督精调、指令微调、强化学习等。其中,我们认为强化学习是提升模型代码生成能力最有潜力的方向之一。考虑到软件会随着需求不断演进和变化,编写程序的过程本质上就是不断试错和迭代的过程,人类编写的程序会经历多轮修改,在此过程中不断从代码调试、执行、测试、验收的过程中获取反馈来确定下一步改进方向。将强化学习用于代码生成的直观动机和基本假设是:这些反馈既然可以帮助人类开发者改进已有代码并提升其编程能力,那么理论上也应该可以帮助人工智能。


在本研究中,针对现有基于强化学习的方法(如 CodeRL,PPOCoder,RLTF 等)所存在的问题(如反馈信号稀疏、算法实现复杂、训练过程不稳定等),我们提出了一种新的代码大模型强化框架 RRTF,其全称为 Rank Responses to align Test&Teacher Feedback,意为通过对模型不同的响应进行排序来使模型输出概率同时与测试结果和人类偏好对齐。该方法的思想最初受 RLHF 启发(Reinforcement Learning from Human Feedback,即基于人类反馈的强化学习,是 ChatGPT/InstructGPT 背后的核心技术),但采取了类似 RRHF(Rank Responses to Align Language Models with Human Feedback)的实现,不同之处是将 RLHF 中奖励模型的训练简化为对不同响应的相对排序,使用排序响应(代替奖励模型的绝对值)作为反馈,通过排序损失函数将模型输出的概率与奖励分数对齐,避免了复杂的强化学习实现和训练过程,对训练数据和训练资源的要求显著降低,从而可以高效地实现类似 RLHF 的效果。


为了验证该方法的效果,我们在 Huggingface 开源的代码大模型 StarCoder-15B 上进行了一系列实验。测试结果表明,通过该方法训练出的模型在 HumanEval、CoderEval、LeetCode 三个基准测试集上分别达到了 62.20%、38.26%、32/30/10(容易/中等/困难)的单次生成通过率,在 HumanEval 上的提升接近 30%(绝对值,32.93%->62.20%)。超越了当前所有的同参数规模模型。进一步的多语言和多任务测试表明,PanGu-Coder2 的代码生成能力接近 OpenAI GPT-3.5 的表现,同时在代码错误修复、代码解释等多任务上都处于业界领先水平。

RRTF 框架


RRTF 框架的核心理念是:利用预定义的偏好函数和实际执行的测试结果共同作为反馈信号,对针对同一编程任务的多个响应进行排序,通过排序损失函数优化目标模型的生成概率,从而逐步引导目标模型模型生成质量更高、有更大概率通过测试的代码。作为一种简单而有效的框架,RRTF 实际上吸收了多种前沿的技术或思想,包括指令调优(Instruction Tuning)、指令演化(Evol-Instruct)、强化学习(Reinforcement Learning)等。“基于自动化反馈”这一点是代码生成上进行 RRTF 与自然语言上进行 RRHF 最大的不同:人类是自然语言的直接消费者,因此需要参与反馈过程才能更好地对齐模型与用户期望;而人类是代码的间接消费者,代码(特别是高级编程语言写的代码)的直接消费者是计算机中的其他软件(如编译器、解释器、操作系统等),而这部分反馈可以/应该一定程度上自动化或半自动化,从而可以降低对人类反馈的依赖和因此带来的效率瓶颈。


RRTF 框架的概览如图 1 所示。总体而言,RRTF 包括以下三个步骤:采样、排序和训练。


图 1:RRTF 框架概览


  • 采样阶段:基于某个包含了目标任务(如代码生成)的种子数据集(如 CodeAlpaca),通过 Evol-Instruct 逐步增加难度并扩展题目要求,生成一系列既有关联又循序渐进的编程任务。将这些任务描述作为 Prompt 输入模型,让不同的模型进行回答,即对不同的模型进行采样。

  • 排序阶段:根据预定义的偏好规则以及单元测试的结果(若存在配套单元测试)对不同来源的响应进行排序。其中,预定义偏好则代表人类开发者对不同响应的主观评判,可以定义为对某一类来源(如 Ground Truth)或具有某些特征(如更加符合编码规范、圈复杂度更低、同样正确的程序中行数较少)的响应的偏好。单元测试结果泛指程序处理工具链(如代码编译器、解释器、执行器等)对所生成代码的客观评判,从可编译性、可执行性、与期望行为的一致性等角度区分正负样本。预定义偏好和单元测试形成了互补和交叉验证的关系,共同定义了理想代码的特征。

  • 训练阶段:排序后的数据被组织为三元组<prompt, chosen/rejected, score>形式的样本,所有样本构成了训练数据集。将产生 chosen 响应的来源看做 teacher 角色,将被训练模型看做 student 角色,训练过程可以理解为 student 模型通过不断更新自身参数拟合 teacher 行为的概率分布的过程。对于同一任务的一对不同响应,定义模型π下响应 yi 的条件对数概率(使用响应长度标准化)为:



排序损失函数定义为:



其中,r 代表排序过程中赋予正负样本的不同分数。


最终的损失函数由排序损失和监督性微调的损失函数共同组成:



实验及评估


我们进行了一系列的实验来评估 PanGu-Coder2 的性能,并与业界的其他具有代码生成能力的模型进行了对比。我们选取了以下三个基准测试集进行评估:


  • HumanEval:OpenAI 随 Codex 模型发布的测试集,由 164 道手工编写的简单编程任务、对应的参考实现和单元测试构成。主要测试从自然语言描述到代码的生成能力,是目前最广泛被采用的基准测试集。

  • CoderEval:华为和北京大学推出的测试集,由 230 道来自真实开源项目的编程任务、所在的项目上下文和单元测试构成。主要评估依据代码上下文和自然语言任务描述到代码的生成能力,相比 HumanEval 更贴近开发者的实际使用环境。

  • LeetCode:考虑到 StarCoder 的训练数据截止 2022 年 6 月,我们选取了 300 道 LeetCode 上 2022 年 7 月 1 日之后发布的题目构成测试集。主要测试模型在竞赛类算法方面的生成能力和严谨性。


表 1 为 PanGu-Coder2 与现有的代码大模型在 HumanEval-Python 上的性能比较:


表 1:业界知名模型在 HumanEval 上的结果,以生成 200 次的 pass@1/10/100 为指标衡量。对于 PanGu-Coder2/WizardCoder/StartCoder,推理参数为:temperature=0.2/1.2/1.2, top_p=0.95;对于其他模型,指标取自原始论文



从表 1 可以看出:在所有被测百亿模型中,PanGu-Coder 排名第一;在所有模型中,PanGu-Coder2 排名第二。与 PaLM-Coder 和 LaMDA 等千亿级大模型相比,PanGu-Coder2 虽然规模只有百亿,但性能却更好。值得注意的是,PanGu-Coder2 的表现接近或优于 OpenAI 的 GPT-3.5(不同报告中给出的结果有所差异),但与据称万亿规模的 GPT-4 仍有差距。


表 2 展示了各代码生成模型在三个基准测试集上采用贪婪解码的单次生成通过率及其比较结果。可以看出,在所有测试集上,PanGu-Coder2 都取得了最好的成绩。值得注意的是,与基础模型 StarCoder,以及在 StarCoder 上采用指令微调的 WizardCoder 相比,采用 RRTF 方法的 PanGu-Coder2 在 HumanEval、CoderEval 和 LeetCode 上均效果更佳。


表 2:各代码生成模型在 HumanEval、CoderEval、LeetCode 上的 Pass@1 对比



为了进一步检验 PanGu-Coder2 的泛化能力,我们在其他编程语言和其他代码强相关任务上对 PanGu-Coder2 进行了评估。我们选取了以下两个公开的基准测试集:


  • HumanEval-X:清华大学基于 HumanEval 推出的多语言代码生成评测基准,包含 820 个高质量手写样本,覆盖 Python、C++、Java、JavaScript、Go 等语言,我们扩展了 C 和 TypeScript 语言的部分。

  • HumanEvalPack:Huggingface 上著名的代码大模型社区 Big Code 推出的多任务评测基准,包含 HumanEval-Synthesize(代码生成,自然语言->代码)、HumanEval-Fix (代码修复,自然语言+代码->代码)、HumanEval-Explain (代码解释,自然语言+代码->自然语言)等任务。


表 3 展示了 PanGu-Coder2 最新版本代码生成测试集 HumanEval-X 上的结果以及与业界其他的对比:

表 3:各多语言代码生成模型在 HumanEval-X 上的 Pass@1 对比



表 4 展示了 PanGu-Coder2 在多任务测试集 HumanEvalPack 上的结果以及与业界其他模型的对比(其他模型的数据主要来自 OctoPack 论文):


表 4:各支持多任务的模型在 HumanEvalPack-Python 上的效果对比



综合以上实验结果,可以得出以下结论:


  • 在所有具有代码生成能力的大模型中,PanGu-Coder2 的综合代码生成能力处于业界第一梯队

  • 在多语言和多任务的基准测试中,PanGu-Coder2 处于业界相近规模模型的最高水平

  • 在代码生成任务上,尽管 PanGu-Coder2 的规模较小,但其性能却优于 PaLM-Coder 和 LaMDA 等更大规模的模型

  • PanGu-Coder2 是被测模型中唯一同时在 HumanEval、HumanEval-X、HumanEvalPack、CoderEval、LeetCode 等测试集上都达到最佳性能的模型。

总结与展望


在本文中,我们介绍了 PanGu-Coder2 背后的创新性训练框架 RRTF,并通过充分的实验证明了其在激发大模型代码生成潜力方面的效果。RRTF 背后的核心动机和思想是基于自动化反馈的强化学习,即在语言模型的自回归优化目标之外,引入代码特有的自动反馈信号,即通过解释器、编译器、执行器、单元测试等代码处理工具链依次对所生成代码进行检查,其结果通过相对排序后作为目标函数的一部分,从而在训练和优化过程中引导模型生成有更大概率能顺利编译运行并通过测试的代码。作为一种与模型无关的训练方法,RRTF 可无缝迁移到其他具有一定编程能力的预训练模型上,或同一模型的不同规模上。


PanGu-Coder2 百亿级模型即将上线到华为云 CodeArts Snap 智能开发助手中,将带来三倍的代码生成准确率提高以及对所有主流编程语言的逐步支持,从而全面提升 Snap 用户的开发效率和代码质量。在 JetBrains 或 VSCode 插件市场上提前下载安装 CodeArts Snap,关注 CodeArts Snap 即将到来的重大更新吧!


文章来自 PaaS 技术创新 Lab:PaaS 技术创新 Lab 隶属于华为云,致力于综合利用人工智能和软件分析技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!

号外!



华为将于 2023 年 9 月 20-22 日,在上海世博展览馆和上海世博中心举办第八届华为全联接大会(HUAWEICONNECT 2023)。本次大会以“加速行业智能化”为主题,邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁,从商业、产业、生态等方面探讨如何加速行业智能化。


我们诚邀您莅临现场,分享智能化的机遇和挑战,共商智能化的关键举措,体验智能化技术的创新和应用。您可以:


  • 在 100+场主题演讲、峰会、论坛中,碰撞加速行业智能化的观点

  • 参观 17000 平米展区,近距离感受智能化技术在行业中的创新和应用

  • 与技术专家面对面交流,了解最新的解决方案、开发工具并动手实践

  • 与客户和伙伴共寻商机


感谢您一如既往的支持和信赖,我们热忱期待与您在上海见面。


大会官网:https://www.huawei.com/cn/events/huaweiconnect


欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
PanGu-Coder2:从排序中学习,激发大模型潜力_人工智能_华为云开发者联盟_InfoQ写作社区