一种基于序列生成对抗网络的代码注释生成方法及装置

文档序号:33393040发布日期:2023-03-08 11:57阅读:44来源:国知局
一种基于序列生成对抗网络的代码注释生成方法及装置

1.本发明涉及代码注释生成与判别,尤其涉及一种基于编码器-解码器框架和seq2seq与graph2seq融合的代码注释生成方法,基于卷积神经网络的代码注释判别方法,与基于序列生成对抗网络的代码注释生成改进方法。


背景技术:

2.软件开发过程越来越庞大复杂,无法再凭借单人单次完成,需要更多地团队配合、后期维护甚至是后续扩展开发,因此,迫切需要一种能够记录、便于沟通软件各方面情况的方式,也就是软件开发文档。
3.软件开发文档涵盖软件开发过程的方方面面,是伴随整个软件开发、使用和维护过程中的必备资料、引导指南。内容规范的软件开发文档能大大提高软件开发的效率,保证软件的质量。软件工程的所有阶段都伴随着软件文档的产生和使用,通常来说,开发过程中产生的文档会包括需求分析阶段产生的需求分析文档,设计阶段产生的概要设计文档、系统设计文档和详细设计文档等,测试阶段产生的软件测试文档,以及开发完成后可能需要的总结汇报型文档如qa文档用户手册等等。
4.而软件技术文档,顾名思义,更关注软件开发过程中的技术相关部分,也就是需求分析文档、概要设计文档、系统设计文档、详细设计文档、软件测试文档等与开发实现的技术相关的文档,而不关注面向系统管理员的部署文档和面向用户的用户手册等其他文档。
5.高质量的软件文档能有效梳理串联整个软件工程的所有阶段,有效辅助整个软件工程的进程,帮助开发者和用户更好地把握该软件。而高质量的软件技术文档,则能够明晰开发设计的细节,帮助开发者高效、准确地理解用户需求、软件整体和局部的设计、软件变更历史及现有代码等重要信息,使开发者快速理解软件,促进简化开发者之间的交流沟通,进而加速软件开发过程,提升软件开发质量。
6.代码注释是软件技术文档中与代码实体联系最紧密的文档,是辅助其他开发者快速理解程序代码最直观的文档。代码注释中往往记录着开发者的代码实现思路、实现方式和使用方式等,完备的代码注释能帮助开发者快速掌握代码实体的核心内容与核心意图,方便开发者快捷调用或修改,是软件技术文档中不可或缺的一部分。
7.然而,代码注释的维护也需要开发者额外付出时间与精力,因此,常常存在开发者完成代码实体的开发后遗忘或忽略了对代码注释的维护,导致代码注释的缺失或过时。代码注释的缺失会使其他开发者阅读该代码实体时缺乏指导,需要消耗更多时间精力去理解代码;代码注释的过时则会导致对其他开发者的错误引导,对代码实体的理解与代码实体实际内容的不匹配,进而导致对代码实体的错误调用甚至是错误修改,从而进入软件缺陷甚至导致更严重的问题。因此,维护代码注释的完整性和与代码实体内容的一致性是非常重要的。
8.为了减少人工的付出、节省人工劳力,同时更好地保证代码注释的完整性以及与代码实体的一致性,诞生了代码注释智能化生成这一研究课题。顾名思义,代码注释自动化
生成即基于开发者实现的代码实体,由机器智能化生成对应的代码注释。


技术实现要素:

9.本发明的目的在于针对现有技术的不足,为代码注释的自动生成提供了一种基于序列生成对抗网络改进的算法,以生成比单一的神经序列网络效果更好的代码注释。当前研究依托机器学习已能进行一定程度的代码注释智能化生成,但是生成效果还有很大提升空间,本发明提出了一种通过融合结构特征和语义特征,并加入序列对抗网络以进一步提高生成效果的方法,即,引入强化学习,使单一生成网络的生成能力得到进一步强化。
10.本发明是通过以下技术方案来实现的:
11.根据本说明书的第一方面,提供一种基于序列生成对抗网络的代码注释生成方法,该方法包含以下步骤:
12.s1,获得代码-注释对数据,构建数据集,根据一定比例划分为训练集和测试集,训练集数据量要远多于测试集,并根据数据集构建语料库;
13.s2,构建生成网络,完成代码注释生成任务,并进行预训练,用于后续对抗训练;具体为,代码具有自身特定的结构特征,如循环、分支等都具有明显的结构上的特征,通过静态分析器得到代码对应的控制流图作为输入,基于图神经网络构建控制流图编码器,学习结构信息,基于transformer模型构建代码编码器,以代码和注释文本作为输入学习语义信息,将两种特征信息进行融合,基于transformer模型构建解码器组成生成网络,从特征向量得到生成注释序列,在传统的seq2seq模型上加入graph2seq模型,有助于理解代码,更好地生成代码注释;此外,针对序列较长的代码,提出根据二八原则,只保留其学习特征中最重要的20%,以节省计算资源,加快训练速度;
14.s3,基于卷积神经网络模型建立针对生成注释判别的判别网络,并进行预训练;具体地,可使用cnns模型建立一个能完成二分类任务的判别网络,可以判别输入的注释为代码对应的真实注释或生成注释,用于对抗训练中与生成网络进行对抗;
15.s4,加入强化学习,基于序列生成对抗网络模型建立生成网络与判别网络的对抗网络,并进行对抗训练;具体为,使用策略梯度方法完成依据判别网络输出结果计算生成网络损失与梯度的过程,在生成网络和判别网络间建立对抗关系,使二者能够通过对抗进一步强化学习,生成网络有更好生成效果,判别网络有更准确判定结果;
16.s5,使用bleu-4作为评估指标评估生成网络的生成效果,在测试集上进行评估,在对抗训练过程中,根据评估结果对生成网络、判别网络和对抗网络进行调参,控制生成网络和判别网络分别的强度,找到模型的平衡点,以达到最佳对抗效果;此外,由于评估过程中发现的判别网络学习速度远快于生成网络的现象,认为应选择结构简单、表征能力差、训练程度未达最佳、判别精度约为0.75左右的判别网络,和结构复杂、表征能力强、训练程度最佳的生成网络,以维持初期的对抗平衡;
17.s6,将待注释的代码输入训练好的生成网络中,得到代码注释结果。
18.进一步地,所述s1中,采用公开数据集codesearchnet中针对代码到文本生成任务专门清洗的数据集codexglue的java数据部分,该数据集本身已划分为含164923条数据的训练集和10955条数据的测试集,并针对代码注释生成任务的特性进行针对性数据清洗,基于清洗后数据集生成代码和注释的语料库,此外,在语料库中额外加入《unk》《pad》《bos》《
eos》分别表示未知单词标识、补全标识、序列开始标识和序列结束标识;清洗过程具体为:针对代码和注释中驼峰命名词和蛇形命名词进行拆词;清洗掉代码中包含注释内容的样例;清洗掉包含无意义重复特殊符号,如*、#或-的注释的样例;对字符串和数字做统一处理,分别用《str》和《num》来统一标识。
19.进一步地,所述s2在预训练过程中,分别完成代码和真实注释从单词到token的转化,同时头尾均加入《bos》和《eos》对应的token以标识序列的开始与结束;生成网络主要由编码器和解码器两部分组成,为了更好地保留代码的丰富结构信息,编码器部分采用两种编码器,一是图神经网络,如图注意力网络,对应输入为由静态分析器分析得到的代码控制流图,二是transformer模型,对应输入为代码和真实注释对应的token序列;在分别学习结构特征向量和语义特征向量后将二者融合得到最终的特征向量;解码器也采用transformer模型,通过学习到的特征向量解码得到生成注释token序列;使用交叉熵损失函数计算生成注释序列与真实注释序列的损失,并进行梯度传递优化网络;经多次验证,优化器使用adamw时的预训练得到的生成网络更有利于后续的对抗训练;此外,发现代码数据中有相当一部分存在序列长度超过200词的情况,过于长的序列在学习时准确率会下降,资源消耗却增加,为了改善这一问题,根据二八原则,对长序列的特征向量只保留其中最重要的20%,忽视权重较小的80%,以在最大化保留特征的同时,最小化资源消耗,加快训练速度。
20.进一步地,所述s3在预训练过程中,将代码分别和真实注释、生成注释结合混合后,作为判别网络的输入,并经嵌入层处理后得到各自的词向量;判别网络卷积层采用多个不同大小的卷积核,多维度提取代码和两种注释的特征,再将代码特征分别与真实注释特征和生成注释特征连接起来作为该输入数据的整体特征,送入relu激活函数;激活后,又经池化操作,最后通过连接层得到判别网络做二分类的结果,对结果进行一次softmax处理;最终输出给出两个类别各自的概率,若为真的概率更高,则说明判别网络认为该注释是代码对应的真实注释,若为假的概率更高,则说明判别网络认为该注释是由机器生成的虚假注释;最后通过与数据标签对比计算该轮次的损失,进一步传递梯度训练判别网络。
21.进一步地,所述步骤s4具体为:在序列生成对抗网络设计中,策略梯度是指将生成网络选择序列下一个单词token的过程看作一种选择策略,通过调整这一策略使得生成网络能够选择更贴合真实的token,因此,要为每次选择的结果给出一个评分,而这个评分,就来自判别网络;其中,策略梯度j(θ)的计算表示为:
[0022][0023]
式中,y
1:t
表示生成的完整注释序列,g
θ
表示超参为θ的生成网络,x表示输入的代码序列,cfg表示输入的控制流图,表示超参为的判别网络,y
1:t-1
表示生成注释序列已有t-1个token,y
t
表示在此情况下,生成网络选择的第t个token,表示判别网络针对生成网络选择y
t
这一token的行为给出的奖励;
[0024]
对生成过程中不完整的注释序列y
1:t
(t<t),采取蒙特卡洛搜索(monte carlo search)对未生成部分的注释序列进行快速选词生成,同时由于蒙特卡洛快速生成的序列
具有随机性,因此在实际使用时会生成多个序列,用n表示序列个数,用mc表示蒙特卡洛搜索过程,计算过程如以下公式所示:
[0025][0026]
是判别网络给生成网络的奖励得分,其本质是判别网络认为当前注释序列为代码序列对应的真实注释序列的概率;当t<t时,该概率是通过蒙特卡洛搜索得到的多个完整注释序列作为判别网络的输入得到的输出,用表示第n个序列对应的判别网络输出,对多个序列取平均值;当t=t时,直接将生成网络生成的完整注释序列和源代码序列作为判别网络的输入,得到奖励得分,具体计算过程为:
[0027][0028]
基于以上过程可建立生成网络与判别网络之间的对抗关系,生成网络根据输入的代码选择token生成注释序列,判别网络接受代码和生成注释作为输入并判断该注释序列是否为真,并以为真的概率作为生成网络本次选择的奖励得分,奖励得分回传到生成网络作为指导梯度下降的损失,生成网络完成梯度更新后再次生成新的注释序列传给判别网络做判断;
[0029]
而判别网络的更新在生成网络进行一定轮次的更新后单独进行,其原理与预训练一致,只是生成注释由最新训练得到的生成网络生成。
[0030]
进一步地,所述步骤s5具体为:在初始对抗训练时,由于对抗双方强度不平衡,判别网络的判别任务远比生成网络的生成任务简单,经预训练后,能达到更高的强度,导致对抗时,生成网络无法与之抗衡,从而迅速崩溃;为了解决这一问题,依据对生成网络生成注释的bleu-4评分结果变化,对生成网络和判别网络重新调整后再预训练,更改生成网络的优化器为adamw,并优化了超参数学习率和训练轮次,减少判别网络训练轮次,不使其达到最高判别精度,而是维持在0.75左右的中强度,以达到二者的平衡;
[0031]
在调整完生成网络和判别网络的预训练阶段后,再依据bleu-4评分的变化调整对抗训练中的相关训练参数;根据实验中bleu-4评分的变化发现,当对判别网络训练更多时,生成网络的生成效果提升更快,能快速达到最佳生成效果,但是也会因判别网络效果太强在达到最佳后迅速进入崩溃状态,生成效果逐渐降低为0,对抗训练效果差;而设置生成网络的步长大于判别网络的步长step,使生成网络得到更多训练时,由于生成网络更容易通过判别网络的判断,学习速度下降,但能稳定训练,得到稳定的最佳生成效果;由此指导对抗网络中步长step和轮次epoch参数的设置。
[0032]
进一步地,所述步骤s6具体为:代码先经静态分析器处理得到对应的控制流图,以控制流图作为生成网络控制流图编码器的输入;生成注释的序列中最初只有标识序列开始的《bos》对应的token,此后为已选定单词的token序列,以代码序列和当前生成注释序列作为生成网络代码编码器的输入,经各自编码器处理得到结构特征向量和语义特征向量后并融合;已训练好的生成网络的解码器依据融合特征向量,逐词选择生成注释应有的下一个单词的token,此处最基础的方法是贪心方法,即每次选择概率最大的单词,也可选择效果
更好的束搜索(beam search),但是搜索代价更大,时间消耗更多;直到出现序列结束标识《eos》,得到生成注释;根据语料库token对应单词转换为完整英文注释序列。
[0033]
根据本说明书的第二方面,提供一种基于序列生成对抗网络的代码注释生成装置,包括存储器和一个或多个处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,用于实现如第一方面所述的基于序列生成对抗网络的代码注释生成方法。
[0034]
本发明的有益效果是,当前虽然有各种代码注释智能化生成方法,但都生成效果有限,且目前没有将序列对抗生成网络用于代码注释智能化生成的尝试,本发明在这一方面做了开创性尝试,并证实了可以在当前已有的代码注释智能化生成方法的基础上进一步提升生成效果。
附图说明
[0035]
图1是本发明的对抗训练算法框架图;
[0036]
图2是本发明的源代码示例图;
[0037]
图3是本发明的图2源代码转化控制流图示例图;
[0038]
图4是本发明的策略梯度方法过程图;
[0039]
图5是本发明的基于序列生成对抗网络的代码注释生成装置结构图。
具体实施方式
[0040]
下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。
[0041]
本发明使用了codesearchnet团队提供的专用于代码-文本生成任务的数据集codexglue,对其进一步清洗后用于代码注释生成任务。本发明是针对代码注释生成任务,提出在已有的神经机器翻译模型基础上,叠加生成对抗网络,通过生成网络和判别网络之间的对抗,指导神经机器翻译模型的学习,以得到更好的生成效果。
[0042]
本发明共包含三个网络和三个训练阶段,对抗训练的算法框架如图1所示。
[0043]
第一个网络是生成网络,采用了编码器-解码器框架,使用了两个不同的编码器和一个解码器,将作为输入的代码控制流图表示为cfg=(v,e,v
t
,r),v表示图的节点,e表示图的边,v
t
表示节点类型,r表示边的关系类型,代码序列表示为x=(x1,

,xm),作为输出目标的注释序列表示为y=(y1,

,yn),我们试图学习一个生成模型,使得g(cfg,x)=y。
[0044]
第二个网络是判别网络,采用了主流的卷积神经网络(convolutional neural networks,cnns),包含嵌入层和多个卷积层,共同完成输入数据的特征学习,最后完成二分类判别任务,即,该输入数据是真还是假的注释序列。对判别网络来说,其输入数据包括代码序列和注释序列两者,以x表示代码序列,y表示注释序列,d表示判别网络,true/false代表注释序列为真或为假,该学习过程可以表示为d(x,y)=true/false。
[0045]
最后一个网络是生成对抗网络,本发明基于序列对抗网络的思想,通过加入策略梯度训练,实现生成网络与判别网络之间的对抗。
[0046]
三个训练阶段即生成网络的预训练阶段,判别网络的预训练阶段和两者的对抗训练阶段。
[0047]
本发明的具体工作过程是:
[0048]
1、对codexglue数据的进一步清洗。
[0049]
2、基于编码器-解码器框架建立针对代码注释生成的生成网络,并进行预训练。
[0050]
3、基于cnns卷积神经网络建立针对生成注释判别的判别网络,并进行预训练。
[0051]
4、加入强化学习,基于策略梯度方法建立生成网络与判别网络的对抗网络,并进行对抗训练。
[0052]
5、评估训练好的网络的代码注释生成效果,并根据结果对对抗网络进行调整。
[0053]
6、将代码输入生成网络,得到生成注释。
[0054]
本发明的有益效果是,当前虽然有各种代码注释智能化生成方法,但都生成效果有限,且目前没有将序列对抗生成网络用于代码注释智能化生成的尝试,本发明在这一方面做了开创性尝试,并证实了可以在当前已有的代码注释智能化生成方法的基础上进一步提升生成效果。
[0055]
下面从6个方面对本发明作进一步介绍:
[0056]
1、对codexglue数据的进一步清洗。
[0057]
本发明采用husain等人收集并处理的codesearchnet数据集中编程语言为java的部分数据集,其中针对“code to text”任务,husain等人专门清洗了一个名为codexglue的数据集,该数据集在codesearchnet的基础上,清洗掉了以下四种样例:
[0058]
(1)不能被语法分析的代码样例;
[0059]
(2)长于256或短于3个人词的过长或过短的注释样例;
[0060]
(3)含有特殊符号的,如《img

》或http:等的注释样例;
[0061]
(4)语言非英语的注释样例;
[0062]
但是实验过程中发现,codexglue数据集清洗地仍不彻底,虽然去掉了一些不利于注释生成的异常样例,但是样例中包含的驼峰命名单词、无意义重复符号、数字字符串等,仍会给语料库的创建和序列特征的学习造成负面影响,因此,本发明在codexglue数据集的基础上,进一步对数据进行了处理,主要包括以下几个方面:
[0063]
(1)针对代码和注释中驼峰命名词和蛇形命名词进行拆词,消减oov单词,缩小语料库体量,提升语料库质量;
[0064]
(2)清洗掉代码中重复包含注释内容的样例,未能完全分离注释的代码会对代码特征学习造成影响;
[0065]
(3)清洗掉包含无意义重复特殊符号,如*、#或-的注释的样例,无意义分隔符不具有有效信息,属于代码注释内容中的干扰项;
[0066]
(4)对于字符串和数字(包括科学计数法),不同的字符串和不同的数字在代码中代表的分别都是字符串和数字这两个含义,在学习时只需要将其作为字符串和数字的大类处理,而不需要关心其具体内容,因此对字符串和数字做统一处理,分别用《str》和《num》来统一标识;
[0067]
完成以上数据处理后,本发明基于清洗后的数据集为代码和注释分别创建了语料库,其中代码的语料库的大小为31040,注释的语料库的大小为21239,语料库中单词按使用
频率从高到低向后排序,并将开头四个设置为特殊符号《unk》,《pad》,《bos》和《eos》,分别表示未知单词标识、补全标识、序列开始标识和序列结束标识,以应对出现了语料库中没有的单词,或为作为batch同时处理补齐不同序列的长度和标识序列生成的开始和结束的情况。
[0068]
2、基于编码器-解码器框架建立针对代码注释生成的生成网络,并进行预训练。
[0069]
常见的用于seq2seq的序列模型有rnnsearch模型和transformer模型两种,本发明选择采用两者中被认为效果更好的transformer模型做生成网络的语义特征学习基础模型,此外,生成网络模型也可使用已被证明效果的bert模型。结构特征学习的基础模型可以采用各种图神经网络模型,如r-gat或者图transformer等。
[0070]
本发明在生成网络处理前先基于静态分析工具得到代码的控制流图,如图2所示java代码示例,经静态分析器处理后可以得到图3所示的代码控制流图;再基于语料库完成代码和真实注释从单词到token的转化,同时头尾均加入《bos》和《eos》对应的token以标识序列的开始与结束。控制流图经基于图神经网络的控制流图编码器处理后得到关于结构信息的特征向量,token序列经基于transformer模型的代码编码器处理后得到关于语义信息的特征向量;将两种特征向量融合后输入基于transformer模型的解码器中,得到预测的生成注释序列,使用交叉熵损失函数计算生成注释序列与真实注释序列的损失,并进行梯度传递优化网络;经多次验证,优化器使用adamw时的预训练得到的生成网络更有利于后续的对抗训练。
[0071]
此外,发现代码数据中有相当一部分存在序列长度超过200词的情况,过于长的序列在学习时准确率会下降,资源消耗却增加,为了改善这一问题,根据二八原则,对长序列的特征向量只保留其中最重要的20%,忽视权重较小的80%,以在最大化保留特征的同时,最小化资源消耗,加快训练速度。
[0072]
生成网络预训练参数设置:
[0073]
经统计,大部分代码序列长度在200以内,大部分注释序列长度在30以内,如表1和表2所示,因此,读取数据时限制代码序列和注释序列最大长度分别为200和30,以尽可能缩短需处理序列长度,加快训练效率,最后用于训练的train集数据共138230条,用于验证训练效果的valid集数据共4246条。在训练时,针对代码序列长度或注释序列长度低于200或30的,不做特殊处理,对于超过200或30的,根据二八原则,即在任何一组事物中,最重要的只占其中一小部分,约20%,剩下的约80%虽然占大多数,但却是次要的,故对其特征向量的学习进行二八处理,即保留权重最大,最重要的20%,抛弃权重较小可以忽略的80%,以提高学习效率。
[0074]
表1代码序列长度统计
[0075]
序列长度范围范围内样例数占数据集总比《100941910.572《1201079020.655《1401179910.717《1601257950.764《1801318630.801《2001367190.831
≥2001646111.0
[0076]
表2注释序列长度统计
[0077][0078][0079]
生成网络预训练时,损失函数使用了交叉熵损失函数,优化器采用adamw优化器,学习率设为0.0001,批处理大小设置为64。
[0080]
3、基于cnns卷积神经网络建立针对生成注释判别的判别网络,并进行预训练。
[0081]
判别网络(discriminator,d)主要完成判断输入数据是真实还是虚假的任务,该任务可以被看作是一个二分类,即把对象归到真实类还是虚假类。
[0082]
由于要判断的是当前注释是否是代码对应的真实注释,所以判别网络的输入需要代码和注释两者,首先需要对输入的代码和注释进行转换,得到token序列后经嵌入层得到词向量,然后送入卷积层分别提取特征。本发明中采用了多个不同大小的卷积核,多维度提取代码和注释的特征,分别得到代码和注释的特征后,将其连接起来作为该输入数据的整体特征,送入relu激活函数。激活后,又经池化操作,最后通过连接层得到判别网络做二分类的结果,对结果进行一次softmax处理,最终输出给出两个类别各自的概率,若为真的概率更高,则说明判别网络认为该注释是代码对应的真实注释,若为假的概率更高,则说明判别网络认为该注释是由机器生成的虚假注释。
[0083]
判别网络预训练参数设置:
[0084]
判别网络设置了大小分别为1,2,4,6,8,9,10,15,20的卷积核,分别有100,200,200,100,100,100,100,160,160层,构成了多卷积层,充分学习输入序列数据的特征,二分类标签中下标为0的类代表判别网络认为该注释序列为假的概率,下标为1的类代表判别网络认为该注释序列为真的概率。
[0085]
判别网络的损失函数采用交叉熵损失函数,优化器采用adam优化器,学习率设为0.0001,批处理大小设置为128,由于数据集数据量大,判别网络训练提升迅速,而生成对抗网络需要生成网络与判别网络强度相近,因此判别网络的预训练只训练了2轮次,得到最小损失0.450,此时计算判别网络的准确率accuracy为0.782,保证生成网络有较大概率能通过判别网络的判定。
[0086]
4、加入强化学习,基于策略梯度方法建立生成网络与判别网络的对抗网络,并进行对抗训练。
[0087]
对抗网络的对抗是指生成网络追求生成的更佳,也就是生成样例和真实数据之间差异最小,而判别网络追求区分的更准,也就是生成样例和真实数据之间差异最大,因此形成对抗关系。
[0088]
在序列生成对抗网络设计中,策略梯度是指将生成网络选择序列下一个单词token的过程看作一种选择策略,通过调整这一策略使得生成网络能够选择更贴合真实的
token,因此,要为每次选择的结果给出一个评分,而这个评分,就来自判别网络,其过程如图4所示。
[0089]
用g
θ
表示当前参数θ下的生成网络,表示当前参数下的判别网络,cfg表示输入的控制流图,x表示输入的代码序列,y表示生成的注释序列,t表示注释序列最大长度,策略梯度j(θ)的计算可以表示为:
[0090][0091]
公式中,y
1:t
表示生成的完整注释序列,
1:t-1
表示生成注释序列已有t-1个token,y
t
表示在此情况下,生成网络选择的第t个token,表示判别网络针对生成网络选择y
t
这一token的行为给出的奖励。完整公式代表输入代码序列x时,生成网络生成完整注释序列y
1:t
的过程中,在已有t-1个token后,选择第t个token为y
t
的行为,判别网络给出的奖励得分。该计算重复发生在生成注释序列每一次token选择过程中。
[0092]
公式中计算使用的注释序列是y
1:t
,也就是说,需要有完整注释序列才能输入到判别网络中进行评估,但是算法希望能对注释序列生成过程中每一个单词的选择过程都进行评估,因此对生成过程中不完整的注释序列y
1:t
(t<t),采取蒙特卡洛搜索(monte carlo search,mc)对未生成部分的注释序列进行快速选词生成。同时由于蒙特卡洛快速生成的序列具有随机性,因此在实际使用时会生成多个序列,用n表示序列个数,用mc表示蒙特卡洛搜索过程,计算过程如以下公式所示:
[0093][0094]
是判别网络给生成网络的奖励得分,其本质是判别网络认为当前注释序列为代码序列对应的真实注释序列的概率;当t<t时,该概率是通过蒙特卡洛搜索得到的完整注释序列作为判别网络的输入得到的输出,用表示第n个序列对应的判别网络输出,对多个序列取平均值;当t=t时,直接将生成网络生成的完整注释序列和源代码序列作为判别网络的输入,得到奖励得分。具体计算过程为:
[0095][0096]
基于以上三个公式可建立生成网络与判别网络之间的对抗关系,生成网络选择token生成注释序列,判别网络接受生成注释序列作为输入并判断该注释序列为真的概率作为生成网络本次选择的奖励,奖励回传到生成网络作为指导梯度下降的损失,生成网络完成梯度更新后再次生成新的注释序列传给判别网络做判断。而判别网络的更新在生成网络进行一定轮次的更新后单独进行。
[0097]
5、评估训练好的网络的代码注释生成效果,并根据结果对对抗网络进行调整。
[0098]
针对序列生成效果的评估指标,常用的有bleu,根据n-grams中选择的n不同,常用的分为bleu-1、bleu-2、bleu-3和bleu-4,由于代码注释生成的均为较长句子(大于5个单
词),因此本发明采用bleu-4作为评估指标。
[0099]
对抗训练时生成网络和判别网络仍采用预训练时设置的网络参数,训练前先分别加载生成网络和判别网络预训练后得到的最佳网络模型参数。
[0100]
但在初次对抗训练时,发现bleu-4评分在短暂的上升后迅速崩溃一路下降为0。经分析,原因是对抗双方强度不平衡,判别网络的判别任务远比生成网络的生成任务简单,因此在经预训练后,能达到更高的强度,在对抗时,生成网络无法与之抗衡,导致无法从对抗中找到强化学习的方向,从而迅速崩溃。为了解决这一问题,依据对生成网络生成注释的bleu-4评分结果变化,对生成网络和判别网络重新调整后再预训练,更改生成网络的优化器为adamw,并优化了超参数学习率和训练轮次,减少判别网络训练轮次,不使其达到最高判别精度,而是维持在0.75左右的中强度,以达到二者的平衡。
[0101]
在调整完生成网络和判别网络的预训练阶段后,再依据bleu-4评分的变化调整对抗训练中的相关训练参数。对抗训练中最重要的参数是生成网络训练的步长(step)、轮次(epoch)和判别网络训练的步长、轮次的设置。经过一定实验后发现,当判别网络的步长大于生成网络的步长,也就是对判别网络训练更多时,生成网络的生成效果提升更快,能快速达到最佳生成效果,但是也会因判别网络效果太强在达到最佳后迅速进入崩溃状态,生成效果逐渐降低为0,因此这种对抗训练效果较差,而设置生成网络的步长大于判别网络的步长,使生成网络得到更多训练时,由于生成网络更容易通过判别网络的判断,学习速度下降,提升较慢。为了更好地达到生成网络和判别网络的平衡,使生成网络和判别网络的效果都稳步提升,经一定实验后,发现设置生成网络的步长为16,轮次为5,判别网络的步长为400,轮次为1时能得到较好的训练效果。
[0102]
6、将代码输入生成网络,得到生成注释。
[0103]
代码先经静态分析器处理得到对应的控制流图,以控制流图作为生成网络控制流图编码器的输入;生成注释的序列中最初只有标识序列开始的《bos》对应的token,此后为已选定单词的token序列,以代码序列和当前生成注释序列作为生成网络代码编码器的输入,经各自编码器处理得到结构特征向量和语义特征向量后并融合;已训练好的生成网络的解码器依据融合特征向量,逐词选择生成注释应有的下一个单词的token,此处最基础的方法是贪心方法,即每次选择概率最大的单词,也可选择效果更好的束搜索(beam search),但是搜索代价更大,时间消耗更多;直到出现序列结束标识《eos》,得到生成注释;根据语料库token对应单词转换为完整英文注释序列。
[0104]
与前述基于序列生成对抗网络的代码注释生成方法的实施例相对应,本发明还提供了基于序列生成对抗网络的代码注释生成装置的实施例。
[0105]
参见图5,本发明实施例提供的一种基于序列生成对抗网络的代码注释生成装置,包括存储器和一个或多个处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,用于实现上述实施例中的基于序列生成对抗网络的代码注释生成方法。
[0106]
本发明基于序列生成对抗网络的代码注释生成装置的实施例可以应用在任意具备数据处理能力的设备上,该任意具备数据处理能力的设备可以为诸如计算机等设备或装置。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在任意具备数据处理能力的设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而
言,如图5所示,为本发明基于序列生成对抗网络的代码注释生成装置所在任意具备数据处理能力的设备的一种硬件结构图,除了图5所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的任意具备数据处理能力的设备通常根据该任意具备数据处理能力的设备的实际功能,还可以包括其他硬件,对此不再赘述。
[0107]
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
[0108]
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0109]
本发明实施例还提供一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时,实现上述实施例中的基于序列生成对抗网络的代码注释生成方法。
[0110]
所述计算机可读存储介质可以是前述任一实施例所述的任意具备数据处理能力的设备的内部存储单元,例如硬盘或内存。所述计算机可读存储介质也可以是任意具备数据处理能力的设备的外部存储设备,例如所述设备上配备的插接式硬盘、智能存储卡(smart media card,smc)、sd卡、闪存卡(flash card)等。进一步的,所述计算机可读存储介质还可以既包括任意具备数据处理能力的设备的内部存储单元也包括外部存储设备。所述计算机可读存储介质用于存储所述计算机程序以及所述任意具备数据处理能力的设备所需的其他程序和数据,还可以用于暂时地存储已经输出或者将要输出的数据。
[0111]
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1