一种基于栈增强LSTM的程序表示方法与流程

文档序号:17317251发布日期:2019-04-05 21:20阅读:192来源:国知局
一种基于栈增强LSTM的程序表示方法与流程

本发明涉及计算机软件工程技术领域,尤其是涉及一种基于栈增强lstm的程序表示方法。



背景技术:

最近几年,学习表示程序语言成为研究热门。统计语言模型,最开始被设计用于自然语言,如今也广泛用于程序语言之中。但是,与自然语言不同,程序语言包含明确和等级分明的结构信息,因此很难使用统计语言模型学习程序语言。



技术实现要素:

为解决以上问题,在本发明中,为了表示这种信息,通过向标准lstm中加入一个栈作为记忆组件,以提取程序的等级结构特征,本发明强化长短期记忆网络(lstm)以用于对程序语言建模。本发明通过三个程序分析任务,验证了本发明模型的有效性。这三个程序分析任务包括代码补全、程序分类、和代码概要生成。

具体的,本发明提供了一种基于栈增强lstm的程序表示方法,

所述栈增强lstm包括一个栈,所述栈增强lstm开始访问所述程序,将所述栈增强lstm的隐藏状态压入所述栈中;

读取所述程序的代码块中所有的字符;

返回所述栈顶部的隐藏状态;

结合所述栈顶部的隐藏状态和前一个时间步的隐藏状态以得到所述程序的语境信息;

基于所述语境信息表示所述程序。

优选的,所述隐藏状态随着所述栈增强lstm的单元函数的更新而更新。

优选的,所述栈顶的隐藏状态表示所述代码块之前一段前序代码的信息。

优选的,当前时间步的输入向量和所述语境信息作为所述单元函数的输入以更新所述隐藏状态。

优选的,所述结合所述栈顶部的隐藏状态和前一个时间步的隐藏状态以得到所述程序的语境信息的方式为:

hcontext=fc(concat(hbegin,ht-1))

其中,hcontext为所述程序的语境信息,hbegin为所述栈顶部的隐藏状态,ht-1为前一个时间步的隐藏状态;即,将hbegin和ht-1关联为一个新的向量,然后将所述向量输入到一个完全连接层。

优选的,所述结合所述栈顶部的隐藏状态和前一个时间步的隐藏状态以得到所述程序的语境信息的方式为在hbegin和ht-1之间做最大池化:

hcontext=maxpooling(hbegin,ht-1)

其中,hcontext为所述程序的语境信息,hbegin为所述栈顶部的隐藏状态,ht-1为前一个时间步的隐藏状态。

优选的,所述结合所述栈顶部的隐藏状态和前一个时间步的隐藏状态以得到所述程序的语境信息的方式为:

hconext=cell(ht-1,hbegin)

其中,hcontext为所述程序的语境信息,hbegin为所述栈顶部的隐藏状态,ht-1为前一个时间步的隐藏状态;即,将前一个时间步的隐藏状态作为一个新的输入向量,然后将当前状态设为hbegin,随后执行单元函数以得到hcontext,cell是所述lstm的隐藏状态更新函数。

根据本发明的另一个方面,还提供了一种代码补全方法,应用上述的基于栈增强lstm的程序表示方法进行代码补全。

根据本发明的另一个方面,还提供了一种程序分类方法,应用上述的基于栈增强lstm的程序表示方法进行程序分类。

根据本发明的另一个方面,还提供了一种代码概要生成方法,应用上述的基于栈增强lstm的程序表示方法进行代码概要生成。

本发明的优点在于:本发明的模型在所有三个程序分析任务中的表现都要优于传统的标准lstm,这表明通过栈捕获程序的等级结构信息,能够帮助模型更加准确的表示程序语言。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1为程序的抽象语法树模型示意图。

图2为本发明基于栈增强lstm的程序表示方法原理图。

图3为本发明基于栈增强lstm的程序表示算法流程图。

具体实施方式

下面将参照附图更详细地描述本发明的示例性实施方式。虽然附图中显示了本发明的示例性实施方式,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。

本发明提供了一种语言模型,基于栈增强的lstm学习程序。使用栈作为一个记忆单元的递归神经网络(rnn)能够捕获数据序列中的更多信息,因此能够提高网络性能。通过向标准lstm中加入一个栈作为记忆组件,以提取程序的等级结构特征,本发明强化长短期记忆网络(lstm)以用于对程序语言建模。该栈用于动态存储和恢复重要信息,从而帮助网络更加关注重要的语境信息,发现源代码的等级结构属性。

在lstm中,隐藏状态很难记忆所有的语境相关信息,尤其是对于很长的语段来说更是如此。因此,重要的语境信息可能在更新隐藏状态的过程中被覆盖掉而损失。更进一步的,lstm缺乏捕获数据结构信息的能力。为了克服lstm的这些缺陷,本发明提出了一种基于栈增强(stackaugment)lstm(sa-lstm)的程序表示方法。

图1为常见的程序的抽象语法树模型示意图。图中的箭头表明了节点的运算顺序。我们可以沿着箭头的指引方向访问树以得到输入字符。

图2为本发明基于栈增强lstm的程序表示方法原理图。图中,圆圈表示不同时间步(timestep)的隐藏单元。该模型在每个时间步都读取一个输入字符。隐藏单元的背景图案与图1中的抽象语法树模型中的节点相对应,这意味着抽象语法树中的节点是具有相同背景图案的隐藏单元的输入。我们使用栈(stack)来记录输入的重要信息。栈内存主要具有两个操作:

push(压栈操作):将当前隐藏状态ht压入栈内。

pop(出栈操作):返回并删除所述栈顶部的元素。

由于隐藏状态表示了输入数据的信息,对隐藏状态的压栈和出栈操作使得sa-lstm能够在学习的过程中动态存储和恢复语境信息。如此,本发明的模型能够发现程序的结构属性。

图1中,抽象语法树的每个非叶节点表示了一个代码块的类型。

如图3所示,为本发明的sa-lstm算法流程图。我们使用vstart和vend表示代码块的开始和结束符号,例如“{”和“}”。包括下面三种情况:

(1)算法的第3-5行:输入字符是“{”,也就是说,sa-lstm模型访问一个非叶节点,并准备学习一个新代码块,我们将隐藏状态压入栈中。然后所述隐藏状态随着lstm的单元函数而更新。

(2)算法的第6-9行:输入字符是“}”,也就是说,模型已经读取了代码块中所有的字符并且到达了它的最后,我们对栈取出栈操作以得到隐藏状态hbegin,所述隐藏状态hbegin表示所述代码块之前一段前序代码的信息。然后,如图2所示,结合hbegin和ht-1以得到α函数的关键信息。hbegin是所述代码块开头产生的隐藏状态,ht-1是之前一个时间步的隐藏状态,即代码块末尾产生的隐藏状态。我们将这个有价值信息存储在hcontext中。然后我们使用在时间步t的输入向量xt和hcontext作为单元函数的输入以更新所述隐藏状态。

(3)算法的第10-11行:对于其他情况,我们仍然采用与标准lstm网络相同的步骤来更新隐藏状态。

本发明中,α函数是任意一个可训练函数,其被设计用于在网络访问一个完整代码块时提取重要的语境信息。我们可以采用不同的方法来实现α函数。本发明基于提取有价值语境信息的目的,从hbegin和ht-1提取语境信息时采用了以下α函数:

(i)hcontext=fc(concat(hbegin,ht-1))

即,将hbegin和ht-1关联为一个新的向量,然后将它输入到一个完全连接层。

(ii)hcontext=maxpooling(hbegin,ht-1)

在hbegin和ht-1之间做最大池化。

(iii)hcontext=cell(ht-1,hbegin)

前一个时间步的隐藏状态ht-1可以作为语境的“概要”。将它作为一个新的输入向量,然后将当前状态设为hbegin,随后执行单元函数以得到hcontext,cell是所述lstm的隐藏状态更新函数。

实验表明第三个α函数的效果比前两个的效果要更好。这个α函数的工作过程可以解释如下:当模型读取代码块中的所有字符以后,它就会忘记代码块的细节,就好像未看到过似的。然后有人告诉模型被忘记部分的关键信息,模型就存储这个信息到隐藏状态中,然后继续学习过程。

本发明只清除代码块末端的不相关记忆。代码块的实施细节仍然能够被模型学习,原因是模型通过优化网络参数而进行学习过程。这些参数在整个学习过程中都是共享的。这样,sa-lstm就能够学习程序中的所有字符,这个过程中隐藏状态只记住重要的语境信息。

在本发明的优选实施例中,当输入字符按顺序输入网络中时,sa-lstm网络能够动态记忆相关上下文。如此,本发明的模型能够捕获源代码的等级结构信息。进一步的隐藏状态的记忆负担能够有一定程度的减轻,从而解决了长期的依赖性问题。

实验及结果

为了展示本发明的技术效果,本发明还做了对照实验。本发明通过三个程序分析任务,验证了本发明模型的有效性。这三个程序分析任务包括代码补全、程序分类、和代码概要生成。

(1)代码补全

代码补全可以认为是一个预测任务,即给定部分上下文,预测下一个字符是什么。部分上下文的特征能够被本发明的sa-lstm模型提取。本发明采用来自开源数据库和系统的c语言代码和python代码进行实验。其中python代码来自github开源平台,选择具有超过五颗星的python项目。然后随机切分上述数据进行训练、验证、测试。结果如下:

表1

表1显示了标准lstm和本发明sa-lstm模型在预测上述c语言代码和python代码的下个终端(terminal)或非终端(non-terminal)字符时的准确率。非终端字符包含了程序的结构信息,终端字符包含了程序的语义信息。如表1所示,本发明的sa-lstm模型的预测准确率均高于传统的lstm模型。其中,对非终端字符的预测结果表明本发明的模型能够学习程序源代码的结构信息,这在代码补全任务中非常重要。对终端字符的预测结果表明本发明的模型能够学习程序源代码的语义信息。表1的结果表明,本发明在捕获程序的等级结构信息上的表现优于现有技术。

(2)程序分类

根据功能对程序进行分类在软件工程中非常重要。本发明的模型可以应用于程序分类任务中。上一个时间步的隐藏状态包含了完整程序的信息,因此本发明可以使用其作为程序分类的表达和特征。在这个任务中,本发明使用来自开源数据库和系统的c语言代码进行实验。然后随机切分上述数据进行训练、验证、测试。结果如下:

表2

表2的结果表明,采用本发明的sa-lstm模型的准确率要高于使用传统lstm模型的准确率。通过加入一个栈作为记忆组件,本发明的sa-lstm模型能够提取等级结构特征,从而帮助模型理解程序的功能,并生成更准确的程序表示。因此,本发明的模型性能更好。

(3)代码概要生成

根据源代码生成其自然语言概要,在很多软件应用例如代码搜索中非常有价值。在这个任务中有必要理解程序的结构。本发明应用提出的模型到这个任务中,并评价了本发明模型的性能。本发明采用了序列到序列架构,使用sa-lstm模型作为编码器,提供了一种更好的代码表示方法。本发明使用了三种稀疏数据集:jobs,geo,atis。这些数据集包含自然语言查询及其逻辑表示。这些逻辑表示与程序语言非常类似,两者都包括明显的等级结构。在本发明的模型中,使用sa-lstm作为编码器,标准lstm作为解码器。而对于普通lstm模型,均使用标准lstm作为编码器和解码器。并且两种模型都使用注意力机制。我们使用两层网络,隐藏单元大小是100。嵌入大小是100。采用不同词汇量用于编码器和译码器。为了训练模型,使用亚当优化,基础学习率是le-3。bleu是一种评价文本质量的自动算法。本发明使用bleu-4来评价产生的概要。结果如下:

表3

表3表明,sa-lstm的bleu得分在三个数据集上的表现都要优于只使用序列到序列的模型。这表明本发明的sa-lstm模型通过捕获程序的等级结构信息,能够更好的理解程序和提取程序概要。

需要说明的是:

在此提供的算法和显示不与任何特定计算机、虚拟装置或者其它设备固有相关。各种通用装置也可以与基于在此的示教一起使用。根据上面的描述,构造这类装置所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。

在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。

类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。

本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。

此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。

本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(dsp)来实现根据本发明实施例的虚拟机的创建装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。

应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1