AI编程员系统多次迭代自主编程,首次完爆初级程序员
2017-12-14 21:27
609 查看
论文:AI
Programmer: Autonomously Creating Software Programs Using Genetic Algorithms
链接:https://arxiv.org/abs/1709.05703(可下载英文PDF文档)
论文:AI
Programmer,使用遗传算法自动创建软件程序
摘要:此论文中,我们史无前例地提出了一种名为AI
Programmer的机器学习(ML)系统,能够自动生成完整软件程序,全程只需最低限度的人类参与。AI
Programmer的核心是使用遗传算法(GA),加上紧密约束的编程语言,将其ML搜索空间的开销降到最低。AI Programmer的部分创新性源于(i)独特的系统设计,包括用一个嵌入式、手动解释器(hand-crafted interpreter)来提高效率与安全性,以及(ii)对遗传算法的增强,纳入了指令基因(instruction-gene)随机化绑定,以及编程语言特定的基因组构建及消除技术。我们给出了AI
Programmer系统设计的详细测试,系统运行原理的若干详细示例,以及使用主流CPU来演示其软件生成功能和性能的实验数据。
AI自动编程一直是计算机科学家、人工智能领域长久以来的梦想。目前这个方面的成果还非常有限,比如让AI自动补完编程语言,或者执行简单的智能加法程序。文章《智能机器淘汰人工概率最大的365种职业》探讨了人工智能究竟未来可能会代替哪些人类工作,程序员似乎排在靠后几位。不过,这样的看法似乎越来越不准确了。最近,来自Bloomberg LP和英特尔实验室的两位研究人员,提出了一种基于遗传算法的人工智能程序,号称实现了首个能够自动生成完整软件程序的AI系统“AI
Programmer”。这个“AI程序员”利用遗传算法和图灵完备语言,开发的程序理论上能够完成任何类型的任务。AI自动编程的时代,大幕已开。它可以在普通计算机的硬件基础之上为指定任务生成程序。
计算机发明以来,正确、高效地开发软件程序一直是个根本性挑战。为了帮助解决该问题,软件开发领域已经作出了无数的突破。一些突破包括在静态、动态、渐进式系统中的安全、灵活的进步;使用自动化存储管理和垃圾收集系统作出的简化、安全、稳健的进步;在通用与特定领域语言的普通和特定发展;当然还包括以各种方式协助程序员的众多工具。
硬件创新领域中,新发展也在以类似的频率在发生,例如越来越多的通用性能多核CPU,带有高级的硬件扩展,或者是低能耗SoC边缘计算设备、接近先前超级计算机性能的高性能嵌入式协处理器;宽泛数据并行GPU;适合神经网络和计算机视觉的ASIC,等等。硬件进展持续扩展计算的深度与广度同时,副作用就是把软件开发与人类写代码的效率之间的紧张关系变得越来越复杂、恶劣。
在这篇论文中,作者们探索了一种取代传统人类软件开发的方式,也就是使用遗传算法自动创造软件程序,只需要少量的人类指导。
据论文介绍,该研究技术贡献在于:
1.史无前例的提出了软件生成框架AI Programmer,使用遗传算法结合全新简化编程语言构建程序。
2.给出多种批评观测系统,包括一个嵌入式注释器和模拟器解决方案,保证机器学习生成的软件的安全与优化。
3.在硬件上完整生成了多个软件程序,给出了经验式结果证明AI Programmer的功效与效率。
研究人员表示,他们用这个系统证明了长久以来的假设,那就是功能完备的程序确实能够被自动生成。具体到这项工作,AI Programmer利用机器学习中的遗传算法,模拟复杂的指令。虽然现在AI
Programmer生成的程序,复杂程度与人类新手程序员编写的结果相当。但研究人员认为,AI Programmer编写的程序完全可以超越传统范畴,不受人类时间和智慧的局限。
AI编写的程序只是在测试复杂度和计算资源之间找得到最适合的点。换句话说,可能性无限。
研究人员还表示,我们需要重新思考,设计新的、面向机器的编程语言,因为当前的编程语言是面向人类的,不适用于基于ML的编程。“在考虑ML驱动程序生成的未来时,我们需要放弃和重新考虑典型程序语言创建的方法。”
研究人员写道,只有这样做,我们才能开始设想一个由AI系统驱动,以人类创造力和设计为指导的计算机软件开发的新未来。
图 1:AI
Programmer的软件架构
从图中可见,由人类驱动的部分非常少,只需要在开始输入指令,最后接收适用于某项任务的函数即可,剩下部分全部由机器完成。
AI Programmer:利用遗传算法自动生成程序,理论上能够完成所有类型的任务
根据论文,研究人员选择了无类型编程语言,只包括了8种指令来驱动AI
Programmer生成软件。
AI Programmer使用的编程语言是图灵完备的,如表1所示。理论上,在时间和内存不限的情况下,图灵完备编程语言能够处理任何编程任务。本质上,任何一种具有这种特质的编程语言都能够解决海量编程问题。同样,AI
Programmer生成的软件能够完成所有任务。
有了这个保障,再来看AI Programmer的核心——遗传算法。
要使用遗传算法生成软件程序,必须首先创建一个基因组(genome)。基因组是一组被组合在一起作为单个单元的基因。AI
Programmer的基因组编码为浮点数组,每个唯一指令的固定值范围在0和1之间,如上面表1的基因范围列所示。
创建好基因组后,AI Programmer就将其转换为相应的程序,执行,并根据程序的输出为结果程序分配适合度。生成的程序越靠近解决提供的任务,适应度就越高,越有可能继续进行下一代的进化。在每一代,AI
Programmer利用随机选择以及交叉和变异来创建子程序,其中包含轻微的随机扰动,并且可能比其父母更好的基因组来解决目标任务。
图3展示了从浮点数组中构建基因组的实例。每个值范围映射到编程语言中的特定指令。最初,这些值是随机的,导致生成的程序无法正常运行。但是,其中必将有一两个能够运行并执行一些有效的指令。一个程序执行得越成功,就越有可能继续使用代码,实现更成功的后代。
为了创建后代,父母将其基因的一部分交给孩子,这个过程如图4所示。除了继承父母的编程指令外,每个孩子也可能会遇到突变,也就是对特定基因增加受控但随机的扰动。这导致特定基因的值发生修改,使所得到的编程指令发生变化,进而改变整个程序。
可执行程序根据其执行情况进行排名,如图5所示。其中,特定程序会被立即从基因组池中删除,成功的方案则被推进以产生新的后代。
AI Programmer使用结果:输出“Hello
World”,反转字符串,加减乘,输出斐波那契数列……
AI Programmer由C#.NET.上设计的模块化框架组成。它包括用于运行遗传算法的引擎,用于基因组图的编码器和解码器,用于执行模拟程序的沙箱解释器,以及将代码转换为二进制可执行文件的编译器。虽然最初设计AI
Programmer时使用C#,但需要注意的是,设计原则的应用范围并不仅限于C#。AI
Programmer的软件框架是可以扩展的,开发者们可以在此基础上构建适合自己的工具,通过指导系统的遗传算法,不断改进自己的软件程序。
研究人员指出,AI Programmer的适应性测试软件框架具有延展性,并已被开发。用户可以自己设计无数的定制化软件,最终指导系统的遗传算法(GA)生成和软件程序演变。
如果目标程序旨在生成一个字符串,如”Hello World”(见上图),测试分数可能是字符串中的数字。但由于AI
Programmer是在字节级生成代码,测试分数应将输出字符的增量差考虑在内。
研究人员表示i,他们能用AI
Programmer生成很多软件程序。表2是所生成程序的名单。
表 2:AI
Programmer 的结果
一开始,研究人员让AI Programmer生成了一个非常简单的程序来输出“hi”。经过5700代后,测试成功。生成代码如图9所示。
经过580,900代后,生成了“hello
world”,如图10所示。
经过6,057,200代后,AI
Programmer成功生成了”I
love all humans”,如图11所示。
AI Programmer生成反转字符串的程序。生成代码如图13所示。
AI Programmer能在92,400代之后生成加法程序;在177,900代之后生成减法程序,如图15所示。
图16所示的生成程序可以从两个初始输入值来输出斐波纳契序列。
相关文章推荐
- AI 系统首次实现真正自主编程,完爆初级程序员
- 技术文章 |【AI系统首次实现真正自主编程】利用遗传算法_完爆初级程序员
- 【AI系统首次实现真正自主编程】利用遗传算法,完爆初级程序员
- AI 系统首次实现真正自主编程,完爆初级程序员
- AI系统首次实现自主编程,完爆初级程序员!
- 程序员菜鸟必备——作为独立开发者如何系统的学习编程
- 开发无人编程即编程自动化系统,让程序员失业
- 程序员编程艺术第三十八章:Hero在线编程判题、出题系统的演进与优化
- 专访Rust——由Mozilla开发的系统编程语言(目标人群就是那些纠结的C++程序员,甚至也是他们自己)
- 程序员编程从初级到中级的10个秘诀
- 资讯丨谷歌 AutoML AI系统写的机器学习代码,完爆程序员
- 听见丨苹果申请自主导航系统专利,自动驾驶汽车梦再近一步 现代打造更聪明、实用汽车AI语音系统
- 织梦系统编程收集
- 系统编程之信号
- 深入理解计算机系统中网络编程一节echo客户端服务器的源码编译和运行
- 程序员编程艺术2:字符串是否包含问题
- 发生系统错误 1275.此驱动程序被阻止加载 寒江孤钓<<windows 内核安全编程>> 学习笔记
- Windows 2000系统编程 (1)
- 程序员编程面试取胜的8个技巧
- 关于Linux系统编程的错误处理:errno、perror、strerror