BatCoder:通过回译实现自监督双向代码-文档学习 BatCoder: Self-Supervised Bidirectional Code-Documentation Learning via Back-Translation
用回译与强化学习在无配对数据下同步提升代码生成与文档生成能力。
前置知识
回译(Back-Translation)
在本文中,回译指先将代码 c 转写为文档 d,再由 d 重建代码 c';通过比较 c 与 c' 的相似度形成训练信号。核心假设是:若文档保留了足够语义,c' 应与 c 高度一致。该范式无需人工配对标注,可仅凭未标注代码构建双向监督信号。
理解回译是读懂 BatCoder 方法的关键,它解释了为何无需配对数据也能同时优化两个方向。
强化学习(RL)与策略梯度
在代码生成语境里,强化学习通过奖励(如执行正确性或相似度)直接优化模型策略。本文采用 Reinforce++ 策略梯度算法,并使用回放缓冲区稳定训练;奖励被用于估计每个 token 的优势函数以更新参数。
BatCoder 的训练信号来自重建相似度和格式约束,因此需要理解策略梯度如何将这些奖励回传到代码→文档阶段。
代码相似度度量(如 CSSG)
代码相似度度量用于比较两段代码在结构和语义上的接近程度。本文使用 CSSG,一种基于改进的程序依赖图(PDG)的度量,输出范围在 [0,1],分数越高代表语义与结构越接近,从而作为重建质量的量化指标。
CSSG 直接决定了奖励的质量;理解其评分机制有助于解释为何某些重建被强化或抑制。
低资源编程语言
低资源语言指缺乏大量高质量代码-文档配对或训练数据的语言,例如 Ruby 和 Go。传统监督方法往往难以在这些语言上取得理想性能,而 BatCoder 的回译策略通过仅使用代码就能在低资源场景中挖掘有效信号。
论文强调 BatCoder 在低资源语言上的显著收益,说明该方法在数据稀缺领域的适用性。
研究动机
在代码与文档的双向变换任务中,传统做法依赖高质量的代码-文档配对数据进行监督微调或强化学习。然而,配对数据成本高且在很多语言或场景下稀缺,导致模型在低资源语言上性能受限。现有的数据增强方案(如 WizardCoder、Magicoder、Gao 等)通常需要更强的外部模型或规则来合成数据,目标模型无法通过同一机制自我提升;一旦生成配对数据,训练多采用 SFT,将文档当作固定监督,不再显式评估或优化文档对训练目标的贡献。
本文的目标是BatCoder 的目标是提出一种自包含、自监督的框架,仅使用未标注代码,通过回译策略同步提升代码生成与文档生成能力。作者希望通过重建相似度形成统一的双向学习信号,在无需外部配对数据或教师模型的前提下,实现高质量的代码→文档与文档→代码双向建模。
与已有工作不同的是,BatCoder 的切入点在于将文档视作可重建的中间表示,并通过代码级相似度作为隐式奖励进行强化学习。与需要强模型或规则约束的 UniCoder、SelfCodeAlign 等方法不同,BatCoder 不依赖外部约束,而是让模型通过重建忠实度自我校正文档质量。这种回译+奖励的闭环设计使模型能在训练中不断改进文档表达和代码重建,形成自监督的双向优化路径。
核心方法
BatCoder 的整体思路可以分两步理解:先把代码想象成一个问题,模型试着用自然语言写出“答案”(文档),再用这个“答案”去回写原始代码;如果文档写得好,重建出来的代码就会和原始代码很像。通过比较重建代码与原始代码的相似度,模型获得“做得好不好”的反馈,从而同时改进文档生成和代码生成。整体上,BatCoder 把代码→文档与文档→代码看作一个双向回译过程,利用未标注代码自动生成训练信号,不需要人工配对数据或更强的教师模型。
核心创新点在于将重建相似度作为统一奖励,将文档质量与代码生成能力绑定在一个闭环里。与传统 SFT 把文档当作固定监督不同,BatCoder 在训练中显式评估文档是否足以让模型重建原始代码,并通过 Reinforce++ 等策略梯度方法把奖励回传到文档生成阶段。同时引入文档有效性奖励(0/0.5/1)以稳定训练,避免格式不规范导致的噪声。这种设计使得模型能自监督地提升双向生成,而无需外部配对数据。
方法步骤详情
BatCoder 的训练包括:1) 给定未标注代码 c,使用单次示例提示生成 K=8 个文档候选(Stage 1);2) 对文档进行正则过滤与重写,只保留满足结构约束(含描述、示例、函数定义等)的部分,记录冗余情况,获得文档有效性奖励;3) 对每个合格文档生成一个重建代码 c'(Stage 2);4) 用 CSSG 计算 c 与 c' 的相似度作为 Stage 2 的奖励,并据此推导 Stage 1 的奖励(R_sim,code2doc × R_doc);5) 将轨迹放入回放缓冲区,计算归一化优势估计,联合优化两个方向的策略;6) 在训练中丢弃全零奖励的小批次以提高采样效率。整个过程无需外部配对数据,仅靠重建与格式约束产生训练信号。
技术新颖性
BatCoder 的技术新颖性体现在三点:第一,提出自监督回译闭环,将文档质量与代码重建能力绑定,避免对配对数据和外部模型的依赖;第二,采用不对称采样策略(Stage 1 多样本、Stage 2 单样本)以平衡轨迹数量并降低计算/内存开销;第三,在奖励设计中引入文档有效性奖励,并以 CSSG 作为语义-结构相似度指标,使训练信号更具可解释性和鲁棒性。
实验结果
BatCoder 在多个基准上展现出一致性收益:以 7B 模型为例,HumanEval 从基线 81.7 提升到 83.5,HumanEval+ 从 73.2 提升到 76.8,MBPP 从 78.6 提升到 81.0,MBPP+ 从 68.0 提升到 69.3;3B 模型同样在四项指标上获得 +2.4、+3.0、+1.1、+4.2 的提升。在多语言低资源场景下,BatCoder 尤其突出:Ruby 上 7B 从 3.1 提升到 13.0(+9.9),3B 从 0.0 提升到 10.6;Go 上 7B 从 34.4 提升到 39.0,3B 从 33.8 提升到 37.7。训练动态分析显示 Stage 1/2 的平均奖励与 Pass@1 随训练步数呈稳定上升趋势,表明奖励设计与最终性能高度相关。消融实验表明,仅使用 Stage 2(去掉文档优化)时 Ruby Pass@1 仅从 0.0 提升到 1.9,而完整 BatCoder 达到 10.6;与 SFT 相比,BatCoder 也明显更优,说明显式奖励对文档质量的约束是关键。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| HumanEval | pass@1 | 83.5 | 81.7 | +1.8 |
| HumanEval+ | pass@1 | 76.8 | 73.2 | +3.6 |
| MBPP | pass@1 | 81.0 | 78.6 | +2.4 |
| MBPP+ | pass@1 | 69.3 | 68.0 | +1.3 |
局限与改进
论文承认存在若干局限:首先,作者对 3B 与 7B 使用同一套超参数,未进行充分调优,虽已展示有效性,但尚未探索跨模型规模的最优设置;其次,奖励仅基于代码相似度和文档格式,尚未探索更多奖励来源(如执行正确性、语义覆盖度、风格偏好等);再次,虽然方法在 Ruby/Go 上取得显著收益,但尚未系统评估更广泛的低资源语言或更大规模代码库的泛化性。作者还指出,训练采用回放缓冲区与策略梯度,计算成本高于单纯 SFT,未来可在效率与稳定性上做进一步优化。
独立分析的弱点
尽管 BatCoder 提供了自监督的双向优化,但仍存在一些弱点:1) 当前奖励完全依赖 CSSG,该度量对复杂控制流或高度抽象代码可能不足以全面反映语义一致性,改进方向是引入混合奖励(如执行通过率、抽象语法树差异、类型一致性等)以提高鲁棒性;2) 训练使用回放缓冲区与策略梯度,计算开销相对较大,且需要较精细的奖励归一化和动态采样策略,未来可设计更高效的 RL 算法或采用 off-policy 方法以降低开销;3) 文档有效性奖励仅区分三种情况(0/0.5/1),对于更细粒度的文档质量问题(如冗余但结构完整、部分覆盖逻辑等)可能不够敏感,改进方向是引入连续奖励或基于模型评估的打分;4) 论文未公开完整代码或大规模复现实验,复现者需自行搭建提示模板、过滤规则与 RL 框架,存在一定的工程难度。
未来方向
作者提出未来可以在以下方向扩展:1) 引入更多样化的奖励信号(如执行正确性、代码风格、可维护性指标)并在不同 RL 算法下评估鲁棒性;2) 研究在更大规模模型(如 13B、34B)与更大代码库上的 scaling 行为,理解回译信号的收益曲线;3) 将回译框架应用到其他任务(如代码补全、代码翻译、错误修复),检验其通用性;4) 探索更强的代码相似度度量或与执行反馈结合的混合奖励,以进一步提升文档质量与重建一致性;5) 在更多低资源语言或跨语言场景下测试,挖掘回译在数据极端稀缺时的潜力。
复现评估
论文基于 Qwen2.5-3B/7B-Instruct 开源模型进行训练,使用 CodeXGLUE 的代码-文本数据作为代码语料,并在 HumanEval/MBPP 等公开基准上评估;训练采用公开的 verl 框架与 Reinforce++ 实现,理论上可在具备 2×A100 的环境下复现。作者承诺将在被接受后开源核心代码,但尚未提供完整复现实验脚本或大规模训练日志,复现者需自行处理提示模板、文档过滤与奖励归一化细节。
论文图表