Treecaps
TBCNN和GGNN不能准确地捕捉代码元素之间的语义依赖关系
-
优势: 能够更准确地编码句法结构和捕获代码依赖关系, 胶囊网络能很好地捕捉输入物体之间相对空间和层次关系, 捕获代码元素之间显式的、结构化的父-子兄弟关系
应用: 读懂代码功能,对代码功能进行分类
但是不能同时捕捉语法结构与依赖信息
-
Overview Architecture:
-
用 将训练数据中的代码转化为ASTs, 并将其矢量化, 然后将ASTs和矢量化的节点送到TBCNN中获取特征
-
将TBCNN的输出的张量输入到PVC层中分组成一组胶囊,这组胶囊的数量是动态的
-
通过动态路由算法, 将PVC层中的胶囊路由到SC层, 同时减少组合到固定数量的胶囊, 这一层中的胶囊数量是静态的c
-
SC层的输出被路由到最终的代码胶囊(CC)层,其中胶囊可以被视为输入代码的向量表示,并可以根据各种代码理解任务进行训练,如代码功能分类和函数名称预测。
-
-
The Primary Variable Capsule Layer (PVC)
每个TBCNN卷积层输出一个 |V|\times D 的张量, |V| 是AST的节点数, D 是节点嵌入的维数, 有 m 个这样的卷积层, 那么TBCNN的输出是一个 的一个张量, 那么令
-
通过一个非线性的squash function:
得到PVC层的输出张量
-
The Secondary Capsule Layer (SC)
由于PVC层的胶囊数量是变化的, 因此不能直接路由到最后的CC层, 因此这篇论文提出了两种方法来解决这个问题:
-
DRSW: 动态囊见路由算法
先定义一个可训练的共享的变换矩阵 是PVC层中的胶囊数量,是SC层中每个胶囊的维度
将其与PVC的输出张量相乘得到
然后将prediction vector作为囊间路由算法的输入运算
-
VTS: 动态转静态
用PVC层输出的张量 X_{pvc} 的L2范数模拟实体存在的概率, 然后进行排序, 将排序后的前a个值取出.
-
-
The Code Capsules Layer (CC)
输出代码的vector embedding:
可以通过其完成代码功能分类任务和函数名的预测任务
-
程序功能分类任务
-
函数名预测任务
-
capsules network -- 胶囊网络
-
优势: CNN很难识别图中位置的关系, CNN不能理解图片的语义和位置关系, 并且没有空间分层和空间推理能力, 而相比于CNN, capsnet可以只需要学习一小部分的数据, 通过囊间动态路由算法,就可以实现先进的功能
-
胶囊是如何工作的:
胶囊输出向量的长度代表着对应特征出现的概率, 而方向代表着空间位置等特征信息
-
囊间动态路由算法
路由(routing) : 底层胶囊将输入向量传递到高层胶囊的过程
r 表示迭代系数, 是来自了l (底层)的胶囊的输入
通过点积来刻画底层胶囊输入和高层胶囊输出之间的相似性, 相似 --> 点积>0 --> 增加, 反之不变或者减少 --> 路由系数(的权重)相应变化
迭代系数过多容易导致过拟合, 一般用3次比较适合, 这样算法重复 r 次之后就计算了所有高层胶囊的输出还有确立了所有的路由权重, 之后正向传导就可以推进到更高层的网络