一、本文想要解决的问题:
作者想开发一个可以自动编写程序的机器学习模型,这个模型被取名为“人工智能程序员”(AI programmer)。具体功能如下:
1. 简单程序,例如,字符串的输出(“hello world”,“hi”)
2. 相对复杂的程序,例如反转字符串,菲波那切数列
二、本文提出的idea:
1. 采用图灵完备的编程语言
2. 将该语言编码为遗传算法的输入
3. 使用了遗传算法(Genetic Algorithm)进行优化搜索
三、具体方法:
1. 采用极小编程语言。该语言名称是 BrainFxxK。
1.1 为什么采用?
(a) 理论上,在可计算理论领域,如果一个编程语言是图灵完备的,那么理论上这个语言可以在无限的时间和内存需求下完成任何计算机可完成的任务。
(b) 编程语言可分为两种:
人类设计的语言(human-intended programming languages),例如:python,java
极小编程语言,可看做一组指令集,满足图灵完备。例如:BrainFxxK,Hasekell
1.2 该语言的具体?
其中,Gene Range表示,在实际计算中,作者用数字代替符号。将符号平均地取在0-1之间(如果符号很多,那有挑战),为了易于使用遗传算法进行优化。
例如 ( 0, 0.125 ] 代表符号>,即指针加1。
2. 遗传算法
2.1 算法原理
进化算法:最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。
遗传算法:是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。流程如下:
1. 产生初始种群。即随机产生 m 个个体,假设每个个体产生n个特征。
2. 计算适应度。 通过评估函数 (Fitness function) 对每个个体的 n 个特征评估,来确定适应度 Fi=1,2,3...m
3. 根据适应度,对不同个体分进行不同操作:
a. 选择 (Survival):对于适应度低的个体,直接从群体中淘汰。对于表现优良的个体,继续存活。
b. 交叉 (Crossover):对于适应度高的两个个体,交换其部分特征的后代。就像染色体交叉,生物繁衍后代一般。
c. 变异 (Mutation):对于适应度高的个体,随机改变其部分特征。
4. 重复上述过程。直到某个个体满足了我们的需求,作为最优解输出。
2.2 算法在本文的应用
1. 基因组 (genome) 的创建: 将初始程序 (极小编程语言构成的) 编码为浮点数组,每个唯一指令的固定取值范围在0和1之间,如 1.2 小节里面的 Table 1 所示。
2. 随机产生一定数量的初始程序。
3. 根据程序的输出每个程序的适应度。生成的程序越靠近需要解决的任务,适应度越高,越有可能进行下一代的进化。
4. 在每一代,随机选择、交叉和变异来创建子程序。其中包含轻微的随机扰动(避免局部最优解)。如下图所示
5. 重复上述过程。直到某个个体 (程序) 满足了我们的需求,作为最优解输出。
选择:
交叉,变异:
四、不足
1. 极简编程语言与遗传算法之间的矛盾。仅有8个指令的编程语言,在实现复杂程序时,花费时间比较多。
2. 依然需要大量人为干预。需要定义适应度函数;提供所有期待的输入输出值格式;提供所有逻辑顺序。
3. 程序开销与特例。输出结果的长度上升时,程序所需时间大幅度上升。
4. 创新性。这篇文章只是用了遗传算法,是优化领域的经典算法,也许换成其他启发式算法效果更好。
五、总结
这篇文章相当于可行性测试,并没有理论突破。实验结果也比较单一,不能被大规模推广使用。
本博客内容参考文献:
[1] 如何评价arXiv上的最新论文:“可自动编程”的人工智能程序员(AI Programmer)?
[2] AI Programmer--利用遗传算法实现AI Programmmer
[3] 原论文:AI Programmer:Autnomously Creating Software Programs Using Genetic Algorithms