深度学习如何指导机器自动编写出能正确执行的代码?

机器自动编程是人工智能一直希望攻克的一个重要应用领域。随着深度学习的逐渐普及,它最近被广泛使用,并在自动编程方向上取得了长足的进步。深度学习如何引导机器自动编写正确执行的代码?本文介绍了该领域的最新技术进展,将主流技术分为“黑盒学派”和“代码生成学派”两个派别,并介绍了相应的代表系统:“神经程序解释器”和“关卡生成”。CNN模型的工作机制”。

随着深度学习技术的飞速进步,人工智能时代的序幕已经拉开。目前,深度学习在图像处理方面的能力已经接近人,在某些方面甚至超过了人的识别能力。在语音识别、自然语言处理等人机交互方面也取得了重大的技术进步。在未来的社会中,各行各业的不同类型的工作将逐渐被机器所取代。作为一种社会发展趋势,它已经逐渐出现。例如,工业机器人已经开始在工厂中广泛使用,特斯拉也已经在销售的汽车中实现了自动驾驶。功能方面,传统司机的角色被人工智能部分取代。

目前人工智能已经能够成功从事一些基于体力的工作,那么作为脑力密集的劳动岗位,程序员会不会被机器取代?从技术和社会发展趋势来看,这个问题在很大程度上可能是一个肯定的答案。那么机器编码员如何理解需求呢?如何根据需求快速编写代码?本文后续内容将介绍相关技术,尤其是一些与深度学习相关的技术思路。

深度学习近两年涉足自动编码领域。目前,深度学习系统的自动编码可以解决的问题比较简单。减法和正则字符串匹配规则等,因此机器编码人员在短期内没有替代人类程序员的可能。但我们也必须看到,随着深度学习在自动编码领域的深入应用,其技术发展速度非常快,未来几年很有可能会出现突破性的技术进步。

归纳程序综合问题

如何让机器自动生成代码的问题由来已久,是人工智能一直希望解决的重大问题之一。传统上,这个问题通常被称为“归纳程序综合”(IPS)问题。IPS问题的研究目标是:

给定一组数据对,如何自动生成一段代码,将这些给定的输入正确转换为给定的输出。

在传统的研究方法中,构建一个能够自动生成代码的IPS系统,一般涉及两个过程:代码组合空间搜索和代码排序。通用编程语言可以形成的程序语句是多种多样的。如果随机选择并组合其中的一些语句,则可以将输入数据转换为输出。但是,这种法码组合所创造的空间是非常大的。在这么大的代码语句组合空间中,哪些语句可以组合起来正确转换给定的一组数据呢?这需要在巨大的代码组合空间中搜索,以找到可以转换给定数据的代码片段。这些代码片段是机器自动生成的程序。显然,这里的关键是设计高效的搜索算法。另外,通过在代码组合空间中搜索,可以找到很多程序,都可以对输入数据进行准确的转换,那么哪一个是最合理的输出呢?这就是代码排序的工作,即对执行相同功能的多段代码进行排序,并找到最好的一段。例如,一种简单直观的方式是将码长最短的一段作为自动生成的码输出。

以上就是传统IPS系统的设计思路。最近,深度学习也被频繁应用到代码自动生成领域。以下内容主要介绍典型的相关技术思想。

机器如何学习使用深度学习自动编程

武林界分派是正常的。有少林、武当、峨眉、崆峒等派别。目前神经网络自动编程的主流技术路线也可以分为“黑盒学派”和“代码生成学派”两派。虽然都使用了深度学习技术,但两者在路线的方向上差别很大,各有特色。下面我们分别介绍两个派系的基本技术思想及其对应的代表系统。

黑盒馅饼

“黑盒学派”是神经网络编程的典型方法。所谓“黑盒”,是指编程系统不显式输出代码片段,而是从输入输出数据中学习变换规则,通过这些变换规则完成变换。对于某个任务,输入被正确地转换为输出。学习到的转换规则和输入输出数据中的规则以神经网络参数的形式体现,因此没有明确的代码或规则输出。在人类眼中,只有经过训练的神经网络才能完成指定的任务,但并不清楚它学到了什么规律,这就是为什么它被称为“黑匣子”的原因。

图 1 “黑盒派”技术思路

图1展示了“黑盒派”神经网络编程器的基本操作思想,其主要部分包含三个关键组件:神经网络控制器、神经网络感知器和actor。神经网络感知器用于感知当前输入数据并提取输入数据的特征,神经网络控制器根据输入数据的特征判断输入数据的当前行为(例如,对于数组排序,可能是交换两个数值 SWAP(number1, number2) 运算) 属于决策体,也是类似人脑的神经网络程序员的关键部件,当要采取的动作时确定后,调用actor执行输入数据,实际操作中,输入数据一步转换形成中间数据,然后新形成的中间数据继续作为感知器的新输入。这样就可以不断变换原始输入数据,完成诸如数组排序等任务。在训练阶段,人类提供一些输入和相应的输出数据来完成一项任务,并指定相应的行为序列作为训练数据。训练神经网络程序员的学习目标是让深度学习系统对输入数据模仿这个行为过程,最终可以形成正确的输出数据。当训练完成后,这些变换规则被编码到神经网络的网络参数中,当实际应用时,提供了一个新的输入,神经网络感知器。对输入数据进行特征提取和表示,神经网络控制器决定采取什么动作,actor对输入数据进行实际的变换行为形成中间结果,以此类推,直到神经网络控制器决定终止操作。结果就是程序对应的输出。

从以上过程可以看出,“黑盒学派”神经网络程序员并没有生成特定的代码来完成编程任务,而是学习输入数据和输出数据之间的规则和转换规则。从广义上讲,神经图灵机等网络模型虽然不是专门用于编程,而是用在更一般的任务过程中,但其实很符合这种“黑盒学派”架构的基本思想。

图 2 神经程序解释器(NPI)运行机制

Neural Programmer Interpreters (NPI) 是 Google 在提交给 ICLR 2016 的会议论文中提出的神经网络编程模型。该论文因其新颖的思想和创新的应用获得了 ICLR 2016 最佳论文奖。神经程序解释器是一种典型的“黑盒”方法。

NPI的主要控制结构是递归LSTM(见图2)。这种递归的 LSTM 结构可以反映程序和子程序之间的调用关系。至于什么是递归LSTM,我们后面会解释。我们先按照图2所示的内容来解释一下NPI的操作流程。

在时间 t,LSTM 的输入包括当前选择的子程序和此时的输入数据。两个输入通过Encoder编码网络映射,形成时间t的LSTM输入层的内容。这个过程实际上对应于图 1 中的神经网络感知器,用于对输入数据进行编码和提取特征。在 NPI 中,不同类型的任务可能对应不同的 Encoder 编码网络,因为不同任务的输入类型不同。,比如有些是图片,有些是数组等等,所以很难有一个通用的输入编码器可以统一处理,但是不同的任务会共享LSTM层参数。

在对输入进行特征编码后,t时刻的LSTM隐藏层单元对输入和t-1时刻LSTM网络的隐藏层信息进行非线性变换,即历史信息和当前输入的特征融合;然后,通过三个A解码器在时间t产生三种输出:Decoder_1根据隐藏层编码信息生成一个概率值P,代表当前节目结束的可能性。当P大于阈值时,当前程序终止;Decoder_2输出子程序库中某个子程序的ID,表示它们之间的调用关系;Decoder_3 输出新映射的子程序所需的参数信息列表,而Decoder_2和Decoder_3可以一起触发被调用的子程序。可以看出,LSTM结构和子程序库实际上就是图1所示的神经网络控制器,它决定了神经网络需要做出的各种决策。NPI 没有明确的参与者,这些行为隐藏在被调用的子程序中。一般不同的子程序会对输入数据定义不同的操作,调用子程序会触发子程序的操作,从而改变输入数据的内容。

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

图3为NPI自动学习小数加法的结构示意图。它的输入是一个数组矩阵,其内容由子程序不断变换。它的控制结构其实就是图2所示的内容,只是显示了被调用子程序的LSTM结构,所以看起来很复杂,但它的操作逻辑如上所述。

图3 NPI学习小数加法

图片[1]-深度学习如何指导机器自动编写出能正确执行的代码?-老王博客

代码生成饼

图 4 代码生成饼图

“黑箱学派”有一个很容易被诟病的问题:对于开发者来说,他们对神经网络从数据中学到了什么规律知之甚少,因此不利于分析系统存在的问题并进行针对性的改进。计划。“代码生成派”的思路在这一点上与“黑盒派”的思路有很大不同,更接近于解决“IPS问题”的传统思路。形成代码片段。目前很多深度学习自动编码系统都采用这种技术路线。虽然不同系统的具体技术方案有很大差异,但基本流程是相似的。图 4 显示了从不同解决方案中抽象出来的“代码生成系统”。”

在模型训练阶段从机器语言程序员看,需要不同类型编程任务的训练数据来训练深度学习自动编程模型。一般训练数据包括:

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

{<输入 1,输出 1>,<输入 2,输出 2>…<输入,输出 >}

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

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

目前常用的编程语言有很多种,如JAVA、C++、Python、PHP等,对于机器码农来说,还有“PHP是最好的语言”的问题,也就是说应该用什么语言被用来决定生成代码。一般来说,不同的深度学习自动编码系统会参考“Domain Specific Language”自行定义编程语言,而不是直接采用人类程序员常用的编程语言,因为对于机器生成的代码,目前常用的编程语言过于复杂从机器语言程序员看,包括循环、分支判断等复杂的控制逻辑,而按照“领域专用语言”定义的语言一般都比较简单,不包含这些控制逻辑,但只包含一些基本的原语,如Value plus一、value minus一、移动指针位置、读某内存数据、写数据到内存某位置等基本操作原语. 所有代码片段(包括训练数据对应的程序和未来要生成的代码)都是自定义的领域特定语言,大大简化了机器编码人员的学习难度。

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

在模型应用阶段,为了让机器码农为新任务自动编写解决任务的代码P(P可以正确地将所有给定的输入转换为相应的正确输出),需要提供几个输入并输出新任务的数据。这其实和日常程序员写代码的需求描述差不多,只是体现在数据的形式上。否则,机器不可能随机生成不知道自己在做什么的代码。任务的输入输出数据其实就是通知机器码。农业数据之间的映射规则。机器码农在获得新任务的输入输出数据后,可以预测“

Hierarchical Generative Convolutional Neural Networks(简称HGCNN模型)是Facebook最近提出的具有“代码生成学派”典型特征的深度学习自动程序推导方法。其整体工作流程符合上述“代码生成学派”操作流程,只是图4中的“深度学习自动编程系统”模块采用了特定的HGCNN模型。

图5 分层生成CNN模型(HGCNN)

图 5 显示了 HGCNN 模型的神经网络结构。在模型应用阶段,对于一个需要编码的新任务,首先提供一些满足任务处理逻辑的输入输出数据(HGCNN主要对数组进行各种类型的变换,如图5所示的例子就是对数组进行排序)。对于每一个输入和输出数据,HGCNN 使用一个全连接结构的四层 DNN 网络(图 5 中标记为 b 的网络结构)来提取特征,网络的每一层包含 512 个隐藏层神经元。之后,对几个输入输出数据的特征进行平均,作为输入输出数据的整体特征表示。可以看出,这个过程就是输入实例的编码和特征提取的阶段。然后,连续CNN上采样(UpSampling)操作用于不断形成一个逐渐扩展的二维结构矩阵。上采样是一种常用的技术,用于可视化 CNN 隐藏层学习的特征。在这里,上采样可用于输入和输出。数据中的特征规则以类似于二维图的方式显示;上采样形成的二维矩阵每次翻倍,直到形成最终的16*16大小的Code Canvas,代表最终的Code Canvas。最终代码中出现各种操作原语的可能性。代码画布的每一行代表一个操作原语语句,一个操作原语由一个操作符和对应的两个参数组成(参见图5中的c部分)。GHCNN 定义的语言“

图 6 HGCNN 的领域特定语言

HGCNN在获得最终程序可能包含的原始语句的概率信息后,采用广度优先搜索策略,在代码组合空间中搜索满足输入输出实例约束的代码片段,最终形成输出程序代码,这样就完成了指定输入输出实例后自动生成代码的功能。

HGCNN 的一个特点是训练数据,包括输入和输出,以及相应的代码是完全自动生成的,不像许多其他系统需要提供现成的训练数据。从这个角度来看,它的运行机制有点类似于无监督学习。另外,从上面的描述可以看出,HGCNN本质上是一个符合Encoder-Decoder(编码器-解码器)结构的特定模型。这里Encoder的编码对象是多个数据,Decoder用来在特征表示形成后生成DSL。Primitive 语句,Decoder 使用上采样生成二维结构来生成 DSL 图元片段生成概率。

DeepCoder 是另一个采用“代码生成学校”路线的深度学习自动编码系统。其主要思想与HGCNN类似,但使用的具体Encoder和Decoder并不相同,其整体操作流程基本采用图4所示的“代码生成饼”的典型流程。

问题与展望

使用机器根据任务示例自动学习编写代码,是一个可以大大提高代码开发效率的人工智能应用领域。尽管技术进步很快,但深度学习技术在该领域的广泛应用也是近两年才出现的新趋势。,但这个研发领域仍然面临着一系列需要解决的问题。

首先,深度学习自动编码的研究还处于技术发展的早期阶段,目前只能生成解决相对简单任务的代码,距离真正实用的代码生成还有很长的路要走. 其次,虽然提出了一些通用的解决方案,但大多数技术的通用性还不够强。所谓通用性不足,是指在面对一种新型的编程任务时,需要重新训练神经网络参数,训练一次后面对新的场景时,原来的神经网络不能重复应用,这对于技术的实际应用。是一个很大的障碍。

同样,对于机器生成的代码,很难验证其逻辑的正确性。虽然自动生成的程序可以正确地将训练样例中给出的输入转换为指定的输出,但毕竟这些样例非常有限,对于更多的输入,很难验证输出是否正确。

尽管面临上述困难,但深度学习的蓬勃发展为许多应用领域带来了根本性的性能提升。相信在未来几年内,神经网络编码器领域将会有实质性的技术进步。生成一个真正实用的机器码农夫。

作者简介:张俊林,中国科学院软件研究所博士。曾任阿里巴巴、百度、新浪微博资深技术专家。现任用友昌捷同济工业智能业务负责人,专注于深度学习在自然语言处理中的应用。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论