一种基于迭代对比学习的代码重排方法及系统技术方案

技术编号:37460097 阅读:28 留言:0更新日期:2023-05-06 09:32
本发明专利技术提出了一种基于迭代对比学习的代码重排方法及系统,包括:获取编程问题对应的待排序候选代码;利用程序转换技术扩增候选代码;将扩增后的候选代码输入至训练后的排序模型中,对每个代码进行排序;取所得序列中,排序得分最高的代码作为所述编程问题的最后推荐的代码。本发明专利技术通过迭代训练两个损失,即鉴别损失和对齐损失,能够发挥对比学习的能力增强代码排序模型的性能,相比于先前基于单元测试执行的方法,避免了执行代码执行的安全问题和用户提供单元测试的困难;相比于先前简单的基于分类的方法,迭代训练使得本发明专利技术的排序模型不仅注意代码的表现形式,更加习得代码的语义特征,进而排名更精确。进而排名更精确。进而排名更精确。

【技术实现步骤摘要】
一种基于迭代对比学习的代码重排方法及系统


[0001]本专利技术属于计算机
,尤其涉及一种基于迭代对比学习的代码重排方法及系统。

技术介绍

[0002]本部分的陈述仅仅是提供了与本专利技术相关的
技术介绍
信息,不必然构成在先技术。
[0003]程序合成任务旨在自动生成满足问题规范的可执行计算机程序,因其对软件行业的重大影响而备受关注。现有的代码生成模型都采用了一种基于采样的策略来生成多样的解决方案,这可以显著提高生成正确代码的概率,例如,尽管在HumanEval数据集上Codex的pass@1 (仅产生一个候选答案的通过率) 仅仅可以达到33.5%,但是它的pass@100 (如果针对给定问题生成的100个解决方案中的一个或多个能够通过相应的测试用例,则认为通过) 可以达到 77.4%。然而,在实际代码生成应用中(如Copilot),让用户从许多外观相似且可能包含微妙错误的候选中选出正确解决方案却是不现实的,这一问题使我们必须探索如何给众多候选排序来帮助选择最好的解决方案,以弥补pass@1和pass@100的差距。
[0004]现有的代码候选排序的方法可以归纳为两类。一类是基于执行的方法。这种方法通过执行问题描述对应的单元测试重排候选代码。但是这一方法存在很大的问题:首先,由于环境依赖不满足、候选片段不完整以及执行模型生成的候选存在潜在的安全风险(读写磁盘)等问题,代码候选本身不被允许执行,在CoPilot这样的插件中采用基于执行的方法是不切实际的;其次,提供单元测试会给用户增加很多负担。另一类工作使用一个神经网络来为采样得到的程序排序。现有的方法将此视作一个多分类问题,然而简单的分类损失函数难以促使模型对微妙的程序错误做出区分。

技术实现思路

[0005]为克服上述现有技术的不足,本专利技术提供了一种基于迭代对比学习的代码重排方法及系统,可以作为灵活方便地直接应用到现有的代码自动生成系统(如Copilot)中,且区别于先前的方法,该方法保证了代码重排时的及时性与安全性,并通过迭代的对比学习达到更高的准确性,为用户提供了巨大便利。
[0006]为实现上述目的,本专利技术的一个或多个实施例提供了如下技术方案:本专利技术第一方面提供了一种基于迭代对比学习的代码重排方法,包括:获取自然语言问题描述对应的待排序的原始候选代码;利用语义等价的程序转换程序技术扩增所述原始候选代码;将原始候选代码和扩增后的代码同时输入至训练后的排序模型中,对每个代码进行排序;取所得序列中,排序得分最高的原始候选代码作为所述自然语言问题描述的最后推荐的代码;
Alignment Loss)训练,采用错误注入的程序转换技术构造与正确候选表面相似但语义不同的负样本代码进行对比学习,使得排序模型不仅关注候选代码的表面形式,而且学习到代码的本质语义特征,并同时增强排序模型区分微妙错误的能力。该训练方法可以使得模型更精确,且更具鲁棒性。
[0011](4)在推理阶段,通过语义等价转换的的程序转换技术为每个生成的候选生成多个语义不变但语法改变的转换,然后计算这些转换上的平均排序得分,以减小训练时的过拟合并增强鲁棒性。
[0012]本专利技术附加方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本专利技术的实践了解到。
附图说明
[0013]构成本专利技术的一部分的说明书附图用来提供对本专利技术的进一步理解,本专利技术的示意性实施例及其说明用于解释本专利技术,并不构成对本专利技术的不当限定。
[0014]图1为第一个实施例的一种基于迭代对比学习的代码重排方法流程图。
[0015]图2为第一个实施例的Codex生成候选的运行时异常类型分布图。
具体实施方式
[0016]实施例一如图1所示,本实施例公开了一种基于迭代对比学习的代码重排方法,包括:步骤S1:模型生成的负样本构建。本专利技术并非使用来自同一批(batch)中的对比样本,而是从生成模型的预测中构建负样本。这种方法可以自动产生大量符合代码生成模型所产生的候选分布的的难负样本,且其在子词级别与正确候选相似但语义级别不同。而且,可方便快速地生成大量难负样本而无须人工标注;步骤S2:程序转换的正负样本构建。对于编程语言而言,微妙的错误即可导致语义的反转,这种微小的差别在排序问题中更为普遍。且对于排序问题而言,答案的搜索空间仅由生成模型采样得到的候选组成,正误候选之间高度相似的,所以模型难以区分这些表面相似但语义不同的代码。为了使得排序模型可以理解代码的本质语义而非仅关注其表面形式,在统计并分析了生成模型采样得到的错误候选的运行时错误类型(如图2所示)后,受这些异常类型的启发,本专利技术设计了微妙错误注入的启发式方法来构建难负样本。一方面,由于这些错误参考了生成模型产生的的实际错误,所以增强了排序模型区分这些典型错误的能力;同时,这些错误注入代码与原始代码在表面形式上尽可能相似,从而使排序模型更关注代码的本质语义而非表面形式,提升对含微小错误的代码的排序效果。同时,通过已有的正样本扩增方法,即变量重命名、死代码插入、For

while转换等扩增了正样本;步骤S3:通过鉴别损失函数(The Discrimination Loss)训练。为训练排序模型从大量生成模型产生的错误候选中鉴别出正确候选的能力,本专利技术运用步骤S1构造的来自生成模型预测的负样本,通过一个鉴别损失函数,以对比学习的方式从训练模型从步骤S1构造的负样本中鉴别出正确代码。
[0017]步骤S4:通过对齐损失函数(The Alignment Loss)训练。本专利技术运用步骤S2提到
的程序转换的启发式方法,为数据集中的每个正确代码解决方案(即锚点代码)生成1个语义保护转换的正样本和个错误注入转换的负样本。本专利技术通过对齐损失函数(The Alignment Loss),拉近锚点代码和其语义保护转换的正样本的距离,并且拉远锚点代码与其错误注入转换的负样本的距离。这样做的目的是:本专利技术认为,经过充分训练ranker应该为具有一致语义的代码提供相同的分数。通过对齐损失函数,使得排序模型在被错误注入代码的干扰的情况下,将锚点代码和其语义相同转换的代码在语义向量空间对齐,以使得排序模型为语义一致的代码打出相同的排序得分,而为语义不同但表面形式类似的代码打出不同的更低的排序得分。排序模型通过对齐损失函数更好地学习到代码的本质语义,并同时增强排序模型区分微妙错误的能力;步骤S5:为了使模型不仅关注代码的表面形式,而且进一步理解语法和语义,在鉴别损失后迭代训练对齐损失,两个损失函数交替进行训练,以层层递进的方式获得更好的语义表征。具体解释为:步骤S3中与生成模型推理产生的分布相同的负样本进行训练(即负样本由步骤S1得到),从而可增强排序器从错误候选结果分布中鉴别正确方案的能力;步骤S4中则通过错误注入转换技术构造表面相似但语义不同的负样本,使排序器更关注代码的本质语义而非表面形式,从而提升对含微妙程序错误代码的排序效果,并使得推理阶段更具有鲁棒性。
[0018]步骤S6:在推理阶本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于迭代对比学习的代码重排方法,其特征在于,包括:获取自然语言问题描述对应的待排序的原始候选代码;利用语义等价的程序转换程序技术扩增所述原始候选代码;将原始候选代码和扩增后的代码同时输入至训练后的排序模型中,对每个代码进行排序;取所得序列中,排序得分最高的原始候选代码作为所述自然语言问题描述的最后推荐的代码;所述排序模型的训练步骤包括:利用生成模型构建自然语言问题描述的原始代码集;分别利用语义等价的程序转换程序技术和错误注入的程序转换技术扩增原始代码集;利用错误注入的程序转换技术扩增原始代码集,包括:通过统计分析错误代码的常见异常类型,利用错误注入的程序转换技术为原始代码集中的正样本代码构建多个语义不同但表面形式相似的负样本代码;利用原始代码集以及扩增后的代码集对排序模型进行迭代对比训练,得到训练后的排序模型。2.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,所述利用生成模型构建自然语言问题描述的原始代码集,包括:使用生成模型为数据集中的每一个自然语言问题描述产生N个候选代码,使用对应的单元测试执行采样得到的候选代码来生成对应的标签,完全通过单元测试的候选代码被视为正样本,未能通过任一单元测试的样本被视为负样本。3.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,所述错误代码的常见异常类型包括:EOFError异常、Valueerror/TypeError异常、IndexError异常以及NameError异常。4.如权利要求3所述的一种基于迭代对比学习的代码重排方法,其特征在于,所述利用错误注入的程序转换技术为原始代码集中的正样本代码构建多个语义不同但表面形式相似的负样本代码,包括:针对EOFError异常:在正样本代码行中随机插入input输入语句,并保持转换后代码的可编译性来构建负样本代码;针对Valueerror/TypeError异常:随机更改正样本代码中函数调用时参数的顺序、随机更改操作符左右参数的顺序、增加或者减少函数调用时的参数以及增加或者减少赋值语句左侧变量的个数来构建负样本代码;针对IndexError异常:通过在正样本代码列表和字符串序列对象的下标索引上随机加或者减一个数来构建负样本代码;针对NameError异常:通过随机变换正样本代码中的变量名来构建负样本代码。5.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,利用语义等价的程序转换技术扩增原始代码集包括:利用死代码插入、...

【专利技术属性】
技术研发人员:聂帅怡黄琨瑜董颖佳
申请(专利权)人:山东师范大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1