CN113383316B - 用于学习程序语义的方法和设备 - Google Patents
用于学习程序语义的方法和设备 Download PDFInfo
- Publication number
- CN113383316B CN113383316B CN201980089331.8A CN201980089331A CN113383316B CN 113383316 B CN113383316 B CN 113383316B CN 201980089331 A CN201980089331 A CN 201980089331A CN 113383316 B CN113383316 B CN 113383316B
- Authority
- CN
- China
- Prior art keywords
- program
- states
- state
- execution
- computer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N20/00—Machine learning
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/044—Recurrent networks, e.g. Hopfield networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3466—Performance evaluation by tracing or monitoring
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
- G06F8/4435—Detection or removal of dead or redundant code
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Computing Systems (AREA)
- Artificial Intelligence (AREA)
- Mathematical Physics (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- Biomedical Technology (AREA)
- Molecular Biology (AREA)
- General Health & Medical Sciences (AREA)
- Biophysics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Medical Informatics (AREA)
- Machine Translation (AREA)
Abstract
公开了一种使用深度学习模型来学习程序语义的***和方法。所述方法包括接收程序的多个执行跟踪,每个执行跟踪包括多个变量值。所述多个变量值通过第一循环神经网络进行编码以针对每个执行跟踪生成多个程序状态。然后,双向循环神经网络可以从所述多个程序状态中确定每个执行跟踪的一组减少的程序状态。然后所述一组减少的程序状态通过第二循环神经网络进行编码以生成所述程序的多个执行。然后,所述方法包括池化所述多个执行以生成程序嵌入以及使用所述程序嵌入预测所述程序的语义。
Description
相关申请交叉引用
本申请是2019年1月17日提交的第62/793,500号美国临时申请的非临时申请并且要求其权益,所述非临时申请以全文引用的方式并入本文中。
背景技术
开源软件的增长趋势和机器学习技术的快速发展使“大代码”的概念具体化。这个概念正在重复使用从现有代码存储库中提取的知识以例如简化软件开发并且提高产品质量。本领域的一些早期方法主要将源代码处理成一段文本,并且应用来自自然语言处理域的现成模型(Abram Hindle、Earl T Barr、Zhendong Su、Mark Gabel和PremkumarDevanbu。关于软件的自然性,在软件工程(ICSE),2012年第34届国际会议,第837-847页,IEEE,2012年,Rahul Gupta,Soham Pal,Aditya Kanade和Shirish Shevade。深度修复:使用深度学习修复常见的c语言错误,2017年,Yewen Pu、KarthikNarasimhan、Armando Solar Lezama和Regina Barzilay。sk_p:一种用于慕课的神经程序校正器,在2016年ACMSIGPLAN***、编程、语言和应用国际会议的配套会议记录:人类软件,第39-40页,ACM,2016年),而后来的方法是用抽象句法树(AST)建模程序(Chris Maddison和Daniel Tarlow。自然源代码的结构化生成模型,《机器学习国际会议》,第649-657页,2014年,Pavol Bielik、Veselin Raychev和MartinVechev.Phog:代码的概率模型。《国际机器学习会议》,第2933-2942页,2016年,Lili Mou、Ge Li、Lu Zhang、Tao Wang和Zhi Jin,用于编程语言处理的树结构上的卷积神经网络,2016年)。
尽管这些努力设法将程序以经得起检验的形式转换为深度学习模型,但它们可能只能捕获浅层的句法特征,并且无法利用定义明确的程序语义。最近,出现了很多深度学习模型,这些模型致力于学习程序语义的表示(Ke Wang、Rishabh Singh和Zhendong Su。用于程序修复的动态神经程序嵌入。arXiv预印本arXiv:1711.07163,2017年,Daniel DeFreez、AdityaV、Thakur和Cindy Rubio-González。第40届软件工程国际会议的会议记录:随附会议记录,ICSE'18,第430-431页,美国纽约,2018年,Jordan Henkel、Shuvendu Lahiri、BenLiblit和Thomas Reps。代码向量:通过嵌入的抽象符号跟踪理解程序,arXiv预印本arXiv:1803.06686,2018年,MiltiadisAllamanis、Marc Brockschmidt和Mahmoud Khademi。学习用图形表示程序,arXiv预印本arXiv:1711.00740,2017年,UriAlon、Meital Zilberstein、Omer Levy和Eran Yahav。Code2vec:学习代码的分布式表示。arXiv预印本arXiv:1803.09473,2018年)。
这些作品可以分为两类:动态的和静态的。动态模型从程序的执行中学习,例如Wang等人提出的程序状态序列,或Henkel等人提出的抽象符号跟踪。静态模型是仿照静态分析在之前方法的域中提取程序语义的方式建模的。这些以前的模型在理解语义方面并不稳定,且因此也不是完全有效。
本公开的实施例单独地以及共同地解决这些问题和其它问题。
发明内容
本公开的一个实施例包括接收程序的多个执行跟踪,每个执行跟踪包括多个变量值。所述方法还包括由第一循环神经网络对所述多个变量值进行编码以针对每个执行跟踪生成多个程序状态,以及由双向循环神经网络从所述多个程序状态中确定每个执行跟踪的一组减少的程序状态。所述方法还包括由第二循环神经网络对所述一组减少的程序状态进行编码以生成所述程序的多个执行。所述方法还包括池化所述多个执行以生成程序嵌入以及使用所述程序嵌入预测所述程序的语义。
本公开的另一实施例包括一种计算机,所述计算机包括处理器和计算机可读介质,所述计算机可读介质包括可由所述处理器执行以实施方法的代码,所述方法包括接收程序的多个执行跟踪,每个执行跟踪包括多个变量值。所述方法还包括由第一循环神经网络对所述多个变量值进行编码以针对每个执行跟踪生成多个程序状态,以及由双向循环神经网络从所述多个程序状态中确定每个执行跟踪的一组减少的程序状态。所述方法还包括由第二循环神经网络对所述一组减少的程序状态进行编码以生成所述程序的多个执行。
所述方法还包括池化所述多个执行以生成程序嵌入以及使用所述程序嵌入预测所述程序的语义。
关于本公开的实施例的其它细节可以参见具体实施方式和附图。
附图说明
图1示出根据实施例的深度学习模型架构。
图2示出根据实施例的模型训练和预测过程的流程图。
图3示出根据实施例的语义预测模型的流程图。
图4示出执行跟踪的示例。
图5A和5B示出根据实施例的示例数据集的表格。
图6示出根据实施例的处理计算机的框图。
图7示出根据实施例的评估框架的流程图。
图8示出几种语义预测模型的预测准确度的图表。
图9示出根据实施例的模型的预测准确度与程序状态的数量的函数关系的图表。
图10示出根据实施例的模型的预测准确度与分支覆盖率的关系的图表。
图11示出几种语义预测模型的预测准确度结果的表格。
具体实施方式
本公开的实施例包括一种深度学习模型,其被配置成学习动态程序语义。语义包括一段文本的含义(例如,句子的含义、计算机程序的功能),而不是一段文本的句法或内容(例如,句子中的单词、计算机程序中的变量)。例如,句子“我有一只黑猫”和句子“我有一只猫,它是黑色的”尽管句法不同,但语义相同。程序的语义可能与程序的功能有关。程序功能可以指由程序解决的问题,而程序语义指由程序解决问题的方式。
与从程序文本中学习的静态深度学习模型不同,动态深度学习模型可以是从程序的执行中学习的模型。深度学习模型可以允许通过神经网络学习程序嵌入。根据实施例的深度学习模型可以建立并改进Wang等人的状态跟踪模型,以便不仅能够压缩执行跟踪以避免与可扩展性有关的问题,而且还能够在不同输入的多个执行之间进行泛化。
在实施例中,深度学习模型可以包括至少两个循环神经网络(RNN)和双向RNN。实施例可以解决其它模型(例如,在Wang等人提出的那些模型)的缺点。具体地说,实施例解决了可扩展性问题。当程序正在执行时,跟踪可能会任意增长,这使得RNN很难进行泛化。此外,其它模型可能无法学习程序语义;相反,它们可以从单独的执行跟踪中学习以预测程序单独运行的特征。
实施例可以应用于例如分析未知代码的示例。例如,可以在程序上训练根据实施例的深度学习模型。然后,用户可能会遇到目的不明的程序。用户可以通过模型传递程序以标识程序的语义。当写入程序时也可以使用实施例。如果计算机理解语义,则它可以基于语义为程序提供建议并自动写入代码。
在论述本公开的实施例之前,可更详细地描述一些术语。
“执行跟踪”可以是关于程序执行的信息日志。在执行计算机程序时,可以构建执行跟踪。执行跟踪可以例如在执行时记录每一行源代码。在一些实施例中,执行跟踪可以在程序执行的每个时间步骤记录计算机存储器的内容。
“程序状态”可以是程序的执行期间任何给定点处的计算机存储器的内容。程序状态可以包括一个或多个变量。每个变量可以表示计算机存储器中的存储位置。
“语义”可以是一段文本的含义。这可能与一段文本的句法或结构不同。语义可以用于分析计算机程序中代码的含义。具体地说,操作语义可以描述文本执行的结果。计算机程序的操作语义可能与程序的功能有关。
“嵌入”可以是高维向量的数字表示。嵌入可以使对输入向量执行计算变得更容易。一些嵌入可以通过使语义相似的输入靠近嵌入来保留输入向量的语义。程序嵌入可以是计算机程序的相对低维的表示。
“令牌”可以是机器学习模型中作为输入的信息单元。例如,在自然语言处理模型中,令牌可以是文本块中的单词或特定标点符号。在程序处理模型中,令牌可以是执行跟踪中的单词或变量值。
“处理器”可以包括任何合适的一个或多个数据计算装置。处理器可以包括一起工作以实现期望的功能的一个或多个微处理器。处理器可以包括CPU,所述CPU包括足以执行用于执行用户和/或***生成的请求的程序组件的至少一个高速数据处理器。CPU可以是微处理器,例如AMD的Athlon、Duron和/或Opteron;IBM和/或摩托罗拉(Motorola)的PowerPC;IBM和索尼(Sony)的Cell处理器;英特尔(Intel)的Celeron、Itanium、Pentium、Xeon和/或XScale;和/或类似处理器。
“存储器”可以是可存储电子数据的任何合适的一个或多个装置。合适的存储器可包括非瞬态计算机可读介质,其存储可由处理器执行以实现所要方法的指令。存储器的示例可包括一个或多个存储器芯片、磁盘驱动器等。此类存储器可使用任何合适的电气、光学和/或磁性操作模式来操作。
“服务器计算机”通常是功能强大的计算机或计算机集群。例如,服务器计算机可以是大型主机、小型计算机集群或充当单元的一组服务器。在一个示例中,服务器计算机可以是耦合到网络服务器的数据库服务器。
“机器学习模型”可以包括人工智能应用,所述人工智能应用为***提供无需明确编程即可自动学习和从经验中改进的能力。机器学习模型可以包括一组软件程序和参数,所述一组软件程序和参数可以基于“特征向量”或其它输入数据来预测过程(例如,计算机网络攻击者的标识、计算机的认证、基于用户搜索查询的合适推荐等)的输出。可以在训练过程中确定软件例程的结构(例如,子例程的数量和它们之间的关系)和/或参数的值,所述训练过程可以使用正被建模的过程的实际结果,例如,不同类的输入数据的标识。机器学习模型的示例包括支持向量机;模型,其通过在不同分类的输入之间建立间隙或边界来对数据进行分类;以及神经网络,其是通过响应于输入而激活来执行功能的人工“神经元”的集合。
“机器学习分类器”可以包括可以对输入数据或特征向量进行分类的机器学习模型。例如,图像分类器是可以用于对例如动物图像的图像进行分类的机器学习模型。作为另一示例,新闻分类器是可以将新闻报道分类为“真实新闻”或“虚假新闻”的机器学习模型。作为第三示例,例如***欺诈检测器的异常检测器可以将例如***交易的输入数据分类为正常或异常的***交易。机器学习分类器产生的输出可以被称作“分类数据”。机器学习分类器还可以包括聚类模型,例如K均值聚类。聚类模型可以用于将输入数据或特征向量分成多个集群。每个集群可以与特定分类相对应。例如,聚类模型可以接受与狗的大小和重量相对应的特征向量,然后生成与小型狗、中型狗和大型狗的特征向量相对应的集群。当新的输入数据包括在集群(例如,小型狗集群)中时,聚类模型有效地将新的输入数据分类成与所述集群相对应的输入数据。
“特征向量”可以包括表示某个对象或实体的一组可测量属性(或“特征”)。特征向量可以包括以数组或向量结构形式用数字表示的数据的集合。特征向量还可以包括可以被表示为数学向量的数据的集合,可以对所述数学向量执行例如标量积的向量运算。可以从输入数据确定或生成特征向量。特征向量可以用作机器学习模型的输入,使得机器学习模型产生某种输出或分类。基于输入数据的性质,可以各种方式实现特征向量的构造。例如,对于将单词分类为正确拼写或错误拼写的机器学习分类器,对应于例如“LOVE”的单词的特征向量可以被表示为向量(12,15,22,5),它对应于输入数据字中的每个字母的字顺索引。对于更复杂的输入,例如人类实体,示例性特征向量可以包括例如人类的年龄、身高、体重、相对幸福感的数字表示等特征。可以在特征存储区中以电子方式表示和存储特征向量。此外,可以将特征向量归一化,即,使特征向量具有单位量值。例如,可以将对应于“LOVE”的特征向量(12,15,22,5)归一化为大约(0.40,0.51,0.74,0.17)。
“标签”可以是机器学习模型的输出。标签可以是数值,具体地说可以是概率或分类。例如,标签可以是欺诈、非欺诈、垃圾邮件、非垃圾邮件、狗和猫。标签可以作为概率输出,例如95%的垃圾邮件和5%的非垃圾邮件。
“深度神经网络(DNN)”可以是在输入与输出之间有多个层的神经网络。深度神经网络的每个层都可能代表用于将输入转换为输出的数学运算。具体地说,“循环神经网络(RNN)”可以是深度神经网络,其中数据可以在神经网络的层之间进行前向和后向移动。
“分析模型”可以是能够分析数据的计算机模型。分析模型可以是机器学习模型,例如神经网络。可以基于一组训练数据训练或构建分析模型。分析模型可以用于分析例如授权请求、气象数据和金融走势。
“隐藏层”可以是位于输入层与输出层之间的神经网络的层。隐藏层的输出可以是中间输出,其可以用作神经网络的其它层的输入。隐藏层可以计算输入数据的复杂的非线性函数。隐藏层的输出可以被称为“隐藏状态”。
图1示出根据本公开实施例的深度学习模型100的架构。深度学习模型100可以包括词汇嵌入层110、状态嵌入层120、状态减少层130、执行嵌入层140、池化层150和预测层160。
词汇嵌入层110可以标识执行跟踪中的变量值,并且将变量值编码成数字向量。所述词汇嵌入层可以接收多个执行跟踪,每个执行跟踪表示特定计算机程序的执行。例如,考虑拼写检查程序。在程序检查一个单词的拼写时,每个执行跟踪可以是程序中变量的记录。执行跟踪可以是计算机程序的执行的记录,并且可以被分解成多个令牌(例如,程序中变量的值)。例如,拼写检查程序可以具有正被检查的当前单词、候选单词、当前单词与候选单词之间的差异以及最佳候选单词的变量。变量采用的值的每个单词可以被标识为单独令牌。词汇嵌入层110可以将执行跟踪中的每个令牌编码成向量。
下面列出了拼写检查程序的示例执行跟踪。这可以是用于标识字典中不存在的且因此可能是拼写错误的单词的程序。然后程序可以将所述单词赋给“当前”变量。然后,程序可以通过字典中的单词进行迭代。在每次迭代中,可以将单词赋给“候选”变量,并且程序可以计算当前单词与候选单词之间的距离分数。距离分数可以存储在“分数”变量中,其中分数越低指示单词越相似。如果分数是迄今为止计算的最低分数,则候选单词可以存储在“最佳”变量中。在通过候选单词的词典进行迭代之后,可以输出最佳单词作为拼写错误的单词的校正。
在此示例中,为“kittin”确定了建议。表格的每一行可以表示在程序的一次迭代之后运行程序的计算机的存储器。在第一步骤,选择候选单词(“soot”),并且计算出距离分数(7)。由于没有其它分数可进行比较,将“soot”赋为最佳候选单词。在第二步骤,选择“kitty”作为候选单词,得到距离分数为2。通过将分数与当前最佳候选单词的分数进行比较,程序可以确定“kitty”是比“soot”更好的候选单词,因此将“kitty”赋为最佳候选单词。可以针对“kitten”重复这个过程,得到的距离分数甚至比“kitty”还要小。因此,将“kitten”赋为最佳候选单词。在最后两个步骤中,再选择两个单词并且计算分数。由于“rank”和“blob”的距离分数都比“kitten”大,因此最佳候选单词的变量没有改变。在通过所有可能的候选单词进行迭代之后,当前最佳单词(在此示例中为“kitten”)作为当前单词“kittin”的校正拼写返回。
当前 | 候选 | 分数 | 最佳 |
kittin | soot | 7 | soot |
kittin | kitty | 2 | kitty |
kittin | kitten | 1 | kitten |
kittin | rank | 4 | kitten |
kittin | blob | 5 | kitten |
返回到图1,词汇嵌入层110可以针对程序的多个执行采用多个状态。例如,输入可以包括n个执行跟踪(u1,…,un),每个执行跟踪由m个状态(u1_1,…,u1_m)组成。可以为令牌嵌入层114输入执行跟踪的状态,例如状态un_m112。令牌嵌入层可以是循环神经网络(RNN)。嵌入可以是高维向量的数字表示。令牌嵌入层114可以针对状态un_m112中的每个变量值(或令牌)形成嵌入。在一个示例中,拼写检查程序的一个状态可以是给定时刻的当前单词、候选单词、分数和最佳候选单词的变量值。在上文的示例性表格中,状态可以表示为一行,并且每个单元格可以表示能够作为令牌嵌入的变量值。当前单词可以是“kittin”,并且当前单词变量的令牌嵌入可以是字符串的数字表示。在另一示例中,程序可以使用公式xy=3计算指数。如果状态un_m112包含变量值x=2、y=3和z=8,则变量x的令牌嵌入可以是向量(2,0,0),指示第一个变量(x)的值为2。令牌嵌入可以使用独热编码。嵌入可以是令牌嵌入层114的最终隐藏状态。
状态嵌入层120可以基于程序状态中的值的令牌嵌入来确定表示程序状态的向量。所述状态嵌入层可以包括第一循环神经网络(RNN),或第一RNN的多个副本。状态嵌入层120可以将表示变量值的向量编码为程序状态。程序状态可以是程序的执行期间给定点处的计算机存储器的内容。每个程序状态都可以表示为状态嵌入。为了生成状态嵌入,可以将每个程序状态的每个值序列运行到状态嵌入层120中。对于拼写检查程序,状态嵌入可以是给定时刻的正被检查的当前单词、候选单词、当前单词与候选单词之间的差异以及最佳候选单词的变量的令牌嵌入的数字表示。然后可以收集状态嵌入层的最终隐藏状态作为嵌入。可以这种方式针对程序的每个执行的每个程序状态生成嵌入向量。
每个RNN 122可以处理词汇单词(例如,变量)可能存在n个RNN 122,它们一起针对具有词汇单词的状态m生成状态嵌入。状态嵌入层120的输出可以是状态嵌入,并且状态嵌入可以是状态嵌入层120的最后隐藏层124的输出。
状态减少层130可以标识最能表示程序动作的执行的程序状态的子集。所述状态减少层可以包括用于每个状态嵌入的双向RNN。状态减少层130可以确定与执行相关联的程序状态的减少数量。例如,第一双向RNN 132可以分析执行un的状态un_1的状态嵌入,并且第二双向RNN 134可以分析执行un的状态un_m的状态嵌入。
第一双向RNN 132和第二双向RNN 134可以各自针对每个状态嵌入向量生成上下文向量。上下文向量可以是包括关于与在所述状态嵌入之前和之后出现的状态相关的状态的信息的向量。状态减少层130可以为每个程序状态确定两个上下文向量:前向上下文向量和后向上下文向量。前向上下文向量可以对程序状态相对于在其之前出现的状态的影响进行量化。后向上下文向量可以对程序状态相对于在其之后出现的状态的影响进行量化。在实施例中,具有较大值的上下文向量可以指示程序状态对执行中的其它状态的影响较大。具有较小值的上下文向量可以指示程序状态对其它执行中的其它状态的影响较小。例如,对于拼写检查程序,一个单词与当前单词非常相似(且因此可能是单词的校正)的状态可能会很重要。如果当前单词是“kittin”,则将“kitten”作为候选单词进行比较的状态可能具有较大值的上下文向量。与当前单词非常不同的候选单词可能不会产生很大的影响。例如,将“rank”作为候选单词与“kittin”进行比较的状态可能具有较小值的上下文向量。在一些实施例中,值可以在0与1之间的范围内。
池化层136可以将上下文向量(前向上下文向量与后向上下文向量)进行比较以确定需要保留的状态和可以移除的状态。状态减少层130可以使用单个S型(sigmoid)输出神经元的多层感知器(MLP)138来预测每个程序状态的必要性。例如,输出神经元可以指示数字(例如,百分比、小数),所述数字指示应该保持多少状态。如果神经元的输出高于阈值(例如,0.5),则可以保持状态。否则,可以拒绝所述状态。可以重复状态减少过程以优化减少从而使MLP的输出总和最小化。MLP的较低总输出可能会激励深度学习模型以尽可能地减少程序状态的数量。
执行嵌入层140可以基于来自状态减少层的状态嵌入的子集来确定表示执行的向量。所述执行嵌入层可以是第二RNN。执行嵌入层140可以将一组减少的程序状态编码为表示程序的执行的嵌入向量。执行嵌入层140可以将一组减少的程序状态的状态嵌入作为输入。例如,执行嵌入层140可以确定表示上文表格中前三个程序状态的嵌入。执行嵌入层可以输出RNN的最终隐藏状态作为程序嵌入。对于表示多个执行的程序,可以存在多个嵌入向量。
池化层150可以组合程序的执行嵌入以形成表示程序的向量。池化层150可以将来自执行嵌入层140的执行嵌入作为输入。然后池化层150可以使用池化函数152来池化执行嵌入以形成向量。例如,对于拼写检查程序,池化层150可以池化执行的执行嵌入,所述执行从多个正确和拼写错误的单词(例如,“kittin”、“legume”、“break”和“missake”)形成。池化函数152可以是例如最大池化函数。池化函数152可以替代地是平均池化函数。对于执行嵌入的每个维度,池化层150可以保留执行嵌入的所述维度中的最大值。
预测层160可以输出关于程序语义的预测。预测层160可以包括密集层162和归一化指数(softmax)层。密集层162可以是具有用于正被预测的每个功能的输入神经元的层。密集层162可以创建概率分布。归一化指数层可以确定多个分类的概率。多个分类可以包括一系列程序功能。如果分类是二进制分类(例如,如果只有两个语义分类),则可以使用例如ReLU或S型函数之类的其它激活函数而非归一化指数函数。在一些实施例中,预测层可以返回程序正在执行一组功能中的一个功能的概率。例如,预测层160可以指示程序被配置成反转字符串的概率。作为另一示例,预测层160可以指示程序被配置成检查一段文本的拼写、语法或大小写的概率。
可以训练深度学习模型100以使交叉熵损失以及执行中所有程序状态的MLP的输出总和最小化。交叉熵损失可以对深度学习模型的性能进行量化。
可将交叉熵估计为
其中N是在训练集T中被分类的程序数量,并且q(xi)是深度学习模型使用语义分类xi对程序进行分类的概率。分类正确的程序可能得出q(xi)=1或非常接近1,因此log2q(xi)=0或非常接近0,对交叉熵损失的影响很小。分类不正确的程序可能得出q(xi)=0或非常接近0,因此log2q(xi)的绝对值非常大(接近无穷大)。预测越不正确,对交叉熵损失的影响越大。其它实施例可以使用其它损失函数。
因此,使交叉熵损失最小化可以增加模型的准确度。使MLP的输出总和最小化可以激励深度学习模型以尽可能地使一组减少的程序状态中的程序状态的数量最小化。MLP输出为1可以指示明确保留程序状态,MLP输出为0可以指示明确拒绝程序状态。因此,通过减少总MLP输出可以使得一组减少的程序状态中的程序状态更少。使交叉熵损失和MLP输出总和最小化的组合,可以使得在维持高预测准确度的同时减少程序状态的数量。
图2示出根据实施例的深度学习模型的模型训练和测试的流程图。
在步骤210中,可以收集一组程序来训练和测试深度学习模型。程序可以从现有的代码存储库中收集,所述代码存储库比如编码挑战网站或大型计算机科学课程的作业。另外或替代地,程序可以是生成的。例如,计算机可以采用现有程序并使其变异以生成其它程序。为了使程序变异,计算机可能有用于改变程序的句法而不改变程序的语义的规则。以此方式,可以使用一小组程序生成一大组程序,用于训练和测试深度学习模型。
在步骤220中,可以从程序生成数据集。数据集可以包括每个计算机程序的多个执行跟踪。可以使用不同的输入运行每个程序,并且可以为每个程序的每个执行收集执行跟踪。多个执行跟踪中的每个执行跟踪是使用随机生成的输入生成的。替代地,可以选择输入以使分支覆盖率最大化。执行跟踪是程序的每个时间步骤时存储器中记录的内容,具体地说是每个变量的值。因此,执行跟踪可以提供每个程序如何操作的记录。每个程序的执行跟踪还可以包括在数据集中。
在步骤230中,可以使用语义标签来标记数据集。数据集中的每个程序都可以使用程序的语义进行标记。在一些实施例中,数据集可以包括程序的执行跟踪,并且每个执行跟踪都可以使用程序的语义来标记。语义标签可以包括程序功能。例如,单词处理程序的一组语义标签可以是“拼写检查”、“语法检查”和“大小写检查”。在一些实施例中,可以手动标记程序和/或执行跟踪。数据集还可以划分为训练数据集、测试数据集和验证数据集。训练数据集可以用于训练深度学习模型。测试数据集和验证数据集可以用于测试深度学习模型。
在步骤240中,可以在包括标记的程序(或标记的执行跟踪)的数据集的训练子集上训练深度学习模型。训练可以使用图3中描述的过程来完成。
在步骤250中,可以使用数据集的测试子集测试一个或多个深度学习模型,所述数据集包括标记的程序的执行跟踪。一个或多个深度学习模型可以输出关于数据集中程序的语义标签的预测。
图3示出根据实施例的使用深度学习模型分析程序的流程图。使用如图1所描述的深度学习模型来执行过程。对深度学习模型的输入可以是多个程序的一组执行跟踪。程序可以使用语义标签来标记。输入数据的数据集可以使用图2的过程来生成。
在步骤302中,深度学习模型可以标识执行跟踪中的词汇令牌。执行跟踪可以是关于程序执行的信息日志,并且可以被划分为表示通过程序的执行的每个步骤中计算机状态的片段。然后每个状态可以包括变量值。每个词汇令牌可以是变量值。可以例如基于存储器中的位置来标识词汇令牌。执行可以包括m个状态,每个状态由n个词汇令牌构成。
在步骤304中,深度学习模型可以根据词汇令牌形成词汇嵌入。每个词汇嵌入可以是编码变量值的向量。这可以使用多个循环神经网络(RNN)来完成。循环神经网络的最后隐藏层的输出可以是词汇嵌入。
在步骤306中,深度学习模型可以使用第一循环神经网络RNN1将词汇嵌入嵌入到状态嵌入向量中。每个程序状态的词汇令牌序列可以通过第一循环神经网络或第一循环神经网络的多个副本运行,然后RNN1的最终隐藏状态可以是嵌入向量。变量可以表示第e个执行跟踪中第s个程序状态的第n个变量vn的值,并且是RNN的所得隐藏状态。然后,下面的等式展示了在给定词汇嵌入和前一个令牌的嵌入的情况下,如何在循环神经网络RNN1中计算第e个执行中的第s个程序状态的嵌入。
…
在步骤308中,深度学习模型可以计算程序状态的前向序列。这可以是确定一组减少的程序状态的过程中的第一步骤。计算前向序列可以使用双向神经网络来完成。给定执行e的状态嵌入h(he_1到he_n),以下等式展示了如何使用前向RNN计算隐藏状态到的序列。可以使用前向RNN计算前向序列的第一分量其中第一状态嵌入he_1作为输入。另一输入可以是初始向量。初始向量的值可以随机生成。
…
在步骤310中,深度学习模型可以使用相同的双向神经网络计算程序状态的后向序列。类似地,以下等式通过处理另一方向的状态嵌入来计算后向序列到的分量。可以使用后向RNN计算后向序列的第一分量其中最后状态嵌入he_m作为输入。输入可以是初始向量,并且初始向量的值可以随机生成。
…
在步骤312中,深度学习模型可以根据前向序列的分量确定每个状态的前向上下文向量并且根据后向序列的分量确定后向上下文向量。前向上下文向量可以表示程序状态如何适应在程序状态之前出现的程序状态的上下文。后向上下文向量可以表示程序状态如何适应在程序状态之后出现的程序状态的上下文。对于状态嵌入he_s,以下等式可以限定上下文向量Cf和Cb。
前向上下文向量可以是前向序列的分量子集的最大池化,所述分量子集具体地说是包括来自第一s-1程序状态的信息的第一s-1分量。后向上下文向量类似地可以是后向序列的分量子集的最大池化,其中后向序列的第一m-s分量包括来自最后m-s程序状态的信息。最大池化函数可以在所有前向序列分量(或后向序列分量)上取最大值,以捕获关于在上下文向量的特定状态之前和之后出现的状态的最相关信息。
在步骤314中,深度学习模型可以至少基于前向上下文向量和后向上下文向量来确定要包括在一组减少的程序状态中的程序状态。确定将哪些程序状态包括在一组减少的程序状态中可以由多层感知器执行。所得的池化向量可以与特定状态嵌入连接,如以下等式所示,然后用作多层感知器(MLP)的输入。多层感知器(MLP)可以具有一个S型输出神经元。
如果MLP的输出高于阈值,则可以保留程序状态。例如,如果输出大于0.5,则可以将状态添加到一组减少的程序状态。可以选择更高的阈值以使得程序状态的更大程度地减少。通过为每个执行的一组程序状态中的每个程序状态完成这个过程,可以形成一组减少的程序状态。实施例可以减少程序状态的数量,因此例如在一组减少的程序状态中的状态比在多个程序状态中的状态少50%
在步骤316中,深度学习模型可以使用一组减少的程序状态,针对使用第二循环神经网络(RNN2)或第二循环神经网络的多个副本每个执行形成执行嵌入。一组减少的程序状态可以是第二RNN的输入。然后执行嵌入可以是第二RNN的最后隐藏状态。
在步骤318中,深度学习模型可以池化来自程序的执行嵌入以形成程序嵌入。在一些实施例中,池化可以使用最大池化函数来完成。将执行嵌入分组到程序嵌入中能进一步提取每个执行跟踪的含义,以捕获关于程序的高级信息量。
在步骤320中,深度学***均程序的概率为2%,所述程序是数组第k个最大元素程序的概率为3%,并且所述程序是数组最大差分程序的概率为1%。在一些实施例中,可以使用不同的函数预测概率。其它实施例可以使用其它激活函数。如果分类是二进制分类(例如,如果只有两个语义分类),则可以使用例如ReLU或S型函数之类的其它激活函数而非归一化指数函数。
在步骤322中,深度学习模型可以预测程序语义。深度学习模型可以使用归一化指数函数的输出并且预测程序语义。例如,如果归一化指数函数输出的值指示所述程序有94%的概率是字符串反转程序,则深度学习模型可以预测所述程序是字符串反转程序。在一些实施例中,预测程序的语义包括返回一系列程序函数中的一个程序函数的概率。
图4示出可以从程序生成的多个执行跟踪的示例。然后可以根据实施例由深度学习模型分析执行跟踪以确定程序的语义。
程序412可以是以适当的计算机编程语言写入的任何计算机程序。在此示例中,程序412以Python写入,并且计算两个数字的总和。首先,程序412接收输入1并将其赋给变量x。然后程序412接收输入2并将其赋给变量y。然后程序412计算x和y的总和,将总和赋给变量z,然后返回z。
输入402、输入404和输入406是到程序412的三个示例输入,每个输入限定输入1和输入2的值。输入越多且因此生成的执行跟踪越多可以提高语义预测的准确度,因为它们可以捕获关于程序操作的更多细节。在一些实施例中,输入可以是随机生成的输入。
当程序412处理每个输入402、404、406以分别生成输出422、424、426时,可以形成执行跟踪。例如,输出422包括值3和执行跟踪。执行跟踪的状态422A示出在执行程序的第一行之后的存储器的状态。只有存储器中赋给变量x的位置可以被填充,并且它可以存储值1(输入1的值)。存储器中的其它位置可能是空白的(例如,可能存储空值)。存储器中可能存在预先分配给将在程序运行过程中使用的三个变量的位置,或者在整个执行过程中根据需要分配存储器位置。为简单起见,示出预先分配位置的情况。在状态422B,将变量y赋到输入2的值或值2。变量z的位置仍然为空。在状态422C,使用值0实例化变量z,然后在状态422D,将变量z赋到值3。然后,程序412返回存储在变量z中的值,即3。可以类似的方式生成输出424和426的执行跟踪。
输出422、424、426的元素可以根据图1的架构图进行标记。输出422的执行跟踪可以表示为执行跟踪u1,输出424可以表示为u2,并且输出426可以表示为un。状态422A可以表示为状态u1_1,直到状态422D表示为u1_m。类似地,状态426A可以表示为un_1,直到状态426D表示为状态un_m。每个状态的每个变量也可以被标记。例如,状态422D的变量可以标记为 直到
当根据实施例将输出422、424、426的执行跟踪输入到深度学习模型中时,第一步骤可以是形成具有每个状态处每个变量的值的令牌嵌入。在输出422的示例中,执行跟踪中可能存在12个令牌,与四个状态中的每一个状态处的三个变量值相对应。在另一实施例中,可能只存在9个令牌,与所有状态处的非空变量值的数量相对应。然后,在状态嵌入层中,可以针对来自令牌嵌入的每个状态生成嵌入。例如,可以针对状态422A处的x、y和z的值生成状态嵌入。在状态减少层中,可以减少状态的总数量。例如,可以移除状态422A和422B的嵌入,因为状态422C捕获状态422A的所有信息并且包括所有变量的生成。在一些实施例中,即使状态422D捕获状态422C的所有信息,也可以不移除状态422C的嵌入,因为深度学习模型可以区分仅包括输入数据的状态和包括计算数据的状态。其它实施例可以取决于深度学习模型的训练而保留和丢弃来自相同执行跟踪的不同状态。在执行嵌入层中,保留在状态减少层之后的状态(例如,状态422C和422D)的嵌入可以分组为执行嵌入。
图5A和图5B示出用于训练和测试的示例数据集的表格。数据可以包括为完成多个任务或基准而设计的不同程序。数据例如可以从编码挑战网站或代码存储库收集。图5A示出可以基于旨在完成例如对数组或反转字符串求平均的函数进行标记的数据。图5B示出基于可以使用数据完成的编译器优化任务进行标记的数据。例如,编译器优化任务可以包括死代码消除和提升。
数据可以划分成训练集、验证集和测试集。数据集可以被划分,使得验证集和测试集中的程序数量相等。例如,在图5A中,训练集中可以存在大约10,000个程序,验证集中可以存在1000个程序,测试集中可以存在1000个程序。
为了准备深度学习模型的输入数据,可以使用编译器框架(例如,MicrosoftRoslyn)来解析AST和监测器执行。在一些实施例中,每个程序可以使用随机生成的一组二十个输入来运行。在其它实施例中,可以使用更多或更少的输入,并且输入可以随机生成,也可以不随机生成。每个程序的执行跟踪可以是评估框架数据集的一部分。模型可以在例如Tensorflow或Keras之类的机器学习框架中实施,并且可以从头开始或紧接着现有架构实施。在训练之前,可以确定一些超参数,例如循环层的数量(例如,1个)、循环层中隐藏单元的数量(例如,100个)、每个输入令牌的嵌入尺寸(例如,100)、优化器(例如,Adam算法)以及用于在修剪时归一化梯度的最大值(例如,0.9)。
图6示出根据实施例的处理计算机600的框图。处理计算机可以包括存储器610、处理器620、网络接口630和计算机可读介质640。计算机可读介质640可以存储代码,所述代码可由处理器620执行以实施本文所描述的处理计算机600的一些或全部功能。计算机可读介质640可以包括学习模型642、数据处理模块644、训练模块646和预测模块648。
可以使用任何数量的非易失性存储器(例如,闪存存储器)和易失性存储器(例如,DRAM、SRAM)的任何组合或任何其它非瞬态存储介质或介质的组合来实施存储器610。
处理器620可以实施为一个或多个集成电路(例如,一个或多个单核或多核微处理器和/或微控制器)。处理器620可以用于控制处理计算机600的操作。处理器620可以响应于存储在存储器610中的程序代码或计算机可读代码而执行多种程序。处理器620可以包括维护多个同时执行的程序或过程的功能。
网络接口630可以被配置成连接到一个或多个通信网络以允许处理计算机600与其它实体通信。例如,处理计算机600可以与计算机交互以从例如代码存储库的计算机之类的其它计算机接收代码和/或程序。网络接口630可以允许其它计算机使用处理计算机600来分析程序。例如,与代码存储库的通信可以是直接、间接和/或经由API的。
计算机可读介质640可以包括用于存储和/或传输的一个或多个非瞬态介质。合适的介质包括例如随机存取存储器(RAM)、只读存储器(ROM)、例如硬盘驱动器的磁性介质、或例如光盘(CD)或DVD(数字通用光盘)的光学介质、快闪存储器等。计算机可读介质640可以是这些存储或传输装置的任何组合。
计算机可读介质640可以包括代码,所述代码可由处理器620执行以实施方法,所述方法包括接收程序的多个执行跟踪,每个执行跟踪包括多个变量值。所述方法还包括使用第一循环神经网络对所述多个变量值进行编码以针对每个执行跟踪生成多个程序状态,然后使用双向循环神经网络从所述多个程序状态中确定每个执行跟踪的一组减少的程序状态。所述方法还包括使用第二循环神经网络对一组显著减少的程序状态进行编码以生成所述程序的多个执行。所述方法还包括池化所述多个执行以生成程序嵌入以及使用所述程序嵌入预测所述程序的语义。
学习模型642可以是深度学习模型。学习模型642与处理器620结合,可以从程序或多个程序接收包括执行跟踪的数据,并且可以确定程序或多个程序的语义标签。语义标签可以包括程序语义和程序功能。程序功能可以指由程序解决的问题,而程序语义指由程序解决问题的方式。在学习模型642的训练期间,学习模型可以从训练模块646接收训练数据。
数据处理模块644与处理器620结合,可以在将数据发送到学习模型642之前处理数据。数据处理模块644可以在将程序数据用作学习模型642的输入之前对其进行处理。处理可以包括例如,将程序转换成不同的格式(例如,Python转换成C#),并且将执行跟踪划分为词汇令牌。数据处理模块644可以运行具有多个输入的程序以生成多个执行跟踪。可以使用随机测试生成执行跟踪。例如,可以使用50个测试用例来生成执行跟踪。
训练模块646与处理器620结合可以训练学习模型642。训练模块646可以接收执行跟踪,并且执行跟踪可以具有语义标签。训练模块646可以从数据处理模块644接收执行跟踪。训练模块646还可以将执行跟踪划分为训练数据集、测试数据集和验证数据集。
预测模块648与处理器620结合可以接收具有未知语义的程序,所述程序可以使用学习模型642进行分类。预测模块648可以从数据处理模块644接收未知程序的执行跟踪,然后将执行跟踪提供到学习模型642。预测模块648还可以根据学习模型642的输出形成对程序的预测。
实施例还可以包括用于全面评估深度学习模型的评估框架。实施例可以是用于使程序嵌入的评估标准化并且衡量深度学习模型能够学习表示程序语义的程度的框架。框架可以包括数据集、一个或多个预测任务以及一个或多个评估度量。
评估框架可以包括一种方法,所述方法包括:使用语义标签标记计算机程序数据集,其中所述计算机程序数据集包括多个计算机程序;使用所述计算机程序数据的第一子集训练一个或多个深度学习模型;使用所述计算机程序数据的第二子集测试所述一个或多个深度学习模型,以针对所述计算机程序数据中的每个计算机程序生成语义预测;以及使用度量来评估所述一个或多个深度学习模型的一个或多个度量。计算机程序数据还可以包括每个计算机程序的一个或多个执行跟踪。在一些实施例中,语义预测可以是功能分类。在其它实施例中,语义预测可以是语义分类。
一个度量可以是稳定性,并且评估深度学习模型的稳定性可以包括:生成由所述深度学习模型正确预测的计算机程序的测试集;对所述测试集中的每个计算机程序应用局部变换以生成变异测试集,其中所述变异测试集中的每个计算机程序保留所述测试集中相关联计算机程序的语义;使用所述变异测试集测试所述深度学习模型,以针对所述变异测试集中的每个计算机程序生成新的语义预测;重复上述步骤,直到所述测试集中没有计算机程序为止;以及基于原始计算机程序与最后计算机程序之间的变化次数来计算稳定性分数。
数据集可以包括许多程序。数据集可以是例如图5A和图5B中描述的那些数据集。例如,数据集中可能存在10,000多个程序。例如,可以从公共编码平台(例如coderbyte、hackerrank)获得程序,并且可以写入每个程序来解决特定的编码问题。每个程序可能是使用例如C#之类的特定编码语言写入。在一些实施例中,可以选择模型相对容易开始的问题,包括:反转字符串;计算平均值、第k个最大成员、数组的两个元素之间的最大差值;计算平衡圆括号的数量;以及打印棋盘。然后可以对数据集进行分析和标记。可以手动完成分析和标记。标签可以基于操作语义,例如,在执行期间描述数据流的方法。可以允许某些类型的变量,例如用于临时存储中间结果的额外变量。然后,整个数据集可以分成训练集、验证集和测试集。在一些实施例中,训练集中的程序数量可能明显多于验证集中和/或测试集中的程序数量。
在一些实施例中,框架可以包括深度学习模型要完成的两个预测任务:功能和语义分类。模型可以用于基于特定程序的功能/语义预测其所属的类别,这与图像分类任务类似。功能分类可以用于验证深度学习模型的学习的不仅仅是浅层、表层句法特征的能力。
在一些实施例中,框架可以包括三个度量,即准确度、可扩展性和稳定性,以评估深度学习模型的性能。准确度可以衡量正确预测的百分比。可扩展性可以衡量模型随着大小(例如,程序中的行数、执行跟踪中的行数)的增长而扩展程序的能力。
为了实现稳定性,可以通过对先前正确预测的程序应用局部变换规则来生成新的程序。转换可能在语义上保持不变,这意味着模型的预测不应该因为句法更改而改变。但是,如果模型没有在更深层次上学习程序语义,则预测很可能会因此类变化而不稳定。根据实施例,转换规则可能不会改变深度学习模型的输入格式,因为构造的程序可能在语义上等同于其原始对应物,因此,程序语句/表达式可能会随机注入原始程序中,使得语义变得不同。
为了准备所有深度模型的输入数据,可以使用编译器框架(例如,MicrosoftRoslyn)来解析AST和监测器执行。具体地说,每个程序可以使用随机生成的一组二十个输入来运行。每个程序的执行跟踪可以是评估框架数据集的一部分。模型可以在例如Tensorflow之类的机器学习框架中实施,或者可以从头开始或紧接着现有架构实施。在训练之前,可以在所有模型之间统一一些超参数,例如循环层的数量(例如,1个)、循环层中隐藏单元的数量(例如,100个)、每个输入令牌的嵌入尺寸(例如,100)、优化器(例如,Adam算法)、用于在修剪时归一化梯度的最大值(例如,0.9)等。
图7示出使用评估框架的模型训练、测试和评估的流程图。
在步骤S702中,可以生成数据集。数据集可以包括多个计算机程序。多个程序可以使用不同的输入运行,并且可以针对每个程序的每次执行收集执行跟踪。执行跟踪是程序的每个时间步骤时存储器中记录的内容,具体地说是每个变量的值。因此,执行跟踪可提供每个程序如何操作的记录。每个程序的执行跟踪还可以包括在数据集中。
在步骤S704中,可以使用语义标签来标记数据集(包括程序和/或执行跟踪)。语义标签可以包括程序的功能。这些可以手动标记。
在步骤S706中,可以在包括标记的执行跟踪和/或标记的程序的数据集的训练子集上训练一个或多个深度学习模型。
在步骤S708中,可以使用数据集的测试子集测试一个或多个深度学习模型,所述数据集包括标记的执行跟踪和/或标记的程序。一个或多个深度学习模型可以输出关于数据集中程序的语义标签的预测。
在步骤S710中,可以评估来自一个或多个深度学习模型的结果的准确度。模型的准确度可以基于模型返回的准确预测的百分比。
在步骤S712中,可以评估一个或多个模型的稳定性。对于每个模型,可以将正确预测的程序收集到测试集中。然后可以将局部转换规则随机应用到测试集中的每个程序,生成变异。局部转换规则可以保留原始程序的语义和功能。变异程序可以为每个程序形成变异测试集,然后每个模型可以使用相应的变异测试集进行测试。每个正确预测的变异的分数可以基于原始程序与变异的当前版本之间的差异数量(例如,令牌数量)来计算。预测不正确的变异可能分数为0并且可以被移除。可以将已经预测正确的变异添加到新的测试集中,并且可以重复应用局部变换和测试一个或多个模型的过程。这个过程可以继续,直到测试集中没有留下任何变异为止,此时可以基于所有被测试变异的分数来计算每个模型的稳定性分数。例如,可以将稳定性分数计算为所有变异之间分数的平均值。
在步骤S714中,可以评估一个或多个模型的可扩展性。可扩展性可以衡量每个模型的度量如何随着程序大小(例如,程序的行数、执行跟踪的时长)的增加而变化。包括例如DyPro之类的状态减少层的实施例的可扩展性也可以衡量程序状态的减少。例如,DyPro可能会丢弃特定执行中超过50%的程序状态。
图8示出针对用于包括实施例(DyPro)的各种学习模型的功能分类和语义分类两者的预测准确度的条形图。预测准确度是模型能够成功执行的预测任务占预测任务总数的百分比。被测试模型中的每一个在功能分类方面都有很高的准确度。然而,各模型之间的差异因为在比较语义分类准确度时更加明显。TreeLSTM模型、ASTPath神经网络和封闭图(Gated Graph)神经网络执行的预测准确度全部低于65%。然而,根据实施例的DyPro模型实现了82%的语义分类预测准确度。因此,DyPro模型在预测程序语义方面比其它模型更有效。
图9示出在有压缩和无压缩的两个情况下,DyPro预测准确度与程序状态数量的函数关系图。在无压缩的深度学习模型中,状态减少层不移除状态嵌入。在有压缩的模型中,状态减少层在优化预测准确度时移除了不需要的状态嵌入。对于只有很少程序状态的小型程序,有压缩和无压缩的两种模型的性能大致相同,并且具有较高的预测准确度。这可能是因为程序状态数较少时,可以移除的状态数较少,这意味着压缩与不压缩之间的差别较小。随着程序状态数的增加,两种模型的预测准确度都有所下降。这可以理解为具有更多程序状态的程序可能更长且更复杂,因此具有更复杂的语义含义。有压缩模型的准确度降低幅度小于无压缩模型的准确度降低幅度。因此,因为模型要考虑最终状态数量,所以移除不必要的程序状态的模型对于程序状态增加的程序可能更加稳定。
图10示出DyPro预测准确度与分支覆盖率的函数关系图。分支覆盖率是使用测试用例或一组测试用例测试的程序中代码量的度量。分支是通过提供多个输出的结构,例如“if-else”语句引入到代码中的。例如,设想了接收数字作为输入的程序,如果输入是偶数则输出“真”,如果输入是奇数则输出“假”。只使用一个数字或所有偶数(或所有奇数)测试程序只能实现50%的分支覆盖率。也就是说,测试输入只激活了if-else语句的两个分支中的一个。使用偶数和奇数测试程序可以得到100%的分支覆盖率。随机测试(随机生成的测试输入)可以使得多组数据集的分支覆盖率高。如图10所示,DyPro的预测准确度随着分支覆盖率的增加而增加。这可能是因为随着分支覆盖率的增加,程序的功能会暴露得更多,从而可以更清楚地描写程序的语义。
图11示出根据实施例的包括封闭图神经网络、ASTPath神经网络、TreeLSTM和DyPro的多种学***均值。F1可以用以下公式计算:
一个任务可以是常量和变量传播。对于数据集中的每个程序,可以标识不必要的变量,否则可以用常量替换所述变量。此类变量的声明可以标记为正。然后可以注入额外的声明,这些声明采用现有变量的值,传递给后面的语句,并且标记为正。程序中的所有其它声明都为负。任务的目标是预测编译器将通过常量或变量传播移除的不必要声明。
另一任务是死代码消除。类似地,标识在更新时只写入非活动变量(根据活动定义)的语句。因此,这些语句可以被给予正标签。可以在可能不使用的随机位置引入额外变量,或者可以在变量非活动的位置合并写入现有变量的新语句,在这种情况下,新语句也被标记为正。最后,所有其它非控制语句都可以标记为负。任务是预测编译器将消除的死非控制语句。
提升是另一可以评估的任务。提升意味着从循环中提取循环不变量,从而通过只执行一次不变量而不是在每次迭代来中执行不变量来提高运行时性能。可以提出可能的循环不变候选项(例如,使用Daikon),然后可以移除误报(例如,使用微软代码合约(Microsoft Code Contracts))。用Java和Python写入的程序可以转换为C#。然后可以在循环体中添加一条语句,以将一个不变量表达式赋给新的变量。因为变量在循环的每次迭代中都会接受到相同的值,所以赋值可以标记为正(例如,应该从循环中提升出来的语句)。对于负样本,不变量可以变异;被确认为非不变量的变异(经由随机测试)可以被挑选出来以生成赋值语句。例如,考虑堆栈的实施方案。鉴于类中的两个字段:用于存储元素的实际数据结构“对象[]数组(object[]array)”和顶元素的索引“整数栈顶(int topOfStack)”,Daikon可能会提出“此数组[此栈顶+1]==空(this.array[this.topOfStack+1]==null)”作为一个跨类中的方法边界不变量(例如在队头执行入队操作(对象x)、在队头执行出队操作()、顶级对象()等)。检查表达式并将其确认为不变量之后,可以引入语句“varobj=此数组[此栈顶+1](var obj=this.array[this.topOfStack+1])”作为正示例,引入“var obj=此数组[此栈顶-1](var obj=this.array[this.topOfStack-1])”作为负示例。
归纳变量消除是另一可以评估的任务。归纳变量消除是指将多个归纳变量组合成一个。可以考虑两个归纳变量的循环。在一些实施方案中,这些循环可以占到数据集中具有多个归纳变量的程序的95%以上。给定由两个归纳变量x和y组成的循环,我们可以检测并确认它们之间的关系f,使得y=f(x)在每次循环迭代中都成立。接下来,我们可以用循环体中的f-1(y)替换所有出现的y,不包括y的增量。由于x和f-1(y)将被评估为相同的值,因此x和y的实际用法可以互换。因此,我们可以为循环赋予正标签,指示其归纳变量可以组合。小的调整可有助于生成负示例。不是用f-1(y)替换x,而是可以用f-1(y)、g-1≠f-1替换x。
对于常量和变量传播,封闭图神经网络(GGNN)、TreeLSTM和实施例(DyPro)在常量和变量传播方面都表现良好,但DyPro具有最高准确度。对于死代码消除,TreeLSTM的表现不如封闭图神经网络和DyPro。随着提升,准确度之间的差异变得更加明显。GGNN的准确度下降到63.8%,并且TreeLSTM的准确度下降到56.4%。同时,DyPro的准确度仍高达92.7%。类似地,使用归纳变量消除时,只有DyPro保持了90.3%的准确度,而GGNN和TreeLSTM的准确度则低于60%。此表显示,它们都擅长于一些简单的任务,但是随着编译器优化任务变得更加困难,其它模型可能无法捕获程序语义。
本公开的实施例提供多个优势。通过分析程序的多个执行,深度学习模型可以泛化程序在特定执行之外的功能。这又可以提供对程序语义的更可靠的理解,因为它们与特定的输入集无关。执行跟踪还允许对计算机程序进行动态分析,而不是对程序代码本身进行静态分析。动态分析可以提供关于程序如何对输入作出响应的更多信息,这对于确定语义可能很重要。根据实施例的深度学习模型可以用于分析未知代码。这可以节省开发人员在处理新信息时的时间和资源。在开发新的计算机程序时可以使用实施例,这些程序可以是由开发人员开发的,也可以是自主开发的。实施例还可以通过标识语义冗余的代码来提高现有程序的效率,从而在执行程序时节省时间和计算资源。
与其它深度学习模型进行比较,实施例还表示出通过使用状态减少层来学习程序语义的技术优势。执行跟踪可以变成任意时长,这取决于程序和输入。例如,递归程序或循环可能会迅速增加执行跟踪的时长,甚至对于相对简单的输入也是如此。长时间执行跟踪可能会减缓模型分析它们的速度。通过减少被分析但维持语义信息的程序状态数量,深度学习模型可以跨大型程序和长时间执行跟踪进行扩展,并且仍然保持相对较高的准确度和效率。这样可以更好地利用计算机资源来完成任务。
本申请中描述的任何软件组件或功能可以使用例如常规的或面向对象的技术并且使用任何合适的计算机语言(例如,Java、C++或Perl)实现为由处理器执行的软件代码。软件代码可作为一系列指令或命令存储在计算机可读介质上,所述计算机可读介质例如随机存取存储器(RAM)、只读存储器(ROM)、例如硬盘驱动器等磁性介质或例如CD-ROM等光学介质。任何此类计算机可读介质可驻存在单个计算设备上或单个计算设备内,并且可以存在于***或网络内的不同计算设备上或不同计算设备内。
以上描述是说明性的而非限制性的。在本领域的技术人员审阅了本公开后,本公开的许多变化可能变得显而易见。因此,本公开的范围可以不参考以上描述来确定,而是可参考待决的权利要求以及其完整范围或等同物来确定。
在不脱离本公开的范围的情况下,来自任何实施例的一个或多个特征可以与任何其它实施例的一个或多个特征组合。
除非明确指示有相反的意思,否则“一”或“所述”的叙述旨在表示“一个或多个”。
上文提及的所有专利、专利申请、公开案和描述都出于所有目的以全文引用的方式并入。并非承认它们是现有技术。
Claims (16)
1.一种用于学习程序语义的方法,包括:
接收程序的多个执行跟踪,每个执行跟踪包括多个变量值;
由第一循环神经网络对所述多个变量值进行编码以针对每个执行跟踪生成多个程序状态;
由双向循环神经网络从所述多个程序状态中确定每个执行跟踪的一个或多个减少的程序状态,
其中从所述多个程序状态中确定每个执行跟踪的所述减少的程序状态包括:
根据所述多个程序状态计算前向序列;
根据所述多个程序状态计算后向序列;
对于所述多个程序状态中的每个程序状态:
根据所述前向序列确定前向上下文向量;
根据所述后向序列确定后向上下文向量;以及
至少基于所述前向上下文向量和所述后向上下文向量确定将所述程序状态包括在一组减少的程序状态中;
由第二循环神经网络对所述一个或多个减少的程序状态进行编码以生成所述程序的多个执行;
池化所述多个执行以生成程序嵌入;以及
使用所述程序嵌入预测所述程序的语义,
其中确定所述前向上下文向量包括池化所述前向序列的分量子集,所述前向序列的所述分量子集包括来自第一s-1程序状态的信息,并且其中确定所述后向上下文向量包括池化所述后向序列的分量子集,所述后向序列的所述分量子集包括来自最后m-s程序状态的信息,其中m是所述程序状态的数量,并且s是整数且1≤s≤m。
2.根据权利要求1所述的方法,其中预测所述程序的语义包括返回一个或多个程序函数中的一个程序函数的概率。
3.根据权利要求1所述的方法,其中所述一个或多个减少的程序状态中的状态比所述多个程序状态中的状态少50%。
4.根据权利要求1所述的方法,其中所述多个执行跟踪中的每个执行跟踪是使用随机生成的输入生成的。
5.根据权利要求1所述的方法,其中确定将所述程序状态包括在所述一个或多个减少的程序状态中是由多层感知器执行的。
6.根据权利要求1所述的方法,其中预测语义是通过归一化指数函数的输出执行的。
7.根据权利要求1所述的方法,其中所述程序已经变异。
8.根据权利要求1所述的方法,其中所述方法被优化以使交叉熵损失最小化并且使所述一个或多个减少的程序状态中的程序状态的数量最小化。
9.一种用于学习程序语义的计算机,包括:
处理器;以及
计算机可读介质,其包括能由所述处理器执行以实施方法的代码,所述方法包括:
接收程序的多个执行跟踪,每个执行跟踪包括多个变量值;
由第一循环神经网络对所述多个变量值进行编码以针对每个执行跟踪生成多个程序状态;
由双向循环神经网络从所述多个程序状态中确定每个执行跟踪的一个或多个减少的程序状态,其中从所述多个程序状态中确定每个执行跟踪的一组减少的程序状态包括:
根据所述多个程序状态计算前向序列;
根据所述多个程序状态计算后向序列;
对于所述多个程序状态中的每个程序状态:
根据所述前向序列确定前向上下文向量;
根据所述后向序列确定后向上下文向量;以及
至少基于所述前向上下文向量和所述后向上下文向量确定将所述程序状态包括在所述一组减少的程序状态中;
由第二循环神经网络对所述一个或多个减少的程序状态进行编码以生成所述程序的多个执行;
池化所述多个执行以生成程序嵌入;以及
使用所述程序嵌入预测所述程序的语义,
其中确定所述前向上下文向量包括池化所述前向序列的分量子集,所述前向序列的所述分量子集包括来自第一s-1程序状态的信息,并且其中确定所述后向上下文向量包括池化所述后向序列的分量子集,所述后向序列的所述分量子集包括来自最后m-s程序状态的信息,其中m是所述程序状态的数量,并且s是整数且1≤s≤m。
10.根据权利要求9所述的计算机,其中预测所述程序的语义包括返回一个或多个程序函数中的一个程序函数的概率。
11.根据权利要求9所述的计算机,其中所述一个或多个减少的程序状态中的状态比所述多个程序状态中的状态少50%。
12.根据权利要求9所述的计算机,其中所述多个执行跟踪中的每个执行跟踪是使用随机生成的输入生成的。
13.根据权利要求9所述的计算机,其中确定将所述程序状态包括在所述一个或多个减少的程序状态中是由多层感知器执行的。
14.根据权利要求9所述的计算机,其中预测语义是通过归一化指数函数的输出执行的。
15.根据权利要求9所述的计算机,其中所述程序已经变异。
16.根据权利要求9所述的计算机,其中所述计算机被优化以使交叉熵损失最小化并且使所述一个或多个减少的程序状态中的程序状态的数量最小化。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201962793500P | 2019-01-17 | 2019-01-17 | |
US62/793,500 | 2019-01-17 | ||
PCT/US2019/054075 WO2020149897A1 (en) | 2019-01-17 | 2019-10-01 | A deep learning model for learning program embeddings |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113383316A CN113383316A (zh) | 2021-09-10 |
CN113383316B true CN113383316B (zh) | 2022-11-25 |
Family
ID=71613546
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201980089331.8A Active CN113383316B (zh) | 2019-01-17 | 2019-10-01 | 用于学习程序语义的方法和设备 |
Country Status (5)
Country | Link |
---|---|
US (1) | US11900250B2 (zh) |
EP (1) | EP3912042A4 (zh) |
CN (1) | CN113383316B (zh) |
SG (1) | SG11202107620QA (zh) |
WO (1) | WO2020149897A1 (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11899566B1 (en) * | 2020-05-15 | 2024-02-13 | Google Llc | Training and/or using machine learning model(s) for automatic generation of test case(s) for source code |
KR20220087922A (ko) * | 2020-12-18 | 2022-06-27 | 에스케이하이닉스 주식회사 | 메모리 시스템 및 그 동작 방법 |
US20220215241A1 (en) * | 2021-01-05 | 2022-07-07 | Alibaba Group Holding Limited | Method and system for microarchitecture-aware program sampling |
US11630853B2 (en) | 2021-01-29 | 2023-04-18 | Snowflake Inc. | Metadata classification |
CN113191838B (zh) * | 2021-04-09 | 2024-01-30 | 山东师范大学 | 一种基于异质图神经网络的购物推荐方法及*** |
Family Cites Families (34)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP6628350B2 (ja) * | 2015-05-11 | 2020-01-08 | 国立研究開発法人情報通信研究機構 | リカレント型ニューラルネットワークの学習方法及びそのためのコンピュータプログラム、並びに音声認識装置 |
US10115055B2 (en) * | 2015-05-26 | 2018-10-30 | Booking.Com B.V. | Systems methods circuits and associated computer executable code for deep learning based natural language understanding |
US10133729B2 (en) | 2015-08-28 | 2018-11-20 | Microsoft Technology Licensing, Llc | Semantically-relevant discovery of solutions |
CN108885712B (zh) * | 2015-11-12 | 2022-06-10 | 渊慧科技有限公司 | 神经编程 |
US10042740B2 (en) * | 2015-12-04 | 2018-08-07 | Microsoft Technology Licensing, Llc | Techniques to identify idiomatic code in a code base |
US20170213130A1 (en) | 2016-01-21 | 2017-07-27 | Ebay Inc. | Snippet extractor: recurrent neural networks for text summarization at industry scale |
US10325351B2 (en) | 2016-03-11 | 2019-06-18 | Qualcomm Technologies, Inc. | Systems and methods for normalizing an image |
US11783173B2 (en) * | 2016-06-23 | 2023-10-10 | Microsoft Technology Licensing, Llc | Multi-domain joint semantic frame parsing |
US10503998B2 (en) * | 2016-11-07 | 2019-12-10 | Gracenote, Inc. | Recurrent deep neural network system for detecting overlays in images |
US10255269B2 (en) * | 2016-12-30 | 2019-04-09 | Microsoft Technology Licensing, Llc | Graph long short term memory for syntactic relationship discovery |
KR101937778B1 (ko) | 2017-02-28 | 2019-01-14 | 서울대학교산학협력단 | 인공지능을 이용한 기계학습 기반의 한국어 대화 시스템과 방법 및 기록매체 |
US10795645B2 (en) * | 2017-03-27 | 2020-10-06 | Microsoft Technology Licensing, Llc | Neural network for program synthesis |
PL3542316T3 (pl) * | 2017-05-23 | 2023-02-20 | Google Llc | Oparte na uwadze sieci neuronowe z transdukcją sekwencji |
CN107220180B (zh) * | 2017-06-08 | 2020-08-04 | 电子科技大学 | 一种基于神经网络语言模型的代码分类方法 |
US20180357530A1 (en) * | 2017-06-13 | 2018-12-13 | Ramot At Tel-Aviv University Ltd. | Deep learning decoding of error correcting codes |
US20190034785A1 (en) * | 2017-07-25 | 2019-01-31 | The Allen Institute For Artificial Intelligence | System and method for program induction using probabilistic neural programs |
US10581888B1 (en) * | 2017-07-31 | 2020-03-03 | EMC IP Holding Company LLC | Classifying software scripts utilizing deep learning networks |
US10705809B2 (en) * | 2017-09-08 | 2020-07-07 | Devfactory Innovations Fz-Llc | Pruning engine |
CN109754256A (zh) * | 2017-11-08 | 2019-05-14 | 徐蔚 | 基于码链的模型、装置、***、方法和应用 |
CN108344564B (zh) | 2017-12-25 | 2019-10-18 | 北京信息科技大学 | 一种基于深度学习的主轴特性试验台状态识别及预测方法 |
US10915631B2 (en) * | 2017-12-28 | 2021-02-09 | Intel Corporation | Deep learning on execution trace data for exploit detection |
US11132180B2 (en) * | 2018-01-05 | 2021-09-28 | Microsoft Technology Licensing, Llc | Neural-guided deductive search for program synthesis |
US10671355B2 (en) * | 2018-01-21 | 2020-06-02 | Microsoft Technology Licensing, Llc. | Code completion with machine learning |
US10481879B2 (en) * | 2018-02-07 | 2019-11-19 | Microsoft Technology Licensing, Llc | Code development using continued machine learnings |
US10452367B2 (en) * | 2018-02-07 | 2019-10-22 | Microsoft Technology Licensing, Llc | Variable analysis using code context |
CN109101235B (zh) * | 2018-06-05 | 2021-03-19 | 北京航空航天大学 | 一种软件程序的智能解析方法 |
CN109036380B (zh) * | 2018-07-04 | 2020-08-04 | 苏州思必驰信息科技有限公司 | 对话状态跟踪方法、***、电子设备及存储介质 |
CN109213520A (zh) * | 2018-09-08 | 2019-01-15 | 中山大学 | 一种基于循环神经网络的注释点推荐方法及*** |
WO2020061587A1 (en) * | 2018-09-22 | 2020-03-26 | Manhattan Engineering Incorporated | Error recovery |
WO2020061586A1 (en) * | 2018-09-22 | 2020-03-26 | Manhattan Engineering Incorporated | Code completion |
US11061805B2 (en) * | 2018-09-25 | 2021-07-13 | International Business Machines Corporation | Code dependency influenced bug localization |
US11150875B2 (en) * | 2018-09-27 | 2021-10-19 | Microsoft Technology Licensing, Llc | Automated content editor |
US11822918B2 (en) * | 2018-10-13 | 2023-11-21 | Affirm, Inc. | Code search and code navigation |
US20200125482A1 (en) * | 2018-10-18 | 2020-04-23 | Manhattan Engineering Incorporated | Code examples sandbox |
-
2019
- 2019-10-01 WO PCT/US2019/054075 patent/WO2020149897A1/en unknown
- 2019-10-01 CN CN201980089331.8A patent/CN113383316B/zh active Active
- 2019-10-01 EP EP19909938.3A patent/EP3912042A4/en active Pending
- 2019-10-01 SG SG11202107620QA patent/SG11202107620QA/en unknown
- 2019-10-01 US US17/423,103 patent/US11900250B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
EP3912042A4 (en) | 2022-03-02 |
US11900250B2 (en) | 2024-02-13 |
SG11202107620QA (en) | 2021-08-30 |
WO2020149897A1 (en) | 2020-07-23 |
US20220044119A1 (en) | 2022-02-10 |
EP3912042A1 (en) | 2021-11-24 |
CN113383316A (zh) | 2021-09-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113383316B (zh) | 用于学习程序语义的方法和设备 | |
CN113011533B (zh) | 文本分类方法、装置、计算机设备和存储介质 | |
Al-Ayyoub et al. | Deep learning for Arabic NLP: A survey | |
CN112214995B (zh) | 用于同义词预测的分层多任务术语嵌入学习 | |
CN109766277B (zh) | 一种基于迁移学习与dnn的软件故障诊断方法 | |
US10949456B2 (en) | Method and system for mapping text phrases to a taxonomy | |
Zhang et al. | Multi-label learning from medical plain text with convolutional residual models | |
Hossain et al. | Bengali text document categorization based on very deep convolution neural network | |
CN112530584A (zh) | 一种医疗诊断辅助方法及*** | |
CN111582506A (zh) | 基于全局和局部标记关系的偏多标记学习方法 | |
US20240152707A1 (en) | Automated Patent Language Generation | |
CN114742069A (zh) | 一种代码相似度检测方法及装置 | |
CN113138920A (zh) | 基于知识图谱与语义角色标注的软件缺陷报告分派方法及装置 | |
US20230014904A1 (en) | Searchable data structure for electronic documents | |
CN116882402A (zh) | 基于多任务的电力营销小样本命名实体识别方法 | |
CN117217277A (zh) | 语言模型的预训练方法、装置、设备、存储介质及产品 | |
CN114662477A (zh) | 基于中医对话的停用词表生成方法、装置及存储介质 | |
CN116956228A (zh) | 一种技术交易平台的文本挖掘方法 | |
CN113901811A (zh) | 一种基于掩码语言模型的文献新词发现方法及*** | |
CN113821571A (zh) | 基于bert和改进pcnn的食品安全关系抽取方法 | |
Xu et al. | Hard Sample Aware Prompt-Tuning | |
Schiegl | Disease-symptom relation extraction from medical text corpora with BERT | |
CN114943229B (zh) | 一种基于多级别特征融合的软件缺陷命名实体识别方法 | |
Bensghaier et al. | Investigating the Use of Different Recurrent Neural Networks for Natural Language Inference in Arabic | |
Pandey et al. | A Robust Approach to Plagiarism Detection in Handwritten Documents |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |