【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来演示其软件生成功能和性能的实验数据。

时间: 2024-10-06 22:42:08

【AI系统首次实现真正自主编程】利用遗传算法,完爆初级程序员的相关文章

SQL Server 利用锁提示优化Row_number()-程序员需知

原文:SQL Server 利用锁提示优化Row_number()-程序员需知 网站中一些老页面仍采用Row_number类似的开窗函数进行分页处理,此时如果遭遇挖坟帖的情形可能就需要漫长的等待且消耗巨大.这里给大家介绍根据Row_number()特性采用特定锁Hint提升查询速度.   直接上菜   脚本环境可在SQL Server优化技巧之SQL Server中的"MapReduce"找到   如下查询在分页中比较常见 set statistics time on select *

编程报错-初级程序员 正在学习老黑莓编程,有几个问题请教

问题描述 初级程序员 正在学习老黑莓编程,有几个问题请教 我是照着黑莓开发入门到精通那本教程书,编的,但是到后来一些页面,编的代码,老是报错,下载的JDE是7.1的,是不是跟教程比是新的,教程里6才刚出来,咋办

只有喜欢研究编程的人才能成为 10x 程序员

10x(10 倍效率)程序员的概念首次被佛瑞德·菲利普斯·布鲁克斯二世(布鲁克斯法则的名气)[注1]在其文章<没有银弹>中提出,'在普通设计师(程序员)和优秀设计师(程序员)之间,有着 10 倍多的差异'.这个想法得到了广泛讨论,有时候还被驳斥,多数情况是得到了支持,这种现象不会让人吃惊,因为不可能精确地衡量一名程序员的生产力. 令人悲哀的是,10x 程序员经常被视作粘到屏幕上的瘾君子,在键盘上一刻不停地移动手指.这种画面在科幻电影里或许受欢迎,但是它很难等同于现实. 在我之前的公司,我们需要

编程没有捷径:奇葩冒牌程序员的故事

在讲述这个故事之前,我有一句话要说:编程是一件特别难的事情! 成为优秀的编程人员没有捷径,你要拥有高智商,要保持谦逊,还要不断的努力,犯错,在错误中成长,深刻理解你所学习的材料. 但是有些人就是一定要寻找捷径,而其中之一,就是使用欺诈的手段. 这篇文章讲述的就是我所遇到的一个冒牌程序员. 几年前,我认识了一个 30 多岁的人,我们姑且给他起名叫 Bryan 吧. Bryan 想要成为一名程序员,在我认识他之前的一年时间里,他一直都在有一搭无一搭的学习 Ruby,他还参加了一个为期 12 周的编程

从“拖拽”编程开始到一个合格的程序员

在美国,计算机科学是一个蓬勃发展的行业,并且它的薪资非常好.这里总会有优秀工程师的迫切需求,这就是为什么学习写代码看起来像是一个有吸引力的选择. 但是,与任何新技术一样,万事开头难.现在这里有一些你在早期应该掌握的步骤和编程语言,都很适合初学者. 从"拖拽"编程开始 "拖拽"编程是一种基本的技术,它允许通过拖拽代码构建块或者其他视觉线索,而不是手动编写基于文本的代码. 它使基本的编程很容易理解,不陷入细致的字符位置,根据Hadi Partovi的理论,一个网站的创始

程序员编程从初级到中级的10个秘诀_相关技巧

这个观点很好,有关程序员如何从初级跃升到中级的信息极少.以下是为了实现这种转变需要你去做的10件事. 1.学习另一门语言 其实你学的是哪一门语言并没有关系,但是学习另一门语言(不管你已经了解多少种语言)将把你打造为更好的程序员.能学会一门与你日常使用的语言风格迥异的语言则更佳.打个比方,如果你是C#程序员,学习VB.NET或者Java对你的帮助就没有学习Ruby或者Groovy大. 我说"学另一门语言"的意思是要真正学会它.学习一门语言包括三个领域的知识:语法.内置操作符和库,以及&q

10句编程箴言 每个程序员都应该知道

导读:原文作者Kevin Pang在kevinwilliampang.com发表一篇<10 Programming Proverbs Every Developer Should Know>.译文由伯乐在线整理编译成<10句编程箴言 每个程序员都应该知道>.文章内容如下: 所谓谚语,就是用言简意赅.通俗易懂的方式传达人生箴言和普遍真理的话,它们能很好地帮助你处理生活和工作上的事情.也正因如此,我才整理了10句编程谚语,每位开发人员都应该铭记他们,武装自己. 1. 无风不起浪 别紧张

关于程序员的59条搞笑但却真实无比的编程语录

程序员编程语录 1. 一个好的程序员是那种过单行线马路都要往两边看的人.(Doug Linder) 2. 程序有问题时不要担心.如果所有东西都没问题,你就失业了.(软件工程的Mosher定律) 3. 程序员的麻烦在于,你无法弄清他在捣腾什么,当你最终弄明白时,也许已经晚了.(超级计算机之父Seymour Cray) 4. 我想大部分人都知道通常一个程序员会具有的美德.当然了,有三种:懒惰,暴躁,傲慢.(Perl语言发明者Larry Wall) 5. 编程时要保持这种心态:就好象将来要维护你这些代

AAAI学会主席Rao演讲:AI系统崛起后的未来应当是更好地服务人类 | CCF-GAIR

2017年7月7日至9日,全球人工智能与机器人峰会CCF-GAIR大会在深圳大中华喜来登酒店举行.本次由CCF中国计算机学会主办.雷锋网(公众号:雷锋网)与香港中文大学(深圳)承办的大会聚集了全球30多位顶级院士.近300家AI明星AI企业 ,参会人数规模高达3000人,都是国内顶级阵容.  在7日上午的人工智能前沿专场中,亚利桑那州立大学教授.AAAI学会主席Subbarao Kambhampati教授进行了题为"人工智能的崛起与人类感知AI系统的挑战"的演讲,分享了他在AI浪潮中的