一种基于tbcnn和多头自注意力机制的代码特征提取方法
技术领域
1.本发明涉及互联网技术的机器学习领域,具体涉及一种基于tbcnn和多头自注意力机制的代码特征提取方法。
背景技术:2.在软件工程领域,分析程序源代码对解决软件工程问题具有十分重要的作用。计算机虽然可以运行程序代码,但它却不能真正意义上理解代码的含义。分析源代码提供了估计程序的行为、功能、复杂性等方法。特征提取作为代码相关研究方向的一项基础而又非常重要的操作,提取的特征质量直接影响了后续的研究成果,具有决定性的作用。
3.近些年,使用深度学习模型并借助代码的抽象语法树(abstract syntax tree,ast)来提取代码特征是许多研究的共同选择。将程序代码表示成抽象语法树,通过各种神经网络模型获得程序中的结构信息,这个过程中的关键在于面对复杂的程序代码也能完整地保存ast节点之间的信息,包括程序结构信息和语义信息。代码特征提取主要用来提取代码的语法信息和语义信息,最终输出一个表示代码的特征向量,这个输出可以直接应用于代码分类、代码克隆检测、代码相似性检测等代码任务,特征提取的质量直接影响了各类任务的准确性。关于代码特征提取的方法有很多,主要包含基于卷积神经网络(cnn)的特征提取和基于循环神经网络(rnn)的特征提取,但目前的方法大多都存在一些问题。cnn和rnn都可以提取局部特征,但cnn存在感受野的问题,不能很好的捕获全局信息,且计算复杂度比rnn要高,rnn存在梯度消失、梯度爆炸和长时间依赖的问题,且无法对一个序列的处理实现并行化,尽管lstm及其变体gru可以缓解梯度消失、梯度爆炸和长时间依赖的问题,但在代码特征提取中仍然具有很大的局限性。另外,类似于自然语言的长文本,当把整个大的抽象语法树直接放进模型而不进行处理时,很大可能在训练过程中出现梯度消失的问题。以上存在的问题,极大地提高了准确提取代码特征的难度。因此,需要发明提出了一种基于tbcnn和多头自注意力机制的代码特征提取方法。
技术实现要素:4.针对神经网络中代码特征提取质量较低的问题,本发明提供了一种基于tbcnn和多头自注意力机制的代码特征提取方法,该方法利用基于树的卷积神经网络以及多头自注意力机制和残差网络实现了代码的特征提取。多头自注意力机制重点关注序列内部的关系,可以实现cnn网络和rnn网络的功能,不仅可以解决cnn感受野限制和计算复杂度大的问题,而且还可以解决因无法学习长距离依赖导致的梯度消失和梯度爆炸的问题。
5.一种基于tbcnn和多头自注意力机制的代码特征提取方法,包括:
6.s1:对程序代码进行解析处理,获得抽象语法树;
7.s2:按照预设的功能节点对抽象语法树进行分割处理,获得若干个小型抽象语法树;
8.s3:将小型抽象语法树输入基于树的卷积神经网络,获得程序代码结构信息的向
量序列;
9.s4:利用多头自注意力机制和残差网络对向量序列进行处理,获得程序代码特征;
10.s5:利用全连接网络对程序代码特征进行融合,获得程序代码的特征向量。
11.进一步地,s1包括:
12.s101:对程序代码进行词法分析,按照预设的规则读取程序代码,获得标记分类列表;所述标记分类列表包括语法关键字、操作符、语句截止位置和数据;
13.s102:对标记分类列表进行语法分析,将标记分类列表转换成树形的形式,获得抽象语法树。
14.进一步地,s2包括:
15.s201:设置功能节点关键字;所述功能节点关键字包括try、function、while、for、if、switch和unit;
16.s202:按照功能节点关键字对抽象语法树进行分割,获得若干个小型抽象语法树。
17.进一步地,s3包括:
18.s301:通过编码层对小型抽象语法树中的节点进行编码,得到抽象语法树中的节点向量;
19.s302:通过卷积层利用预设的特征检测器对节点向量进行检测,获得小型抽象语法树的结构信息;
20.s303:通过最大池化层对结构信息进行最大池化操作,对结构信息的特征取最大值,获得程序代码结构信息的向量序列。
21.进一步地,s302包括:
22.s3021:按照预设的特征深度初始化特征检测器;
23.s3022:采用特征检测器在抽象语法树中按照预设的滑动方法进行滑动;所述滑动方式为从根节点开始,然后按照以下顺序递归完成节点访问:左孩子节点、右孩子节点、根节点的顺序。
24.进一步地,s3还包括:
25.基于树的卷积神经网络的训练算法为反向传播算法。
26.进一步地,s4包括:
27.s401:设置多头自注意力层;
28.s402:利用多头自注意力机制对程序代码结构信息的向量序列进行并行化处理,计算程序代码片段与全局代码段之间的权值关系,获取程序代码片段之间的顺序依赖关系;
29.s403:将顺序依赖关系编码成向量,得到程序代码的并行处理序列信息。
30.进一步地,s4还包括:
31.s404:利用跳层连接的方式构建残差网络;
32.s405:利用残差网络对并行处理序列信息进行残差操作,获得程序代码特征。
33.进一步地,所述s5包括:
34.所述全连接网络每个神经元的激励函数采用relu函数。
35.进一步地,所述s5还包括:
36.所述全连接网络倒数第二层采用随机失活正则化方法。
37.本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书以及附图中所特别指出的结构来实现和获得。
38.下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
39.附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
40.图1为本发明的一种基于tbcnn和多头自注意力机制的代码特征提取方法基本架构示意图;
41.图2为本发明的基于tbcnn体系结构示意图;
42.图3为本发明序列信息提取过程方法示意图。
具体实施方式
43.以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
44.一种基于tbcnn和多头自注意力机制的代码特征提取方法,如图1所示,包括:
45.s1:对程序代码进行解析处理,获得抽象语法树;
46.s2:按照预设的功能节点对抽象语法树进行分割处理,获得若干个小型抽象语法树;
47.s3:将小型抽象语法树输入基于树的卷积神经网络,获得程序代码结构信息的向量序列;
48.s4:利用多头自注意力机制和残差网络对向量序列进行处理,获得程序代码特征;
49.s5:利用全连接网络对程序代码特征进行融合,获得程序代码的特征向量。
50.上述技术方案的工作原理为:代码智能在软件工程和人工智能变得越来越重要。基于代码智能可以实现多种智能系统。代码搜索系统可以帮助开发人员根据给定查询条件检索语意相似的代码;代码补全系统可以根据开发人员编辑的上下文内容自动补充缺失代码;代码翻译系统可以帮助开发人员将代码从一个编程语言翻译到另一个编程语言。其中,代码的特征提取作为代码智能处理的核心技术之一,在代码自动生成、代码翻译、代码相似度检测等方面发挥了极其重要的作用;随着深度学习的广泛应用,代码的特征提取在机器学习、自然语言处理、机器翻译、计算机视觉以及其他相关领域都取得了很多成果。越来越多的研究借助能够充分表达程序代码逻辑结构的抽象语法树(ast)并使用深度学习模型来提取代码特征,但目前使用的神经网络存在计算复杂度大、梯度消失、梯度爆炸以及长期依赖的问题,代码特征提取的结果仍不够理想。抽象语法树可以表达程序代码逻辑结构,利用抽象语法树并使用深度学习模型可以用来提取代码特征,本发明基于树的卷积神经网络(tbcnn)和多头自注意力机制进行程序代码特征提取,其过程为:首先,将代码的抽象语法树按照自定义的功能节点分割成若干个小型抽象语法树作为模型的输入;然后,利用基于树的卷积神经网络进行代码结构信息的提取,获得若干向量e1、e2、e3....en,然后利用多头自注意力机制和残差网络进行代码序列信息的提取,充分利用全文信息,更好地提取代
码的深层特征;最后通过全连接网络融合特征得到最后的输出r。
51.上述技术方案的有益效果为:采用本实施例提供的方案,多头自注意力机制重点关注序列内部的关系,可以实现cnn网络和rnn网络的功能,不仅可以解决cnn感受野限制和计算复杂度大的问题,而且还可以解决因无法学习长距离依赖导致的梯度消失和梯度爆炸的问题。
52.在一个实施例中,s1包括:
53.s101:对程序代码进行词法分析,按照预设的规则读取程序代码,获得标记分类列表;所述标记分类列表包括语法关键字、操作符、语句截止位置和数据;
54.s102:对标记分类列表进行语法分析,将标记分类列表转换成树形的形式,获得抽象语法树。
55.上述技术方案的工作原理为:抽象语法树(abstract syntax tree,ast)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。抽象语法树的生成过程包括两步;第一步是进行词法分析,将程序代码去除空格,对标记进行分类,分类内容包括语法关键字、操作符、语句截止位置和数据;第二步是进行语法分析,通过扫描标记分类表,分析语法,通过分析一条以“;”符号结尾的语句具体的执行规则,然后使用逆波兰表达式组合,最后形成一个二叉树,二叉树从底部往上一步步合并,生成抽象语法树。
56.上述技术方案的有益效果为:采用本实施例提供的方案,通过将程序代码生成抽象语法树,便于进行代码特征的提取。
57.在一个实施例中,s2包括:
58.s201:设置功能节点关键字;所述功能节点关键字包括try、function、while、for、if、switch和unit;
59.s202:按照功能节点关键字对抽象语法树进行分割,获得若干个小型抽象语法树。
60.上述技术方案的工作原理为:在应用模型训练过程中会出现梯度消失的问题,为了缓解这一问题,需要对抽象语法树进行分割处理;具体为:设置功能节点关键字;所述功能节点关键字包括try、function、while、for、if、switch和unit;按照功能节点关键字对抽象语法树进行分割,获得若干个小型抽象语法树。
61.上述技术方案的有益效果为:采用本实施例提供的方案,通过对抽象语法树进行分割处理,可以减小模型训练过程中会出现梯度消失的问题的发生。
62.在一个实施例中,如图2所示,s3包括:
63.s301:通过编码层对小型抽象语法树中的节点进行编码,得到抽象语法树中的节点向量;
64.s302:通过卷积层利用预设的特征检测器对节点向量进行检测,获得小型抽象语法树的结构信息;
65.s303:通过最大池化层对结构信息进行最大池化操作,对结构信息的特征取最大值,获得程序代码结构信息的向量序列。
66.上述技术方案的工作原理为:tbcnn网络由节点构成,和数据结构中的树一样,每个节点都有自己的id、父亲及孩子,网和标签,其中最顶部为树的根节点。利用tbcnn网络可
以有效地进行程序代码结构信息的提取;在tbcnn中设置池化层,可以有效缩小参数矩阵的尺寸,从而减少参数数量,加快计算速度和防止过拟合;本步骤包括:通过编码层对小型抽象语法树中的节点进行编码,得到抽象语法树中的节点向量;通过卷积层利用预设的特征检测器对节点向量进行检测,获得小型抽象语法树的结构信息;通过最大池化层对结构信息进行最大池化操作,对结构信息的特征取最大值,并通过softmax激活函数进行归一化处理,获得程序代码结构信息的向量序列。
67.上述技术方案的有益效果为:采用本实施例提供的方案,借助tbcnn模型对代码的结构信息进行提取,首先在编码层对每个小型抽象语法树中的节点进行向量表示,然后在卷积层用一组特定深度的特征检测器实现基于树的卷积,即利用特征检测器在整个ast上进行滑动,以获取树的结构信息,最后使用最大池化来获取代码各部分信息,一定程度上可以提高代码特征提取的有效性。
68.在一个实施例中,s302包括:
69.s3021:按照预设的特征深度初始化特征检测器;
70.s3022:采用特征检测器在抽象语法树中按照预设的滑动方法进行滑动;所述滑动方式为从根节点开始,然后按照以下顺序递归完成节点访问:左孩子节点、右孩子节点、根节点的顺序。
71.上述技术方案的工作原理为:特征检测器在网络中可以有效地检测特征,通过滑动方式进行检测提高检测的质量;s302包括:
72.s3021:按照预设的特征深度初始化特征检测器;
73.s3022:采用特征检测器在抽象语法树中按照预设的滑动方法进行滑动;所述滑动方式为从根节点开始,然后按照以下顺序递归完成节点访问:左孩子节点、右孩子节点、根节点的顺序。
74.上述技术方案的有益效果为:采用本实施例提供的方案,采用特征检测器可以提高检测的速度和效果,从而提高结构信息获取的质量。
75.在一个实施例中,s3还包括:
76.基于树的卷积神经网络的训练算法为反向传播算法。
77.上述技术方案的工作原理为:反向传播算法是由学习过程由信号的正向传播与误差的反向传播两个过程组成,该算法的非线性映射能力、自学习和自适应能力、泛化能力、容错能力都比较强,利于模型的训练。
78.上述技术方案的有益效果为:采用本实施例提供的方案,采用反向传播算法可以提高模型训练的效果。
79.在一个实施例中,如图3所示,s4包括:
80.s401:设置多头自注意力层;
81.s402:利用多头自注意力机制对程序代码结构信息的向量序列进行并行化处理,计算程序代码片段与全局代码段之间的权值关系,获取程序代码片段之间的顺序依赖关系;
82.s403:将顺序依赖关系编码成向量,得到程序代码的并行处理序列信息。
83.上述技术方案的工作原理为:自注意力机制的核心是捕捉向量之间的相关性,多头自注意力机制引入多个向量捕捉多种相关性,设置多组矩阵,每一组只进行内部计算,得
到相应的输出。多头自注意力机制可以获取序列不同方面的信息,实现并行化处理,能够很好的进行长距离依赖的学习,并且具有较低的计算复杂度。如图3中,x1、x2、x3....xn多个分支向量序列,通过多头注意力机制,输出z1、z2、z3...zn多个类别,s4包括:
84.s401:设置多头自注意力层;
85.s402:利用多头自注意力机制对程序代码结构信息的向量序列进行处理,计算程序代码片段与全局代码段之间的权值关系,获取程序代码片段之间的顺序依赖关系;
86.s403:将顺序依赖关系编码成向量,得到程序代码的序列信息。
87.上述技术方案的有益效果为:采用本实施例提供的方案,通过多注意力机制可以计算每个代码片段与全局代码段之间的权值关系,无需担心上下文信息的缺失,它可以综合全局信息得到每个代码片段的向量表示,而且整个过程为并行化处理,能够很好的进行长距离依赖的学习,并且具有较低的计算复杂度,大大缩短了模型训练的时间,提高了训练效率。
88.在一个实施例中,如图3所示,s4还包括:
89.s404:利用跳层连接的方式构建残差网络;
90.s405:利用残差网络对并行处理序列信息进行残差操作,获得程序代码特征。
91.上述技术方案的工作原理为:在深度学习中,随着网络层数增多,会出现计算资源的消耗增加、模型容易过拟合、梯度消失问题;为了实现良好的学习效果,提取出代码的深层特征而将冗余特征消除,通过一系列残差块组成残差网络,可以有效解决这些问题的;在图3中,z1、z2、z3...zn是第一层残差块的输入,fc代表对经过第一层线性变化并激活后的输出进行进一步残差处理后输出。本发明首先利用跳层连接的方式构建残差网络;然后利用残差网络对并行处理序列信息进行残差操作,获得程序代码特征。
92.上述技术方案的有益效果为:采用本实施例提供的方案,通过设置残差网络,以跳跃式的方式进行残差操作,减少了特征的参数,降低了训练误差,解决了深度神经网络的退化问题,可以提高深度学习的效果,提高程序代码特征获取的质量。
93.在一个实施例中,所述s5包括:
94.所述全连接网络每个神经元的激励函数采用relu函数。
95.上述技术方案的工作原理为:全连接网络起到“分类器”的作用,将学习得到的特征表示映射到样本的标记空间,即把特征整合到一起,交给最后的分类器或者回归。全连接网络中的每个神经元与其前一层的所有神经元进行全连接,为了提升网络性能,全连接层每个神经元的激励函数采用relu函数,使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
96.上述技术方案的有益效果为:采用本实施例提供的方案,通过设置激励函数,可以提高全连接网络的性能。
97.在一个实施例中,所述s5还包括:
98.所述全连接网络倒数第二层采用随机失活正则化方法。
99.上述技术方案的工作原理为:全连接网络容易出现参数冗余的问题,影响训练的速度,容易过拟合;随机失活正则化方法,通过对网络层的节点都设置一个被消除的概率,之后在训练中按照概率随机将某些节点消除掉,以达到正则化,降低方差的目的。为了解决这一问题,在网络倒数第二层采用随机失活正则化方法。
100.上述技术方案的有益效果为:采用本实施例提供的方案,在网络倒数第二层采用随机失活正则化方法,提高了训练的速度。
101.显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
技术特征:1.一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,包括:s1:对程序代码进行解析处理,获得抽象语法树;s2:按照预设的功能节点对抽象语法树进行分割处理,获得若干个小型抽象语法树;s3:将小型抽象语法树输入基于树的卷积神经网络,获得程序代码结构信息的向量序列;s4:利用多头自注意力机制和残差网络对向量序列进行处理,获得程序代码特征;s5:利用全连接网络对程序代码特征进行融合,获得程序代码的特征向量。2.根据权利要求1所述的一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s1包括:s101:对程序代码进行词法分析,按照预设的规则读取程序代码,获得标记分类列表;所述标记分类列表包括语法关键字、操作符、语句截止位置和数据;s102:对标记分类列表进行语法分析,将标记分类列表转换成树形的形式,获得抽象语法树。3.根据权利要求1所述的一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s2包括:s201:设置功能节点关键字;所述功能节点关键字包括try、function、while、for、if、switch和unit;s202:按照功能节点关键字对抽象语法树进行分割,获得若干个小型抽象语法树。4.根据权利要求1所述的一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s3包括:s301:通过编码层对小型抽象语法树中的节点进行编码,得到抽象语法树中的节点向量;s302:通过卷积层利用预设的特征检测器对节点向量进行检测,获得小型抽象语法树的结构信息;s303:通过最大池化层对结构信息进行最大池化操作,对结构信息的特征取最大值,获得程序代码结构信息的向量序列。5.根据权利要求4所述一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s302包括:s3021:按照预设的特征深度初始化特征检测器;s3022:采用特征检测器在抽象语法树中按照预设的滑动方法进行滑动;所述滑动方式为从根节点开始,然后按照以下顺序递归完成节点访问:左孩子节点、右孩子节点、根节点的顺序。6.根据权利要求1所述一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s3还包括:基于树的卷积神经网络的训练算法为反向传播算法。7.根据权利要求1所述一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s4包括:s401:设置多头自注意力层;s402:利用多头自注意力机制对程序代码结构信息的向量序列进行并行化处理,计算
程序代码片段与全局代码段之间的权值关系,获取程序代码片段之间的顺序依赖关系;s403:将顺序依赖关系编码成向量,得到程序代码的并行处理序列信息。8.根据权利要求1所述一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s4还包括:s404:利用跳层连接的方式构建残差网络;s405:利用残差网络对并行处理序列信息进行残差操作,获得程序代码特征。9.根据权利要求1所述一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s5包括:所述全连接网络每个神经元的激励函数采用relu函数。10.根据权利要求1所述的一种基于tbcnn和多头自注意力机制的代码特征提取方法,其特征在于,s5还包括:所述全连接网络倒数第二层采用随机失活正则化方法。
技术总结本发明提供了一种基于TBCNN和多头自注意力机制的代码特征提取方法,包括:对程序代码进行解析处理,获得抽象语法树;按照预设的功能节点对抽象语法树进行分割处理,获得若干个小型抽象语法树;将小型抽象语法树输入基于树的卷积神经网络,获得程序代码结构信息的向量序列;利用多头自注意力机制和残差网络对向量序列进行处理,获得程序代码特征;利用全连接网络对程序代码特征进行融合,获得程序代码的特征向量。本发明可以实现CNN网络和RNN网络的功能,不仅可以解决CNN感受野限制和计算复杂度大的问题,而且还可以解决因无法学习长距离依赖导致的梯度消失和梯度爆炸的问题。依赖导致的梯度消失和梯度爆炸的问题。依赖导致的梯度消失和梯度爆炸的问题。
技术研发人员:杨永全 张东晓 魏志强
受保护的技术使用者:青岛海洋科学与技术国家实验室发展中心
技术研发日:2022.07.26
技术公布日:2022/11/1