收藏 分销(赏)

基于代码语句掩码注意力机制的源代码迁移模型.pdf

上传人:自信****多点 文档编号:2187679 上传时间:2024-05-22 格式:PDF 页数:12 大小:1.28MB
下载 相关 举报
基于代码语句掩码注意力机制的源代码迁移模型.pdf_第1页
第1页 / 共12页
基于代码语句掩码注意力机制的源代码迁移模型.pdf_第2页
第2页 / 共12页
基于代码语句掩码注意力机制的源代码迁移模型.pdf_第3页
第3页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、基于代码语句掩码注意力机制的源代码迁移模型徐明瑞,李征,刘勇,吴永豪(北京化工大学信息科学与技术学院,北京100029)通信作者:刘勇,E-mail:摘要:源代码迁移技术旨在将源代码从一种编程语言转换至另一种编程语言,以减轻开发人员迁移软件项目的负担.现有研究通常利用神经机器翻译(NMT)模型将源代码转换为目标代码,但这些研究忽略了代码结构特征,导致源代码迁移性能不佳.为此,本文提出了基于代码语句掩码注意力机制的源代码迁移模型 CSMAT(code-statementmaskedattentionTransformer).该模型利用 Transformer 的掩码注意力机制(maskedatt

2、entionmechanism),在编码时引导模型理解源代码语句的语法和语义以及语句间上下文特征,在译码时引导模型关注并对齐源代码语句,从而提升源代码迁移性能.本文使用真实项目数据集 CodeTrans 进行实证研究,并使用 4 个指标评估模型性能.实验结果验证了 CSMAT 的有效性,同时验证了代码语句掩码注意力机制在预训练模型的适用性.关键词:代码语句;掩码;代码迁移;机器翻译;注意力机制引用格式:徐明瑞,李征,刘勇,吴永豪.基于代码语句掩码注意力机制的源代码迁移模型.计算机系统应用,2023,32(9):7788.http:/www.c-s- Code Migration Model B

3、ased on Code-statement Masked Attention MechanismXUMing-Rui,LIZheng,LIUYong,WUYong-Hao(CollegeofInformationScienceandTechnology,BeijingUniversityofChemicalTechnology,Beijing100029,China)Abstract:Sourcecodemigrationtechniquesaredesignedtoconvertsourcecodefromoneprogramminglanguagetoanother,whichhelps

4、reducedevelopersburdeninmigratingsoftwareprojects.Existingstudiesmainlyuseneuralmachinetranslation(NMT)modelstoconvertsourcecodetotargetcode.However,thesestudiesignorethecodestructurefeatures,resultinginpoorsourcecodemigrationperformance.Therefore,thisstudyproposesasourcecodemigrationmodelbasedonaco

5、de-statementmaskedattentionTransformer(CSMAT).ThemodelusesTransformersmaskedattentionmechanismtoguidethemodeltounderstandthesyntaxandsemanticsofsourcecodestatementsandinter-statementcontextualfeatureswhenencodingandmakethemodelfocusonandalignthesourcecodestatementswhendecoding,soastoimprovemigration

6、performanceofsourcecode.Empiricalstudiesareconductedontherealprojectdataset,namelyCodeTrans,andmodelperformanceisevaluatedbyusingfourmetrics.TheexperimentalresultshavevalidatedtheeffectivenessofCSMATandtheapplicabilityofthecode-statementmaskedattentionmechanismtopre-trainedmodels.Key words:codestate

7、ment;mask;codemigration;machinetranslation;attentionmechanism1引言随着计算机软件和硬件的发展,编程语言也快速更新迭代.为了让传统平台的软件项目适应新的业务场景,开发人员需要用新的编程语言重写软件项目,这计算机系统应用ISSN1003-3254,CODENCSAOBNE-mail:ComputerSystems&Applications,2023,32(9):7788doi:10.15888/ki.csa.009217http:/www.c-s-中国科学院软件研究所版权所有.Tel:+86-10-62661041基金项目:国家自然科学

8、基金(61902015,61872026)收稿时间:2023-02-14;修改时间:2023-03-14;采用时间:2023-03-30;csa 在线出版时间:2023-06-09CNKI 网络首发时间:2023-06-12SystemConstruction系统建设77一过程称为代码迁移.然而,软件项目代码量十分庞大,不同编程语言有着不同的功能特性,这使得开发人员迁移源代码既耗时又容易出错.例如澳大利亚联邦银行花了大约 7.5 亿美元和 5 年时间将其代码库从 COBOL迁移至 Java1.为此,研究人员提出源代码迁移技术,期望将源代码从一种编程语言转换至另一种编程语言,以减轻开发人员迁移源

9、代码的负担.随着神经网络技术的发展,神经机器翻译(neuralmachinetranslation,NMT)模型在自然语言翻译任务中取得了优异的成绩2,3,促使着研究人员探索使用神经机器翻译模型迁移源代码的可能性.例如,Chen 等人4提出了基于语法树的 tree-to-tree 模型,该模型的树编码器理解源代码抽象语法树(abstractsyntaxtree,AST),带有注意力机制的树译码器模型对齐并转换源代码AST 节点为目标代码 AST 节点,进而生成目标代码 AST.Shiv 等人5采用 Transformer 模型改进了 tree-to-tree模型架构,并提出了适用于 Trans

10、former 模型的树节点位置编码方式.然而此类模型受限于语法树:一方面抽象语法树会省略部分语义节点,例如有些编程语言的抽象语法树会把“+”“”“=”等符号抽象化为“BinOpSub”节点,不能表现出源代码的语义特征6.另一方面具体语法树(concretesyntaxtree,CST)尽管能完整地表征源代码语法和语义,但是其节点多且层数深,模型难以有效地从中提取代码特征.Feng 等人7使用六种编程语言和自然语言数据集,并采用掩码语言建模任务和替换词符检测任务预训练了 Transformer 编码器模型CodeBERT,让模型通过代码文本学习语法和语义.Lu等人8提出了代码翻译任务,并将代码文

11、本作为输入,让 Transformer 和 CodeBERT 模型学习代码文本的转换规则.然而有研究表明,此类模型忽略了代码结构特征,导致模型难以理解并迁移源代码911.为了解决此问题,Guo 等人12把数据流作为模型输入,并采用数据流的边预测任务和数据流节点-代码变量对齐等任务预训练了 Transformer 编码器模型 GraphCodeBERT,旨在用数据流引导模型更好地理解源代码.从这些源代码迁移工作可以得知,目前研究通常的做法是从语法树、数据流或者模型的角度提升模型迁移源代码的性能,很少考虑到为源代码迁移任务设计理解代码结构特征的模型,导致这些模型在源代码迁移任务中的性能不佳.为了解

12、决此问题,本文提出模型可以在编码时理解源代码语句的语法和语义以及语句级别上下文特征,并在译码时关注并对齐源代码语句,进而提升迁移源代码的性能.图 1 给出了代码迁移数据集中的一组C#和 Java 代码语句关联性样例,可以发现 C#的构造函数声明语句对应 Java 的构造函数声明语句和父类构造函数调用语句,C#的赋值语句对应 Java 的赋值语句.该样例表明源代码和目标代码的语句有着语法和语义的联系.一些研究也证明了神经网络模型理解编程语言的语法和语义上的可行性.例如,Hindle 等人13验证了代码是一种比自然语言更具备规则的语言,因此代码语句可以使用语言模型来建模;Zhang 等人14通过实

13、验验证了代码语句的语法是有规则的,并且代码语句序列同样具有规则及顺序依赖关系.此外,神经机器翻译研究中常用的 Transformer 模型3有着掩码注意力机制(maskedattentionmechanism),该机制能依据掩码矩阵来引导模型关注指定的词符特征12.因此,在模型迁移源代码至目标代码时,可让掩码注意力机制引导模型对齐并转换源代码语句的语法和语义特征,提升源代码迁移的性能.public XPathRuleElement(string ruleName,int ruleIndex):base(ruleName)this.ruleIndex=ruleIndex;public XPath

14、RuleElement(String ruleName,int ruleIndex)super(ruleName);this.ruleIndex=ruleIndex;C#代码Java 代码图 1一组 C#和 Java 代码语句关联性样例基于上述讨论和研究的启发,本文在 Transformer模型基础上提出了一种基于代码语句掩码注意力机制的源代码迁移模型 CSMAT(code-statementmaskedattentionTransformer).该模型的执行流程分为 3 个步骤:首先预处理代码文本,用自定义的语句词符标识代码语句;随后,编码器在掩码矩阵的引导下,其自注意力(self-atte

15、ntion)机制能够关注到源代码语句的语法和语义以及语句间上下文特征;最后,译码器在掩码矩阵的引导下,其跨层注意力(cross-attention)机制能够关注并对齐源代码语句,进而生成目标代码.为了验证模型性能,本文基于真实项目数据集 Code-Trans 设计了源代码迁移任务,并采用 BLEU、完全匹计 算 机 系 统 应 用http:/www.c-s-2023年第32卷第9期78系统建设SystemConstruction配率、CodeBLEU 和词法正确率 4 个指标对模型输出结果进行评估.对比实验结果显示 CSMAT 在 4 个指标的分值均优于对比模型,并且消融实验验证了代码语句掩码

16、注意力机制的有效性.此外,预训练模型的改进实验验证了代码语句掩码注意力机制的适用性.本文的模型和实验结果公布在:https:/ 等人15从代码的基本类型、变量、字面量和表达式等角度提出了 Smalltalk 到 C 语言的翻译器.Bravenboer 等人16设计了程序转换规则语言Stratego 和程序转换工具集 XT.石学林等人17提出了数据流转换规则和控制流转换规则,并通过 C2J 平台将 COBOL 转换至 Java.刘静18提出了词法语法分析、语法树存储结构和翻译处理等方式实现了 Verilog至 MSVL 的转换.然而,以上方法需要开发人员提供准确且完备的代码迁移规则,使得模型的构

17、建低效且容易出错.为了解决上述问题,研究人员采用基于短语的统计机器翻译(phrase-basedstatisticalmachinetransla-tion,PBSMT)技术19自动构建模型.例如,Nguyen 等人20用分词器将代码转换成词符序列,然后基于PBSMT 技术训练了 Java 至 C#的迁移模型.但这些模型仅输入代码文本,没有考虑代码结构特征,导致模型迁移性能不佳.Karaivanov 等人21利用短语表、编程语言前缀语法规则和 API 映射规则等特征结合 PBSMT模型,设计了 C#至 Java 的迁移模型.Nguyen 等人22定义了粗粒度的语法单元模板(syntaxemes

18、)和细粒度的语义单元模板(sememes),提出了分而治之的 Java 至C#迁移模型.该模型先迁移源代码为语法单元模板,再依据该模板内的语义单元模板生成具体的目标代码.从改进的研究可以发现,基于 PBSMT 技术的源代码迁移模型需要通过人工定义规则或者构建模板的方式提升模型的迁移性能.后来,神经网络机器翻译模型取得了成功2,3,许多研究人员开始探索该技术用于源代码迁移任务的可能性.例如,Chen 等人4提出了 tree-to-tree 的抽象语法树翻译模型,该模型能将源代码抽象语法树转换至目标代码抽象语法树.Feng 等人7使用 6 种编程语言和自然语言,并采用掩码语言建模任务和替换词符检测

19、任务预训练了 Transformer 编码器模型 CodeBERT.Lu 等人8收集了代码翻译数据集 CodeTrans,并基于该数据集训练了 Transformer 和 CodeBERT 模型.该数据集可以用于评估模型迁移代码的性能.Guo 等人12在 Code-BERT 基础上采用掩码语言建模任务、数据流的边预测任务和数据流节点-代码变量对齐任务预训练代码文本、自然语言以及代码数据流,提出了 GraphCode-BERT 模型.从这些源代码迁移相关工作可知,目前研究通常从语法树、数据流或者模型的角度提升模型性能,很少考虑到为源代码迁移任务设计理解代码结构特征的模型.为此,本文在 Trans

20、former 模型的基础上提出了一种基于代码语句掩码注意力机制的源代码迁移模型CSMAT,以提升 Transformer 模型迁移源代码的性能.3模型概述本文把源代码迁移任务看作是代码序列到代码序列的转换任务.该任务可以细分为两个阶段:首先,模型的编码器理解源代码语句的语法和语义以及语句间的上下文,进而提取源代码的特征;其次,模型的译码器关注并对齐源代码语句,生成符合目标编程语言语法规则的代码.本文设计了代码语句的预处理方法,用自定义的词符标识代码语句.为了实现源代码迁移任务的两个阶段,本文在 Transformer 模型基础上提出了基于代码语句掩码注意力机制的源代码迁移模型 CSMAT,模型

21、架构如图 2 所示.本节将详细讲述预处理方法和CSMAT 模型.3.1 预处理方法不同编程语言所要求的书写格式不同,而神经网络的性能会受到不同格式代码的影响.为了统一代码格式并标识代码语句,本文提出预处理方法规范化代码文本格式,该方法分为两步:(1)格式化代码文本,统一代码格式;(2)加入语句词符,标识代码语句.为了统一代码格式,本文使用了代码格式化工具Astyle(https:/ 1给出了一组 Java 和 C#的代码片段,表中“原始代码文2023年第32卷第9期http:/www.c-s-计 算 机 系 统 应 用SystemConstruction系统建设79本”经格式化后如表中“格式化

22、文本”所示,可以发现格式化后的代码有着相同的换行样式和缩进样式.因为 Java 和 C#的缩进样式不会改变代码语义,本文删除了缩进以压缩代码文本长度.随后,本文在每行代码前加入了一个自定义的语句词符以标识该行代码语句.由于 CSMAT 模型的译码器是依据文本顺序逐个词符进行预测的神经网络模型,因此在语句前加入词符可以帮助译码器先关注并对齐源代码语句,后依据对齐的源代码语句生成目标代码.加入语句词符的代码如表 1“加入语句词符的文本”所示.代码语句完成标识以后,本文删除换行符以进一步压缩代码文本长度,并在代码文本首尾分别加入和词符以明确代码首尾位置.最后,代码文本经过CSMAT 模型分词器转换为

23、词符序列,再依据分词器的单词表索引转换为索引序列.该序列送入 CSMAT 模型后,模型开始训练并更新参数.编码器位置嵌入层词嵌入层多头注意力机制相加,层规范化点式前馈网络相加,层规范化译码器多头注意力机制相加,层规范化点式前馈网络相加,层规范化多头注意力机制相加,层规范化全连接层X=,S1,S2,S3,Y=,L1,L2,V1K1Q1V2K2Q2V3K3Q31212图 2CSMAT 模型架构图表 1一组 Java 和 C#代码片段以及预处理后的文本格式编程语言原始代码文本格式化文本加入语句词符的文本JavapublicXPath(Parserparser,Stringpath)this.pars

24、er=parser;this.path=path;elements=split(path);publicXPath(Parserparser,Stringpath)this.parser=parser;this.path=path;elements=split(path);publicXPath(Parserparser,Stringpath)this.parser=parser;this.path=path;elements=split(path);C#publicXPath(Parserparser,stringpath)this.parser=parser;this.path=path;

25、elements=Split(path);publicXPath(Parserparser,stringpath)this.parser=parser;this.path=path;elements=Split(path);publicXPath(Parserparser,stringpath)this.parser=parser;this.path=path;elements=Split(path);3.2 多头注意力机制本文提出的源代码迁移模型 CSMAT 使用了Transformer 模型.得益于 Transformer 模型多头注意力机制,模型能关注并获取同一序列或不同序列中词符之间的

26、特征.多头注意力机制指的是多个注意力头对一组输入(查询 Q、主键 K、数值 V)执行按比缩放的点积注意力(scaleddotproductattention)运算3.该注意力计算查询 Q 和主键 K 的相似度分数,并把分数结合数值 V,以表征查询 Q 从主键 K 和数值 V 关注并获取的上下文特征.以长度为 x1的序列 X1关注并获取长度为x2的序列 X2上下文特征为例,多头注意力机制计算公式如下:Qi=X1WQi,Ki=X2WKi,Vi=X2WVi(1)headi=SoftmaxQiKTidk+MiVi(2)Attention(Q,K,V,M)=head1,headnWo(3)WQi,WKi

27、,WVi RdhdkWo RdhdhMiMij,kMultiAttn(Q,K,V,M)其中,分别是查询、主键、数值的序列投影矩阵,dh为序列表征向量维度,dk为注意力头向量维度,是多头注意力机制输出的投影矩阵.此外,是第 i 个注意力头 x1x2大小的掩码矩阵,为 0 时表示 X1序列的第 j 个词符能够关注到 X2序列的第 k 个词符,为负无穷时则不能关注.故多头注意力机制可通过掩码引导模型关注特定的词符特征.为便于表示,式(1)式(3)共同表示为计 算 机 系 统 应 用http:/www.c-s-2023年第32卷第9期80系统建设SystemConstruction操作.需要注意的是,

28、多头注意力机制依赖矩阵乘法操作,该机制计算时没有考虑词符在序列中的顺序.为了解决此问题,序列 X1和序列 X2的索引序列先经词嵌入层映射至词向量(wordembedding),再加上位置嵌入层的位置向量(positionembedding)23以明确词符的顺序特征.3.3 CSMAT 编码器xi1xinxi1如图 2 所示,CSMAT 编码器由 12 层编码器层组成,每层编码器包含多头注意力机制和点式前馈网络(pointwisefeedforwardnetwork),并且以残差和层规范化操作组合起来.给出代码片段 X=,S1,S2,S3,输入编码器,其中代码语句 Si=,为语句词符,S1、S2

29、和 S3长度分别为 2、4、2,编码器公式如下:Hn=LN(MultiAttn(Hn1,Hn1,Hn1,Menc)+Hn1)(4)FFN(x)=Activation(xW1+b1)W2+b2(5)Hn=LN(FFN(Hn)+Hn)(6)W1,W2,b1,b2其中,LN 是层规范化(layernormalization)操作,FFN 是点式前馈网络,是可训练的参数,Hn1是前一层编码器的输出(H0=X),Activation 指的是激活函数,本文为 GELU 函数.式(4)中 MultiAttn 的查询、主键和数值来源相同时,可称为自注意力(self-attention)机制.编码器的自注意力机

30、制对应于图 2 的多头注意力机制.xijxikxij,xikxi1xj1xi1,xj1本文为式(4)的自注意力掩码矩阵 Menc设计了代码语句掩码规则,该规则应用于所有注意力头.编码器的自注意力机制能让代码片段 X 中的词符关注并获取代码片段 X 中的任意词符,这使得注意力连接样式有着正反两个方向,并且掩码矩阵有着对称矩阵样式.在这里,起止词符和均可关注并获取源代码每个词符的特征,该掩码矩阵样式如图 3(b)所示.对于代码语句内注意力的掩码规则,每条语句 Si的词符可关注并获取词符的特征(即ES,ES为同一代码语句的词符关联集合),该掩码矩阵样式如图 3(c)所示.该规则引导模型关注每条代码语

31、句的语法和语义.对于代码语句间注意力的掩码规则,语句 Si的语句词符(即)可关注并获取语句 Sj的语句词符(即)的特征(即Eloc,Eloc为不同语句词符关联集合),该掩码矩阵如图 3(d)所示.该规则引导模型用语句词符表征代码语句,同时引导模型表征代码语句之间的上下文特征.以源代码 S2的语句词符为例,以上 3 种注意力连接样式如图 3(a)所示.基于上述规则,编码器自注意力掩码矩阵 Menc如图 3(e)所示.(a)源代码 S2 的语句词符注意力连接样式语句间注意力语句内注意力起止词符注意力x12x22x23x24x23=S1S2S3S1S3S2(e)编码器掩码矩阵样式S1S2S3S1S3

32、S2(d)代码语句间掩码矩阵样式S1S2S3S1S3S2(c)代码语句内掩码矩阵样式S1S2S3S1S3S2(b)起止词符掩码矩阵样式关注代码语句内的特征和语句间的特征关注起始词符或终止词符的特征关注代码语句间的特征关注代码语句内的特征无注意力图 3CSMAT 编码器自注意力连接样式和掩码矩阵样式基于此,给出代码片段 X 的索引 i 和 j,式(4)掩码矩阵 Menc如下表示:Menci,j=0,xi,xj,或xi,xj ESEloc,其他(7)3.4 CSMAT 译码器如图 2 所示,CSMAT 译码器由 12 层译码器层组yi1yinyi1成,每层译码器层包含两个多头注意力机制和点式前馈网

33、络,也以残差和层规范化操作组合起来.给出代码片段 Y=,L1,L2,输入译码器,其中代码语句Li=,为语句词符,L1和 L2长度分别为 5 和 3,译码器公式如下:Gn=LN(MultiAttn(Gn1,Gn1,Gn1,Mdec1)+Gn1)(8)2023年第32卷第9期http:/www.c-s-计 算 机 系 统 应 用SystemConstruction系统建设81Gn=LN(MultiAttn(Gn,Henc,Henc,Mdec2)+Gn)(9)Gn=LN(FFN(Gn)+Gn)(10)其中,Gn1是前一层译码器的输出(G0=Y),Henc是编码器最后一层的输出.式(8)为译码器自注意

34、力机制,对应于图 2 的多头注意力机制.该注意力机制在掩码Mdec1的引导下关注并获取前缀词符的上下文特征,使译码器预测出未来的词符,进而生成完整的目标序列.本文使用了译码器原始的自注意力机制,该注意力连接样式如图 4(a)所示,Mdec1掩码矩阵如图 4(b)所示.式(9)多头注意力机制中查询来自译码器,主键和数值来源于编码器,本文称之为跨层注意力(cross-attention)机制,并为其设计了代码语句掩码规则.跨层注意力机制对应于图 2 的多头注意力机制.考虑到跨层注意力需关注源代码具体词符特征,故该掩码规则只应用于部分注意力头,原始注意力头掩码矩阵Mdec2,style2如图 5(e

35、)所示.CSMAT 译码器采用代码语句掩码规则的注意力头数占比为 1/2.(a)目标代码 L2 的语句词符注意力连接样式(b)代码语句内掩码矩阵样式L1L2L1L2关注词符特征无注意力y12y13y14y15y22y32图 4CSMAT 译码器自注意力连接样式和掩码矩阵样式(a)目标代码 L2 的语句词符注意力连接样式起止词符注意力语句间注意力(b)起止词符掩码矩阵样式(c)代码语句间掩码矩阵样式=(d)跨层注意力掩码矩阵样式 1(e)跨层注意力掩码矩阵样式 2关注代码语句间的特征关注代码语句内的特征无注意力关注起始词符或终止词符的特征L1L2S1S2S3L1L2S1S2S3L1L2S1S2S

36、3L1L2S1S2S3源代码目标代码y12y13y14y15y22y32x12x22x23x24x23图 5CSMAT 译码器跨层注意力连接样式和掩码矩阵样式xi1跨层注意力机制是目标代码 Y 关注并获取源代码X 的特征,这使得注意力连接样式从源代码 X 到目标代码 Y,且掩码矩阵不再是对称矩阵样式.在代码语句掩码规则下,目标代码的每个词符均可关注并获取源代码起止词符和的特征,该掩码矩阵样式如图 5(b)所示.为了对齐源代码语句,目标代码的每个词符也均可关注并获取源代码 Si语句词符(即)特征,该掩码矩阵样式如图 5(c)所示.该规则能使译码器通过源代码语句词符的特征对齐源代码语句,更好地理解

37、并转换源代码语句的上下文特征.以上两种注意力连接样式如图 5(a)所示.基于上述规则,代码语句掩码的译码器跨层注意力掩码矩阵 Mdec2,style1如图 5(d)所示.基于此,给出目标代码片段 Y 的索引 i 和源代码片段 X 的索引 j,代码语句掩码的跨层注意力机制掩码矩阵 Mdec2,style1如下表示:Mdec2,style1i,j=0,xj,其他(11)4实验设置本节将介绍源代码迁移任务的实验配置,并给出3 个研究问题评估本文提出方法的有效性.4.1 研究问题RQ1:本文提出的模型在源代码迁移任务中表现如何?此 RQ 是为了评估现有基于神经网络的源代码迁移模型在两个迁移任务(即 J

38、ava 到 C#和 C#到 Java)中的性能.为了减少预训练模型使用外部数据集训练的干扰,实验将初始化 CSMAT 模型参数和对比模型参数,并使用相同的训练集进行训练.其中数据集在第 4.2节中进行了介绍,对比模型在第 4.4 节中进行了介绍.RQ2:本文方法的不同设置分别对模型的性能有怎样的影响?此 RQ 是为了从预处理方法、编码器注意力机制和译码器注意力机制 3 个角度验证代码语句掩码注意力机制的有效性.因此,实验将对语句词符、编码器注意力机制和译码器注意力机制 3 个部分进行消融实验.计 算 机 系 统 应 用http:/www.c-s-2023年第32卷第9期82系统建设System

39、ConstructionRQ3:本文提出的方法应用于现有预训练模型后,对其性能有怎样的影响?此 RQ 目的是为了评估代码语句掩码注意力机制在预训练模型的适用性.为了更好地评估注意力机制对模型性能的影响,本文对比了原始预训练模型、改进了编码器的模型以及同时改进了编码器和译码器的模型.预训练模型在第 4.4 节中进行了介绍.4.2 数据集本文采用的数据集来自文献 8 中的 CodeTrans数据集12.该数据集收集了来自 Lucene、POI、JGit和 Antlr 等开源项目中的代码函数片段.这些项目最初基于 Java 语言开发,随后迁移至 C#语言.该数据集通过两个编程语言版本中相似的代码函数

40、片段进行收集,经过抽象语法树和数据流清除冗余的代码片段获得.该数据集的训练集、验证集和测试集大小分别是 10.3k、0.5k 和 1k.该数据集具体语法树词符、代码词符和代码语句统计如表 2 所示,其中具体语法树是通过 tree-sitter(https:/tree-sitter.github.io/tree-sitter/)解析工具生成.代码分词器的配置以及模型输入长度将在第 4.5 节中介绍.表 2具体语法树词符、代码词符和代码语句统计编程语言每个具体语法树内的词符每个代码片段内的词符每个代码片段内的语句平均数量分布平均数量分布平均数量分布4004002002002020Java99.19

41、11529(97.7%)271(2.3%)51.8411488(97.4%)312(2.6%)5.5511508(97.5%)292(2.5%)C#122.7111417(96.8%)383(3.2%)66.7111445(97.0%)355(3.0%)6.3811411(96.7%)389(3.3%)4.3 评价指标本文的实验不仅采用了现有研究广泛使用的BLEU3,2428、完全匹配率4,8,12和 CodeBLEU8,12评价指标,还引入了词法正确率来评价模型性能.指标的介绍如下.(1)BLEU:该指标通过预测序列和参考序列的 n-gram 重叠率,给出 0100%之间的分值.分值越高表示

42、预测序列越接近参考序列.(2)完全匹配率:该指标统计预测代码和参考代码在文本上是否完全匹配,给出 0100%之间的分值.分值越高表示预测代码和参考代码相同的比例越高.(3)CodeBLEU:该指标基于 BLEU 的 n-gram 重叠率计算方法,计算预测代码的普通 BLEU 成绩、代码关键词分数权重高的 BLEU 成绩、语法树节点序列BLEU 成绩以及数据流节点序列 BLEU 成绩.该指标从文本、语法和语义 3 个维度对预测代码评分,给出0100%之间的分值.分值越高表示预测代码的质量越接近参考代码.(4)词法正确率:该指标通过分析预测代码的语法树是否存在词法错误节点的方式,判断预测代码的词法

43、是否正确.该指标借助 tree-sitter 工具做预测代码的词法分析,并给出 0100%之间的分值.分值越高表示预测代码越满足编程语言的词法格式.4.4 对比模型和预训练模型本节将给出对比模型和预训练模型的介绍.现有的源代码迁移研究通常采用了基于 Transformer 的外部数据集预训练模型,并取得了较好的性能.为了消除此类预训练模型使用外部数据集的干扰,本文将非预训练的模型作为对比模型,并把预训练代码数据集的模型作为实验采用的预训练模型.对比模型有:(1)Naive 模型是常用的对比模型8,12,模型直接把输入作为输出;(2)PBSMT 模型是基于短语的统计机器翻译模型19,该模型实验结

44、果来自文献 8;(3)Pointer-Generator 模型29指的是指针生成网络,是基于循环神经网络的序列到序列模型,模型能自动复制源代码词符作为输出的一部分;(4)tree-to-tree 模型4是树到树的转换模型;(5)Transformer 模型3是序列到序列模型,是目前源代码迁移任务中最佳的非预训练模型.预训练模型有:(1)CodeBERT 模型7是预训练编程语言和自然语言文本的 Transformer 编码器模型.(2)GraphCodeBERT 模型12是预训练编程语言文本、自然语言文本以及数据流的 Transformer 编码器模型.4.5 参数设置参照 CodeBERT 和

45、 GraphCodeBERT 模型的设置,实验中基于 Transformer 模型均设置为 12 层,隐藏层设置为 768,多头注意力数量为 12,词符位置表征方式设置为位置嵌入层,并采用添加了词符的 RoBERTa分词器对代码分词.依据第 4.2 节的统计,基于 Transfor-mer 的模型输入长度和输出长度设置为 320.此外,模2023年第32卷第9期http:/www.c-s-计 算 机 系 统 应 用SystemConstruction系统建设83型训练阶段的批处理大小设置为 16,梯度累积步数设置为2,损失函数设置为标签平滑参数是0.1的交叉熵函数3,并采用带有学习率为 1E5

46、 线性调度函数的 AdamW优化器30优化模型参数.实验中模型运行环境为带有Python3.9、PyTorch1.13.1 和 Transformers4.25.1 的Linux 服务器(Ubuntu20.04.3LTS,IntelCorei9-9900KF3.60GHz,NvidiaRTX2080Ti11GB).5实验结果 5.1 RQ1:本文提出的模型在源代码迁移任务中表现如何?为了回答此 RQ,本节将对 CSMAT 和对比模型在测试集的评价指标结果进行比较.实验对比结果如表 3所示.可以发现 CSMAT 的源代码迁移性能均优于其他模型.PBSMT 受限于模型架构,难以通过代码文本理解源代

47、码,导致模型性能不及 Transformer.Pointer-Generator 模型尽管可以复制源代码的词符作为输出,但是该模型受限于循环神经网络的长序列理解和生成难题31,导致模型性能同样不及 Transformer.Tree-to-tree 模型能够通过语法树较好地理解代码的结构特征,并且 C#到 Java 任务中词法正确率优于 Pointer-Gene-rator,但其性能依然不及 Transformer.从第 4.2 节对数据集词符数量的统计可知,该模型输入的具体语法树词符数量多于代码文本词符数量,这表明该模型难以理解并生成具有复杂结构特征的代码.本文提出的模型 CSMAT 优于 T

48、ransformer.从模型架构上分析,该模型得益于代码语句掩码注意力机制,能够在迁移目标代码时,有效地理解并对齐源代码语句的语法和语义,提升源代码迁移性能.表 4 给出了 CSMAT 和部分对比模型的输出样例.可以发现 Pointer-Generator 生成的函数声明语句中,返回值类型和代码语法错误.本文认为这是因循环神经网络的长序列理解和生成难题所导致31.Tree-to-tree生成的函数有两个相同的形参,并且生成了上下文无关的“invocation_expression”变量.联系表 2 具体语法树词符数量可推测,该模型难以理解并迁移词符较多的源代码具体语法树.Transformer

49、 模型生成了语法错误的函数调用语句,而 CSMAT 输出结果和参考代码相同.该结果表明,CSMAT 在代码语句掩码的引导下,能有效地理解并对齐源代码语句的语法和语义,具有最佳的迁移性能.RQ1 总结:在源代码迁移任务中,本文提出的基于代码语句掩码注意力机制的源代码迁移模型 CSMAT相比于对比模型具有最佳的迁移性能.表 3CSMAT 和对比模型在两个源代码迁移任务的结果(%)模型Java到C#C#到JavaBLEU完全匹配率CodeBLEU词法正确率BLEU完全匹配率CodeBLEU词法正确率Naive18.54018.690PBSMT43.5312.542.7140.0616.143.48P

50、ointer-Generator26.1813.843.8748.527.8420.544.8848.6Tree-to-tree36.343.442.1345.632.094.443.8665.2Transformer60.9937.966.8889.055.4140.662.2089.2CSMAT62.7439.567.8290.259.0941.565.1489.4表 4CSMAT 和部分对比模型在 Java 到 C#任务的输出样例来源代码文本源代码publicStringBuilderinsert(intoffset,inti)insert0(offset,Integer.toStrin

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服