从代码到语言:CoreGen 助力自动化提交信息生成

1.概述

        源代码与自然语言之间的语义鸿沟是生成高质量代码提交信息的一个重大挑战。代码提交信息对于开发者来说非常重要,因为它们简明扼要地描述了代码更改的高层次意图,帮助开发人员无需深入了解具体实现即可掌握软件的演变过程。手动编写高质量的提交信息对开发者来说是额外的负担,特别是在大型项目中,这种负担尤为明显。

        目前,已有多种方法尝试解决这一问题。早期的研究通常采用预定义的模板来生成提交信息,但这种方法需要人工定义模板,且对无法匹配这些模板的提交可能无法生成有意义的信息。随后,基于信息检索的技术开始被应用于从现有提交信息中检索合适的信息。然而,这些方法在变量和函数名不一致的情况下效果有限。

        近年来,随着神经机器翻译(NMT)技术的进步,研究人员开始将提交信息生成视为一种代码到文本的翻译任务,使用深度神经网络来建模代码提交与提交信息之间的关系。然而,现有的研究存在一些局限性,如采用静态嵌入方式,不关注代码的上下文信息,无法准确捕捉代码变化的语义。

        CoreGen 提出了一个两阶段的框架,通过上下文代码表示学习来生成提交信息。其主要贡献包括:

  • 第一个阶段,CoreGen 学习上下文化的代码表示,区分代码提交中的显式和隐式变化,并根据不同的提交类型预测代码变化或掩码的代码片段。
  • 第二个阶段,CoreGen 在上下文化代码表示的基础上微调模型,用于提交信息的生成。

        在实验中,CoreGen 在 BLEU-4 评分上比现有模型至少提升了 28.18%,并且在低资源情况下表现出色,展示了其强大的泛化能力。

2. 方法 (Approach)

        CoreGen 提出了一个用于提交信息生成的两阶段框架,主要通过上下文代码表示学习来实现。这个方法通过对代码提交信息进行上下文化处理,提出了两种针对不同类型代码提交的表示学习策略,以有效利用代码的上下文信息。

2.1 阶段 I:上下文代码表示学习 (Stage I: Contextualized Code Representation Learning)

        CoreGen 将代码提交分为两类:

  • 显式代码更改(explicit code changes):包括代码的添加、删除或修改。
  • 隐式二进制文件更改(implicit binary file changes):无法直接查看更改细节的文件变更。

        针对这两类不同的代码提交,CoreGen 提出了不同的上下文代码表示学习策略:

  • 代码变化预测(Code Changes Prediction):对于显式的代码更改,CoreGen 通过训练 Transformer 模型来预测代码的变化。具体步骤包括:

    • 将源代码分割为更改前和更改后的子序列。
    • 根据代码提交中的特殊标记(如 "+" 和 "-")定位更改。
    • Transformer 模型通过上下文信息来预测代码变化,重点关注代码片段的变化,而不是整个代码片段。
  • 掩码代码片段预测(Masked Code Fragment Prediction):对于隐式的二进制文件更改,无法直接查看内容,因此,CoreGen 通过掩码策略进行上下文表示学习。具体步骤包括:

    • 随机掩盖代码序列的某个片段,然后预测被掩盖的部分。
    • Transformer 模型通过上下文中的其他代码片段预测被掩盖的片段,从而捕捉上下文信息。

        在阶段 I 的学习过程中,CoreGen 通过这两种策略对代码的上下文信息进行了充分的利用。学习到的上下文化代码表示将被应用于阶段 II 的提交信息生成任务。

2.2 阶段 II:提交信息生成 (Stage II: Downstream Commit Message Generation)

        在阶段 II 中,CoreGen 将从阶段 I 中学习到的上下文化代码表示与 Transformer 模型参数一起,进一步微调模型用于提交信息的生成。具体步骤包括:

  • 给定一个代码提交序列,模型通过微调预测相应的提交信息。
  • 微调过程中的所有层都通过反向传播进行优化,以确保模型能够生成高质量的提交信息。

        通过这种两阶段的策略,CoreGen 实现了更加精确的提交信息生成。

3. 实验设置 (Experimental Setup)

这一部分描述了 CoreGen 的基准数据集、评价指标、基线模型以及实验中使用的参数设置。

3.1 数据集 (Dataset)

实验基于 Liu 等人发布的清理后的基准数据集,最初的数据集来自 Jiang 等人的工作,包含大约 200 万对代码提交和对应的提交信息。清理后的数据集包含约 2.7 万对代码提交和提交信息,并按 8:1:1 的比例划分为训练集、验证集和测试集。清理过程包括去除无信息的符号(如问题 ID 和提交 ID)以及删除质量较差的提交信息。

3.2 评价指标 (Evaluation Metrics)

CoreGen 的有效性通过自然语言生成任务中常用的自动评价指标来验证,包括 BLEU-4、ROUGE 和 METEOR。

  • BLEU-4 衡量候选文本与参考文本之间的 4 元组精度,适用于评价生成句子的质量。
  • ROUGE 是一种面向召回的指标,尤其适用于总结任务,本文计算了 ROUGE-1(单字词)、ROUGE-2(双字词)和 ROUGE-L(最长公共子序列)。
  • METEOR 通过惩罚功能和 F-分数的加权计算,评价句子生成的顺序准确性。

3.3 基线模型 (Baseline Models)

为了验证 CoreGen 的有效性,本文与几种基线模型进行了比较:

  • NMT:该模型使用 RNN 编码器-解码器架构,使用 TensorFlow 工具包 Nematus 实现,用于将代码提交翻译为提交信息。
  • NNGen:一种基于检索的模型,使用最近邻算法从现有提交信息中重用提交信息。
  • PtrGNCMsg:另一种基于 RNN 的编码器-解码器模型,采用指针生成网络来解决 OOV(词汇外)问题。

3.4 参数设置 (Parameter Setting)

在验证集上,实验测试了不同的超参数组合,以优化 CoreGen 的端到端性能。具体设置如下:

  • 代码提交和提交信息使用 55,732 个唯一词汇的共享词汇表。
  • 词向量的输入维度设置为 512,初始时随机初始化,并在上下文代码表示学习过程中进行训练。
  • 使用 Adam 优化器进行训练,批量大小设置为 64,学习率动态调整,阶段 I 的掩码比例设置为 0.5。

4. 实验结果 (Experimental Results)

        这一部分展示了 CoreGen 模型及其基线模型的实验结果,包括结果分析、消融研究和参数敏感性分析。

4.1 结果分析 (Result Analysis)

        实验结果表明,CoreGen 在 BLEU-4、ROUGE-L 和 METEOR 评分上分别提高了 28.18%、26.12% 和 17.82%。这种改进归因于 CoreGen 对代码片段的关键部分(如代码更改)的关注。此外,与 PtrGNCMsg 模型相比,CoreGen 在处理 OOV(词汇外)问题上表现出色,能够通过上下文信息更准确地建模上下文特定的标记。

        CoreGen 的上下文代码表示学习还加快了模型的收敛速度。在与传统 Transformer 模型的对比实验中,CoreGen 仅需 25 个训练周期就能达到相同的生成质量,表明其在模型训练效率上的优势。

        为了模拟实际使用场景,实验还验证了 CoreGen 在低资源设置下的泛化能力。即使只使用 50% 的标注数据进行监督微调,CoreGen 仍能显著超过基线模型。这表明 CoreGen 的上下文代码表示学习策略具有很强的泛化能力,特别是在低资源的情况下。

4.2 消融研究 (Ablation Study)

        为了验证上下文代码表示学习的有效性,实验比较了去除表示学习阶段(Stage I)的 CoreGen 变体(CoreGen II)。结果表明,大约一半的性能提升来自于上下文代码表示学习,其余提升可以归因于 Transformer 的自注意力模型架构。尽管 CoreGen II 相对于基线模型有显著改进,但与完整的 CoreGen 仍存在明显差距,进一步证明了上下文代码表示学习的重要性。

4.3 参数敏感性 (Parameter Sensitivity)

        实验分析了掩码率、层数和头数等关键参数对 CoreGen 性能的影响。结果表明,当掩码率增加到 0.5 时,生成质量提升;但当掩码率继续增加时,性能反而下降,这是由于上下文信息的不足导致的。在 CoreGen 中,掩码率被设定为 0.5,意味着代码序列中最长行的 50% 的标记会被随机掩盖,用于表示学习阶段。

        此外,实验还表明,层数和头数过多会对模型的生成质量产生负面影响。因此,CoreGen 中的 Transformer 模型的层数和头数分别设定为 2 和 6,以优化计算成本。

代码地址:

https://pan.baidu.com/s/1BQL5y2OBf2wQc18Jg75JKg?pwd=tbfx 
提取码:tbfx 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱花的浪漫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值