「程序合成」或「代码生成」任务的目标是根据给定的描述生成可执行代码,最近有越来越多的研究采用强化学习(RL)来提高大语言模型(简称大模型)(LLM)在代码方面的性能。
不过,这些RL方法仅使用离线框架,限制了它们对新样本空间的探索。
此外,当前利用单元测试信号的方法相当简单,没有考虑到代码中特定错误位置。
而国内团队最近发布的新型在线RL框架RLTF(即基于单元测试反馈的强化学习),可以将代码的多粒度单元测试反馈结果用于优化code LLM,在训练过程中实时生
成数据,并同时利用细粒度反馈信号引导模型生成更高质量的代码。
有趣的是,小编发现这篇论文的作者,和曾经称霸王者峡谷的腾讯绝悟AI的作者,有所重叠。
论文地址:
https://arxiv.org/pdf/2307.04349.pdf
具体来说,在线框架RLTF通过细粒度的单元测试反馈来增强预训练的LLM在程序合成任务中
的性能,允许模型在训练过程中实时生成新样本,并利用单元测试结果作为反馈信号,从而改善整体模型性能。
此方法使模型能够学习代码错误的具体细节,并相应地提高性能。
大语言模型(LLM)在程序合成任务中表现出色,如Codex、AlphaCode、InCoder等,现有的LLMs在处理更具挑战性的问题(如程序竞赛)方面仍有进展空间且预训练的代码模型在生成代码时可能存在语法和功能上的错误。
基于此,研究人员提出了基于强化学习(RL)的算法来改进代码LLMs的性能,如CodeRL和PPOCoder,但现有的RL方法大多是离线的,而在线RL训练更稳定,能更好地探索环境并得到更优的策略;
且现有的RL方法对单元测试结果的反馈信号较为简单和粗粒度,无法捕捉到代码中具体错误的细节。
RLTF方法引入了多粒度的单元测试反馈(Fine-grained Feedback根据代码的错误类型和错误具体位置,惩罚代码中出现错误的特定部分,Adaptive Feedback根据通过的测试用例比例分配不同的惩罚),并通过实时生成样本和提供多样化的训练样本,提高了模型性能。
RLTF在程序合成任务中取得了APPS和MBPP基准测试的最新成果,并通过消融研究证明了方法的有效性。
论文中提出的任务可以形式化为一个条件概率优化问题,即在给定自然语音描述D和模型可优化参数θ的情况下,最大化正确程序W的概率:
在线RL训练框架
为了更好地探索样本空间,研究人员使用在线学习的方式进行RL训练。
两个LLM共享权重,一个负责梯度回传更新模型,另一个负责在线生成训练样本。
训练样本经过编译器,分配好标签,进而更新online buffer中的数据。
Online buffer负责存储在线训练所用的数据,它在内部维护一个队列,会删除过旧的数据,buffer的更新频率是50个step。
多粒度反馈的强化学习
RL训练的loss可以定义为:
其中,R代表奖励系数,S和E代表代码的起点和终点。
研究人员将编译器的反馈分为3类,eg. Error, Failure, Pass,然后根据不同的编译器反馈,制定了不同粒度的模型奖励。
粗粒度反馈:该反馈的级别建立在上述3类反馈上,和CodeRL,PPoCoder设置相同;
细粒度反馈:粗粒度的反馈只告诉模型「错了」,却没有将具体「哪里错了」告知模型。
而细粒度反馈的目的就是为了解决这一问题,使得模型能更加明确错误产生的原因和位置。为此,研究人员将Error中不同的错误子类型分为U_global,U_line,U_ignore,具体分类见下表;
根据不同的错误子类型,我们有不同的R值和起点终点:
自适应反馈:针对未能通过全部测试样例的数据,我们根据其通过的比率设定了自适应的反馈,这一设置是为了模型能够生成通过尽可能多的测试样例的程序。
如下两个消融实验也验证了「在线训练框架 」和「多粒度反馈」的有效性:
研究人员使用了两个最先进的基于强化学习和code LLMs的方法作为基准,并在相同的基准和设置下进行评估。作者使用了两个不同的编程问题数据集进行评估,分别是APPS和MBPP。
在APPS数据集上,作者使用了RLTF框架对预训练的CodeT5模型进行微调,并取得了优于其他方法的结果。在MBPP数据集上,作者展示了RLTF方法在零样本设置下的性能,取得了新的最优结果。