记录(0)A Syntax-Guided Edit Decoder for Neural Program Repair
目录
Basic
buggy code to correct code(or edit operation)
总之还是一个翻译任务,不管是直接翻译成正确代码还是翻译成编辑代码的相应操作
DL-APR相对于传统APR的优点:最明显的应该是不需要任何规范(测试套件)
与自然语言翻译任务的不同:
1.程序包含更多与代码相关的信息
2.程序的变量命名可以不规范,五花八门,比如a_1bcs_xyz这种,导致了OOV问题
为了更好的“翻译”程序设计语言,应当尽可能的利用程序语言区别与自然语言的特性。
对此,Recoder在preprocessiong阶段的
- context extraction中,对上下文范围的提取采用基于AST的方式:选择bug节点最近的methoddeclaration类型的祖先作为上下文AST的根。
- code tokenization中,采用code-aware:lexical。将源代码输入特定于语言的词法分析器。
- code abstraction中,rename to Identifier, 占位符。
- feature abstrction中,额外特征,AST-based tree path和将AST-based graph(邻接矩阵表示)
encoder:使用Code Reader,AST Reader, Tree Path Reader的特殊编码器。将多种包含在代码中的信息结合。
decoder:对bug程序的AST进行编辑操作,provider/decider结构。
patch ranking:beam search
图例:每一步都在beam_width*vocabulary_size()个选择中选择可能性最大的前beam_size个,当beam size=1时,相当于贪心搜索。
Code Reader
self-attention
attention机制缺少位置信息,所以将position vector直接与输入向量相加
简单表示为
x
i
=
c
i
+
p
i
x_i = c_i+p_i
xi=ci+pi
计算如下:
使用multi-head attention来捕获long dependence信息。
gating mechanism
gating mechanism:由上一层得出的特征,进一步结合tag embedding信息。(最后类似加权平均
a
c
1
v
c
1
+
a
c
2
v
c
2
/
(
a
c
1
+
a
c
2
)
a_{c_1}v_{c_1}+a_{c_2}v_{c_2}/(a_{c_1}+a_{c_2})
ac1vc1+ac2vc2/(ac1+ac2))
Tree Conv Layer
进一步结合c,“天涯若比邻”,节点可以在序列中相隔很远,但其在AST结构中很接近。这些特征使用图来提取,节点和节点之间的边关系。
其中𝑊𝑔为全连接层的权值,ˆ𝐴为𝐺的标准化邻接矩阵。
ˆ
𝐴
=
𝑆
1
−
1
/
2
𝐴
𝑆
2
−
1
/
2
ˆ𝐴=𝑆^{−1/2}_1𝐴𝑆^{−1/2}_2
ˆA=S1−1/2AS2−1/2,其中𝐴为𝐺的邻接矩阵,𝑆1、𝑆2为行和为𝐴的对角矩阵。
然后,将邻居的编码(
u
j
)
u^j)
uj)直接添加到输入向量中。
AST Reader、Tree path Reader
类似于Code Reader(rule sequence用规则的id进行词嵌入,rule encoding用规则的内容,此外在self-attention这层, 除位置信息外,多了个深度嵌入)
self-attention捕获关于输入规则的long dependence信息,gating mechanism进一步融合规则编码(内容)的信息。然后进一步结合code reader的输出(multi-head attention)及AST Graph信息(邻居节点信息)。
树路径读取器对待展开的非终端节点信息进行编码,与TreeGen中的相同。
该组件将非终端节点表示为从根到待展开节点的路径,并将该路径中的节点转换为向量。
例如,如果要展开下图中的节点“Assign”,路径应该是root、Module、body、Assign。
然后应用两个注意层来集成AST阅读器和Code阅读器的输出。 最后,是一组两个完全连接的层,其中第一层具有𝐺𝐸𝐿𝑈激活功能(x越大越可能保留,x越小越可能置0),然后提取特征进行预测。
Edit Decoder
以上一步tree path reader的输出out=[
𝒅
1
,
𝒅
2
,
⋅
⋅
⋅
,
𝒅
L
𝒅1, 𝒅2, · · · , 𝒅_L
d1,d2,⋅⋅⋅,dL]作为输入。由上面几个encoder组件可知,out中包含了来自所有输入的编码信息:1错误语句及其周围的方法、到目前为止生成的部分AST、以及表示要展开的节点的树路径。
provider:1.rule predictor, 2.tree copier, 3.subtree locator
1.rule predictor估计编辑语法中每个产生式规则的概率。神经组件由一个完全连接的层组成。
左边不是相应的非终止符的无效规则是不允许的。对于这些规则,逻辑组件将全连接层的输出复位为−∞。因此,softmax归一化后,无效规则的概率为零。
2.tree copier提供程序设计用于编辑语法中的任何非终止符符号,以在本地上下文中选择子树。神经组件基于指针网络。
O
𝑖
=
𝒗
𝑇
t
a
n
h
(
𝑊
1
𝒅
𝑖
+
𝑊
2
𝒕
)
O_𝑖=𝒗^𝑇tanh(𝑊_1𝒅_𝑖+𝑊_2𝒕)
Oi=vTtanh(W1di+W2t)
当对应子树的根符号与正在展开的符号不一致时,逻辑组件会将
O
O
O重置为−∞,,然后通过softmax规范化。
3.subtree locator在编辑语法中,输出错误语句中非终止符号Modify的子树ID。计算同上。
decider
如果对应的provider对上表中扩展的符号不负责,则逻辑组件将𝝀重置为−∞。
在补丁生成过程中,
𝒐
𝑖
𝒐_𝑖
oi将是
𝑖
𝑖
ith步骤下的一个规则的概率向量。
模型训练
采用最大化负对数似然
补丁生成
依靠故障定位技术,对每个可能的错误语句,调用上述模型。对于每个语句,通过beam search生成100个有效的候选patch,当beam search产生一个有效的patch时,将其从搜索集中移除,并继续搜索下一个patch,直到产生100个候选patch。在生成补丁之后,最后一步通过开发人员编写的测试套件来验证。所有生成的补丁都被验证,直到找到一个合理的补丁(通过所有测试用例的补丁)。