《Contextualized Code Representation Learning for Commit Message Generation》阅读

Contextualized Code Representation Learning for Commit Message

Generation

目录

Contextualized Code Representation Learning for Commit Message

Generation

Abstract :

1. Introduction

2. Approach

2.1. Stage I: Contextualized Representation Learning

2.1.1. Code Changes Prediction

2.1.2. Masked Code Fragment Prediction

2.2. Stage II: Downstream Commit Message Generation

3. Experimental Setup

3.1. Dataset

3.2. Evaluation Metrics

3.3. Baseline Models

3.4. Parameter Setting

4. Experimental Results

4.1. Result Analysis

4.2. Ablation Study

4.3. Parameter Sensitivity

4.4. Low-resource Study

5. Related Works

6. Conclusion


Abstract :

为代码提交自动生成高质量的提交消息可以极大地促进开发人员的工作和协调。然而,源代码和自然语言之间的语义差异是这项任务的主要挑战。已经提出了一些研究来缓解这一挑战,但没有一项研究明确涉及提交消息生成过程中的代码上下文信息。具体来说,现有的研究对代码标记采用静态嵌入,将标记映射到相同的向量,而不考虑其上下文。在本文中,我们提出了一种新的上下文化代码表示学习方法来生成提交消息。CoreGen首先学习上下文化的代码表示,它利用代码提交序列背后的上下文信息。在Transformer上构建的代码提交的学习表示,然后被传输用于下游提交消息生成。在基准数据集上进行的实验表明,我们的模型比基线模型的效率更高,BLEU-4得分提高了28.18%。此外,我们还强调了在更大的代码语料库上训练上下文化的代码表示的未来机会,作为低资源设置的解决方案,并使预先训练好的代码表示适应其他下游的代码到文本生成任务。

 

1. Introduction

随着人们日常生活和工作中对软件程序需求的增加,每天都会产生大量的源代码。因此,弥合源代码和自然语言之间的差距已经成为一项实际有用但具有挑战性的任务。减少这种差距将使源代码的语义与自然语言连接起来,这在解决许多任务中是至关重要的,比如代码提交消息生成。在软件开发的生命周期中,版本控制系统(如GitHub和GitLab)上的提交消息对于开发人员在高级自然语言总结中记录抽象代码差异至关重要。图2显示了代码提交消息的一个示例,其中一行代码已被更新以进行更通用的异常处理。绿色背景中标记为+的行是新添加的代码,红色背景中标记为-的行表示代码已被删除,相应的提交消息显示在顶部。高质量的提交消息允许开发人员理解软件发展背后的高层次直觉,而不必深入到低层次的实现细节,这可以显著简化大型项目[6]的协作和维护。
然而,在实践中,提交消息的质量并不总是得到保证。Dyer等人[10]在他们的研究中报告说14%的Java项目在SourceForge上留下了完全空白的提交信息。由于缺乏时间和动力,许多开发人员要么忽视了提交消息的重要性,要么故意牺牲质量。写有意义而简洁的提交消息需要开发人掌握代码变更背后的基本想法和显式地总结他们从整体的角度来看,这是一个技能,在很大程度上依赖于个人开发者的重击经验。星航工程科从事即使对于有经验的人来说,为大量的代码提交编写高质量的摘要仍然会带来相当大的额外工作量。
 
因此,自动生成高质量的提交消息变得非常必要,并且已经提出了许多方法来满足这一需求。在早期,研究者采用预定义的模板从提取的信息中生成commit信息[6,8,19,37]。但是,这些基于规则的方法需要人工开发人员手动定义模板。对于与任何预定义规则不匹配的代码提交,它们的方法可能无法生成有意义的提交消息。例如,在Shen等人的工作[37]中,他们定义的规则只能处理四种典型的代码提交类型,琐碎到在[方法名]处填充模板Add [Add information]来修改方法内的句子。为了解决这个问题,后期的工作[13,23]利用信息检索技术对传入的代码提交重用现有的提交消息。尽管灵活性得到了提高,但是检索到的消息的质量仍然取决于是否可以从数据库中搜索类似的代码提交。
 
与神经促进机器翻译(NMT),最近研究人员将提交消息代视为codeto-text自然语言生成任务,利用深层神经网络模型之间的关系代码提交和提交消息(42岁,14日,25日22),这是声称获得最先进的性能基准。
 
尽管深度学习模型在代码提交消息生成方面取得了比较成功,但所有这些研究都存在三个关键的局限性。首先,现有的研究一般采用静态嵌入方法来表示代码,将代码标记映射到相同的向量,而不考虑其上下文。然而,考虑到源代码和自然语言之间的语义差异,代码数据与文本数据在本质上是不同的。例如,单个标记(如果是文本数据)可以表示部分语义,但如果没有上下文就不能在源代码中传递任何有意义的信息。其次,以前的研究只是将整个代码提交片段作为输入,而没有显式地关注已更改的片段。第三,现有的用于生成提交消息的NMT模型都是基于递归的,这已经被证明存在[4]的长期依赖问题。
 
在本文中,我们提出了一种新的两阶段代码提交消息生成方法,名为CoreGen,以解决上述限制。受最近成功的预训练语言模型的启发[31,9,33,38],我们提出了上下文化代码表示学习任务,它根据上下文信息赋予相同的代码标记不同的嵌入。通过训练模型预测代码更改,还可以明确地关注已更改的代码片段。在第二阶段,学习到的代码表示被保留,并进一步为下游提交消息生成进行微调。两个阶段都是基于Transformer实现的。在基准测试数据集上的实验结果表明,CoreGen在代码提交消息生成方面达到了新的水平。
 
我们工作的主要贡献如下:
•我们提出了一种两阶段提交消息生成方法,利用上下文化的代码表示来更准确地生成提交消息。
•我们的经验表明,我们提出的方法至少比以前的最先进的模型要好
提高了28.18%的大学4分。我们的深入消融研究和低资源研究也证明了CoreGen的前景的有效性。
•我们强调通过上下文化代码表示学习来改进其他低资源代码到文本生成任务的机会,并将发布我们的实现
 

2. Approach

在本节中,我们将介绍我们的方法,它被命名为提交的上下文化代码表示学习消息生成(CoreGen),用于提交消息生成的两阶段流程。CoreGen首先在第一阶段通过自监督训练学习上下文化的代码表示,然后在第二阶段为下游提交消息生成任务对整个模型进行微调。CoreGen的概述如图1所示。
 

2.1. Stage I: Contextualized Representation Learning

为了更准确地生成提交消息,我们建议利用代码提交下面的上下文信息来丰富代码表示。我们首先根据更改将代码提交分为两类:一类是显式代码更改,另一类是隐式二进制文件更改。图4分别为(a)和(b)中的每个提交类型演示了一个示例。然后,对于每种提交类型,基于Transformer的神经模型通过其各自的自监督学习任务进行训练,以利用上下文化的代码表示。以下是详细的说明。

2.1.1. Code Changes Prediction

第一类代码提交包括显式的代码更改,如行添加、删除或修改。通常,行首用特殊符号标记,如“+”表示添加,“-”表示删除。与源代码中未更改的部分相比,这些更改的代码片段在代码提交消息生成中发挥了更重要的作用,因为根据定义,提交消息应该对代码更改进行编码,而不是对整个代码片段进行编码。因此,代码变更预测被指定为这种类型的代码提交的自监督表示学习任务,用于代码上下文建模。

具体地说,给一个源代码x序列,我们进行预处理和源代码序列分割成code-beforechange code-after-change子序列,分别标注为x^before和x^after。如果确定明确的代码更改,我们训练一个变压器网络来预测变化的建模x^before和x^after之间的关系。Transformer[39]是一种基于自注意的编解码器架构,在许多神经机器翻译基准中已经取得了最先进的结果。编码器模块将输入序列编码为隐藏表示的序列,而解码器模块接着将隐藏表示解码为输出序列,并每次生成一个令牌。具体来说,我们将更改前的代码序列输入到转换器中,以预测相应的更改后代码序列。目标函数采用对数似然法

通过从各自的上下文预测代码更改,我们显式地强制转换器关注被更改代码的比例,并在上下文代码令牌和已更改代码令牌之间建立连接,从而可以使用它们的上下文丰富代码更改的表示。

2.1.2. Masked Code Fragment Prediction

另一类代码提交包括隐式二进制文件更改,其中不可见详细的修改。为了对文件更改的上下文进行建模,我们随机掩码提交序列的一个片段,并通过从剩余的标记中预测掩码标记来进行自我监督表示学习。

2.2. Stage II: Downstream Commit Message Generation

在阶段II,我们将Transformer模型参数与从阶段I学习到的代码提交表示结合起来,用于下游的微调。整个模型在监督微调过程中得到优化,反向传播应用于所有层。具体地说,给一个源代码푋序列,预测模型进行了微调푌相应的提交消息序列。

3. Experimental Setup

在本节中,我们将描述用于评估的基准数据集、度量、基线模型和参数设置。

3.1. Dataset

我们基于Jiang等[14]发布的基准数据集进行评价实验。数据集包含2M对代码提交和相应的提交消息。我们进一步清理了数据集,方法是用空格和标点集来标记代码提交序列,删除非信息标记(例如,问题id和提交id),以及删除按照Liu等人的实践[23]编写的糟糕提交消息。这个预处理步骤给我们留下了27k对代码提交和提交消息,它们被进一步分成训练集、验证集和测试集,比例大约为8:1:1。

3.2. Evaluation Metrics

我们验证了CoreGen与自动评估指标的有效性,这些指标在自然语言生成任务中广泛使用,包括BLEU-4、ROUGE和METEOR。BLEU-4测量考生对参考的4克精度,并惩罚过短的句子[29]。BLEU-4通常在微粒水平上计算,它被证明比其他评价指标[21]更与人类判断相关。因此,我们使用语料库级的BLEU-4作为我们的评价指标之一。

为了减轻BLUE-4对长时间提交消息的偏好,我们还使用了ROUGE,这是一种面向recall的度量,特别为摘要任务而提出,用来评估生成的提交消息[18]的质量。本文分别计算了unigram (ROUGE-1)、bigram (ROUGE-2)和lcs (ROUGE- l)的胭脂分数。流星是[17]实验中使用的最后一种自然语言生成度量,它利用加权F-score计算和对乱序令牌的惩罚函数。

3.3. Baseline Models

在实验中,我们将提出的CoreGen与下列基线模型进行比较。

NMT. NMT model uses an attentional RNN Encoder
Decoder architecture to translate code commits into
commit messages [ 25 , 14 ]. Specififically, Jiang et al. [ 14 ]
implement the NMT model using a TensorFlow built
in toolkit named Nematus [ 36 ].
NNGen. NNGen is a retrieval-based model that lever
ages nearest neighbor algorithm to reuse commit mes
sages [ 23 ]. It represents each code commit sequence
as a “bags of words” vector and then calculates the co
sine similarity distance to retrieve top code commits
from the training corpus. The commit with the highest
BLEU-4 score to the incoming commit is thereafter
regarded as the nearest neighbor and the corresponding
commit message is then output as the fifinal result.
PtrGNCMsg. PtrGNCMsg [ 22 ] is another RNN-based
Encoder-Decoder model that adopts a pointer-generator
network to deal with out-of-vocabulary (OOV) issue.
At each prediction time step, the RNN decoder learns
to either copy an existing token from the source se
quence or generate a word from the fifixed vocabulary,
enabling the prediction of context-specifific OOV tokens
in commit message generation.
 

3.4. Parameter Setting

为了优化所提模型的端到端性能,我们对不同的超参数组合进行了实验。具体来说,我们使用包含55,732个唯一令牌的共享词汇表将代码提交和提交消息提供给CoreGen。令牌的输入维度设置为512。对于变压器,编码器和解码器模块均由相同的两层组成,每层包括六个平行的注意头。

在培训时,我们使用批量大小为64的Adam optimizer[16],按照原实现动态调整学习率,预热步骤设置为4000[39]。第I阶段掩码片段预测的掩码率设置为0.5。关于超参数对模型性能影响的详细分析可以在4.3节中找到。

4. Experimental Results

4.1. Result Analysis

表1显示了我们的模型和基线的实验结果。CoreGen在所有评价指标上都优于基线模型,分别比BLEU-4、ROUGE-L和METEOR得分至少提高了28.18%、26.12%和17.82%。我们将此归因于它捕获代码上下文信息的能力,以表示代码片段中最关键的片段,即已更改的代码片段。此外,比较PtrGNCMsg采用pointergenerator网络解决OOV问题,CoreGen年代优越性能进一步支持我们的主张利用情景化代码表示可以达到更准确的预测下游代码提交消息的上下文相关的令牌生成任务,导致一个优雅的解决方案OOV问题。

4.2. Ablation Study

为了进一步验证上下文化代码表示的有效性,我们还比较了CoreGen和一种缺失的方法CoreGen II,后者在没有自监督表示学习的情况下从零开始执行阶段II的微调。

正如我们从表1所示的统计数据中观察到的那样,与以前的先进技术相比,大约有一半的性能增益来自于上下文化的代码表示,而其余的则归功于Transformer的高级自注意模型架构。具体来说,CoreGen II与基线相比的实质性改进也证明了Transformer在代码提交消息生成任务方面优于传统的基于lstm的编解码器模型。然而,CoreGen II和CoreGen之间仍然存在显著的性能差距,这再次肯定了语境化代码表示学习的必要性。

4.3. Parameter Sensitivity

进一步分析了掩模率、层数和封头尺寸三个关键参数对coreen性能的影响。图5描述了分析结果。

从图5(a)可以看出,当掩码率从0.1增加到0.5时,生成质量会提高,但随着掩码率的增加,生成质量会下降。这肯定了我们的假设,屏蔽连续片段比屏蔽单个令牌更适合于代码语义建模,而屏蔽率过大的负面影响则可以用上下文信息的缺乏来解释。因此,在这项工作中,我们将掩码率设置为0.5,这意味着在阶段I的表示学习中,最长线的50%标记被掩码。图5(b)和5(c)表明,虽然层数或头的小会降低性能,但过多的层数或头也会损害模型的端到端性能。因此,为了节省计算成本,将Transformer的层数和head size分别设置为2和6。

4.4. Low-resource Study

在实践中,收集高质量的提交消息数据集是困难的,因为研究人员需要投入大量的精力来区分和清理编写得不好的消息[23]。因此,作为我们实验的最后一部分,我们验证了CoreGen在低资源设置下的泛化能力。在使用整个训练集进行自监督代码表示学习之后,我们调整可用于阶段II监督微调的提交消息数据量。

如图6所示,CoreGen通过只使用50%的标记数据集而优于基线模型(用虚线标注)。这不仅令人鼓舞的结果表明我们提出的概括性强self-supervised代码表示学习任务,但也表明承诺未来的研究方向,如培训更符合实际的代码表示更大的代码语料库作为一种通用解决方案资源缺乏任务,和我们的代码表示学习任务适应其他代码和文本生成任务域。

5. Related Works

6. Conclusion

代码提交消息的生成是一项必要但具有挑战性的任务。在本文中,我们提出了CoreGen,一种两阶段的方法,它利用上下文化的代码表示学习来提高提交消息生成的下游性能。具体地说,针对两类代码提交,我们引入了两种自监督的学习任务,即代码变更预测和代码片段隐藏预测,以利用上下文化的代码表示。实验结果表明,CoreGen在基准数据集上的性能显著优于竞争基线,达到了最先进的水平。

我们进一步验证了CoreGen在低资源设置下的性能,在这种情况下,只有finetuning中使用的50%标记数据就生成了更准确的提交消息。这指出了很有前途的未来方向,包括扩展我们的上下文化代码表示学习方法到更大的代码语料库和其他下游的代码-文本生成任务,如代码摘要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值