如果代码开始对自己进行分析、自我修正并提升,且速度比认为的更快,那么技术的突破可能会来得更快。由此带来的可能性是无止境的:医学的进步、更加自然的机器人、更智能的手机、更少bug的软件,更少的银行欺诈等等。
人工智能具有解决软件开发中的一个古老问题的潜力。代码编写或操纵其他代码的能力的概念已经存在了很长时间,一般称为元编程(它实际上起源于20世纪50年代末的Lisp)。它解决的难题,目前都还在人们的想象之中。
今天,这项最终将会带来颠覆性改变的技术尚处在萌芽时期,但是,它已经开始生长。比如,谷歌的TensorFlow机器学习软件,让每位程序员都能将神经网络直接融入到所开发的APP中,让APP拥有识别图片中的人和物体的能力。要把这些想法变成现实,你将不再需要一个博士学位。让业余人士也可以修正程序,这可能会成为AI发展历史上最大的突破。
国外著名科技记者 Steven Levy 在他刊于 BackChannel 的文章《谷歌如何将自己重塑为一家“AI 为先”的公司》(How Google Is Remaking Itself As A "Machine Learning First" Company)中提到,谷歌大脑负责人 Jeff Dean 表示,随着他和团队对机器学习了解得更多,他们利用机器学习的方法也更加大胆。“以前,我们可能在系统的几个子组件中使用机器学习,”Jeff Dean 说:“现在我们实际上使用机器学习来替换整套系统,而不是试图为每个部分制作一个更好的机器学习模型。”Levy 在文中写道,如果现在让 Jeff Dean 改写谷歌的基础设施,大部分代码都不会由人编码,而将由机器学习自动生成。
谷歌的代码bug预测系统,使用一个得分算法,随着commits变得越来越旧,它们的价值越来越小。
开源地址:https://github.com/igrigorik/bugspots
Ilya Grigorik ,图片来自twitter
另一个例子来自Siri 的继承者——Viv。Wired 最近的一篇报道中写道,Viv 不仅使用一系列的自然语言处理来实现语言识别, 还基于英语词汇建立了复杂的自适应性计算机程序。代码自己写代码(Code writing code)。由于被写入的代码是经过Viv的开发人员自己训练和专门化的,所以这里的“写代码”并不是我们通常所说的写代码的能力,但这确实是一个大的进步。
在这个方向上,另一个大的进步来自非专业领域。Emil Schutte 曾有过一句非常具有挑衅性的言论:厌倦了写代码?我也是!让Stack Overflow来做这件事吧。他分享了一个例子来证明这一概念,从Stack Overflow 的大型编程数据库中提取完整的工作代码,来提供完整的功能代码块,但是,这样得到的模块还是基于已经写好的代码。
实际上更早之前,DeepMind 团队开发了一个“神经编程解释器”(NPI),能自己学习并且编辑简单的程序,排序的泛化能力也比序列到序列的 LSTM 更高。描述这项研究的论文《神经程序解释器》(Neural Programmer-Interpreters),被评选为 ICLR16 最佳论文。
NPI 是一种递归性的合成神经网络,能学习对程序进行表征和执行。NPI 的核心模块是一个基于 LSTM 的序列模型,这个模型的输入包括一个可学习的程序嵌入、由调用程序传递的程序参数和对环境的特征表征。这个核心模块的输出包括,一个能指示接下来将调用哪个程序的键、一个经典算法程序的参数,以及一个能指示该程序是否该停止的标记。除了递归性内核外,NPI 构架还包括一个内嵌的可学习程序的键值内存。这种程序-内存的结构对于程序的持续学习和重用是极其重要的。
图 6:NPI 与 序列到序列 LSTM 对不同长度的序列进行排序的准确率对比,最长序列含有20个数组。
NPI 有三个拥有学习能力的部件:一是任务未知的递归内核,二是持续键值程序内存,三是基于特定领域的编码器,这个编码器能在多个感知上有差异的环境中让单一的 NPI 提供截然不同的功能。通过合成低层程序表达高层程序,NPI 减少了样本复杂性,同时比序列到序列的 LSTM 更容易泛化。通过在既有程序的基础上进行建构,程序内存能高效学习额外的任务。NPI 也可以利用环境缓存计算的中间结果,从而减轻递归隐藏单元的长期存储负担。
不过,当时 DeepMind 团队并未使用无监督学习的方法的训练 NPI,其模型也只能学习合成若干种简单的程序,包括加法、排序和对 3D 模型进行正则化转换。不过,单一 NPI 能学会执行这些程序以及所有 21 个关联子程序。
Facebook 人工智能实验室研究员田渊栋在他提交 ICLR17 的文章中,就有一篇研究了这方面的问题。
论文摘要:构建能够通过自动推断(infer),将一组输入映射到输出的计算机程序仍是一个开放且极具挑战性的问题。由于在可能的程序上存储着巨大的搜索空间,并且需要处理高阶逻辑(如 for循环或递归),所以程序进行归纳(induction)任务是很困难的。在本文中,我们使用 Hierarchical Generative Convolutional Neural Networks(HGCNN),自动根据输入/输出对生成程序。HGCNN 以层次式预测候选代码串,由此可以使用标准的搜索技术来构造程序。应当注意,该模型仅使用随机生成的程序进行训练,因此可被视为一种无监督学习的方法。我们证明,文中所提出的方法可以生成程序,从简单的 Swap 到更复杂的循环和分支(比如找到一串数组中的最大值)。我们还展示了使用该方法,在实现诸如 Bubble Sort 等嵌套循环程序时取得的不错结果。将 LSTM 等作为比较的基础,新方法的预测精度有了显著的提高。
田渊栋在《深度学习没有解决的理论问题》里表示,这篇论文将算法的输入输出的结果抽取特征后,送入卷积神经网络文献中,再层次式地生成图像的经典框架,生成一张二维图,每一行就是一行代码,或者更确切地说,是代码的概率分布。有了好的分布,就可以帮助启发式搜索找到正确的程序。而神经网络的训练数据,则由大量的随机代码、随机输入及随机代码执行后得到的输出来提供——基本不需要人工干预,算是一种非监督的办法。
同时,田渊栋还在后面补充:“等到今年的 ICLR 的文章一公布,随便翻一翻就找到了七篇计算机自动生成(或者自动优化)代码的文章。打开一看,引论里全在描述同样的动机。”
那这个动机就是什么?
“让计算机自己写代码”。
人工智能的核心挑战之一便是教会机器学习新的程序、从既有程序中快速地编写新程序,并自动在一定条件下执行这些程序以解决广泛种类的任务。在各种人工智能问题中,程序以不同的面貌出现,包括运动行为、图像转换、强化学习策略、经典算法和符号关系等等。
现在,机器已经能够自动执行越来越多的程序,而且现在开源代码这么多,如果把历史上的代码都学习一下,很多编程场景应该是可以自动化的,至少可以大大减少人工。人类程序员尤其是初级程序员的工作被取代的可能性,也越来越大。
来源:新智元
扫描下面二维码
或长按二维码识别
“有渔”编程体验课免费上!
快来报名体验吧~
扫描二维码 即刻关注哦
▼ ▼ ▼