会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 人工智能 / 人工智能 / 机器学习 / 深度学习 / 一种基于深度学习进行JavaScript类型推断的方法

一种基于深度学习进行JavaScript类型推断的方法

阅读:271发布:2021-02-27

IPRDB可以提供一种基于深度学习进行JavaScript类型推断的方法专利检索,专利查询,专利分析的服务。并且本发明涉及人工智能领域的深度学习,特别是涉及一种对源代码的学习。本发明的内容包括:数据的收集与处理、模型的构建、模型的训练、模型的评估、类型推断。数据的收集与处理包括:首先在Github上下载一定量的源代码,接着筛选类型丰富的源代码作为最终的数据集,然后将数据转换为单词(token)和类型(type)对齐匹配的格式,同时生成token和type词汇库,最后利用token-type映射将源代码表示为一种适合学习的数据格式,如向量。模型的构建包括:首先确定神经网络种类,然后确定神经网络层数,最后确定每层神经元个数。模型的训练包括:跟踪损失函数值和分类误差,更新模型参数,直至得到准确度较高的模型。模型评估包括:统计模型的准确度和一致性。类型推断包括:加载训练好的准确度较高的模型,将类型推断结果标注在其对应标识符的后面,最后以文件的形式输出。其流程如图1所示。,下面是一种基于深度学习进行JavaScript类型推断的方法专利的具体信息内容。

1.一种采用深度学习技术进行JavaScript类型推断的方法,其步骤如下:(1)数据。包括数据的筛选、转换、切分、表示,最终作为模型的输入;

(2)模型。包括神经网络组成、及其超参数的初始化等;

(3)训练。跟踪模型的损失函数等,确定神经网络种类,网络层数、超参数等因素对模型精确度的影响,从而不断调整模型参数,进而不断提高模型准确度;

(4)类型推断。将源代码文件作为模型的输入,加载训练好的模型中准确度较高的模型,针对输入中每一个标识符进行类型推断,并将推断的类型信息标注在其标识符的后面。

2.根据权利要求1所述的该系统所需的数据,需要进行以下变换,以符合模型的的输入,其特征在于:(1)筛选类型丰富且各种类型的数目保持均衡的源代码;

(2)利用类型检查器,得到源代码中标识符的类型信息,利用分词器将源代码及其类型信息转换为TXT文本数据,同时构建大小合适的词汇表;

(3)根据实验机器配置,设置合适大小及比例的训练数据、验证数据、测试数据;

(4)将TXT文本数据表示为深度学习库CNTK兼容的CTF格式数据。

3.根据权利要求1所述的针对源代码的模型,其具有以下特征:(1)传统的自然语言处理模型不适合源代码任务,本发明采用深度神经网络,将神经网络与传统的自然语言处理模型结合,捕获更多的代码特征;

(2)结合数据集大小,选取合适的神经网络层数及每个隐藏层包含的神经元个数等;

(3)结合任务类型,设置合理的初始神经网络参数。如激活函数,损失函数,学习器等的设置。对于分类任务,输出层一般选择softmax()函数对输出结果进行处理,且学习率一般要随着训练进行衰减,因此可使用自适应梯度的办法,如使用adadelta学习器,可自动调整学习率等。

4.根据权利要求1或3所述的针对模型的训练,主要特征包括:(1)跟踪损失函数值,训练集和验证集准确率,进而不断的调整模型参数,优化模型的性能;

(2)采用单一神经网络训练模型;

(3)结合多种神经网络训练模型;

(4)针对以上两种模型,改变其超参数,观察其中每个超参数对最终结果的影响,综合各种影响,获取准确度较高的模型。

5.根据权利要求1所述的类型推断,其特征如下:

(1)将源文件作为输入参数,利用分词工具,提取其中的每一个标识符;

(2)加载训练好的准确度较高的模型,针对每一个标识符,将隐藏层中的隐藏状态映射到与类型词汇库相同维度的向量上,然后使用softmax()函数对输出结果进行处理,将其规范为有效的类型分类概率分布;

(3)将每个标识符的类型推断结果标注在其对应标识符的后面。

说明书全文

一种基于深度学习进行JavaScript类型推断的方法

技术领域

[0001] 本发明涉及人工智能领域的深度学习,特别是涉及一种对源代码的学习。具体通过对源代码的处理后,将其作为神经网络的输入,然后进行训练,得到准确度较高的模型,从而进行JavaScript类型推断的方法。

背景技术

[0002] 近年来,深度学习在语音识别、机器翻译、自动驾驶等领域都得到了广泛的应用,目前针对源代码的学习也引起了人们的关注。深度学习的优势在于能够通过深度神经网络提取高度复杂的特征,而机器学习则需要自己定义特征。目前,深度神经网络已经在一系列自然语言任务上获得了成功。与自然语言不同,程序中包含丰富、明确、复杂的结构信息,传统的自然语言处理模型(NLP,Natural Language Processing)将不适用于源代码任务,所以可以将神经网络与自然语言处理模型进行结合,从而处理源代码任务。
[0003] Javascript作为web开发的一种语言,仍然是最受欢迎的语言之一。JavaScript是一种弱类型语言,在静态类型检查、代码重构和语言服务方面存在一定的劣势。而类型推断可以通过对标识符(指变量、函数、属性的名字,或者函数的参数)等进行类型标注从而使代码的静态验证有很大不同,同时类型推断可以提高代码质量。Typescript是一种强类型的语言,通过类型注解,对类型进行约束,可以避免一些类型问题,提高代码健壮性。Flow是一个静态类型检查器,用于快速的发现JavaScript应用中的错误,验证JavaScript中的基本数据类型。另外还有一些其他的代码检查工具,但这些工具存在一些不足,比如无法检测引用类型、自定义类型等类型错误,所以对JavaScript进行类型推断是很有必要的。
[0004] 传统的JavaScript类型推断需要考虑众多因素,一般是通过各种分析技术如语法分析和语义分析等,不断细化类型,从而进行类型推断。而基于深度学习的JavaScript类型推断仅需构建单词和类型对齐匹配的语料库,然后基于语料库和数据集进行模型的构建和训练,最终得到准确度较高的模型。

发明内容

[0005] 本发明是一种采用深度学习技术进行JavaScript类型推断的方法。第一,对源代码数据进行收集与处理,将数据分为训练数据、验证数据和测试数据,并表示为一种适合学习的数据格式,如表示为向量形式;第二,进行模型的构建,选取合适的神经网络,如双向传播的门控循环单元(GRU,Gated Recurrent Unit)、循环神经网络(RNN,Recurrent Neural Network)、长短时记忆神经网络(LSTM,Long Short-Term Memory)等,可以捕获到更多的源代码信息,使输入数据通过神经网络后有一个合理的输出;第三,进行模型的训练,根据每一次训练结束后的损失函数值及验证集准确率不断更新网络参数,不断提高模型的精度,直至得到一个准确度较高的模型;第四,进行模型的评估,统计模型的准确度和一致性;第五,进行类型推断,将待推断的数据输入到已训练好的准确度较高的模型中,并将推断结果进行输出。以上所述方法如图1,包括:
[0006] 1.数据收集与处理
[0007] 针对深度学习任务,不经任何处理的源代码数据是不能直接使用的,本发明通过对源代码数据进行筛选、转换、切分、表示等处理后,将其作为神经网络的输入。具体如下:
[0008] 筛选:针对源代码学习任务,需要保证源代码设计模式和风格的多样性;针对类型推断任务,需要保证代码中类型丰富且各种类型的数目保持均衡。基于以上两个需求,在GitHub上下载一定量的开源项目源码。
[0009] 转换:利用类型检查器分析每个源文件中每个标识符的类型,并在其后面进行标注,最后将标识符和其对应的类型转换为单词和类型(token-type)对齐匹配的数据格式,同时生成一定大小的单词词汇表和类型词汇表,以方便后续的学习。
[0010] 切分:根据实验机器的配置,将数据切分为大小及比例合适的训练数据、验证数据、测试数据,以提高训练速度。
[0011] 表示:通过单词和类型词汇表映射关系将数据标准化,作为神经网络的输入。
[0012] 2.模型构建
[0013] 针对源代码任务,使用传统的NLP模型是不合适的,本发明采用深度神经网络,将神经网络与自然语言处理模型进行结合。其中模型的构建包括以下几个部分:
[0014] a.神经网络:本发明采用双向传播的GRU、LSTM、RNN等神经网络构建深度神经网络。首先通过实验观察其中任一神经网络对整个模型准确度的影响,得出各种神经网络对模型准确度的影响程度;然后结合每种神经网络对模型准确度的影响,将两种或两种以上的神经网络进行组合,观察对整个模型准确度的影响,最终平衡各方面因素,选取最合适的神经网络组合。
[0015] b.网络结构:整个模型分为输入层,隐藏层,输出层。输入层将数据进行归一化处理后输入神经网络。隐藏层对输入数据进行各种运算等。输出层将隐藏层数据结果进行输出。根据要解决问题的难易及网络的复杂度设置合适的神经网络层数和每层神经元个数。
[0016] c.网络参数:数据集分批训练,设置每批数据的大小,并对数据进行正则化处理,提高训练速度;设置输入层、隐藏层、输出层的激活函数和隐藏层的Dropout值,激活函数用来加入非线性因素的,解决线性模型所不能解决的问题,Dropout用于模型训练时,随机让神经网络的某些节点不工作;根据问题类型选取恰当的损失函数,如对于多分类任务,损失函数一般为交叉熵函数;训练过程采用梯度下降算法,设置合适的学习率(Learning Rate)和动量(Momentum)值,用于加速梯度下降,或直接采用学习器自动调整学习率,同时设置梯度裁减值,保证梯度值在一定的范围内。
[0017] 总之,基于常用的神经网络如GRU、LSTM、RNN等,结合数据集,构建合理的神经网络结构,设置初始的神经网络参数。
[0018] 3.模型训练
[0019] 对于模型的训练分为以下步骤:分批处理,模型参数初始化,跟踪损失函数值更新模型参数,测试模型泛化能力,提高模型泛化能力。
[0020] a.分批处理:当训练集数据大小过大且将整个数据一次性输入神经网络时,不利于学习,所以本发明将数据分为若干个一定大小的批量数据(minibatches),在一定程度上提高了训练速度。
[0021] b.模型参数初始化:根据激活函数值的大小和梯度值的大小选取初始化方法,初始化每层节点的权重(Weight)和偏置(Bias)。如对于RNN,正交初始化(SVD)方法会有更好的效果。
[0022] c.跟踪损失函数值,更新模型参数:对于多分类任务,一般损失函数采用交叉熵函数,在计算损失函数后对梯度值进行裁减,使梯度值保持在一定的范围内。同时计算其分类错误率。基于损失函数值和分类错误率,利用学习器自动调整学习率等,进行模型训练。
[0023] d.测试模型的泛化能力:将验证集数据作为模型的输入,统计模型推断结果的准确度和统计不同位置相同标识符类型推断结果的一致性,作为衡量模型泛化能力的标准。
[0024] e.提高模型泛化能力:主要针对模型过拟合和欠拟合现象,对模型做出调整。
[0025] 一般训练误差和验证误差差别不大,但两种误差都较大,这种情况下出现欠拟合现象。通常可以增加神经网络的隐藏层层数、增加神经元个数、延长训练时间、选择其它更复杂的神经网络模型等来减少训练误差和验证误差,提高模型的泛化能力。
[0026] 一般训练误差和验证误差差别较大,这种情况下出现过拟合现象。通常可以对隐藏层部分神经元进行Dropout操作,即对隐藏层中每层的神经元,按照一定的概率将其暂时从网络中丢弃,起到简化复杂网络模型的作用。同时可以改变批处理的规模、对数据进行正则化处理等,提高模型的泛化能力。
[0027] 4.模型评估
[0028] 对于模型的评估,也就是衡量模型的泛化能力,泛化能力强,说明模型推断结果的准确度高。泛化能力弱,说明模型推断结果的准确度低。通过将测试集数据输入模型,统计模型推断结果的准确性和一致性,进而确定模型的泛化能力。
[0029] 5.类型推断
[0030] 对于类型推断,首先将待推断数据作为模型输入,然后利用已得到的准确度较高的模型进行类型推断,最后将推断结果输出。整个过程具体如下:
[0031] (1)输入:首先利用分词器将源代码转换成单词序列数据,作为模型的输入。
[0032] (2)推断:采用训练好的准确度较高的模型,将隐藏层中的隐藏状态映射到与类型词汇表相同维度的向量上,然后利用输出层激活函数将其规范为类型的概率分布。
[0033] (3)输出:将每个标识符的类型推断结果标注在其后面。

附图说明

[0034] 图1:系统流程图

具体实施方式

[0035] 本发明的硬件环境主要是一台GPU型号为GeForce GTX 1080Ti的服务器。软件实现以ubuntu 16.04为平台,基于深度学习框架CNTK(Computational Network Toolkit),采用python语言开发。CNTK支持各种神经网络模型和算法,极大的方便了整个系统的实现。实验数据来源于Github上一定量的开源项目。操作主要分为四个部分:数据预处理、模型构建与训练、模型评估、类型推断。具体如下:
[0036] 1.数据预处理
[0037] 数据预处理主要包括数据的筛选、转换、切分、表示等。具体实施如下:
[0038] 筛选:挑选一定量类型丰富且标星数目较多的开源项目;对每一个开源项目中的文件进行检查,删去其中包含类型较少的文件和标识符数目过多的文件。
[0039] 转换:利用类型检查器得到标识符的类型信息,并将其类型信息标注在其标识符的后面。
[0040] 切分:将数据按照8:1:1的比例分为训练数据、验证数据和测试数据。
[0041] 表示:生成一定大小的单词词汇表(token vocabulary)和类型词汇表(type vocabulary),因为词汇表的大小和模型的复杂度强烈相关,为保证训练时间和所需存储合理,尽可能选择大小合适的词汇表。利用这两个词汇表之间的映射关系,将TXT格式的数据文件转换为适合学习的CTF格式。
[0042] 2.模型构建与训练
[0043] 模型的构建包括神经网络结构、训练器、训练。根据深度学习库CNTK中的io、sequences、layers、ops、learners、train、metrics等模块中的函数实现整个模型的构建。具体实施如下:
[0044] 创建模型:整个模型的创建分为输入层,隐藏层和输出层。在创建模型之前首先通过sequences.input_variable()创建输入容器;输入层通过layers.Embedding()将输入数据转换为一定维度的嵌入向量,同时通过layers.LayerNormalization()函数对数据进行归一化操作;隐藏层通过layers.Recurrence()函数调用已有的GRU、RNN、LSTM神经网络模型构建编码器和解码器,编码器对输入数据进行计算得到隐藏状态,最终的隐藏状态作为解码器的初始状态,解码器对隐藏状态的数据进行对应计算后作为输出层的输入;输出层通过layers.Dense()函数创建一个全连接层,并利用ops.softmax()对最终的结果进行处理。另外通过layers.Dropout()设置一定的丢弃率。通过丢弃操作简化隐藏层的网络结构。
[0045] 创建训练器:通过train模块中的Trainer()函数对整个训练过程进行封装,向其中添加损失函数和学习器等参数。损失函数直接使用CNTK中的计算函数实现,学习器通过深度学习库中learners模块中的adadelta()等构建学习器实例,向其中添加各种网络参数,如初始的学习率,动量值,梯度阈值等;
[0046] 训练模型:首先通过io模块中MinibatchSource()等函数读取输入数据,调用训练器对输入数据进行学习,训练过程中,跟踪损失函数的值和模型的准确度,并不断的更新模型参数,直到得到准确度较高的模型。
[0047] 3.模型评估
[0048] 模型评估包括模型的准确度和一致性。具体实施如下:
[0049] 首先加载已训练的准确度较高的模型,然后迭代输入测试数据,记录测试数据中的每个标识符对应的真实类型、类型检查器得到的类型,该发明推断得到的类型,最终进行统计,得到模型的准确度。同时记录出现单次的token数目、出现多次的token数目,类型推断不一致的数目,最后统计不一致性的结果。
[0050] 准确度: 其中tp表示推断类型与真实类型一致的数目,fp表示推断类型与真实类型不一致的数目。
[0051] 不一致性: 其中inconsistency表示多次出现的token中类型推断不一致的数目,multi_occurences表示出现多次的token的数目。
[0052] 4.类型推断
[0053] 类型推断是基于已训练的准确度较高的模型,对JavaScript中的标识符类型进行推断。
[0054] 具体实施如下:
[0055] 首先,对输入的数据进行处理,将其表示为单词序列,如将“var str=“hello”;”语句分解为[var,str,=,“hello”,;],然后对这些单词进行分析,去除关键词var等,只保留标识符数据。最后加载模型,进行类型推断,得到对应标识符的类型,并将每个标识符对应的类型信息标注在其后面,如“var str:String=“hello”;”。
高效检索全球专利

IPRDB是专利检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,专利查询、专利分析

电话:13651749426

侵权分析

IPRDB的侵权分析产品是IPRDB结合多位一线专利维权律师和专利侵权分析师的智慧,开发出来的一款特色产品,也是市面上唯一一款帮助企业研发人员、科研工作者、专利律师、专利分析师快速定位侵权分析的产品,极大的减少了用户重复工作量,提升工作效率,降低无效或侵权分析的准入门槛。

立即试用