[论文解读] Fix Bugs with Transformer through a Neural-Symbolic Edit Grammar
NSEdit 提出了一种基于 Transformer 的新型代码修复方法,通过将神经符号编辑语法形式化为正则语言来生成编辑序列。通过结合用于位置选择的指针网络以及在验证数据上微调的集成重排序器,NSEdit 在 CodeXGLUE 基准的 Tufano 小数据集上实现了 24.04% 的新 SOTA 准确率,表现出对语法错误的鲁棒性,并在无需程序分析输入的情况下实现了有效的编辑序列生成。
We introduce NSEdit (neural-symbolic edit), a novel Transformer-based code repair method. Given only the source code that contains bugs, NSEdit predicts an editing sequence that can fix the bugs. The edit grammar is formulated as a regular language, and the Transformer uses it as a neural-symbolic scripting interface to generate editing programs. We modify the Transformer and add a pointer network to select the edit locations. An ensemble of rerankers are trained to re-rank the editing sequences generated by beam search. We fine-tune the rerankers on the validation set to reduce over-fitting. NSEdit is evaluated on various code repair datasets and achieved a new state-of-the-art accuracy ($24.04\%$) on the Tufano small dataset of the CodeXGLUE benchmark. NSEdit performs robustly when programs vary from packages to packages and when buggy programs are concrete. We conduct detailed analysis on our methods and demonstrate the effectiveness of each component.
研究动机与目标
- 为解决在缺乏程序分析或辅助表示的情况下存在语法错误时的代码修复挑战。
- 通过将编辑建模为一种结构化、可微的语言而非直接的代码到代码翻译,提升代码修复的泛化能力和鲁棒性。
- 通过引入可学习的重排序机制,提升序列生成中束搜索输出的质量,优化精确率与召回率的权衡。
- 证明 Transformer 可通过删除和插入操作的领域特定语言(DSL)学习复杂编辑操作,实现精确、符号化的程序转换。
提出的方法
- NSEdit 使用 Transformer 编码器-解码器架构,其中编码器处理存在错误的源代码,解码器使用神经符号编辑语法作为领域特定语言(DSL)来生成编辑序列。
- 该编辑语法定义为正则语言,包含两种基本操作:'delete' 和 'insert',这些操作作为特殊标记嵌入模型的词汇表中。
- 在解码器中集成指针网络,通过从编码器的隐藏状态中检索来动态选择编辑位置,从而实现基于内容的位置注意力,而非静态嵌入。
- 模型采用束搜索进行解码,随后通过一组在验证集上微调的重排序器对假设进行重排序,这些重排序器基于与主模型对数似然不同的学习置信信号进行评分。
- 重排序器在验证集上进行训练以减少过拟合并提升泛化能力,置信度分数用于在实际部署中控制精确率-召回率的权衡。
- 该方法通过仅使用存在错误和修复后的代码对进行端到端训练,无需 AST、DFG 或错误信息,完全依赖模型从预训练中学习语法和语义的能力。
实验结果
研究问题
- RQ1Transformer 模型是否能够在不依赖程序分析表示的情况下,学习生成存在错误代码的精确编辑序列?
- RQ2与直接代码生成相比,使用神经符号编辑语法作为 DSL 是否能提升代码修复的鲁棒性和准确性?
- RQ3集成重排序器和在验证集上微调在多大程度上提升了代码修复中束搜索输出的质量?
- RQ4在实际部署场景中,重排序分数的精确率-召回率权衡与束搜索的内在对数似然分数相比如何?
主要发现
- NSEdit 在 CodeXGLUE 基准的 Tufano 小数据集上实现了 24.04% 的新 SOTA 准确率,优于依赖直接代码生成或复杂图表示的先前方法。
- 在验证集上微调的集成重排序器相比单个重排序器将 top-1 准确率提升了 1.69 个百分点,证明了集成学习在减少过拟合方面的有效性。
- 在验证集上微调重排序器后,所有 top-k 设置下的准确率均有所提升,当同时采用集成和微调时性能达到最佳。
- 重排序分数在精确率-召回率权衡上比束搜索的内在对数似然分数更高效:在 50% 精确率下,重排序方法可保持 38.4% 的召回率,而束搜索需将召回率降至 22.4% 才能达到相同精确率水平。
- NSEdit 在多样化的代码库和具体存在错误的程序上均表现出稳健性,表明即使在语法被破坏的情况下也具备强大的泛化能力。
- 将 CodeBERT 和 CodeGPT 作为主干编码器和解码器进一步提升了性能,证实了在代码上预训练的模型能够有效将知识迁移至编辑序列生成任务。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。