原文标题:Cross-Language Learning for Program Classification Using Bilateral Tree-Based Convolutional Neural Networks
原文作者:Nghi D.Q.Bui, Lingxiao Jiang, Yijun Yu.
原文链接:https://arxiv.org/pdf/1710.06159.pdf
发表会议:The Workshops of the Thirty-Second AAAI Conference on Artificial Intelligence
笔记作者:[email protected]
笔记小编:[email protected]
为了实现不同编程语言之间的算法比较,遂提出一种基于双边树的卷积神经网络(BITBCNN)模型。
作者的算法开源于:https://github.com/bdqnghi/bi-tbcnn
TBCNN结构如下图所示:上图展示了TBCNN的架构,具有以下四个部分:
①使用编码层将每个AST节点嵌入到连续的向量空间中,语义相似的节点(比如while和for相似)嵌入后相互靠近,不同的节点类型嵌入策略不一致。
②TBCNN提出者设置了一组固定深度的子树过滤器在AST上移动来提取树的结构信息;
③池化层用来收集从树的不同部分提取的信息;提出了“连续二叉树”并应用动态池化处理AST节点的不同数量的子节点;
④隐藏层和输出层对程序进行分类。
要训练TBCNN,需要对每个AST节点进行向量化表示。 向量化时使用了不同的策略,与word2vec的skip-gram模型相似,将其应用于AST的上下文,即给定一个输入词,来预测其上下文词(这里需要先了解skip-gram模型的原理才能明白)。具体来说就是,TBCNN将给出整个AST的词汇表(词汇表是AST的节点类型,很小)中每个节点成为候选节点的概念(选择给定的AST节点的随机子节点)。
上图为此模型最终的结构图,由两部分组成,第一部分是具有两个子网络的双边结构图,第二部分是一个分类网络,改编自TBCNN。首先将源算法代码解析为Pickle格式的AST,然后将其输入到TBCNN模块,TBCNN模块进行卷积输出AST的特征,之后将两个特征向量连接为一个向量(这一部分称为联合表示层),然后进入两个完全连接的隐藏层,并将其输入到softmax层,以对两个输入程序的算法进行分类(关于算法分类这一块作者在文中提出了两种应用,一种是比较两个编程语言实现的程序是否属于同一种算法,另一种是给定一种编程语言的算法,来识别未知编程语言实现的算法)。
作者使用Tensorflow来构建模型,在隐藏层中设置dropout为0.7防止过拟合,并使用leaky ReLU作为激活函数避免梯度消失/爆炸问题。
1.作者的数据集程序代码量少,算法简单,对于含有混合算法集或者代码量大的程序不适用;
2.数据集变大时,训练速度也会变慢,若将其切片,或有所缓解;
3.dropout设置太过单一,没有对比其它的值;
4.使用leaky ReLU作为激活函数时对比不够。
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com