本文是在读完AI Programmer:Autnomously Creating Software Programs Using Genetic Algorithms一文之后写的总结。
一、文章的任务
本文提出了一个可以自动完成编程任务的机器学习模型,即AI programmer。该模型使用遗传算法(Genetic Algorithm)进行优化搜索,模型可以在大部分普通机器上运行且仅需要最低限度的人类指导。最终可以实现的自动化编程项目如下:
- 简单程序,诸如:字符串的输出(如:“Hello World”、“Hi”等);
- 相对复杂的程序,比如:反转字符串、斐波那契数列等。
二、文章的方法
1、指令集的选取
作者使用的指令集是图灵完备的(Turning Completeness)。在可计算理论领域,如果一个编程语言是图灵完备的,那么理论上这个语言可以在无线的时间和内存需求下完成任何计算机可完成的任务。作者采用的指令集如下:
2、AI Programmer的核心部分-遗传算法
(1)基因组(genome)的创建:AI Programmer的基因组编码为浮点数组,每个唯一指令的固定取值范围在0和1之间,如上表(Table 1)所示。
(2)程序的生成:根据创建好的基因组,AI Programmer就将其转换为相应的程序,执行,根据程序的输出计算程序的适合度,生成的程序越靠近需要解决的任务,适应度越高,越有可能进行下一代的进化。在每一代,AI Programmer利用随机选择、交叉和变异来创建子程序,其中包含轻微的随机扰动(避免局部最优解)。遗传算法的过程如下:
以下图片展示了从浮点数组中构建基因组的实例:
突变的过程:
可执行程序根据其执行情况进行排名,其中特定程序会被立即从基因组池中删除,成功的方案则被推进以产生新的后代:–选择的过程
3、生成程序的结果展示
生成的诸多软件程序,如下图所示:
AI Programmer生成非常简单的程序来输出“Hi”,经过5700带后,生成的代码如下图所示:
三、文章相关的工作
提供了一个自动化编程框架,架构图如下:
四、局限性
AI Programmer中存在的问题:
- 极简编程语言与遗传算法之间的“矛盾”
实现相对复杂的程序,若采用较少指令集的编程语言其代价是内存消耗和时间,若引入更多指令集则会影响遗传算法的表现。
2. 依然需要大量的人为干预
现阶段模型依然需要大量人为干预。主要表现在以下方面:
(1)需要定义适应度函数;
(2)提供所有期待输入输出格式;
(3)提供所有逻辑顺序,如if/else。
3. 程序的开销与特例
随着输出结果的长度上升时,程序所需时间大幅上升,例如输出“hello world”所需要的时间是“hello”的5倍;
存在一些陷阱,例如:死循环(目前通过人为限制最大运行次数来避免)等。