您现在的位置:首页 > 教案范文 > 正文

历史学论文研究方法_毕业论文研究方法_论文研究方法怎么写(3)

2017-12-16 17:05 网络整理 教案网

之所以说NPI是个递归LSTM结构,是因为当子程序被触发时,自身也形成了类似图2所示的LSTM结构,所以形成了递归LSTM的形态。当被调用的子程序中的某个时间步输出的程序终止概率P大于阈值时,会返回调用程序的LSTM结构中,继续下一个时间步的类似操作。

图3所示是NPI自动学习十进制加法的结构示意图,其输入是不断被子程序变换内容的数组矩阵,其控制结构其实就是图2所示内容,只是展示出了被调用子程序的LSTM结构,所以看上去比较复杂,但其运行逻辑就如上文内容所述。

图3 NPI学习十进制加法

代码生成派

图4 代码生成派

“黑盒派”有个很容易被诟病的问题:对于开发人员来说,对神经网络到底从数据中学到了什么规律所知甚少,所以不利于分析系统存在的问题以及提出有针对性的改进方案。“代码生成派”在这一点上的思路和“黑盒派”有很大差异,更接近传统的解决“IPS问题”的思路,期望能够让机器码农像人类程序员一样把解决问题的过程形成代码片段。目前也有不少深度学习自动编码系统采用这一技术路线,尽管不同系统具体技术方案有较大差异,但其基本流程都是类似的,图4展示了从不同方案中抽象出的“代码生成派”神经网络自动编程的基本思路,分为模型训练阶段和模型应用阶段。

在模型训练阶段,需要使用不同种类编程任务的训练数据来训练深度学习自动编程模型,一般训练数据包括:

任务Taski的一系列输入输出数据:

{??Input1,Output1??,??Input2,Output2??……??Inputn,Outputn??}

任务Taski对应的代码片段:Programi

历史学论文研究方法_毕业论文研究方法_论文研究方法怎么写

这组训练数据的含义是:对于要执行的任务Taski来说,当输入为Inputj的时候,经过任务的代码Programi对输入进行各种变换,形成对应的输出Outputj。训练数据中可以包含各种不同类型的任务及其对应的训练数据,这形成了总体的训练神经网络模型的训练数据集合。

目前常用的编程语言有很多,比如JAVA、C++、Python、PHP等,对于机器码农来说,也存在着:“PHP是不是最好的语言”这种问题,就是说需要作出应该用什么语言产生代码的决策。一般不同的深度学习自动编码系统都会参考“领域特定语言(Domain Specific Language)”自己定义一种编程语言,而不是直接采用人类程序员常用的某种编程语言,这是因为对于机器产生代码来说,目前常用的编程语言过于复杂,里面包含了循环、分支判断等复杂控制逻辑,而根据“领域特定语言”定义的语言一般都比较简单,不包含这些控制逻辑,只包含一些基本原语,比如数值加一、数值减一、移动指针位置、读取某存储器内数据、将数据写入存储器某位置等基本操作原语。所有代码片段(包括训练数据对应的程序以及将来要生成的代码)都采用自定义的领域特定语言,这样会大大简化机器码农的学习难度。

给定了各种任务的输入输出数据及其对应的代码片段,深度学习自动编程系统就可以开始使用SGD(随机梯度下降)算法来训练模型,一般神经网络的输入是某个任务对应的输入输出数据,而学习目标则是调整神经网络参数,使得其输出的代码片段和训练数据中对应的代码片段尽可能相同。通过这种方式可以训练获得自动编程模型。

在模型应用阶段,为了让机器码农能够针对新任务自动编写出解决任务的代码P(P能够正确地将给出的所有输入转换为对应正确输出),需要提供新任务的若干输入输出数据,这其实类似于日常程序员写代码的需求说明,只是以数据的方式体现的,否则不可能让机器漫无目的地去生成不知道在干么的代码,任务的输入输出数据其实是告知机器码农数据之间的映射规律。机器码农在获得新任务的输入输出数据后,根据训练阶段学习到的模型,可以预测出“领域特定语言”中的各种操作原语语句出现在代码片段P中的概率,可以认为出现概率较高的原语是代码片段P中应该包含的语句。这里需要注意的是:深度学习系统并不能准确地输出完整的代码片段,只能预测代码片段中DSL原语出现可能性。之后,可以采用某些搜索技术(比如线性动态编程或者宽度优先搜索等技术)在代码组合空间中寻找代码片段,这些代码片段能够准确地将给定的所有输入正确地转换为对应的输出。从这里可以看出,深度学习预测的结果起到的作用是形成代码组合空间搜索时的约束条件,能够大量减少搜索空间的大小,使得后续代码搜索过程极大地提速。