2017年2月,微软研究院与剑桥大学宣布他们合作开发了一种新的算法,名为DeepCoder——现在看来可能跟算法的名称有关,因为Coder也是程序员的昵称,有读者以为机器程序员来了,传出了“DeepCoder能够从网络论坛和开源社区中复制代码并加以组合来生成新的程序”的说法。 真是这样吗,程序员真的就要被取代了吗?
显然不是。 如同作者在论文所说,这是一种能根据问题输入输出自动编写解题程序的算法:目前业界使用的编程语言对于机器算法来说还是太难掌握了,DeepCoder使用的编程语言是一种原创的、极其精简的语言,其中只有整数数据类型,内置了基本的四则运算以及一些基本函数,例如排序,或者对数组中的元素依次执行某种操作等等。此外,DeepCoder完成的程序生成是一种叫做Inductive Program Synthesis(IPS,归纳式程序合成)的特例;在这种程序生成方法中,机器通过观察输入输出的样例组合来生成一个“与当前样例数据行为一致”的程序。 这就是说,机器连问题的描述都不看,离取代程序员还远着呢,像这样:
不过,尽管原理是如此简单,DeepCoder还是展现了惊人的解题能力:它使用一种非常简单的DSL语言,这种语言允许机器将小的语句和程序块逐个拼接成更大的部分(类似于微软的LINQ语言),这样一来,机器在程序生成的每一步中,只需要考虑下一行执行一个什么操作而不用考虑括号如何匹配、如何安排分支代码这样的问题,也不用自带游标卡尺,大大简化了机器的思考过程。 此外,在DeepCoder出现以前的做法(是的,解题机早已存在),更多采用“枚举”的方法依次验证所有程序,就是由“所有程序”组成一个“程序空间”,解题机在这个空间里执行搜索任务,这样做的一个问题在于,枚举法会执行大量的重复操作,生成无数毫无道理的程序。 “……前三行和第四行的前四个字都是表达生命对宏伟宇宙的惊叹,最后一个字是诗眼,它是诗人在领略了宇宙之浩渺后,对生命在无限时空中的渺小发出的一声无奈的叹息。”——刘慈欣《诗云》 与此形成对比,DeepCoder并不逐一枚举,而是使用神经网络来辅助搜索过程。在此算法的框架中,神经网络担当了两个任务:一是观察输入输出之间的关系,例如输入是否全是负数,输出是否从小到大有序等等,将其转换成机器理解的一组特征。这一做法受到了前人工作的启发,之前的做法是用手工编写方式列举这些规则,而DeepCoder则使用神经网络将这一过程自动化。二是在通过观察了解数据的特征之后,以特征为输入,通过一个神经网络来预测程序中可能有哪些语句。这个预测过程产生的分布会改变搜索程序选择不同语句的优先级,从而避免生成重复而无意义的程序,使得解题效率大大提高。 目前来看,包括DeepCoder在内的现有程序生成算法还不能独立处理较为复杂的问题。但从另一方面看,既然机器已经能够完成简单的编程任务,那么我们就可以利用它来辅助程序员的工作,或者帮助普通计算机用户来自动化一些工作流程。
DeepCoder解题过程示意图:每行代表一个程序,每列代表一种语句。红色越深代表其神经网络给出的预测值越高;绿色代表最终搜索得出的正确结果。 实现程序自动编写程序是通用人工智能领域学者们一个共同的梦想,也是我们机器学习组的一个研究方向。与其他AI研究领域类似,在这一领域的探索工作中,存在两种不同的思路,分别是符号派(Symbolic Method)和连接派(Connectionism)。 (责任编辑:本港台直播) |