1、论文
论文要解决的问题是:读懂代码功能,对代码功能进行分类。
之前的技术为啥不行?与自然语言不同的是,编程语言有明确的语法定义,可编译的源代码必须遵循严格的语法结构。所以一般的技术无法处理。目前Tbcnns接受源代码的抽象语法树(Asts)作为输入,并捕获代码元素之间显式的、结构化的父-子兄弟关系。但是不能同时捕捉语法结构与依赖信息。
本文中提出的模型:Treecaps 树胶囊网络。
胶囊网络相比于cnn能够获得空间信息,能够保证代码的层次性。
2、模型原理
1.输入的数据集是可以运行的代码。模型无法直接对代码直接进行处理。需要进行转换,首先将源代码转为抽象语法树AST,再将AST通过word2vec技术矢量化。如下图所示:
2.处理好的数据集输入到胶囊网络模型中,该论文中提到的胶囊网络是改进的胶囊网络。网络由5层构成,其中隐藏层包括PVC层、PSC层、CC层。如下图所示:
3.在PSC层中,矢量化的AST树需要进行卷积操作,因为树的大小因程序不同,树的高度也不同。因节点的不同引起的子节点的不同(ps:这里理解的是int a 和double a的区别)。所以在卷积核的大小无法固定。文章中采用了 Convolutional neural networks over tree structures for programming language processing.这篇文章提出的二叉连续树方法。讲卷积核模拟为一个二叉树。如下图所示:
分别为Wt、Wr、Wl。Nti,Nli,Nri是与子节点的深度和位置相对应的权重。如Tbcnn卷积方式类似,卷积过程如下图:
卷积的公式如下:
激活函数是用的tanh,初始化b=0。经过胶囊网络不断前向传播。最后得到Xpsc。
4.动态路由转静态是本文的亮点,经过PSC层处理后的到结果,还是不同的,那为什么还要有PSC层呢,卷积的操作是可以降低树的高度差异的,为了更好处理。动态转静态的方式是Xpsc中的每个节点进行L2 norm。然后进行排序。将排序后的第一个值取出。经验上,并非AST的每个节点对源代码分类都有作用。有点topb的意思。(这快我还没看明白)
5.CC层是普通的胶囊网络层,是把psc处理好的数据进行特征提取。然后经过softmax层输出对应的预测结果。胶囊网络摒弃了BP算法。根据有空间意义。