Advertisement

【论文笔记】 Reinforcement-Learning-Guided Source Code Summarization using Hierarchical Attention

阅读量:

本文提出了一种基于深度强化学习(DRL)和层次注意力网络(HAN)的方法来生成高质量的代码注释。传统的注释生成方法在处理复杂代码时面临两个主要问题:缺乏对代码层次结构的理解以及难以捕捉上下文信息。为此,作者提出了三种代码表示方式——纯文本(plain text)、类型增强的抽象语法树(type-augmented AST)和控制流图(control flow graph),并结合HAN模型将这三种表示方式进行融合编码。此外,作者采用actor-critic框架作为强化学习训练方式,并通过奖励函数(如BLEU、METEOR、ROUGE-L)评估生成效果。实验结果显示,在Python和Java数据集上,本文方法显著优于现有基于神经机器翻译和序列到序列模型的方法,并且能够有效捕捉不同上下文信息以生成更优的质量注释。

1 INTRODUCTION

软件维护blablabla……代码注释blablabla……

改写说明

现有的研究:统计语言模型,模板和规则,神经机器翻译等。

研究的局限性和作者的一些见解:

  1. 以代码文本形式直接输入而不考虑其层次结构特性(通过不同上下文中的token序列生成注释的能力得到了充分表征)。
  2. 仅基于简单的时序特征进行编码(如token序列),未能充分挖掘控制流图CFGs、抽象语法树AST以及程序变量类型等其他潜在的语义关联。
  3. 传统训练方法采用"教师强制"(teacher-forcing)机制存在明显缺陷:该方法受限于Exposure Bias,在测试阶段无法获取真实标签反馈(即后续生成词作为输入用于预测当前词),导致模型无法有效暴露预测错误。

teacher forcing 概念参考

针对该问题的具体方案:采用层次注意力机制构建的学习方案,并结合强化学习理论中的actor-critic方法进行优化

  1. 通过引入类型增强的AST序列取代基于树状结构的 AST 表示,并借助控制流机制补充缺失的代码表示;以应对问题(2)。
  2. 采用hierarchical attention network (HAN),系统性地处理各具特色的代码序列;以解决挑战(1)。

框架概述:

离线训练阶段包括以下几个关键组成部分:
第一部分是大规模注释的代码与注解数据对语料库;
第二部分涉及三种不同的序列类型:非结构化级别的纯代码序列由xTXT表示,
结构化级别的类型增强AST由xAST表示,
以及控制流相关的数据由xCFG表示(如图1(a)所示);
第三部分基于层次化注意力机制的HAN架构完成了编码与整合过程(如图1(b)所示);
第四部分利用这些注释信息被用于深度强化学习模型的输入训练过程(如图1©所示)。

  1. 在线总结阶段:
    1. 向actor网络中输入一个给定代码片段,生成相应注释。
在这里插入图片描述

贡献点:

新的思路:提出了一种深度强化学习框架Actor-Critic网络来生成注释

在多样化的算法体系中,本文构建了HAN学习方法,并对如何表征多种代码属性以及它们在层次结构关系中的作用进行了归纳分析。

评估:基于真实数据集的评估获得了最优性能

2 PRELIMINARIES

预备知识:

2.1 语言模型

概率预测

2.2 RNN 编码器-解码器模型

  1. 编码器
  2. 解码器
  3. 训练目标(loss)

2.3 强化学习

在强化学习框架下,系统通过与环境的互动来实现目标;在观察到系统的反馈信号基础上,系统能够有效缓解经验偏差(Exposure Bias),从而在反馈信号中学习最佳行为策略。

基于强化学习的方法体系中不仅会计算生成序列的概率值 同时还会在模型训练过程中计算奖励值作为反馈机制的一部分 从而有效降低Exposure Bias问题的影响。具体而言 文本生成的过程可被建模为一个马尔科夫决策过程(MDP)表示为M = \{S, A, P, R, \gamma\} 在该MDP框架下 时刻t的状态s_t是由代码片段x以及预测序列y_0,y_1,\dots,y_t共同构成的 经过映射后的动作空间\mathcal{Y}则由所有可能单词组成的词汇表\mathcal{Y}所定义 其中每个时刻t的动作选择对应于从\mathcal{Y}中选取特定单词y_t \in \mathcal{Y}。随后 状态转移函数\textit{Transition}则决定了后继状态s_{t+1}如何从当前状态s_t和动作选择y_t中产生 即s_{t+1} = s_t \cup \{y_t\} 并根据实际获得的奖励值r_{t+1}对后续行为进行指导 最终的目标即是通过优化策略\pi^* 使得模型在生成语句时能够最大化预期奖励值。

在这里插入图片描述

\theta 涉及学习策略参数,D 代表训练数据集,在预测动作词(即单词)时使用 ŷ ,而 R 则表示奖励机制。

我们的目标仍然是为给定的代码片段x生成相应的单词序列,并使预期奖励达到最大。在现有研究的基础上, 学习策略的方法主要分两种:(1) 策略导向型, 其主要特点是通过直接优化其相应的策略; (2) 值导向型, 该类方法的基本思路是构建并更新相应的Q-函数模型, 每一次动作选择都是基于当前状态下的最优Q-值。值得注意的是, 在现有研究中发现这类方法往往面临较高的参数更新方差; 然而, 在实际应用中这类方法又会引入估计偏误; 因此综合以上两方面的优势与不足, 在本文中我们采用结合了两者的优势——Actor-Critic方法

3 ILLUSTRATIVE EXAMPLE

展示例子:

在这里插入图片描述

图3(a)展示了简单的Python代码示例,并通过递归函数计算整数阶乘;图3(b)呈现了该代码的抽象语法树(AST),而图3(c)则描绘了程序执行顺序的控制流程图。该代码的最佳注释(绿色)如图3(a)所示;三个关键术语(plain text, type-augmented AST, CFG)能够通过不同编码精确捕获:例如,在multiplying plain text的情况下,在integer方面应用type-augmented AST,在recursive场景中采用CFG进行表示。

在不同代码表示形式中,token和语句的排列顺序会有所差异。本文采用了纯文本、抽象语法树(AST)和控制流图(CFG)三种信息来描述代码结构。基于纯文本表示时,默认采用"def fact(i): if i == 0:"这样的书写方式;而当采用AST表示时,则构建了一个包含函数定义stmt = FunctionDef("fact", ("i",), ...)以及条件判断expr = IfExp(expr("test"), expr("body"), expr("orelse"))的数据结构;特别地,在CFG表示法中由于涉及递归调用机制的存在,在后续的token序列中会从'def'开始逐步展开相关操作体。

在图3(a)中可以看到, 该子句子s_1是由三个关键词def, fact以及i共同构成, 而整个函数则由这些五个子语句s_1s_5组成. 这种层次结构可通过一个两层注意力机制来捕捉(其中涉及tokens层与statements层), 如图4所示. 在此基础之上, 底层会对每个子句子s_i中的每一个tokenx_{it}进行编码从而得到其对应的向量, 而\alpha_i\alpha_{it}分别代表第i个子句子与其第t个token的重要程度权重.

在这里插入图片描述

本文主要运用这三种代码表示方式和HAN模型,在不同类型的token、句子序列等基础上生成相应的向量,并通过将这三个子空间中的向量进行融合处理后得到最终的代码表征形式,在这一过程中能够有效提取tokens间的相互作用与句子间的关联信息。

4 THE DRL-GUIDED CODE SUMMARIZATION VIA HIERARCHICAL ATTENTION NETWORK

通过层次注意力网络实现深度强化学习引导的代码摘要。

本文方法基于在AlphGo上得到了广泛应用的Actor-Critic网络框架,并将其划分为四个子模块,如图5所示。

  1. 用作表示程序中非结构化信息与结构化信息
  2. 一种将代码表示映射到潜在空间中的混合分层注意力机制
  3. 基于LSTM的递归神经网络用于生成序列数据
  4. 一个用于判别生成词质量的判别器网络
在这里插入图片描述

4.1 Source Code Representations

源代码表示方法中首先将代码进行分段处理,并按照指定的符号集合对程序进行分割标记。随后对所有token进行小写标准化处理,并应用Word2Vec模型提取向量特征;对于无法识别的token则将其标记为未知词进行处理以确保模型稳健运行

有以下三种代码表示:纯文本、类型增强的抽象语法树和控制流图。

4.1.1 Plain Text

纯文本

在分析代码语义时的核心观点是最基础常见的文本表达方式:注释通常来源于源代码中的语法元素,在编程开发过程中发挥着重要作用。这些注释多与具体实现细节相关联,在技术文档或系统设计文档中常见。例如函数名称、变量标识符等语法项都是编写者关注的重点内容,在实际应用中起到关键作用

4.1.2 Type-augmented Abstract Syntax Tree

类型增强的抽象语法树

本文首先通过Python语言中的AST模块提取代码结构序列。接着,在此基础上构建派生代码结构时,则需要考虑并整合额外引入的各种类型信息。具体而言,在图3(a)所示的情况下,则是通过抽象分析tokens中的类型信息,并将其整合到原有的代码结构中。例如,在图3(a)中,则是通过在变量'1'上注释'integer'类的方式,在第2行表示为'if integer i == integer 1'的形式进行处理。

总之就是对每个节点都增加了类型信息。

4.1.3 Control Flow Graph

控制流图

本文构建了一种新的语法级模型来替代传统的控制流图(CFG),其中CFG上的每个节点代表由若干token构成的一条指令序列,并通过节点间的连接关系明确程序流程转移的方向

某种意义上应该跟type-augemented AST一样,作为AST的一种补充。

4.2 Hybrid Hierarchical Attention Network

每个代码部分都对生成注释均有独特的贡献。然而,在程序运行过程中,
token与语句的高度依赖于上下文因素,
即同一个token或语句在不同上下文中可能具有不同的重要性程度。
基于此,
在NLP领域中已取得显著成效的Hierarchical Attention Network(HAN)
自然延伸至代码表示领域中,
赋予每个单个token和函数级结构单元赋予权重(attention weight)。
这种权重分配机制不仅能显著提升性能水平,
并且还能深入分析tokens/Stmt与相应摘要之间的关联性,
从而有利于生成高质量的注释内容。

本文基于两层注意力机制(一个基于单词级别的层和一个基于句子级别的层),如图5(b)所示。该系统架构包含四个关键模块:单词级别编码器模块、单词级别注意力机制、句子级别编码器模块以及句子级别注意力机制。

在这里插入图片描述

基于d^{TXT}d^{AST}d^{CFG}分别代表经过编码处理后的纯文本、语法树(Abstract Syntax Tree)以及控制流图(Control Flow Graph)这三个代码表示形式的数据向量,在构建模型时将这些特征信息整合到同一个综合向量d中以反映代码的整体特性。具体架构如下:

该系统采用了一种先进的token编码机制来进行文本处理,在每个输入语句s_i中包含了若干个离散化的信息单元——具体来说是x_{i0}, x_{i1}, ..., x_{iT_i-1}这些具体的编码元素。研究者通过构建了一个嵌入矩阵W_i来进行这些离散信息单元的量化表示,并利用长短期记忆网络(LSTM)模型对这些编码元素进行序列化处理:首先将每个原始输入序列中的每一个位置上的编码元素依次映射到词向量空间中;随后通过LSTM模型对整个序列进行遍历处理,在此过程中动态地提取出各位置上的关键特征信息;最后通过这种多级化的特征提取流程生成了完整的注释描述内容

v_{it}=W_{i}x_{it},t∈[0,T_i)

h_{it}=lstm(v_{it}),t∈[0,T_I)

在自然语言处理中,在自然语言处理中token的关注度并不是均等的,在自然语言处理中

在这里插入图片描述

通过引入注意力机制来识别关键性token,并将其整合成一个语句向量。

u_{it}=tanh(W_xh_{it}+b_x)

\alpha_{it}=\frac {exp(u^T_{it}u_x)}{\sum_Texp(u^T_{it}u_x)}

s_i=\sum_T\alpha_{it}h_{it}

\alpha_i代表了语句s_i中tokenx_{it}对注意力机制的贡献,在此模型中被定义为一个权重系数。该上下文向量基于每个token构建了更高级别的语义表达模式。

在摘要任务中对相关函数在语义上更加重要的语句被给予额外奖励时

u_{i}=tanh(W_sh_{i}+b_s)

\alpha_{i}=\frac {exp(u^T_{i}u_s)}{\sum_Lexp(u^T_{i}u_s)}

d^c=\sum_L\alpha_{i}h_{i}

\alpha_i表示语句s_i对于最终向量d^c的贡献(attention)

Hybrid Representation of Source Code

4.3 Text Generation

文本生成

在这里插入图片描述

通过HAN获取的一组代码片段被用来生成最终注释,在此方案中采用了层次化的多维度输入结构,并从而引入了基于输入前馈注意机制的方法来预测第t个单词的位置;其中符号p_\pi代表由行动者网络所决定的一个策略\pi;而p_{\pi}(y_t|s_t)则具体指出了在状态s_t下生成第t个单词的概率分布情况。

p_{\pi}(y_t|s_t)=softmax(W_s\widetilde s_t+b_s )

4.4 Critic Network

传统的编码器-解码器架构依赖于参考翻译来进行后续词项的预测(Teacher Forcing机制)。而在强化学习场景下,则通过反复优化目标函数来生成注释(如BLEU分数)。本文引入了critic网络来进行时间t步动作价值的估计,并基于此进行反馈调节以迭代优化模型参数。与actor网络不同的是,在解码阶段critic网络仅返回单一标量评估值而非概率分布预测。

基于生成的注释信息以及奖励函数r的基础上,我们建立一个价值函数V来用于推算该时刻状态s_t累计后的总奖励。

在这里插入图片描述

借助于奖励机制,在完成注释序列生成之后会产生一个评价分数(如BLEU)。需要注意的是,在达到最大步数T或者生成了终止标记(EOS)的情况下,则会停止这个过程。具体而言,基于BLEU的奖励机制可以用以下公式表示:

在这里插入图片描述
在这里插入图片描述

c是生成的注释,c'是ground truth。

4.5 Model Training

以actor网络为基础设计系统架构时,旨在最小化负期望奖励;同时通过概率估计的方法实现模型训练。具体而言,在马尔可夫决策过程中(MDP),我们希望最大化累积奖励的期望值,并将其转化为最小化负期望奖励的问题来进行求解。具体而言,在马尔可夫决策过程中(MDP),我们希望最大化累积奖励的期望值,并将其转化为最小化负期望奖励的问题来进行求解。将生成注释的概率作为策略函数的基础,并采用概率估计的方法实现模型训练

该方法旨在最小化以下损失函数:对于critic网络参数\phi来说,
损失函数定义为L(\phi)=\frac{1}{2}\parallel V(s_t)-V_{\phi}(s_t)\parallel^2
其中V(s_t)基于真实值计算得出,
V_{\phi}(s_t)则是通过critic网络利用生成的标注信息并结合参数\phi
所预测的估计值。当L(\phi)收敛时,
我们便认为模型训练已完成。

agent的参数\theta和evaluator的参数\phi的所有参数被表示为\Theta=\{\theta,\phi\} 总体损失函数表示为L(\Theta)=L(\theta)+L(\phi)

5 EXPERIMENTS AND ANALYSIS

5.1 Dataset Preparation

采用了先前研究中名为"Improving automatic source code summarization via deep reinforcement learning"的研究数据。该研究提供了包含108,000份代码-注释配对的数据集合。这些配对涉及两个词汇表:一个为5万零四百词的代码术语集合和另一个为三万一千三百五十词的注释术语集合。其中8成用于训练与验证(通过采用1十折交叉验证实现)。剩下的2成则用于测试

JAVA :基于“Deep code comment generation with hybrid lexical and syntactical information”这一研究中的Java项目数据集对本文方法的跨语言性能进行评估。具体而言,在deepcom项目的原始数据集中按照自上而下的顺序选取与本文Python版本相当数量的数据样本用于训练、验证及测试。

基于多个公开可用的GitHub项目对本文所采用的标准Python数据集进行了统计分析。图7展示了该数据集中代码与注释的具体长度分布情况:其中大部分代码片段长度集中于10至80个token区间内(即每个代码片段通常包含10至80个tokens),而所有注释基本上都在5至40个token左右(即每个注释通常包含5至40个tokens)。此外,在图8中可以看出,在该数据集中所收集到的各种代码片段中,每个语句平均包含1至15个tokens(即一个语句通常由1至15个tokens构成),而每个函数则通常包含2至25个语句(即一个函数内部一般有2至25个不同的语句)。

在这里插入图片描述

5.2 Evaluation Metrics

本文涉及三个在NLP领域广泛使用的评估指标:BLEU、METEOR、ROUGE-L。

BLEU

BLEU=exp(\frac {1} {N} * \sum_{i=1}^N logp_n)

p_n=\frac {\sum_{n-gram\in c}count(n-gram)} {\sum_{n-gram'\in c'}count(n-gram')}

其中c代表生成的注释样本,而c'则表示对应的参考标注。本文探讨了针对文本生成系统的性能评估方法,并拓展了现有的BLEU指标体系。具体而言,在方法层面提出了sentence-level BLEU(S-BLEUB),旨在衡量单个生成文本与参考文本之间的匹配程度;在体系层面则开发了corpus-level BLEUB(C-BLEUB),用于评估大规模文档集合的整体质量。值得注意的是,在计算SB-LEUB时采用了逐样本比较的方式。对于C-BLEUB而言,则是对整个文档集合进行整体评价。

METEOR

METEOR=(1-Pen)F_{mean}

Pen=\gamma (\frac{ch}{m})^\theta F_{mean}=\frac {P_m R_m}{\alpha P_m +(1-\alpha)R_m}

ROUGE-L

ROUGE-L分数计算方法如下:首先分别对样本集中的每个样本S以及每个生成的摘要gram-l进行处理。在分子部分,则是对满足匹配条件的所有gram-l进行累加;而在分母部分,则是对所有 gram-l 进行累加。

其中 l 代表token的数量,在计算生成注释中匹配的n-gram时,我们采用 Count_{match}(gram_l) 来表示其最大数量。

RQ1:我们的方法在生成注释上的有效性?不同代码表示配置的结果如何?

TXT represents plain text, AST stands for abstract syntax tree, CFG denotes a flowchart for control flow, HAN is a hierarchical attention mechanism, and DRL refers to deep reinforcement learning (DRL).

在这里插入图片描述

RQ2:不同training epochs的时间消耗和性能趋势?

表5:不同代码表示的时间消耗

在这里插入图片描述

图9:epochs的增加对性能影响

在这里插入图片描述

RQ3:我们的方法在代码或注释长度不同的数据集上表现如何?

在对比实验中作为基准的方法是仅依赖单一代码表示的强化学习模型:TXT\AST\CFG格式。相比只拥有一个特性的模型而言,在TXT&AST、TXT&CFG以及AST&CFG这三种两两组合的情况下表现更为优异。我们采用所有三个关键特征以期达到最佳性能水平。

图10:不同代码长度下的性能

在这里插入图片描述

图11:不同注释长度下的性能

在这里插入图片描述

RQ4:与其他方法相比性能如何?

优于此前的研究

在这里插入图片描述

RQ5:除了NLP指标,如何广泛地评估我们的方法?

涵盖案例研究与用户行为分析(人工评估)

全部评论 (0)

还没有任何评论哟~