-
-
TBCNN – 基于树的卷积神经网络 TBCNN: A Tree-Based Convolutional Neural Network for Programming Language Processing
-
一种用于编程语言处理的基于树的卷积神经网络 -
Abstract:
- 由于当前还没有将深度神经网络应用于编程语言处理, 提出TBCNN模型来对基于ASTs的编程语言进行建模, 提取丰富的信息
- 在模型中首先通过基于ASTs的编码准则来预训练获得program vector, 然后通过树型卷积来捕捉树的一些有用特征, 并且引入了三路池化(3-way pooling)和连续二叉树(continous binary tree)来处理不同形状大小的ASTs
- 通过与基准方法对比, 这个方法可以更好更快地完成程序分类任务, 同时预训练出来的program vector也能提高训练的速度
-
Introduction:
- 编程语言和自然语言的区别: 程序包含丰富而明确的结构信息, 编程语言中的源代码往往遵循固定僵化的语法结构, 而且通过复杂的控制流和数据流, 批次之间的代码块之间可能存在依赖关系
-
- 提出“编码准则”学习ast中每个节点的向量表示,作为预训练阶段;
- 提出了基于树的卷积方法提取程序的局部结构特征;
- 引入“连续二叉树”和“三路池化”的概念,使模型适用于不同结构和大小的树;
整体模型
-
Pretraining
-
对于一个节点
p
p
p 和它的所有孩子
c
1
,
c
2
,
.
.
.
,
c
i
c_1, c_2,...,c_i
c1?,c2?,...,ci? ,用一下式子来表示
p
p
p 的coded vector ?
v
e
c
(
p
)
≈
t
a
n
h
(
∑
i
l
i
W
c
o
d
e
,
i
v
e
c
(
c
i
)
+
b
c
o
d
e
)
vec(p)\approx tanh(\sum_il_iW_{code,i}vec(c_i)+b_{code})
vec(p)≈tanh(∑i?li?Wcode,i?vec(ci?)+bcode?) -
定义
v
e
c
(
p
)
vec(p)
vec(p) 和
p
p
p 的 coded vector 的距离的平方 ?
d
=
∣
∣
v
e
c
(
p
)
?
t
a
n
h
(
∑
i
l
i
W
c
o
d
e
,
i
v
e
c
(
c
i
)
+
b
c
o
d
e
)
∣
∣
2
2
d=\left|\left|vec(p)-tanh(\sum_il_iW_{code,i}vec(c_i)+b_{code}) \right|\right|_2^2
d=∣∣vec(p)?tanh(∑i?li?Wcode,i?vec(ci?)+bcode?)∣∣22? -
同时, 通过将一个随机一个节点(
p
p
p 或者
p
p
p 的某一个孩子) 换成一个随机的symbol 来完成负采样, 把这个负样本和其coded vector之间的距离计为
d
c
d_c
dc? -
目标:
m
i
n
i
m
i
z
e
W
c
o
d
e
l
,
W
c
o
d
e
r
,
b
c
o
d
e
m
a
x
(
d
?
d
c
+
△
)
minimize_{W^l_{code}, W^r_{code},b_code} max(d-d_c+\triangle)
minimizeWcodel?,Wcoder?,bc?ode?max(d?dc?+△) -
Coding layer
- 对于非叶子结点,
p
=
W
c
o
m
b
1
v
e
c
(
p
)
+
W
c
o
m
b
2
t
a
n
h
(
∑
i
l
i
W
c
o
d
e
,
i
v
e
c
(
x
i
)
+
b
c
o
d
e
p =W_{comb1}vec(p)+W_{comb2}tanh(\sum_il_iW_{code,i}vec(x_i)+b_{code}
p=Wcomb1?vec(p)+Wcomb2?tanh(∑i?li?Wcode,i?vec(xi?)+bcode?
-
Tree-based consolution layer 用固定深度的树型卷积核划过整个树结构, 假定对应节点的向量表示是
x
1
,
x
2
,
.
.
.
x
n
x_1, x_2, ... x_n
x1?,x2?,...xn?, 那么这个卷积层的输出是
y
=
t
a
n
h
(
∑
n
W
c
o
d
e
,
i
?
x
i
+
b
c
o
d
e
)
y=tanh(\sum_nW_{code,i}*x_i+b_{code})
y=tanh(∑n?Wcode,i??xi?+bcode?) 而由于孩子节点的数量不固定并且树的形状和大小不固定, 这一步需要同时用zero-paddings和连续二叉树的概念
-
连续二叉树 continuous binary tree 把目标子树看作是一个二叉树(无论原本是什么形状和大小), 使用三个基本的权重矩阵
W
c
o
n
v
l
e
f
t
,
W
c
o
n
v
r
i
g
h
t
,
W
c
o
n
v
t
o
p
W^{left}_{conv}, W^{right}_{conv}, W^{top}_{conv}
Wconvleft?,Wconvright?,Wconvtop?. 对于子树中的某一个节点
x
i
x_i
xi?, 其权重矩阵
W
c
o
n
v
W_{conv}
Wconv? 是这三个基本权重矩阵的线性组合 -
Three-way pooling ? 卷积层之后会得到一个形状和大小不变的新树, 因此不能直接接到hidden layer和output layer 用三路池化讲特征池化成三个部分 -
SGDM 优化器算法
-
Hiden layer and output layer — softmax 归一化
s
o
f
t
m
a
x
i
=
e
i
∑
j
e
j
softmax_i =\frac{e^i}{\sum_je^j}
softmaxi?=∑j?ejei? ?
- 实验和实验结果
- 向量表示成功地捕获了AST节点的有意义特征
- 神经编程语言处理, 对程序进行分类是有效可行的
|