《Multi-task Learning based Pre-trained Language Model for Code Completion》阅读

Multi-task Learning based Pre-trained Language Model for

Code Completion

目录

Multi-task Learning based Pre-trained Language Model for

Code Completion

ABSTRACT

1 INTRODUCTION

2 BACKGROUND

2.1 Statistical Language Model

2.2 Multi-task Learning

2.3 Pre-trained Language models

3 CugLM

3.1 Model Architecture

3.2 Input Representation

3.3 Pre-training Procedure

3.4 Fine-tuning Procedure

4 EXPERIMENTS AND ANALYSIS

4.1 Data preparation

4.2 Experimental Setup

4.3 Research Questions and Results

5 DISCUSSION

5.1 The type of completions

5.2 Model complexity comparison

5.3 Effect of applying BPE algorithm

5.4 Threats to Validity

6 RELATED WORK

7 CONCLUSIONS AND FUTURE WORK


ABSTRACT

代码完成是集成开发环境(ide)中最有用的特性之一,它可以根据上下文代码实时建议下一个可能的标记,从而加速软件开发。最近的研究表明,统计语言建模技术可以通过学习大规模的软件存储库来提高代码完成工具的性能。然而,这些模型有两个主要的缺点:1)现有的研究使用静态嵌入,将一个单词映射到同一个向量,而不考虑其上下文。当每一个令牌与一个单一的表示相关联时,在不同的上下文中意义上的差异就消失了;b)现有基于语言模型的代码补全模型在补全标识符方面表现不佳,大多数模型忽略了标识符的类型信息。为了解决这些挑战,在本文中,我们开发了一个基于多任务学习的预训练语言模型,用于代码理解和代码生成,使用基于转换器的神经结构。我们用混合目标函数对它进行预培训,混合目标函数包含了代码理解和代码生成任务。然后我们对代码完成的预训练模型进行微调。在完成过程中,我们的模型不会直接预测下一个令牌。相反,我们采用多任务学习联合预测令牌及其类型,并利用预测的类型来辅助令牌预测。在两个真实数据集上的实验结果证明了我们的模型与最先进的方法的有效性。

1 INTRODUCTION

2 BACKGROUND

2.1 Statistical Language Model

2.2 Multi-task Learning

2.3 Pre-trained Language models

3 CugLM

在本节中,我们将详细描述我们提议的代码理解和生成预训练语言模型(CugLM)。

3.1 Model Architecture

3.2 Input Representation

输入x标记序列,这是一双段拥挤在一起。如图3所示,对于给定的令牌,其向量表示是通过对相应的令牌、段和位置嵌入进行求和来计算的。

•对于令牌嵌入,将随机初始化嵌入矩阵,然后作为训练过程的一部分进行调整。定义了两个特殊标记[CLS] [SEP],其中[CLS](“CLaSsification”的缩写)总是出现在输入的开头。与[CLS]对应的最终隐藏状态可以作为分类任务的聚合序列表示,例如在下一个句子预测任务中。[SEP]是“SEPeration”的缩写,用来分隔句子对。

•部分嵌入,即𝐸𝐴和𝐸𝐵也用来区分代码段对。对于每一个标记的第一个代码段,学习嵌入𝐸𝐴添加,和一个有学问的嵌入𝐸𝐵被添加到每个令牌的第二个代码段。段嵌入的嵌入矩阵也是随机初始化的

•为了利用序列的顺序,我们使用学习过的位置嵌入,序列长度最多为128个记号。

3.3 Pre-training Procedure

为了对CugLM进行预训练,我们采用多任务学习的方法来共同学习三个任务,如图2所示,分别是蒙面双向语言建模(MLM)、下一个代码段预测(NCP)和单向语言建模(ULM)。对于前两个目标,变压器网络为双向设置,对于最后一个目标,变压器网络为单向设置。a)掩码双向语言建模:为了训练程序的深度双向表示,我们采用了与BERT类似的目标,即屏蔽一定百分比的输入令牌,然后只预测那些掩码的令牌。与BERT不同的是,我们只使用类型信息来屏蔽标识符,其中类型信息可以通过静态分析提取或由开发人员注释,考虑到这些标识符对于理解程序更有用。然后,目标是根据其双向上下文标记来预测屏蔽标识符,其中所有标记在预测中可以相互关注。它从两个方向编码上下文信息,并且可以生成屏蔽标识符的更好的上下文表示,以及与它的单向对应项相比的其他标记。最后将与掩模令牌对应的隐藏向量输入输出softmax层,生成输出的概率分布。

b)下一个代码段预测:理解两个句子之间的关系对于许多NLP任务非常重要,例如问答(QA)和自然语言推断(NLI),这有助于更深入地理解输入文本。我们认为,理解代码段之间的关系也有助于源代码建模。为了实现这一点,我们预先训练一个二值化的下一个代码段预测任务,即预测在一个代码片段中两个代码段标记是否跟随在一起。具体来说,在为每个预训练示例选择代码段A和代码段B时,有50%的几率B是在A之后实际的下一个代码段,有50%的几率B是从语料库中随机抽取的代码段。例如

Input = [CLS] public void setTextDirection ( int textDirection ) {
             [SEP] this . mTextDirection = textDirection ; }
Label = 1
 
Input = [CLS] public void setTextDirection ( int textDirection ) {
             [SEP] this . request = request ;
Label = 0
 
与[CLS]对应的最终隐藏向量作为聚合的序列表示,被送入输出softmax层,生成分类结果的概率分布。
 
c)单向语言建模:对于语言生成任务,例如代码完成,所预测的标记的上下文应该只包含其左边的标记。因此,我们创建从左到右语言建模任务作为另一个训练的目标,即预测下一个记号𝑥𝑡+ 1鉴于前上下文令牌𝑥1𝑥2,……,𝑥𝑡。每个标记的表示只对左侧上下文标记和本身进行编码。可以使用三角矩阵self-attention面具𝑀的上三角self-attention面具的一部分设置为−∞,以及其他为0。在每个时间步𝑡,最后隐藏向量对应𝑥𝑡输入将softmax层产生的概率分布预测令牌𝑦𝑡。
 

预训练过程遵循现有的语言模型预训练方法。CugLM的参数学习以最小化三个预训练任务的交叉熵损失之和,并在所有任务间共享。最终损失函数为:

3.4 Fine-tuning Procedure

4 EXPERIMENTS AND ANALYSIS

4.1 Data preparation

4.2 Experimental Setup

4.3 Research Questions and Results

5 DISCUSSION

5.1 The type of completions

5.2 Model complexity comparison

5.3 Effect of applying BPE algorithm

5.4 Threats to Validity

6 RELATED WORK

7 CONCLUSIONS AND FUTURE WORK

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值