许多人对AI的想象都停留在应用层,而忽视了技术层AI也将产生颠覆——让机器自己编程。谷歌大脑、DeepMind、Facebook甚至Viv都在这一方向上努力,发表了一系列研究论文。Venture Beat作者Lucas Carlson认为,机器自我编程其实离我们并不遥远,将很快实现。一旦机器做到这一步,在软件发挥重大作用的所有领域,将会经历一场颠覆性的变革。
想象AI的未来是很有趣的:家庭服务机器人、亚马逊的智能家庭中枢(Echo)等设备将走进每家每户,还有无人机快递和更加精准的医学诊断。这些吸人眼球的消费应用充斥着公众的想象,以至于大家都忽视了AI对另一个领域的颠覆——软件本身的发展。
想象一下,如果计算机自己能理解自己,它们可以做些什么?用不了多久,计算机就能做到这件事。并且,我不是在描述遥远的未来,我说的是触手可及的现在,使用时下现有的技术就能达到。
迄今为止,机器学习的专家倾向于聚焦那些为特定任务开发的AI应用,比如人脸识别、自动驾驶、语音识别甚至是搜索。但是,如果这些类似的算法能够在不需要人为帮助、解释或者干预的情况下,理解它们自身的代码结构呢?正如他们理解人类的语言和图像一样。
如果代码开始对自己进行分析、自我修正并提升,且速度比认为的更快,那么技术的突破可能会来得更快。由此带来的可能性是无止境的:医学的进步、更加自然的机器人、更智能的手机、更少bug的软件,更少的银行欺诈等等。
人工智能具有解决软件开发中的一个古老问题的潜力。代码编写或操纵其他代码的能力的概念已经存在了很长时间,一般称为元编程(它实际上起源于20世纪50年代末的Lisp)。它解决的难题,目前都还在人们的想象之中。
但是,现在人工智能让改变发生了。
使用人工智能,计算机能够理解一个软件开发项目从无到有的发展历史过程中的所有代码,并立即改进或者删除单独一行代码中的bug,不管是用什么编程语言。即便是一个缺乏经验的或者中等水平的程序员都能讲清楚让计算机自我编程的原理。由此,一个癌症项目的研究可能几天或者几个月就能完成,而不需要花费好几年的时间,这将带来显著的进步。
今天,这项最终将会带来颠覆性改变的技术尚处在萌芽时期,但是,它已经开始生长。比如,谷歌的TensorFlow机器学习软件,让每位程序员都能将神经网络直接融入到所开发的APP中,让APP拥有识别图片中的人和物体的能力。要把这些想法变成现实,你将不再需要一个博士学位。让业余人士也可以修正程序,这可能会成为AI发展历史上最大的突破。
谷歌的目标:大部分代码都不需要人为编写
国外著名科技记者Steven Levy今年6月在他刊于BackChannel的文章《谷歌如何将自己重塑为一家“AI为先”的公司》(How Google Is Remaking Itself As A“Machine Learning First”Company)中提到,谷歌大脑负责人Jeff Dean表示,随着他和团队对机器学习了解得更多,他们利用机器学习的方法也更加大胆。“以前,我们可能在系统的几个子组件中使用机器学习,”Jeff Dean说:“现在我们实际上使用机器学习来替换整套系统,而不是试图为每个部分制作一个更好的机器学习模型。”Levy在文中写道,如果现在让Jeff Dean改写谷歌的基础设施,大部分代码都不会由人编码,而将由机器学习自动生成。
谷歌的代码bug预测系统,使用一个得分算法,随着commits变得越来越旧,它们的价值越来越小。
认为计算机自我编程离我们还很远?如果我告诉你,一些大公司,比如谷歌,已经开始在内部的项目管理系统中尝试使用这一概念,你可能会觉得震惊。但是,谷歌确实已经开发了一个bug预测程序,使用机器学习和统计分析,来判断某一行代码是否存在瑕疵。谷歌工程师、W3C的联合主席Ilya Grigorik也开发了一个开源版本的bug预测工具,目前已被下载2万次。
Ilya Grigorik,图片来自twitter
另一个例子来自Siri的继承者——Viv。Wired最近的一篇报道中写道,Viv不仅使用一系列的自然语言处理来实现语言识别,还基于英语词汇建立了复杂的自适应性计算机程序。代码自己写代码(Code writing code)。由于被写入的代码是经过Viv的开发人员自己训练和专门化的,所以这里的“写代码”并不是我们通常所说的写代码的能力,但这确实是一个大的进步。
在这个方向上,另一个大的进步来自非专业领域。Emil Schutte曾有过一句非常具有挑衅性的言论:厌倦了写代码?我也是!让Stack Overflow来做这件事吧。他分享了一个例子来证明这一概念,从Stack Overflow的大型编程数据库中提取完整的工作代码,来提供完整的功能代码块,但是,这样得到的模块还是基于已经写好的代码。
DeepMind的尝试
实际上更早之前,DeepMind团队开发了一个“神经编程解释器”(NPI),能自己学习并且编辑简单的程序,排序的泛化能力也比序列到序列的LSTM更高。描述这项研究的论文《神经程序解释器》(Neural Programmer-Interpreters),被评选为ICLR16最佳论文。
NPI是一种递归性的合成神经网络,能学习对程序进行表征和执行。NPI的核心模块是一个基于LSTM的序列模型,这个模型的输入包括一个可学习的程序嵌入、由调用程序传递的程序参数和对环境的特征表征。这个核心模块的输出包括,一个能指示接下来将调用哪个程序的键、一个经典算法程序的参数,以及一个能指示该程序是否该停止的标记。除了递归性内核外,NPI构架还包括一个内嵌的可学习程序的键值内存。这种程序-内存的结构对于程序的持续学习和重用是极其重要的。
图6:NPI与序列到序列LSTM对不同长度的序列进行排序的准确率对比,最长序列含有20个数组。
NPI有三个拥有学习能力的部件:一是任务未知的递归内核,二是持续键值程序内存,三是基于特定领域的编码器,这个编码器能在多个感知上有差异的环境中让单一的NPI提供截然不同的功能。通过合成低层程序表达高层程序,NPI减少了样本复杂性,同时比序列到序列的LSTM更容易泛化。通过在既有程序的基础上进行建构,程序内存能高效学习额外的任务。NPI也可以利用环境缓存计算的中间结果,从而减轻递归隐藏单元的长期存储负担。
不过,当时DeepMind团队并未使用无监督学习的方法的训练NPI,其模型也只能学习合成若干种简单的程序,包括加法、排序和对3D模型进行
本文来源:不详 作者:佚名