让 AI 自动编程是人工智能领域长久以来的梦想之一。现在,来自彭博和英特尔实验室的两位研究人员,号称实现了首个能够自动生成完整软件程序的 AI 系统“AI Programmer”,这个“AI 程序员”利用遗传算法和图灵完备语言,开发的程序理论上能够完成任何类型的任务。AI 自动编程的时代,大幕已开。
让 AI 自动编程一直是计算机科学家的梦想。目前这个方面的成果还非常有限,比如让 AI 自动补完编程语言,或者执行简单的加法程序。今天我们要介绍的这项工作,号称是第一个能够全自动生成完整软件程序的机器学习系统“AI Programmer”。
研究人员表示,他们用这个系统证明了长久以来的假设,那就是功能完备的程序确实能够被自动生成。具体到这项工作,AI Programmer 利用机器学习中的遗传算法,模拟复杂的指令。虽然现在 AI Programmer 生成的程序,复杂程度与人类新手程序员编写的结果相当。但研究人员认为,AI Programmer 编写的程序完全可以超越传统范畴,不受人类时间和智慧的局限。
AI编写的程序只是在测试复杂度和计算资源之间找得到最适合的点。换句话说,可能性无限。
研究人员还表示,我们需要重新思考,设计新的、面向机器的编程语言,因为当前的编程语言是面向人类的,不适用于基于 ML 的编程。“在考虑ML驱动程序生成的未来时,我们需要放弃和重新考虑典型程序语言创建的方法。”
研究人员写道,只有这样做,我们才能开始设想一个由 AI 系统驱动,以人类创造力和设计为指导的计算机软件开发的新未来。
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 的适应性测试软件框架具有延展性,并已被开发。用户可以自己设计无数的定制化软件,最终指导系统的遗传算法(GA)生成和软件程序演变。
如果目标程序旨在生成一个字符串,如”Hello World”(见上图),测试分数可能是字符串中的数字。但由于 AI Programmer 是在字节级生成代码,测试分数应将输出字符的增量差考虑在内。
研究人员表示i,他们能用 AI Programmer 生成很多软件程序。表 2 是所生成程序的名单。
一开始,研究人员让 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 Programmer,使用遗传算法自动创建软件程序
摘要
在本文中,我们介绍了首个能够自动生成完整软件程序的机器学习(ML)系统,全程只需最低限度的人类参与。这个系统名叫“AI Programmer”,以遗传算法(GA)为核心,加上紧密约束的编程语言,将其ML搜索空间的开销降到最低。AI Programmer 的新颖部分源于(i)独特的系统设计,包括用于效率和安全性的嵌入式手工解释器(hand-crafted interpreter),以及(ii)对遗传算法的增强,纳入了指令基因(instruction-gene)随机化绑定,以及编程语言特定的基因组构建及消除技术。我们详细介绍了 AI Programmer 的系统设计,详细介绍了系统的工作原理,以及使用主流 CPU 来演示其软件生成功能和性能的实验数据。
论文地址:https://arxiv.org/pdf/1709.05703.pdf
摘自新智元