TREECAPS:TREE-STRUCTURED CAPSULE NETWORKS FOR PROGRAM SOURCE CODE PROCESSING

12作者:佚名

摘要:程序理解是软件开发和维护过程中的一项基本任务。在开发新特性或修复现有程序中的错误之前,软件开发人员通常需要了解大量现有代码。能够自动处理编程语言代码并准确地提供代码功能摘要,可以极大地帮助开发人员减少代码导航和理解所花费的时间,从而提高工作效率。与自然语言文章不同的是,编程语言中的源代码往往遵循僵化的语法结构,而且通过复杂的控制流和数据流,彼此之间的代码元素之间可能存在依赖关系。现有的基于树的卷积神经网络(Tbcnn)和门控图神经网络(Ggnn)的研究不能准确地捕捉代码元素之间的语义依赖关系。本文提出了一种新的基于树的胶囊网络(Treecaps)和相关的程序代码自动处理技术,能够更准确地编码句法结构捕获代码依赖关系。通过对用不同编程语言编写的程序的评价,我们发现基于树的方法在对多个程序的功能进行分类方面优于其他方法。

引言:理解程序代码是许多软件工程任务的基本步骤。软件开发人员通常花50%以上的时间浏览现有的代码库和理解代码,然后才能实现新特性或修复错误。如果为程序构建了合适的模型,它们可以用于许多任务,例如对程序的功能进行分类、bug预测、并为程序翻译提供依据。

与自然语言文本不同的是,编程语言有明确的语法定义,可编译的源代码必须遵循严格的语法结构,并且可以明确地解析为语法树。在整个程序中,不同代码元素之间可能存在复杂的控制流和数据流,从而影响程序的语义和功能。在程序中,一些依赖于内部的代码元素可以任意的顺序出现(例如,函数A调用另一个函数B,而A和B在空间上相距很远);一些代码元素,例如局部变量名称,对代码功能没有显著影响。

在文献中,基于树的卷积神经网络(Tbcnns)已经被提出,在编程语言处理方面显示出了有希望的结果。Tbcnns接受源代码的抽象语法树(Asts)作为输入,并捕获代码元素之间显式的、结构化的父-子兄弟关系。门控图神经网络(GGNNS)也被提出作为学习图的一种方法,将Asts扩展到具有各种代码依赖关系的图,这些依赖关系作为树节点之间的边添加到模型代码语义中。虽然ggnns比tbcnns捕获更多的代码语义,但必须通过程序分析技术在树节点之间添加许多额外的边缘,而且其中许多边缘可能是噪声,其中许多边缘可能是噪声,导致训练时间较长,性能较低。最近的一个称为astnn的模型,基于一系列用于语句的小astn(而不是整个程序的一个大ast),显示出比tbcnns和ggnns更好的性能。

在本文中,我们提出了一种新的基于树的胶囊网络体系结构-treecaps,它可以在代码中同时捕获句法结构依赖信息,而不需要显式地在树中添加依赖项或将一棵大树分割成较小的树。胶囊网络本身是一个很有希望的概念,在计算机视觉和自然语言处理等各个领域显示出了超过CNN的巨大潜力,因为它的主要优点是能够发现和保持输入(例如图像和文本)中物体之间的相对空间和层次关系。

Treecaps将capsnet应用于节目的Asts,提出了新的主变量和主静态胶囊层,提出了一种新的从变量到静态的路由算法来路由一组可变的胶囊以生成一组静态的胶囊(目的是为了保持代码依赖),并将树胶囊层连接到分类层以对程序的功能进行分类。

在我们的实证评估中,我们采用从GitHub和文献中收集到的用不同编程语言(如python、java、c)编写的各种程序集,并训练我们的树型模型来对具有不同功能的程序进行分类。结果表明,树形图在程序分类中的性能明显优于其他方法,而对模型变量的研究表明了所提出的变静态路由算法的有效性,分类胶囊的维数对模型性能的影响,以及使用额外的胶囊层的有效性。

相关工作:胶囊网络使用动态路由来模拟图像中物体之间的空间和层次关系。这些技术已成功地应用于不同的任务,如计算机视觉、字符识别和文本分类。没有一项研究把复杂的树数据作为输入。最近有人提出用胶囊图神经网络对生物网络图和社会网络图进行分类,但是还没有应用到树中进行编程语言的处理。

另一方面,研究了基于树和图的神经网络在程序语言处理中的应用Tbcnns被用来模拟代码的句法结构。ggnns从Asts构建依赖关系图,并使用图形神经网络对代码依赖项进行编码。还提出了tbcnns和ggnns的变体,以不同的方式表示程序,以达到更好的训练精度和成本。例如,astnn将整个节目分割成一个较小的序列,并使用双向门控递归单元(bi-Gru)来模拟表示程序中语句的较小的asts。另一个例子是基于双边依赖树的cnn(DTBCNNs),用于对不同编程语言的程序进行分类。Tree-LSTM还用于在程序代码中对树结构进行建模。我们的工作也旨在对树结构进行建模,但设计了特殊的动态路由,目的是捕获代码依赖关系,而不需要显式的程序分析技术。

更普遍的是,将深入学习技术应用于各种软件工程任务,如程序分类、错误预测、代码克隆检测、程序重构、翻译,甚至代码合成。我们可能是第一个适应胶囊网络的程序源代码处理,以捕获语法结构和代码依赖,特别是程序分类问题。在未来,将更多的语义感知代码表示和量身定制的程序分析技术与深度学习结合起来,以改进代码学习任务,这将是一个令人兴奋的领域。

方法概述:图1中总结了我们的树图方法的概述。1.利用word2vec或类似的技术,将训练样本程序的源代码解析为ast,并将其矢量化,将ast节点类型而不是具体标记视为词汇。然后将AST和矢量化节点馈送到我们的TreeCaps网络中。它由一个主要的可变胶囊(PVC)层组成,以适应突发事件中不同数量的节点。随后,使用所提出的变静态路由算法将胶囊路由到主静态胶囊(PSC)层,然后用动态路由算法路由到代码胶囊(CC)层。作为分类胶囊层,代码胶囊捕获并提供整个训练样本的嵌入,同时通过各自的向量规范表示源代码类存在的概率。最后,在向量范数上使用一个Softmax层来输出输入代码样本属于各种功能类的概率。

图1 如下:

第4节和第5节解释了更多关于树矢量化和其他主要组成部分的内容

4 抽象语法树和矢量

图2说明了程序的矢量化。每个原始源代码都使用与编程语言相对应的适当解析器进行解析,以生成ast,该AST用一组广义词汇表词(即节点类型名称)表示源代码的语法结构。我们通过采用类似于Peng等人(2015)的技术,在使用类似于Peng等人(2015)的技术的情况下,通过应用诸如Word2Vec(Mikolov等,2013)的嵌入技术来训练节点类型的嵌入,该技术学习了节点类型的矢量化词汇,XNode是RV,其中V是嵌入大小。所学习的词汇表随后可用于向量化所述STS的每个单独的节点,从而生成向量化的ASTS。

图2如下:

5.基于树的胶囊网络

创建基于树的胶囊网络的主要挑战之一是网络的输入是树结构的(在我们的例子中是ASTS)。树结构数据与一般的图像数据有着本质的区别,即Ximg∈R的h×w×c,其中h、w、c分别是固定的高度、宽度和通道数,或者自然语言数据Xnlp∈R的l×e,其中l,e分别是固定的填充句长度和单词嵌入大小。因此,需要构造网络体系结构来容纳这样的树结构数据Xtree∈R的 t×v次方,其中t,v分别是可变树大小(树中的节点数)和节点嵌入大小。

之后详解请参照https://blog.csdn.net/zhuiyunzhugang/article/details/102542426

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值