分享

人工智能,如何让机器自动写编写程序代码!

 长沙7喜 2017-11-20



对于一台电脑来说,它可能写下它自己的程序吗?


人类软件开发者有一天能够被电脑取代吗?如同一个农民,一个流水线工人,一个电话运营员被取代一样,软件开发者会是下一个吗?


这篇论文诠释了这个概念:


回复:ai写代码 下载论文



论文的精华部分: 


接下来我们将会描述创造一个人工智能程序的实验,人工智能工程能够开发其自己的程序,执行一个遗传算法,具有自我修正的代码。

上面这个代码是由人工智能程序创造的。这个人工智能被设计出写能够自我修正的代码。上面的代码是在29分钟中写出来的。其程序语言是brain-fuck


什么是BrainFuck

BrainFuck 语言,是一种按照“Turing complete”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainFuck 语言只有八种符号,所有的操作都由这八种符号的组合来完成。

 

BrainFuck 基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

 

人工智能占据写代码

人工智能随着电脑科技,硬件,CPU的发展,不断地发展着。随着计算机越来越快发展,更多的计算被执行,所以人工智能算法所要求的计算密集型处理能够被实现。


人工智能习惯

对于我来说,让人工智能写程序是我的爱好。我指的是从一个完全白手起家,对于程序完全没有认知的人工智能,它自己学习如何去创造功能性程序。

 

这是个艰难的任务:首先,使用使if/else条件写一个随机程序看起来并不是那么智能。无论是BASICCC++语言,都不能产生一个能够运行的程序。因为这些语言都是以被人类使用为目的的,对于人工智能来说太复杂。

 

最终的目标是创造一个能够写自己的处理软件,图像编辑工具和浏览器的计算机程序。我坚定于这样的想法是可能的。

 

很多的猴子和破碎的打字机

这个想法源于无限猴子定理:这个定理描述了如果你有1000只猴子,在打字机上不断地敲击足够长的时间的话,它们最终会创造由莎士比亚写出的话剧。这听起来很荒唐,但是给定足够的时间,这些猴子最终会创造出随机的文字,组成莎士比亚的作品。


如果这些猴子得到指引呢?每次其中一个猴子敲对键盘的话,就会得到奖励。在足够长的时间后,猴子能够开始习得规律和模式。


遗传算法


遗传算法是一种人工智能,以生物进化为模型。人工智能随机选择一系列的指令(DNA中的一个),检查结果的合适度。在很多的程序中,比方说100个程序,选择出最佳合适度的进行配对,产生后代。

 

每一代得到额外的多样性,由进化的技巧例如轮盘选择,交叉,和突变而来。这个过程在每一代中重复。但愿产生更好的结果,直到找到解决方法。遗传算法执行适者生存法则。最合适的生存下来,并被执行。遗传算法可以被划分为人工智能搜索算法。在巨大的问题空间中寻找具体的解决方案。



为什么是Brain-fuck解释器?

开始寻找简单的程序语言,用有限数量的指令,来训练人工智能程序使用。Assembly(ASM)很接近,但是仍然包含太多的排列。听起来很幽默,最后brain-fuck解释器产生,产生了上面的代码。

 

brain-fuck最初被设计的初衷是一个笑话程序语言,产生于对于人们使用来说,它的难度是怎样。它实际上有着一些对于电脑来说不同的优势。


Brain-fuck作为人工智能程序语言的优势

1. Turning complete 完全图灵

这意味着它在理论上能够解决任何的计算问题。有着这样能力的程序语言打开了很大可能性的序列。总之很多(如果不是所有的的话)计算机程序被设计来执行计算。

 

2. 由简化的只有8个指令的序列组成

简化的指令序列减少了搜索空间,很容易搜索到目标程序代码。随着计算机运行越来越快,问题空间能够被搜索到。然而,搜索空间需要被限制。限制程序指令在8个不同的字母,人工智能能够更快运行,在合理的时间内获得最优的合适度。

 

3. 很容易建立一个解释器

指令系列很好整理,容易理解。因此,创造一个执行程序的简单解释器很直接。在包含人工智能程序+遗传算法的解释器中,代码能够被优化,运行更快。这也能提供安全约束。人工智能能够获得解释器的内部内容,例如内存,指令和输出。这在计算合适度中非常有用。然而,第三方的编译器的这些内容很难获得。

 

4. 每个指令一个字节

因为每个指令只是一个字节,很容易找到每个double

 

5. 扩展指令的可能性存在

很多程序语言的解释器简单地执行代码,保存记忆值,支持输入和输出的操控台。然而,扩展解释器支持产生图标,文件系统途径是可能的。


如何运行

人工智能程序工作如下:

1. 一个genome由一组的double 组成。

2. 每个gene等同于在brainfuck语言中的指令。

3. 从大量随机的genome开始。

4. 解码每个genome成为想要的程序,转化每个double成为对应的指令并执行程序。

5. 在输出的基础上得到每个程序的合适度,然后将它们排序。

6. 使用轮盘选择,交叉,和突变方法将最好的genome配对,产生新的一代。

7. 使用新的一代重复过程,知道达到目标的合适度。



因为合适度方法是计算最集中的部分(执行程序中每个gene),人工智能程序使用Parallel。用这种方法,它能够为每一代多个genome执行多样的合适度算法。这个允许程序利用最大化CPU资源,利用多样的CPU核心。这个程序也能够保存状态,防止程序突然关闭,然后从离开的地方继续搜索。


The Fitness Method

合适度方法通过产生程序的结果的获得得分运行。这个分数通过在观察每个字母输出进行计算,减去和目标字母的数值差距。

当然,最初很多产生的程序不能够编译,更不用说将文字输出到操控台。这些被废弃了,支持至少能够输出一些东西的程序。进一步引导和金湖知道输出结果和目标的解决方案接近。

 

解释指令序列

Brainfuck由以下指令序列组成。

 

结果

人工智能最后成功地在一分钟内5700代后写下程序输出hi”,在一分钟内。产生了如下的代码:


+[+++++-+>++>++-++++++<]>++.[+.]-.,-#>>]<>


尽管以上的代码有语法错误,例如不匹配的括号。我们的模拟解析器计算结果直到程序无法运行。所以语法错误并不影响合适度。

 

你可以尝试将以上的代码放入brain-fuck解析器,点击“开始调试”,忽略警告提示,点击运行到断点。注意输出。

 

如果我们去掉多余的代码,会得到以下句法上有效的代码:

 

+[+++++-+>++>++-++++++<]>++.[+.]


看下面的截屏,当程序运行时候截取下来的。

 

人工智能学习写程序

人工智能学习写程序

 

人工智能找到解决方案

 

这是一张历史图表,画出合适度和时间的关系。能看到人工智能是如何学习在目标语言中写程序和达到想要的解决方案。

 


Hello

人工智能最后成功地写下程序输出hello,29分钟内252,0000代后,产生了如下的代码:

 

1.+-+-+>-<[++++>+++++<><>++]>[-[---.--[[-.++++[+++..].+]],]<><+,.+>[[.,],+<><>

2.[[[.+.,,+].-


在每代的过程中,人工智能都接近解决方案,但是一对字母在一个循环中相互束缚。人工智能能够解决这个问题,创造出一个内在的循环。成功输出正确的字母,继续处理程序。


人工智能学习写程序

人工智能找到解决方案

合适度和时间的关系图表


执行程序,人工智能开发



Hi!

人工智能成功写下程序Hi!”,在两个小时七分钟1,219,400代 之后。产生了如下的代码:

>-----------<++[[++>++<+][]>-.+[+++++++++++++++++++++++++++++><><><-->>>+].]


这实际上是我最喜欢的环节。运行,并且看到为什么(点击开始调试运行到断点)。好像电脑知道在知道做什么的感觉。很有趣的是,我们注意到怎么产生这个程序花费了比之前长的时间。很可能是因为使用的文字,包括大写字母和一个标志。另外两个例子使用了字母(在ASCII系统中的数值特别接近)。因此人工智能能够很容易找到。


人工智能找到解决方案



执行程序,人工智能开发


合适度和时间的关系图表


reddit

人工智能最后成功在22分钟195,000代后写成了reddit的程序。代码如下:

1.+[+++++>++<]+>++++++[[++++++.-------------.-.-+.+++++.+++++],.,+,-+-,+>+.++<><><>

2.-[-<>.]>+.-.+..]


由于长度,可能由于d的位置。这是一个挑战。

人工智能学习写程序

人工智能找到解决方案

 合适度和时间的关系图表


Hello world

在两个小时和580,900代后,产生了这个程序。代码如下:

1.-><[>-<+++]->>++++[++++++++++++++++++<+]>.---.+-+++++++..+++.+>+<><+[+><><>+++++++++.+-

2.-++++[++[.--------.+++.------],.-----],,.>.+<[><>]<++>+.[]+[.[+]],[[.]..,<><>

3.]],[[+[,+[]-<><><><]-><>-]-<>+[-,-[<.>][--+<>+<><><><-,,-,[,[.>]]<>

4.>+[<><><>].[--+[<->--],-+>]-,[,


如果去掉多余的代码,打印如下:

1.-><[>-<+++]->>++++[++++++++++++++++++<+]>.---.+-+++++++..+++.+>+<><+[+><><>+++++++++.+-

2.-++++[++[.--------.+++.------],.-----]]

人工智能找到解决方案

 合适度和时间的关系图表


I love all humans

在十个小时和6057,200代后,产生了这个程序。代码如下:

1.+[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++

2.++++.+++.+++++++.-----------------.--<.>--.+++++++++++..---<.>-.+++++++++++++.--------.--

3.----------.+++++++++++++.+++++.]-+,.-<[><><-[+[>[<><-[+[,]-,,-[>[+[-<><><><>

4..,,>[<><[.]>[<><-.]><>


如果去掉多余的代码如下:

1.+[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++

2.++++.+++.+++++++.-----------------.--<.>--.+++++++++++..---<.>-.+++++++++++++.--------.--

3.----------.+++++++++++++.+++++.


在以上的运行中,人工智能有着300个指令的数列大小的开始程序(例如300字节)。他并不需要整个程序代码的长度,值需要209个指令即可写出程序。

 

注意,这个解决方案需要10个小时去完成。然而,记住,当人工智能在做这些程序的时候,和人类相比,完成所需要的时间是更少需要担心的。人工智能能够默默在幕后运行。我也希望计算时间有望在将来能够减少。


人工智能找到解决方案


未来前景

 

伴随着遗传算法,产生关于设计合适度功能。合适度功能等同于向人工智能描述你在寻找什么。用这种方式,创造合适度功能本身和写程序相似。如果人工智能开发自己的合适度功能成为可能的话,这将是一个里程碑。同时,创造更加复杂的程序成为可能。




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多