AI Programmer: 用基因算法生成程序 简介

最近有篇文章《AI Programmer: Autonomously Creating Software Programs Using Genetic Algorithms》火了,它主要是利用基因算法生成代码。没准儿以后能称为程序员居家旅行之必备。按说这个和深度学习一点关系都没有,但是我还是决定蹭个热度,写一写这篇文章刷一刷存在感。:)

基因算法,用高大上的词汇来说,属于机器学习(或者人工智能)里的进化主义,和深度学习所属的连接主义大相径庭,分属不同的山头。然而,二者隐含了一些相似之处。基因算法的fitness function 对应深度学习的loss function;  基因算法通过遗传和变异改进candidate, 以期达到更好的fitness, 深度学习通过back propagation更新weights,来减少loss  

基因算法主要适用于寻找问题的最优解,也就是optimization问题,如果我们很好的做到以下两件事情,我们就可以利用GA(基因算法)为我们服务:

1. 定义需要最优化的fitness函数。这个fitness往往是我们需要最优化的那个函数。比如任意一个复杂的数学函数的最大(小)值,比如TSP问题中人需要行走的距离,比如自旋玻璃模型中的能量等等。换句话说,fitness函数是我们的任务目标在数学上的表达。

2. 定义问题的解空间。这个解空间必须是有限维度的而且可以表达的。它可以是数字,是符号,是任何可以表达的变量展开出来的空间。


有了以上两点,我们就可以定义candidates

每个candidate都是一个potential solution。 通过优解的结合和在子代身上适度的变异,我们在子代身上既保留了优解身上良好的基因,又让子代在解空间适度的探索,去开发未知的领域。很多代以后我们可以找到问题的最(较)优解。


这篇文章毫无疑问在“写代码”这个事情上,成功的解决了上面的两个问题。让我们看一下它的方案。先看看它是如何定义解空间的。盗图如下:

在这个指令集里,作者只定义了8种操作(所有的操作都是执行在byte上的),每种操作都对应一个连续的实数区间。所以,任何一个candidate都可以表达为一个向量,这个向量的每一个维度都对应了一种操作,具体是哪个操作,取决于该维度上的值落在了图中的哪个Gene Range  比如,某candidate是[0.1, 0.8, 0.2, 0.5], 那么它对应的操作序列为:

>[<-


注意,这个小小的指令集,是图灵完备的!也就是说,基于这样一个解空间,理论上我们可以完成任何清楚交代给我们的任务。那么怎么样才叫交代“清楚”呢?这就涉及到刚才谈到的第一点,定义fitness函数。这里解释一下,如果对于一个问题,我们无法定义好一个fitness函数,我们是无法把它作为一个任务交给这个指令集去完成的。所以说,虽然指令集是图灵完备的,可是如果我们无法定义任务,那么也无法寄希望于这个指令集去做任何事情,无论它理论上有多么强大。接下来我们也可以看到,在利用AI Programmer编程的过程中,人工干预的核心都是围绕在定义fitness函数上的。(另外补充一点,作者处于效率和安全的考虑,自定义了一个内嵌的解释器去解释byte级别上的输出。)

举个最简单的例子,如果我们想让程序输出"Hello World", 我们需要定义一个fitness函数,盗图如下:


_targetStr已经被定义为“Hello World”, 可以看出这个fitness函数是用来检查生成的string和目标string(Hello World)的区别。区别越大,fitness就越小,在GA中,这样的candidates就越容易被淘汰。

总结一下,

AI Programmer整体架构如下:




以上打印“Hello World”乃任何涉世未深码农之基本功,毫无惊艳之处。让我们看看AI Programmer还能完成哪些任务吧:


注意反转字符串49s就能产生代码,这个比我写的快多了 :)

作者使用了扩展指令集之后,也能产生斐波那契序列。这些都属于一个成熟的码工刷题面试的基础题目,AI Programmer也会做。


作者最后一段的展望挺有意思,他们认为也许我们需要一种ML-based编程语言,因为只有有了这样的语言,我们才能最大程度上利用机器来编程。而人类,可以更多的把精力放在设计和创造上。我认为fitness函数是GA的关键,没有它一切都是妄谈。从方法论来说,AI Programmer可以把人类从抽象的逻辑思维中解脱出来,人不再负责想算法和写算法,这个任务可以交给机器。人类唯一需要做的是很好的思考和定义问题本身。





关注公众号《没啥深度》有关自然语言处理的深度学习应用,偶尔也有关计算机视觉


猜你喜欢

转载自blog.csdn.net/triplemeng/article/details/78048478