记录(1)A Syntax-Guided Edit Decoder for Neural Program Repair

记录(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阶段的

  1. context extraction中,对上下文范围的提取采用基于AST的方式:选择bug节点最近的methoddeclaration类型的祖先作为上下文AST的根。
  2. code tokenization中,采用code-aware:lexical。将源代码输入特定于语言的词法分析器。
  3. code abstraction中,rename to Identifier, 占位符。
  4. 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=S11/2AS21/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。在生成补丁之后,最后一步通过开发人员编写的测试套件来验证。所有生成的补丁都被验证,直到找到一个合理的补丁(通过所有测试用例的补丁)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值