博舍

什么是人工智能 (AI) 人工智能 自动编程系统设计

什么是人工智能 (AI)

虽然在过去数十年中,人工智能(AI)的一些定义不断出现,但JohnMcCarthy在2004年的文章 (PDF,127KB)(链接位于IBM外部)中给出了以下定义:"它是制造智能机器,特别是智能计算机程序的科学和工程。AI与使用计算机了解人类智能的类似任务有关,但不必局限于生物可观察的方法"。

然而,在这个定义出现之前数十年,人工智能对话的诞生要追溯到艾伦·图灵(AlanTuring)于1950年出版的开创性作品"计算机器与智能"(PDF,89.8KB)(链接位于IBM外部)。在这篇论文中,通常被称为“计算机科学之父”的图灵提出了以下问题:“机器能思考吗?” 他在这篇文章中提供了一个测试,即著名的“图灵测试”,在这个测试中,人类询问者试图区哪些文本响应是计算机做出的、哪些是人类做出的。虽然该测试自发表之后经过了大量的审查,但它仍然是AI历史的重要组成部分,也是一种在哲学中不断发展的概念,因为它利用了有关语言学的想法。

StuartRussell和PeterNorvig随后继续发表了“人工智能:一种现代方法 ”(链接位于IBM外部),成为AI研究方面的重要教材之一。在这本书中,他们深入探讨了AI的四个潜在目标或定义,基于理性、思考和行动来区分计算机系统:

人类方法:

像人类一样思考的系统像人类一样行动的系统

理想方法:

理性思考的系统理性行动的系统

艾伦·图灵的定义可归入"像人类一样行动的系统"类别。

以最简单的形式而言,人工智能是结合了计算机科学和强大数据集的领域,能够实现问题解决。它还包括机器学习和深度学习等子领域,这些子领域经常与人工智能一起提及。这些学科由AI算法组成,这些算法旨在创建基于输入数据进行预测或分类的专家系统。

目前,仍有许多围绕AI发展的炒作,市场上任何新技术的出现都会引发热议。正如Gartner在其hypecycle技术成熟度曲线(链接位于IBM外部)中指出的那样,自动驾驶汽车和个人助理等产品创新遵循“一个典型的创新周期,从欲望膨胀到期望幻灭、到最终了解创新在市场或领域中的相关性和作用。”正如LexFridman在2019年麻省理工学院演讲中指出的那样(01:08:15)(链接位于IBM外部),我们正处于欲望膨胀高峰期,接近幻灭的谷底期。 

随着对话围绕AI的伦理道德展开,我们可以开始看到幻灭谷底初见端倪。如想了解更多关于IBM在AI伦理对话中的立场,请阅读这里了解更多信息。

昝涛:人工智能如何自动编程

人工智能如何自动编程

知名风险投资人MarcAndreessen说过:”Softwareiseatingtheworld.“,事实上现在确实如此。如今我们每个人的手机上少则安装了五六个,多则几十个App。这些App都是由软件工程师通过一行一行代码写出来的。而写代码涉及到大量繁琐的细节,或则说有很多重复性的工作,我们能否用人工智来优化和改进呢?

我一直对物理有着很深的爱好,高中通过物理奥赛保送到中国科学技术大学计算机系,之后到日本国立情报学研究所读了计算机博士。其实,我是一个闲不住的人,在读书之余还尝试各种创业,做过互联网策展媒体石子儿,做过二次元社交好奇喵,最终沉下心来做了现在的事业Fundebug。

Fundebug为应用提供实时的的bug监控服务,保障产品的质量。上线一年半,注册团队超过1万家,处理数据超过6个亿。我们Fundebug的目标是帮助软件工程师更好的修复bug,甚至让软件工程师不再需要修复bug。那就是我们实现自动修复bug,甚至自动编程的目标。那么到底如何实现自动编程呢

我们先来回顾一下它的发展。现在人工智能的应用可以说已经是非常广泛了,像语音识别,比如今天的搜狗同传,它可以自动的将我现在讲的中文实时翻译成英文。自动驾驶现在已经上路测试了,人脸识别准确率有了极大的提升,乘坐高铁已经不用出示身份证,刷脸就可以。所以在各行各业,人工智能的技术已经有了广泛的应用。那么在编程领域又是怎样的呢?

国外一家叫做UIZard的公司发布了一项新技术叫做pix2code,通过深度学习技术能够将设计师画的草图直接生成网页代码。其实我们软件工程师在写软件的时候,首先要由设计师去把整个软件的外形设计出来,而且非常精确,长宽边距等等标注得非常清楚,再让工程师用代码实现出来。这个工作实际上是非常繁琐、枯燥的。实际上这部分工作如今可以用机器替代了,那么软件工程师只要关注逻辑层面的事情,而不是这些UI的细节。

我们再来看另一个,微软最新的研究成果DeepCoder,让机器自动写程序。通过定义一个特殊的语言,然后给机器很多样本数据,输入是什么样子,输出是什么样子。然后机器就自动把这段程序给学习出来了。这个可以说是一个很大的突破,机器已经能够一定程度上自动写程序了。

其实我认为要真正到实际应用,依然有两个难点:1.这是一个特殊构造的语言,而现实中使用的语言要复杂得多;2.通过大量的示例来学习出来的。要去构造大量的例子,对于现实的编程是不可行的。

其实人工智能,从字面最直观的理解就可以看出:是让机器像人一样智能。那么我们人到底是如何学习的?我认为其中有很重要的一个点,那么就是从错误中学习,不断改进,不断提升。我们在读书的时候,很多人可能都有准备一个错题本,将平时做错的题目记下来,不断地温习巩固,通过掌握易错题来提升能力。

其实在深度学习中也有这样的概念,backpropagation,通过反向的回馈来不断地调整,来提升模型。我们可以设想一下,对于编程这个事情,是不是也可以从bug中学习,从bug中提升自己呢?我的答案是可以的。为什么这样说呢?

其实再厉害的工程师,写出来的第一个版本的代码绝对不可能是百分之百正确,没有问题的。他一样要反复的测试,发现遗漏的状况,把它修复,最终得到一个高质量的程序。机器和人一样,要实现自动编程,它也不会一次就写出100%正确的代码。一样会有bug,一样要改bug,最终达到一个正确率非常高的代码。

在未来,工程师不再是写代码,而是写AI,工程师要经历一个coder到AIer的转变;在未来,工程师是写人工智能,人工智能负责生成代码、测试代码、修复代码;在未来,一定是人与机器相互合作的过程。工程师做更加抽象、更加耗费脑力的事情,而把这些简单重复的工作让机器去做。

而这一切最根本的基础就是我们的机器要能够自动去修复bug。只要通过不断的修复bug,不断地改进和迭代,才可能让机器生成高质量的代码。

昝涛

Fundebug创始人

Fundebug由留学日本的昝涛博士创立,提供全平台(网站、小程序、APP、服务器)的BUG实时监控服务。Fundebug独创了全球领先的可视化场景复现技术,可以大幅度提高修复BUG的效率。自从2016年底正式上线,Fundebug累计处理了6亿+错误事件,目前付费用户有Google中国、360、金山软件、荔枝FM、艾瑞咨询、百姓网等众多明星企业。Fundebug致力于打造下一代编程平台,通过研发BUG自动修复和机器自动化测试,最终实现人工智能自动编程的目标。

返回搜狐,查看更多

让人工智能自己写代码实现自我编程的颠覆性变革

许多人对AI的想象都停留在应用层,而忽视了技术层AI也将产生颠覆——让机器自己编程。谷歌大脑、DeepMind、Facebook甚至Viv都在这一方向上努力,发表了一系列研究论文。VentureBeat作者LucasCarlson认为,机器自我编程其实离我们并不遥远,将很快实现。一旦机器做到这一步,在软件发挥重大作用的所有领域,将会经历一场颠覆性的变革。

想象AI的未来是很有趣的:家庭服务机器人、亚马逊的智能家庭中枢(Echo)等设备将走进每家每户,还有无人机快递和更加精准的医学诊断。这些吸人眼球的消费应用充斥着公众的想象,以至于大家都忽视了AI对另一个领域的颠覆——软件本身的发展。

想象一下,如果计算机自己能理解自己,它们可以做些什么?用不了多久,计算机就能做到这件事。并且,我不是在描述遥远的未来,我说的是触手可及的现在,使用时下现有的技术就能达到。

迄今为止,机器学习的专家倾向于聚焦那些为特定任务开发的AI应用,比如人脸识别、自动驾驶、语音识别甚至是搜索。但是,如果这些类似的算法能够在不需要人为帮助、解释或者干预的情况下,理解它们自身的代码结构呢?正如他们理解人类的语言和图像一样。

如果代码开始对自己进行分析、自我修正并提升,且速度比认为的更快,那么技术的突破可能会来得更快。由此带来的可能性是无止境的:医学的进步、更加自然的机器人、更智能的手机、更少bug的软件,更少的银行欺诈等等。

人工智能具有解决软件开发中的一个古老问题的潜力。代码编写或操纵其他代码的能力的概念已经存在了很长时间,一般称为元编程(它实际上起源于20世纪50年代末的Lisp)。它解决的难题,目前都还在人们的想象之中。

但是,现在人工智能让改变发生了。

使用人工智能,计算机能够理解一个软件开发项目从无到有的发展历史过程中的所有代码,并立即改进或者删除单独一行代码中的bug,不管是用什么编程语言。即便是一个缺乏经验的或者中等水平的程序员都能讲清楚让计算机自我编程的原理。由此,一个癌症项目的研究可能几天或者几个月就能完成,而不需要花费好几年的时间,这将带来显著的进步。

今天,这项最终将会带来颠覆性改变的技术尚处在萌芽时期,但是,它已经开始生长。比如,谷歌的TensorFlow机器学习软件,让每位程序员都能将神经网络直接融入到所开发的APP中,让APP拥有识别图片中的人和物体的能力。要把这些想法变成现实,你将不再需要一个博士学位。让业余人士也可以修正程序,这可能会成为AI发展历史上最大的突破。

谷歌的目标:大部分代码都不需要人为编写

国外著名科技记者StevenLevy今年6月在他刊于BackChannel的文章《谷歌如何将自己重塑为一家“AI为先”的公司》(HowGoogleIsRemakingItselfAsA“MachineLearningFirst”Company)中提到,谷歌大脑负责人JeffDean表示,随着他和团队对机器学习了解得更多,他们利用机器学习的方法也更加大胆。“以前,我们可能在系统的几个子组件中使用机器学习,”JeffDean说:“现在我们实际上使用机器学习来替换整套系统,而不是试图为每个部分制作一个更好的机器学习模型。”Levy在文中写道,如果现在让JeffDean改写谷歌的基础设施,大部分代码都不会由人编码,而将由机器学习自动生成。

谷歌的代码bug预测系统,使用一个得分算法,随着commits变得越来越旧,它们的价值越来越小。

认为计算机自我编程离我们还很远?如果我告诉你,一些大公司,比如谷歌,已经开始在内部的项目管理系统中尝试使用这一概念,你可能会觉得震惊。但是,谷歌确实已经开发了一个bug预测程序,使用机器学习和统计分析,来判断某一行代码是否存在瑕疵。谷歌工程师、W3C的联合主席IlyaGrigorik也开发了一个开源版本的bug预测工具,目前已被下载2万次。

IlyaGrigorik,图片来自twitter

另一个例子来自Siri的继承者——Viv。Wired最近的一篇报道中写道,Viv不仅使用一系列的自然语言处理来实现语言识别,还基于英语词汇建立了复杂的自适应性计算机程序。代码自己写代码(Codewritingcode)。由于被写入的代码是经过Viv的开发人员自己训练和专门化的,所以这里的“写代码”并不是我们通常所说的写代码的能力,但这确实是一个大的进步。

在这个方向上,另一个大的进步来自非专业领域。EmilSchutte曾有过一句非常具有挑衅性的言论:厌倦了写代码?我也是!让StackOverflow来做这件事吧。他分享了一个例子来证明这一概念,从StackOverflow的大型编程数据库中提取完整的工作代码,来提供完整的功能代码块,但是,这样得到的模块还是基于已经写好的代码。

DeepMind的尝试

实际上更早之前,DeepMind团队开发了一个“神经编程解释器”(NPI),能自己学习并且编辑简单的程序,排序的泛化能力也比序列到序列的LSTM更高。描述这项研究的论文《神经程序解释器》(NeuralProgrammer-Interpreters),被评选为ICLR16最佳论文。

NPI是一种递归性的合成神经网络,能学习对程序进行表征和执行。NPI的核心模块是一个基于LSTM的序列模型,这个模型的输入包括一个可学习的程序嵌入、由调用程序传递的程序参数和对环境的特征表征。这个核心模块的输出包括,一个能指示接下来将调用哪个程序的键、一个经典算法程序的参数,以及一个能指示该程序是否该停止的标记。除了递归性内核外,NPI构架还包括一个内嵌的可学习程序的键值内存。这种程序-内存的结构对于程序的持续学习和重用是极其重要的。

NPI与序列到序列LSTM对不同长度的序列进行排序的准确率对比,最长序列含有20个数组。

NPI有三个拥有学习能力的部件:一是任务未知的递归内核,二是持续键值程序内存,三是基于特定领域的编码器,这个编码器能在多个感知上有差异的环境中让单一的NPI提供截然不同的功能。通过合成低层程序表达高层程序,NPI减少了样本复杂性,同时比序列到序列的LSTM更容易泛化。通过在既有程序的基础上进行建构,程序内存能高效学习额外的任务。NPI也可以利用环境缓存计算的中间结果,从而减轻递归隐藏单元的长期存储负担。

不过,当时DeepMind团队并未使用无监督学习的方法的训练NPI,其模型也只能学习合成若干种简单的程序,包括加法、排序和对3D模型进行正则化转换。不过,单一NPI能学会执行这些程序以及所有21个关联子程序。

田渊栋对计算机自我编程的研究综述

Facebook人工智能实验室研究员田渊栋在他提交ICLR17的文章中,就有一篇研究了这方面的问题。

论文摘要:构建能够通过自动推断(infer),将一组输入映射到输出的计算机程序仍是一个开放且极具挑战性的问题。由于在可能的程序上存储着巨大的搜索空间,并且需要处理高阶逻辑(如for循环或递归),所以程序进行归纳(induction)任务是很困难的。在本文中,我们使用HierarchicalGenerativeConvolutionalNeuralNetworks(HGCNN),自动根据输入/输出对生成程序。HGCNN以层次式预测候选代码串,由此可以使用标准的搜索技术来构造程序。应当注意,该模型仅使用随机生成的程序进行训练,因此可被视为一种无监督学习的方法。我们证明,文中所提出的方法可以生成程序,从简单的Swap到更复杂的循环和分支(比如找到一串数组中的最大值)。我们还展示了使用该方法,在实现诸如BubbleSort等嵌套循环程序时取得的不错结果。将LSTM等作为比较的基础,新方法的预测精度有了显著的提高。

田渊栋在《深度学习没有解决的理论问题》里表示,这篇论文将算法的输入输出的结果抽取特征后,送入卷积神经网络文献中,再层次式地生成图像的经典框架,生成一张二维图,每一行就是一行代码,或者更确切地说,是代码的概率分布。有了好的分布,就可以帮助启发式搜索找到正确的程序。而神经网络的训练数据,则由大量的随机代码、随机输入及随机代码执行后得到的输出来提供——基本不需要人工干预,算是一种非监督的办法。

同时,田渊栋还在后面补充:“等到今年的ICLR的文章一公布,随便翻一翻就找到了七篇计算机自动生成(或者自动优化)代码的文章。打开一看,引论里全在描述同样的动机。”

那这个动机就是什么?

“让计算机自己写代码”。

一旦机器可以理解自己,一场颠覆性变革将会发生

随着越来越多的这类技术变得成熟,机器将会在各种各样的任务上超越人类。那么,机器为什么不能理解自己呢?我想这只是时间的问题。并且,一旦机器做到这一步,你会发现,在软件发挥重大作用的所有领域,将会经历一场颠覆性的变革。

人工智能的核心挑战之一便是教会机器学习新的程序、从既有程序中快速地编写新程序,并自动在一定条件下执行这些程序以解决广泛种类的任务。在各种人工智能问题中,程序以不同的面貌出现,包括运动行为、图像转换、强化学习策略、经典算法和符号关系等等。

现在,机器已经能够自动执行越来越多的程序,而且现在开源代码这么多,如果把历史上的代码都学习一下,很多编程场景应该是可以自动化的,至少可以大大减少人工。人类程序员尤其是初级程序员的工作被取代的可能性,也越来越大。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇