论文翻译1——基于图的程序表示

基于图的程序表示

Miltiadis Allamanis1  Marc Brockschmidt2  Mahmoud Khademi3

(1:微软研究院 剑桥大学 miallama@microsoft.com)

(2:微软研究院 剑桥大学mabrocks@microsoft.com )

(3:西蒙弗雷泽大学mkhademi@sfu.ca )

摘要

最近关于源代码(即正式语言)的学习任务收到了一定关注,但是大多数的工作试图转换自然语言方法,并且没有利用代码已知的语义。例如,通常不考虑通过在远处位置使用相同的变量或函数而引起的长程依赖性。我们建议使用图来表示代码的语法和语义结构,并使用基于图的深度学习方法来学习对如何程序结构进行推理。

在这项工作中,我们介绍了如何从源代码构建图以及如何将门控图神经网络训练扩展到大规模图。我们在两个任务上评估我们的方法:VARNAMING,门控图神经网络尝试根据其使用情况预测变量的名称;以及VARMISUSE,门控图神经网络学会推理选择应该在给定程序位置使用的正确变量。与使用较少结构程序表示的方法的比较结果显示了对已知结构建模的优势,并表明我们的模型在许多情况下可以学会推断有意义的名称并解决VARMISUSE任务。此外,我们的测试表明,VARMISUSE可以识别出成熟开源项目中的许多错误。

 

1、简介

大型源代码库以及可扩展的机器学习方法的出现自然导致了“大代码”的概念,即大多数无监督的方法,通过以下方式支持软件工程师从现有源代码推广(Allamanis等,2017)。目前,现有的源代码深度学习模型可以捕获其浅层的文本结构,例如,作为一系列令牌(Hindle等,2012; Raychev等,2014; Allamanis等,2016),作为解析树(Maddison&Tarlow,2014; Bielik等,2016),或作为一个单位变量的依赖网络(Raychev等,2015)。这些模型错过了利用丰富且定义明确的源代码语义的机会。在这项工作中,我们采取通过在源代码中包含两个额外的信号源的措施来缓解这一问题:数据流和类型层次结构。我们通过将程序编码为图来实现这一点,其中边表示句法关系(例如“之前/之后的令牌”)以及语义关系(“此处最后使用/写入的变量”,“参数的形式参数称为流”等))。我们的主要观点是,将这些语义明确地作为机器学习模型的结构化输入,可以减少对训练数据、模型能力和训练机制的要求,并使我们能够解决超出当前技术水平的任务。

我们通过两个任务来说明使用更多语义结构的优点。首先,我们考虑VARNAMING任务(Allamanis等,2014; Raychev等,2015),其中给出一些源代码,“正确”变量名称被推断为一系列令牌。这需要对如何使用变量有所了解,

即需要推断源文件中相距很远的代码行。其次,我们介绍了变量误用预测任务(VARMISUSE),其中门控图神经网络旨在推断应该在程序位置使用哪个变量。为了说明这个任务,图1显示了我们的模型在一个流行的开源项目中检测到的错误的略微简化的片段。比如说,首先应该在黄色突出显示的槽中使用变量first而不是变量clazz。现有的静态分析方法无法检测到这些问题,即使软件工程师很容易将其识别为经验错误。

为了在这些任务上实现高精度结果,我们需要学习程序语义的表示。对于这两个任务,我们需要学习变量的语义角色(例如,“它是一个计数器吗?”,“它是文件名吗?”)。另外,对于VARMISUSE,需要学习变量使用语义(例如,“这里需要文件名”)。这种“填充空白元素”任务涉及用于学习自然语言单词的分布式表示的方法,例如Word2Vec(Mikolov等人,2013)和GLoVe(Pennington等人,2014)。但是,我们可以从更丰富的结构中学习,例如数据流信息。 这项工作是学习程序表示的一个步骤,我们希望它们在许多其他任务中都很有价值,例如代码完成(“这是你正在寻找的变量”)和更高级的bug查找(“你应该 在使用此对象之前锁定“)。

总而言之,我们的贡献是:

(i)我们将VARMISUSE任务定义为对源代码的机器学习建模的挑战,这需要学习(某些)程序的语义(参见第3节)。

(ii)我们提出深度学习通过对代码的图形结构进行建模以及在这些图形上学习程序表示来解决VARNAMING和VARMISUSE任务的模型(参见第4节)。

(iii)我们在290万行真实世界源代码的大型数据集上评估我们的模型,表明我们的最佳模型在VARNAMING任务上达到了32.9%的准确率,在VARMISUSE任务上达到了85.5%的准确率,击败了更简单的基线(参见第5节)。

(iv)我们通过总结我们在成熟的开源软件项目中发现的一些错误来记录VARMISUSE的实际相关性(参见5.3小节)。我们在图形神经网络的实现(在一个更简单的任务上)可以在https://github.com/Microsoft/gated-graph-neural-network-samples找到,数据集可以在https://aka.ms/找到iclr18-PROG-图表-数据集。

 

2、相关工作

我们的工作建立在最近使用机器学习源代码工件的领域(Allamanis等,2017)。例如,Hindle等(2012);与Bhoopchand等(2016)将代码建模为令牌序列,而Maddison&Tarlow(2014); Raychev等(2016)对代码的语法树结构进行了建模。 所有关于代码语言模型的工作都发现预测变量和方法标识符是任务中最大的挑战之一。

和我们工作最相似的是Allamanis等(2015)的工作,他们使用所有用法来预测变量的分布式表示来预测他们的名字。但是,他们没有使用数据流信息,我们也未发现有任何模型采用了这种方法。 Raychev等(2015)和Bichsel等(2016)使用条件随机字段来模拟变量、AST元素和类型之间的各种关系,以预测变量名称和类型(分别用于反欺骗Android应用程序),但不考虑流程明确的数据。在这些工作中,所有变量用法都是预先确定的(因为代码是完整的并且保持不变),如Allamanis等人(2014; 2015)所述。

我们的工作与使用草图(Solar-Lezama,2008)和自动代码移植(Barr等,2015)的程序合成工作有很大关系。但是,这些方法需要一组规范(例如输入输出示例,测试套件)来填补空白,而不是从大代码中学到的统计数据。这些方法可以被认为是对我们的补充,因为我们通过从代码中学习常见的变量使用模式来统计地完成差距而不需要任何规范。

图上的神经网络(Gori等,2005; Li等,2015; Defferrard等,2016; Kipf&Welling,2016; Gilmer等,2017)使各种深度学习方法适应图结构输入。它们已被用于一系列应用,例如链接预测和分类(Grover&Leskovec,2016)以及NLP中的语义角色标记(Marcheggiani&Titov,2017)。与源代码有些相关的是Wang等人(2017)的工作,他们在定理证明中学习用于前提选择的数学公式的基于图的表示。

 

3、VARMISUSE任务

检测代码中的变量滥用是一项需要理解和推理程序语义的任务。 要成功解决任务,需要推断程序元素的作用和功能,并了解它们之间的关系。例如,给定如图1的程序,任务是自动检测所标记clazz的使用是错误的并且首先应该使用。 虽然此任务类似于标准代码完成,但它的范围和目的明显不同,它只考虑变量标识符和大部分完整的程序。

任务描述:我们将源代码文件视为令牌序列,其中一些令牌是变量。此外,让引用t位置范围内所有类型正确变量的集合,即那些可以在t处使用而不会引起编译器错误的变量。当我们想要预测一个槽的正确变量用法,我们称一个令牌。我们为每个槽tλ定义一个单独的任务:给定和,从Vtλ中正确选择tλ。出于训练和评估目的,正确的解决方案是简单地匹配基础事实的解决方案,但请注意,在实践中,可以认为几个可能的分配是正确的(即,当几个变量在存储器中引用相同的值时)。

 

4、模型:将程序转变为图

在本节中,我们将讨论如何将程序源代码转换为程序图并学习它们的表示。这些程序图不仅编码程序文本,还编码可以使用标准编译器工具获得的语义信息。

门控图神经网络:我们的工作建立在门控图神经网络(Li et al,2015)(GGNN)之上,我们在此总结它们。图由一组节点V,节点特征X和有向边集的列表组成,其中K是边类型的数量。我们用表示节点特征的实值向量表示每个(例如,嵌入该节点的字符串标签)。我们将每个节点v与状态向量h(v)相关联,从节点标签x(v)初始化。状态向量和特征向量的大小通常相同,但我们可以通过填充节点特征来使用更大的状态向量。为了在整个图中传播信息,将类型为k的“消息”从每个v发送到其邻居,其中每个消息从其当前状态向量计算为。这里,fk可以是任意函数;在我们的例子中我们选择一个线性层。通过同时计算所有图形边缘的消息,可以同时更新所有状态。具体地,通过将所有传入消息聚合为来计算节点v的新状态。 g是一个聚合函数,我们将其实现为元素求和。给定聚合消息m(v)和节点v的当前状态向量h(v),下一时间步h0(v)的状态计算为,其中GRU是门控复发单位(GRU)的复发细胞功能(Cho等,2014)。由上述等式定义的动力学重复固定数量的时间步长。然后,我们使用上一个时间步的状态向量作为节点表示。

程序图结构: 我们将程序源代码表示为图,并使用不同的边缘类型来模拟不同标记之间的语法和语义关系。程序图的主干是程序的抽象语法树(AST),由语法节点(对应于编程语言语法中的非终结符)和语法标记(对应于终端)组成。我们标记语法节点的名称为非终结符程序的语法,而语法标记用它们代表的字符串标记。我们使用Child边根据AST连接节点。由于这不会导致语法节点的子节点上的顺序,我们还添加了将每个语法标记连接到其后继节点的NextToken边。如图2a所

为了通过程序捕获控制和数据流,我们添加了连接不同用途的附加边以及与变量对应的语法标记的更新。对于这样的令牌v,让DR(v)成为最后可以使用该变量的语法令牌集。该集合可能包含多个节点(例如,在两个分支中使用条件之后使用变量时),甚至包含程序代码中的语法标记(在循环的情况下)。类似地,让DW(v)成为最后写入变量的语法标记集。使用这些,我们添加LastRead(resp.LastWrite)边连接v到DR(v)的所有元素(resp.DW(v))。另外,每当我们观察赋值v = expr时,我们将v连接到使用ComputedFrom边在expr中出现的所有变量标记。这种语义边缘的一个例子如图2b所示。

我们扩展图结构以使用LastLexicalUse边连接相同变量的所有用法(独立于数据流,即if(...){... v ...} else {... v ...},我们链接了两次出现的v)。我们还使用ReturnsTo边将返回标记连接到方法声明(这会创建其名称和类型的“快捷方式”)。受Rice等人(2017)的启发,我们将方法调用中的参数连接到与FormalArgName边匹配的形式参数,即,如果我们观察到调用Foo(bar)和方法声明Foo(InputStream流),我们将bar标记连接到流令牌。最后,我们将对应于变量的每个标记连接到使用带有GuardedBy和GuardedByNegation边的变量的封闭保护表达式。例如,在if(x> y){... x ...} else {... y ...}中,我们将一个GuardedBy边从x(从y开始的一个GuardedByNegation边)添加到AST节点对应于x> y。

最后,对于所有类型的边,我们引入它们各自的向后边(转置邻接矩阵),使边和边类型的数量加倍。向后边有助于在GGNN中更快地传播信息,并使模型更具表现力。

利用可变类型信息: 我们假设一种静态类型语言,并且可以编译源代码,因此每个变量都有一个(已知的)类型τ(v)。为了使用它,我们为已知类型定义可学习嵌入函数r(τ),并为所有未知/未表示类型定义“UNKTYPE”。我们还利用许多面向对象语言中提供的丰富类型层次结构。为此,我们将变量的类型τ(v)映射到其超类型的集合,即。然后,我们计算变量v的类型表示r *(v)作为fr(τ)的元素最大值:。我们在这里选择了最大值,因为它是表示偏序关系(例如类型格)的自然池操作。使用τ*(v)中的所有类型允许我们概括为实现常见超类型或接口的看不见的类型。例如,List <K>有多种具体类型(例如List <int>,List <string>)。然而,这些类型实现了一个通用接口(IList)并具有共同的特征。在训练期间,我们随机选择τ*(v)的非空子集,其确保训练格子中的所有已知类型。这既像一个辍学机制,也允许我们学习类型点阵中所有类型的良好表示。

初始节点表示:为了计算初始节点状态,我们组合来自令牌的文本表示及其类型的信息。 具体地说,我们在camelCase和pascal_case上将表示标记的节点的名称拆分为子字符。例如,classTypes将被拆分为两个子类类和类型)。然后,我们对所有子记录的嵌入进行平均处理来检索节点名称的嵌入。最后,我们将如前所述计算的学习类型表示r *(v)与节点名称表示相连接,并将其传递给线性层以获得图中每个节点的初始表示。

VARNAMING的程序图:给定一个程序和一个现有变量v,我们构建一个如上所述的程序图,然后用一个特殊的<SLOT>标记替换所有相应变量标记中的变量名。为了预测名称,我们使用初始节点标签计算为可学习令牌嵌入和类型嵌入的串联,如上所述,运行GGNN传播8个时间步2,然后通过平均所有<SLOT>标记的表示来计算变量使用表示。 然后将该表示用作初始状态单层GRU,其将目标名称预测为子序列序列(例如,名称inputStreamBuffer被视为序列[输入,流,缓冲])。 我们使用最大似然目标训练这个graph2seq架构。 在第5节中,我们报告了预测确切名称的准确性和预测其子字母的F1分数。

VARMISUSE的程序图:要使用程序图模拟VARMISUSE,我们需要修改图结构。首先,为了计算我们想要预测所使用变量的槽t的上下文表示c(t),我们在t的位置插入一个新节点v <SLOT>,对应于此处的“hole”,并且 使用所有适用的边将其连接到剩余的图,这些边不依赖于插槽中选择的变量(即除了LastUse,LastWrite,LastLexicalUse和GuardedBy边缘之外的所有边缘)。然后,为了计算目标时隙中每个候选变量v的使用表示u(t; v),我们为Vt中的所有v插入“候选”节点vt; v,并通过插入LastUse将其连接到图,如果要在此插槽中使用该变量,将使用LastWrite和LastLexicalUse边。这些候选节点都表示变量在范围内的推测位置。

使用初始节点表示,与为候选节点vt, v设置为1的额外位连接,我们运行GGNN传播8个时间步2。然后,上下文和使用表示是节点的最终节点状态,即 ,。 最后,该位置的正确变量用法计算为其中W是使用c(t)和u(t, v)的串联的线性层。我们使用最大余量目标进行培训。

4.1实施

将GGNN应用于大量不同的图需要一些工程支持,因为在多种形状的情况下有效的批处理是很难的。一个重要的现象是大图通常非常稀疏,因此将边表示为邻接列表通常可以减少存储器消耗。在我们的例子中,这可以使用稀疏张量表示轻松实现,允许大批量大小有效利用现代GPU的并行性。第二个关键的见解是将一批图表示为具有许多断开组件的一个大图。这仅需要适当的预处理以使节点标识唯一。由于这使得批处理构造有点CPU密集,我们发现在单独的线程上准备小批量是有用的。我们的TensorFlow(Abadi等,2016)在训练期间每秒可以扩展到55个图形,在测试时间内每秒可以扩展219个图形,使用单个NVidia GeForce GTX Titan X,图形平均为2,228(中位数936)节点和8,350(中值3,274)边和8个GGNN展开迭代,所有20种边类型(10种原始边类型的前向和后向边)和隐藏层的大小设置为64。GGNN中边类型的数量与运行成比例时间。例如,仅使用两种最常见的边类型(NextToken,Child)进行消融研究的GGNN在训练期间获得105图/秒,在测试时使用相同的超参数获得419图/秒。我们(通用)实施GGNNs可以通过https://github.com/Microsoft/gated-graph neural-network-samples获得,使用更简单的演示任务。

 

5、评估

数据集:我们从GitHub上的开源C#项目收集了VARMISUSE任务的数据集。我们选择了GitHub中的顶级(nonfork)项目。然后,我们使用Roslyn3过滤掉了我们无法(轻松)完全编译的项目,因为我们需要编译来提取代码的精确类型信息(包括外部库中存在的那些类型)。我们的最终数据集包含来自不同域(编译器,数据库,...)的29个项目,其中包含大约290万个非空行代码。附录D中显示了一个完整的表格。

对于检测变量滥用的任务,我们通过选择所有变量使用位置,过滤掉变量声明来收集所有项目中的数据,其中至少有一个其他类型兼容的替换变量在范围内。然后,任务是推断最初存在于该位置的正确变量。因此,通过构造,存在至少一个类型校正的替换变量,即,在类型检查期间拾取它不会引起错误。 在我们的测试数据集中,每个时隙平均有3.8个类型正确的替代变量(中位数3,σ= 2:6)。

从数据集中,我们选择了两个项目作为我们的开发集。从其他项目中,我们为UNSEENPROJTEST选择了三个项目,以允许对结构和类型完全未知的项目进行测试。 我们将剩下的23个项目分成60-10-30比例的训练/验证/测试集,沿文件分割(即,来自一个源文件的所有示例都在同一组中)。我们将测试集称为SEENPROJTEST。

Baselines:对于VARMISUSE,我们考虑两个基于RNN的双向基线。本地模型(LOC)是在目标位置之前和之后的令牌上运行的简单双层双向GRU。对于该基线,c(t)被设置为由RNN计算的时隙表示,以及每个的使用上下文。变量u(t; v)是嵌入变量的名称和类型,其计算方式与GGNN中的初始节点标签相同。此基线允许我们评估使用上下文信息对此任务的重要程度。平坦数据流模型(AVGBIRNN)是LOC的扩展,其中使用表示u(t; v)是使用在每次使用之前/之后在令牌上运行的另一个双层双向RNN来计算的,然后在计算的表示上求平均值。变量标记v。本地上下文c(t)与LOC相同。AVGBIRNN是一个非常强大的基线,已经考虑了一些结构信息,因为对所有变量使用的平均有助于长程依赖。两种模型都选择最大化变量。

对于VARNAMING,我们用AVGLBL替换LOC,它使用每个变量用法的4个左和4个右上下文标记的对数双线性模型,然后对这些上下文表示进行平均(这对应于Allamanis等人的模型(2015)))。 我们还在VARNAMING上测试AVGBIRNN,它实际上用双向RNN替换了对数双线性上下文模型。

 

5.1定量评估

表1显示了两个任务模型的评估结果.由于LOC捕获的信息非常少,因此执行起来相对较差。AVGLBL和AVGBIRNN从许多变量使用站点捕获信息,但没有明确编码问题的丰富结构,仍然大大落后于GGNN。VARMISUSE的性能差异较大,因为代码的结构和语义在此设置中更为重要。

新项目推广:对具有不同域的各种源代码项目进行概括是机器学习中的重要挑战。 我们使用UNSEENPROJTEST集重复评估,该集源自训练集中没有文件的项目。表1的右侧显示我们的模型仍然取得了良好的性能,尽管与SEENPROJTEST相比略低。这个结果是在意料之中的,因为在UNSEENPROJTEST中,类型晶格大多是未知的。

我们认为将训练模型应用于未知项目(即域)的主要问题是其类型层次是未知的并且所使用的词汇(例如,变量,方法和类名等)可能是显著不同的。

消融研究:为了研究我们模型的一些设计选择的效果,我们进行了一些额外的实验,并在表2中显示了它们的结果。首先,我们改变了程序图中使用的边。我们发现将模型限制为句法信息对两个任务的性能有很大影响,而将其限制为语义边似乎主要影响VARMISUSE的性能。类似地,ComputedFrom,FormalArgName和ReturnsTo边在VARMISUSE上提供了一个小的提升,但是大大提高了VARNAMING的性能。正如使用节点标签表示的实验所证明的那样,语法节点和令牌名称对于VARMISUSE似乎并不重要,但自然会对VARNAMING产生很大影响。

 

5.2质量评估

图3显示了GGNN对样本测试片段的预测。片段通过逐渐下降到根文件夹来递归搜索全局指令文件。关于正确变量使用的推理很难,即使对于人类也是如此,但GGNN正确地预测除了两个(第1和第8槽)之外的所有位置的变量使用。当软件工程师正在编写代码时,可以想象她可能会错误地使用一个变量代替另一个变量。由于所有变量都是字符串变量,因此不会引发类型错误。正如图3中的概率所示,模型可以标记大多数潜在的变量误用,从而向软件工程师发出有价值的警告。附录B中可以找到附加评论的样本。

此外,附录C示出了代码片段对的样本,其共享由GGNN的使用表示u(t; v)的余弦相似性计算的类似表示。读者可以注意到网络学会将可变用法分组在一起,这些用法共享语义相似性。例如,在使用变量之前检查null会在代码段之间产生类似的分布式表示(附录C中的示例1)。

5.3发现可变误用的错误

我们使用VARMISUSE模型来识别RavenDB(文档数据库)和Roslyn(Microsoft的C#编译器框架)中可能存在的错误位置。为此,我们手动审查了两个项目中前500个位置的样本,其中我们的模型对选择不同于基本事实的变量最有信心,并且在每个项目中发现了三个错误。

图 1,4,5显示了RavenDB中发现的问题。图1中的错误可能是由复制粘贴引起的,并且传统方法无法轻易捕获。编译器不会警告未使用的变量(因为它是首次使用),实际上没有人会编写测试测试另一个测试。图4说明了一个问题,尽管不是关键的,但可能导致内存消耗增加。图5说明了由非信息性错误消息引起的另一个问题。我们私下向Roslyn开发人员报告了另外三个错误,他们在此期间修复了这些问题(参见https://github.com/dotnet/roslyn/pull/23437)。使用某些Roslyn功能时,其中一个报告的错误可能会导致Visual Studio崩溃。

在广泛发布和测试的代码中发现这些问题表明我们的模型在软件开发过程中非常有用,是对经典程序分析工具的补充。例如,一种使用场景是将代码审查过程引导到VARMISUSE模型已识别为异常的位置,或将其用作焦点测试之前或昂贵的代码分析工作。

6、讨论与结论

尽管源代码在其他学科(如编程语言研究)中得到了很好的理解和研究,但它是深度学习的一个相对较新的领域。与文本或感知数据相比,它提供了新的机会,因为它的(本地)语义是明确定义的,并且可以使用众所周知的有效程序分析来提取丰富的附加信息。另一方面,整合这些丰富的结构化信息是一项有趣的挑战。我们的VARMISUSE任务揭示了这些机会,超越了诸如代码完成之类的简单任务。我们认为它是学习源代码含义的核心挑战的第一代理,因为它需要概率地改进类型系统中包含的标准信息。

参考文献

Martín Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg S Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, et al. Tensorflow: Large-scale machine learning on heterogeneous distributed systems. arXiv preprint arXiv:1603.04467, 2016.

Miltiadis Allamanis, Earl T Barr, Christian Bird, and Charles Sutton. Learning natural coding conventions. In Foundations of Software Engineering (FSE), 2014.

Miltiadis Allamanis, Earl T Barr, Christian Bird, and Charles Sutton. Suggesting accurate method and class names. In Foundations of Software Engineering (FSE), 2015.

Miltiadis Allamanis, Hao Peng, and Charles Sutton. A convolutional attention network for extreme summarization of source code. In International Conference on Machine Learning (ICML), pp.2091–2100, 2016.

Miltiadis Allamanis, Earl T Barr, Premkumar Devanbu, and Charles Sutton. A survey of machine learning for big code and naturalness. arXiv preprint arXiv:1709.06182, 2017.

Earl T Barr, Mark Harman, Yue Jia, Alexandru Marginean, and Justyna Petke. Automated software transplantation. In International Symposium on Software Testing and Analysis (ISSTA), 2015.

Al Bessey, Ken Block, Ben Chelf, Andy Chou, Bryan Fulton, Seth Hallem, Charles Henri-Gros, Asya Kamsky, Scott McPeak, and Dawson Engler. A few billion lines of code later: using static analysis to find bugs in the real world. Communications of the ACM, 53(2):66–75, 2010.

Avishkar Bhoopchand, Tim Rocktäschel, Earl Barr, and Sebastian Riedel. Learning Python code suggestion with a sparse pointer network. arXiv preprint arXiv:1611.08307, 2016.

Benjamin Bichsel, Veselin Raychev, Petar Tsankov, and Martin Vechev. Statistical deobfuscation of android applications. In Conference on Computer and Communications Security (CCS), 2016.

Pavol Bielik, Veselin Raychev, and Martin Vechev. PHOG: probabilistic model for code. In International Conference on Machine Learning (ICML), 2016.

Kyunghyun Cho, Bart van Merriënboer, Dzmitry Bahdanau, and Yoshua Bengio. On the properties of neural machine translation: Encoder–decoder approaches. Syntax, Semantics and Structure in Statistical Translation, 2014.

Michaël Defferrard, Xavier Bresson, and Pierre Vandergheynst. Convolutional neural networks on graphs with fast localized spectral filtering. In Neural Information Processing Systems (NIPS), pp.3844–3852, 2016.

Justin Gilmer, Samuel S. Schoenholz, Patrick F. Riley, Oriol Vinyals, and George E. Dahl. Neural message passing for quantum chemistry. arXiv preprint arXiv:1704.01212, 2017.

Marco Gori, Gabriele Monfardini, and Franco Scarselli. A new model for learning in graph domains.In IEEE International Joint Conference Neural Networks (IJCNN). IEEE, 2005.

Aditya Grover and Jure Leskovec. node2vec: Scalable feature learning for networks. In International Conference on Knowledge Discovery and Data Mining (SIGKDD), pp. 855–864. ACM, 2016.

Abram Hindle, Earl T Barr, Zhendong Su, Mark Gabel, and Premkumar Devanbu. On the naturalness of software. In International Conference on Software Engineering (ICSE), 2012.

Thomas N Kipf and Max Welling. Semi-supervised classification with graph convolutional networks.arXiv preprint arXiv:1609.02907, 2016.

Yujia Li, Daniel Tarlow, Marc Brockschmidt, and Richard Zemel. Gated graph sequence neural networks. In International Conference on Learning Representations (ICLR), 2015.

Chris J Maddison and Daniel Tarlow. Structured generative models of natural source code. In International Conference on Machine Learning (ICML), 2014.

Diego Marcheggiani and Ivan Titov. Encoding sentences with graph convolutional networks for semantic role labeling. In ACL, 2017.

Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg S Corrado, and Jeff Dean. Distributed representations of words and phrases and their compositionality. In Neural Information Processing Systems (NIPS),2013.

Jeffrey Pennington, Richard Socher, and Christopher D Manning. GloVe: Global vectors for word representation. In EMNLP, 2014.

Veselin Raychev, Martin Vechev, and Eran Yahav. Code completion with statistical language models.In Programming Languages Design and Implementation (PLDI), pp. 419–428, 2014.

Veselin Raychev, Martin Vechev, and Andreas Krause. Predicting program properties from Big Code.In Principles of Programming Languages (POPL), 2015.

Veselin Raychev, Pavol Bielik, and Martin Vechev. Probabilistic model for code with decision trees.In Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA), 2016.

Andrew Rice, Edward Aftandilian, Ciera Jaspan, Emily Johnston, Michael Pradel, and Yulissa Arroyo-Paredes. Detecting argument selection defects. Proceedings of the ACM on Programming Languages, 1(OOPSLA):104, 2017.

Michael Schlichtkrull, Thomas N. Kipf, Peter Bloem, Rianne van den Berg, Ivan Titov, and Max Welling. Modeling relational data with graph convolutional network. arXiv preprint arXiv:1703.06103, 2017.

Armando Solar-Lezama. Program synthesis by sketching. University of California, Berkeley, 2008.

Mingzhe Wang, Yihe Tang, Jian Wang, and Jia Deng. Premise selection for theorem proving by deep graph embedding. In Advances in Neural Information Processing Systems, pp. 2783–2793, 2017.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值