程序员以及其他类型的IT工作无疑是当前最热门的工作。然而,这种趋势可能不会一直持续下去。
美国橡树岭国家实验室的一些专家预测,到2040年,AI技术将会强大到足以替代程序员,AI编写软件将比人类程序员更好、更快。换句话说,软件编写的软件比人类编写的更好。
这是怎么发生的?AI能真正学会如何做需要高度创造性的智力工作吗?毕竟创造性一直被认为是人类特有的。AI能学到的东西会比我们教它的更多吗?
利用人工神经网络制定编写规则
人工神经网络是一种试图模仿人类大脑学习机制的技术。它启发自真实的神经网络,并且部分地模拟真实的神经网络。我们可以试着把人类的神经系统想象成一台非常强大的计算机。
在上面这幅图中,每个神经元都有一个输入和输出,输入实际上是一系列信号的加权组合。每个信号都有自己的数学上可表达的影响,信号的总和决定了输出。人类神经网络的特殊之处在于,它们能够基于学习和经验进行适应和改变,这意味着相同的输入并不总是产生相同的输出。
这是通过改变不同脉冲的优先次序和修改神经元之间的物理连接来完成的。这些变化通过学习算法和成本函数来指定,以提高人类适应新环境和优化未来行为的能力。
研究人工神经网络的科学家和工程师试图复制这种机制,并在软件开发中实施。具体地说,这意味着软件不会以传统的方式编写,比如一系列的“if… then”规则。从理论上讲,我们可以想象通过渐进式学习和优化的过程,人工神经网络能够学习如何制定(或“编写”)规则,从而得到比人类编写的更好的输出。在AI科学中,这被称为深度学习,通常在一定程度上依赖人类的反馈。
以下是几个可以代替程序员的应用程序。
Karpathy:利用循环神经网络自动生成代码
早在2015年,当时是斯坦福大学计算机科学博士生的Andrej Karpathy就使用循环神经网络来生成代码。他使用了一个Linux存储库(所有的源文件和 headers files),将它合并成一个巨大的文档(超过400 MB的代码),并用这些代码来训练RNN。
他让系统跑了一晚上。第二天早上,他得到了这个:
AI生成的代码样本
从字面上来看,AI生成的代码包含函数和函数装饰。它有参数、变量、循环和正确的缩进形式。括号有开括号和收括号,甚至还有注释。
在这些代码中,AI当然也犯了一些错误。有时变量从未被使用。其他时候,有些变量没有更早定义。但Karpathy对这个结果感到满意。
“这些代码总体上看起来非常棒。当然,我不认为它会编译,但是当你浏览生成的代码时,它感觉非常像一个巨大的C代码库,”Karpathy在他的博客中写道。
这个项目在GitHub上可以找到。它使用了Torch7 的深度学习库。这里有Karpathy得到的整个输出文件:
https://github.com/karpathy/char-rnn
DeepCoder
微软和剑桥大学的研究人员开发了一种可编写代码的机器学习系统,被称为DeepCoder,它具有学习的能力。
DeepCoder可以在庞大的代码库中进行检索,然后编写有效的代码。DeepCoder 所用的技术叫程序合成( program synthesis),通过截取已有软件的代码行来组成新的程序。不得不承认,当下很多程序员也是这样做的。通过学习一系列代码片(code fragment)的输入和输出数据,DeepCoder 能自动摘取出对目标任务有用的代码片。
DeepCoder 可以在一秒钟之内写出能够跑通的程序。随着 DeepCoder 的编程经验增加,其分辨有用及无用的代码片的能力增加,其生成程序的速度将会越来越快。
这并不意味着AI是在窃取代码,或者从现有软件复制粘贴代码,或者在互联网上搜索解决方案。DeepCoder的作者期望它将在不久的将来参与编程竞赛。
由DeepCoder创建的域特定语言(DSL)示例程序
DeepCoder 的创造者之一,在剑桥大学参与微软研究项目的 Marc Brockschmidt 表示:“该程序最终可以让非编程人员通过向计算机描述自己的程序构想来获得想要的程序,系统会自动写就。”
你可以在这里找到DeepCoder的文档:
https://openreview.net/pdf?id=ByldLrqlx
AI编写Python代码
一名法国工程师以BenjaminTD的昵称发表了一篇博客文章,解释了自己是如何“教一个AI系统如何用Python代码编写Python代码”。
他使用了长短期记忆网络(LSTM),这是最流行的递归神经网络结构之一。他用大量的Python代码(使用Pandas、Numpy、Scipy、Django、Scikit-Learn、PyBrain、Lasagne、Rasterio等库)来“喂给”这个网络。组合文件大小有27MB。
然后,AI生成了自己的代码。下面是定义初始化:
...使用布尔表达式:
...并创建数组:
如果仔细观察数组,你会发现有一个语法错误。BenjaminTD的代码远非完美,但是他认为,对于一个只是从阅读示例代码中学习的网络来说,这些代码看上去不错。
AI Programmer
2017年 ,来自彭博和英特尔实验室的研究人员号称实现了首个能够自动生成完整软件程序的 AI 系统 “AI Programmer”。
AI Programmer 利用机器学习中的遗传算法,模拟复杂的指令。虽然现在 AI Programmer 生成的程序,复杂程度与人类新手程序员编写的结果相当。但研究人员认为,AI Programmer 编写的程序完全可以超越传统范畴,不受人类时间和智慧的局限。
AI Programmer 的软件架构。从图中可见,由人类驱动的部分非常少,只需要在开始输入指令,最后接收适用于某项任务的函数即可,剩下部分全部由机器完成。
研究人员表示,他们能用 AI Programmer 生成很多软件程序。下表是所生成程序的名单。
潜在的威胁:不确定机器能做到什么程度
现在已经有程序可以代替人类了,但随之而来的问题是,如果机器能够自己学习,他们能学到多少?极限在哪里?这个优化的过程真的能教软件比人更好地写代码吗?网站开发机构和软件公司是否会利用AI驱动的程序为自己编写代码,以节省资金?事实是,我们还不确定机器能做到什么程度。
但是,我们知道人工智能已经在影响IT行业的一些工作。印度软件咨询和外包公司Wipro Ltd.自去年6月以来使用AI平台Holmes来维护软件,其3000多名工程师因此担心他们的工作。更不用说,我们经常使用的许多技术都采用机器学习技术——从语音识别到机器翻译。
AI和人类程序员将在编程中扮演互补的角色
人工神经网络的一个问题是它们使用的算法是“黑盒”,这意味着它们内部的工作方式太过复杂。特斯拉的AI总监Andrej Karpathy认为,对于大多数应用领域,我们永远无法得到完全由AI驱动的100%精确的模型。他认为AI系统的准确率将超过90%,但它们并不完美,它们偶尔会以出人意料的方式失败。
一般来说,有监督和有人控制的深度学习系统比无监督的系统表现更好。这意味着,即使是最复杂的AI软件也需要人类的参与和反馈,以学习和适应新的环境。这个事实为未来人工智能和人类程序员之间的紧张关系提供了一种解决方案——共同工作。
我们可以肯定的是,在不久的将来,AI和人类程序员将在编程中扮演互补的角色。AI的工作可能是处理重复性的、耗时的任务,这些任务需要机器优异的精确性。机器可以避免由于人为因素而产生的语法错误或设计错误。例如,AI可以提供帮助的一种方式是自动完成功能,程序员只编写一小部分代码,然后AI识别程序员的意图,并完成剩下的代码,从而为人类节省大量的工作。
即使机器能够完全代替今天程序员所做的工作,但这并不意味着它们不需要人类的帮助。但程序员必须将注意力从编写程序转移到监控AI的性能,并将数据“喂给”AI。正如Karpathy所指出的,程序员可能会成为一种数据加持者——收集、整理和分析数据,然后将它们用作AI的输入,然后让AI完成剩下的工作。
原文发布时间为:2018-05-29
本文作者:肖琴
本文来自云栖社区合作伙伴新智元,了解相关信息可以关注“AI_era”。