机器学习有望从根本上改变软件开发的本质,这也许是自FORTRAN和LISP被发明以来的第一次。 它对我们几十年来的编程范式提出了第一个真正的挑战。 这些变化对数百万正在实施软件开发的人而言,会意味着什么? 我们是否会看到失业和裁员,或者会看到编程演变成不同的东西,也许会是一种更关注于满足用户的东西?
自20世纪70年代以来,我们已经或多或少地构建了软件。 我们有高级语言,低级语言,脚本语言以及用于构建和测试软件的工具,但这些工具需要我们做的事情没有发生太大变化。 我们的语言和工具比50年前要好得多,但它们本质上是一样的。我们仍然有着代码编辑器。这些编辑器变得更花哨了:他们有彩色的高亮,变量名补全,它们有时可以帮助我们完成重构等任务,但他们仍然是emacs和vi的后代。 面向对象代表了一种不同的编程风格,而不是某种本质上而言“全新”的东西 —— 当然,函数式编程可以一直追溯到50年代(除非我们不知道它曾经被叫作这个名字)。 我们可以做得更好吗?
我们将专注于机器学习而不是人工智能。 机器学习曾经被称为“AI管用的那一部分”,但更重要的是,“机器学习”这种提法避开了类似“通用智能”这种叫法。我们不讨论针对某个待解决的问题,设计解决方案,并自己实现该解决方案的系统。 这样的系统不存在,并且可能永远不存在。 我们需要人类才能做到这一点。 机器学习可能只比模式识别多一点点,但我们已经看到模式识别可以完成很多工作。 实际上,手工编码的模式识别是我们当前工具集的核心:这真的是现代优化编译器所正在做的。
我们还需要设定我们的期望。 麦肯锡估计“使用现有技术,只有不到5%的职业可以完全自动化。 然而,大约60%的职业的工作活动中,具有30%或更多的组成部分能够被自动化。” 软件开发和数据科学不会成为完全被自动化的职业之一。 但优秀的软件开发人员一直在寻求对于繁琐,重复的任务的自动化; 这也刚好是计算机的用途。 毫无疑问,软件开发本身将日益变得可以被自动化。
这不是一个激进的新愿景。 因为我们在过去的半个世纪里持续的为了自动化工具而努力,因此这并不激进。 编译器对编写机器代码的过程进行了自动化。 脚本语言通过将更大,更复杂的程序粘合在一起来自动执行许多枯燥无味的任务。 软件测试工具,自动部署工具,容器和容器编排系统,这些都是为了对开发、部署、管理软件系统的过程进行自动化的工具。 这些都没有利用机器学习,但这肯定是下一步它们要做的。
机器学习会不会像Pete Warden和Andrej Karpathy所说的那样吞并了软件?毕竟,“软件吞噬世界”是一个日益抽象和普遍化的过程。 笔记本电脑,手机或智能手表可以取代收音机,电视机,报纸,弹球机,锁和钥匙,电灯开关以至于更多物品。 所有这些技术都是可能的,因为我们将计算机视为通用机器,而不仅仅是数字计算器。
从这个角度来看,很容易将机器学习想象成下一个抽象层次,这是我们迄今为止发现的最通用的问题解决工具。 当然,神经网络已经证明了它们可以执行许多特定任务:能够构建一组训练数据的几乎任何任务都可以。 Karpathy乐观地表示,对于许多任务而言,收集数据比明确地编写程序更容易。 对于一些非常有趣且非常困难的程序,他无疑是正确的:收集围棋或国际象棋的训练数据很容易(各种级别的玩家已经记录了超过150年的游戏),但很难写一个明确的程序成功地玩这些游戏。 因此,当您不知道如何编写软件,但您可以收集数据时,机器学习是一种选择。 另一方面,数据收集并不总是那么容易。 我们甚至无法设想自动标记图片的程序,直到像Flickr,Facebook和Google这样收集了数十亿张图片的网站,而且其中许多图片已被人类标记过。 对于像人脸识别这样的任务,我们不知道如何编写软件,并且很难收集数据。 对于其他任务,例如计费,可以很容易地根据一些简单的业务规则编写程序。 很难想象收集训练机器学习算法所需的数据 – 但是如果你能够收集数据,你编写的程序将更好地适应不同的情况,还能够检测异常,这一点当“将人类纳入软件迭代的循环”时,尤其如此。
正在代替代码的机器学习
机器学习已经使代码更高效:Google的Jeff Dean 报告说,500行TensorFlow代码已经取代了谷歌翻译中的500,000行代码。 虽然代码行数是一个值得质疑的指标,但无论是从编程工作量角度来看还是从需要维护的代码量来看,千倍的减少都是巨大的。不过,更重要的是这段代码是如何工作的:相比于五十万行统计意义上的代码,这是一个经过训练以用于翻译的神经网络。 随着语言的变化和使用场景的变化,随着偏差和偏见被发现,神经网络可以在新数据上被重新审视和重新训练。 它的代码不需要重写。 我们不应低估训练任何复杂度的神经网络的难度,但我们同样也不应低估管理和调试一个巨大代码库带来的问题。
我们已经看到研究表明,神经网络可以通过组合现有模块来创建新程序。 使用对其他程序执行的跟踪,系统得到了训练。 虽然以这种方式构建的程序很简单,但是让单个神经网络能够学习执行几个不同的任务是很重要的,每个任务通常都需要一个单独的程序。
Pete Warden将编程的未来描述为成为一名教师教学的过程:“开发人员必须成为一名教师,一名训练数据的策划人,以及一名结果分析师。”我们发现,这种特性的描述非常具有启发性。 软件开发不会消失; 开发人员必须以不同的方式来思考自己。 你如何构建一个解决一般问题的系统,然后教导该系统解决一个特定的任务? 一方面,这听起来像一个充满风险,充满麻烦的场景,就像拉绳子一样。 但另一方面,它假设我们的系统将变得更加灵活,具有柔韧性和很强的适应性。 Warden设想的未来,更多是关于产出的,而不是关于撰写代码行数的:训练一个通用系统,并测试它是否符合您的要求,包括公平等问题。
Peter Norvig经过更加系统地思考后论证了机器学习可以用来从训练数据中产生短程序(而不是长程序); 优化较大程序的小部分,而不是整个程序; 并且可能(在人类的帮助下)成为初学程序员的更好的辅导员。
数据管理和基础设施
早期的迹象表明,机器学习有着可以胜过传统的数据库索引的性能:它可以学习预测数据的存储位置,或者预测数据是否存在。 机器学习似乎明显更快,并且需要更少的内存,但这里也有着相当大的限制性:当前基于机器学习的工具不包括多维索引,并假设数据库不经常更新。 重新训练比重建传统数据库索引需要更长的时间。 尽管如此,研究人员正在研究如何学习到多维索引,查询的优化,重新训练的性能,以及其他问题。
机器学习已经进入了数据基础设施的其他领域。 数据工程师正在使用机器学习来管理Hadoop,从而可以更快地响应Hadoop集群中的内存不足等问题。 Kafka工程师还报告了如何使用机器学习来诊断问题,从而简化了管理许多配置的问题,这些配置会影响数据库的行为。数据工程师和数据库管理员不会过时,但他们可能需要发展一下他们的机器学习技能。 接下来,机器学习将帮助他们使困难的问题变得更易于管理。 管理数据基础架构这个工作,将不会像正确设置数百个不同的配置参数那样,它会比较像是训练一个系统,使得它在您的典型工作负载上工作良好。
使困难问题变得可管理,仍然是数据科学最重要的问题之一。 数据工程师负责维护数据管线:提取数据,清理数据,特征工程和模型发现。 他们负责在非常复杂的环境中部署软件。 一旦部署了所有这些基础架构,就需要不断监视它,以检测(或防止)资源用尽,并仍然确保模型正确运行。 这些都是非常适合用机器学习处理的任务,我们越来越多地看到像MLFlow这样的软件能够被用于管理数据管线。
数据科学
在自动化编程的早期表现形式中,工具旨在使数据分析师能够执行更高级的分析任务。 Automatic Statistician是一种更新的工具,可自动进行探索性的数据分析,并为时间序列类型的数据提供统计模型,且附有详细说明。
随着深度学习的兴起,数据科学家发现自己需要寻找合适的神经网络架构和参数。 让神经网络学着找到自己架构的过程,也是可能被自动化的。毕竟,神经网络就只是单纯的自动化学习工具:虽然构建神经网络结构仍然需要大量的人力工作,但是不可能手动调整进入模型的所有参数。 一种应用场景是,使用机器学习来探索所有可能的神经网络架构; 正如这篇文章指出的那样,10层网络很容易有10的10次方种可能性。 其他研究人员使用强化学习来让开发神经网络架构变得更加容易。
更进一步:像DataRobot这样的公司可以自动化整个机器学习过程,包括同时使用多个模型,并对结果进行对比。 这个过程被称为“自动化机器学习”; 亚马逊的Sagemaker和Google的AutoML提供基于云的工具,来自动创建机器学习模型。
模型创建不是一劳永逸的事情:数据模型需要不断进行测试和重新调整。 我们开始看到了用于持续监控和模型调整的工具。 这些工具并不是特别新颖:用于A / B测试的老虎机算法已经存在了一段时间,对于许多公司来说,老虎机算法将是强化学习的第一步。 Chatbase是一家Google投资的初创公司, 它负责监控聊天应用程序,以便开发人员了解其性能。 应用程序是否理解用户提出的问题? 是他们真的能够解决问题,还是用户经常要求提供尚未被支持的功能? 这些问题可以通过手动完整地对聊天日志进行浏览和标记问题来解决,但即使创造哪怕一个用于这样任务的机器人也是很难的。Chatbase设想,未来许多机构都会有数十甚至数百个复杂的机器人用于客户服务,咨询台支持,和许多其他应用。
也可以使用机器学习来查找软件中的漏洞。 有些系统会浏览代码,并寻找已知的缺陷。 这些系统不一定需要能够修复代码,也不承诺找到所有潜在的问题。 但是他们可以很容易地对危险的代码进行高亮显示,并且他们可以允许在大型代码库上进行开发的程序员提出诸如“还有类似这样的问题存在于其他地方吗?”之类的问题。
游戏开发者希望通过多种方式进行机器学习。机器学习可以用来制作看起来更逼真的背景和场景吗? 对逼真的场景和图像进行绘制和建模又耗钱,又费时。 目前,非玩家角色(NPC)所做的一切都必须明确编程。 机器学习可以用来模拟NPC的行为吗? 如果NPC可以学习到行为,我们可以期待更有创意的游戏玩法出现。
展望未来
软件开发人员的未来是什么样的? 软件开发是否会同样走上麦肯锡为其他行业预测的演化路径? 在软件开发和数据科学中所涉及的30%的工作是否会被自动化?
也许,尽管这是对情况的简单解读。 毫无疑问,机器学习将以显著的方式改变软件开发。 如果我们现在所认为的“编程”中很大一部分被自动化了,那也没什么好惊讶的。这并不是什么新鲜事:编译器不进行机器学习,但他们通过自动生成机器代码来改变软件行业。
重要的问题是软件开发和数据科学将如何变化。 一种可能性 —— 实际上是一种事实 —— 是, 软件开发人员会在数据收集和准备方面投入更多精力。 没有训练数据,机器学习就什么都不是。 开发人员必须做的,不仅仅是收集数据; 他们必须构建数据管线,以及构建管理这些管线的基础设施。 我们称之为“数据工程”。在许多情况下,这些管线本身将使用机器学习来监控和优化自己。
我们可以看到训练机器学习算法成为一个独特的子专业; 我们可能很快会谈论“训练工程师”,就像我们目前谈论“数据工程师”的方式一样。Andrew Ng在描述他自己的《机器学习渴望》一书时 ,他说:“这本书的重点不是教你ML算法,而是教你如何让ML算法有效。“没有编码,也没有复杂的数学。 本书几乎完全侧重于模型训练过程,而不仅仅是编码,训练才是让机器学习有效工作的本质。
我们提出的想法都涉及增强人的能力:它们使人类能够生产出更快,更可靠,更好的能够生效的产品。 开发人员将能够将更多时间花在有趣,重要的问题上,而不是把基本工作做好。那些问题可能是什么问题呢?
在“如何成为一只半人马”一文中,关于智能增强的讨论里,Nicky Case论证了,计算机在针对一个问题寻找最佳答案上表现出色。它们本质上是计算工具。但是他们不是很擅长“找到一个值得回答的有趣问题”,这件事是人类做的。那么,我们需要提出哪些重要的问题呢?
我们才刚刚开始理解道德在计算中的重要性。 公平等基本问题并不简单,需要加以强调。 我们刚刚才开始考虑更好的用户界面,包括会话界面:它们将如何运作? 即使在人工智能的帮助下,我们的安全问题也不会消失。 先不管安全问题怎样,我们所有的设备都在变得“聪明”。这意味着什么? 我们希望它们做什么? 人类不会编写尽可能多的低级代码。 但是正因为他们将不会去编写那些代码,所以他们可以自由地思考代码应该做什么,以及它应该如何与人交互。 需要解决的问题永远不会少。
很难想象一种“人类不再需要创建软件”的未来。 但很容易想象“将人纳入循环”的软件研发,在未来将占重要比重。
Ben Lorica是O'Reilly Media公司的首席数据科学家,同时也是Strata数据会议和O'Reilly人工智能会议的内容日程主管。他曾在多种场景下应用商业智能、数据挖掘、机器学习和统计分析技术,这些场景包括直销、消费者与市场研究、定向广告、文本挖掘和金融工程。他的背景包括在投资管理公司、互联网初创企业和金融服务公司就职。
Mike Loukides
Mike Loukides是O'Reilly传媒负责内容策略的副总裁。他编辑了很多非Windows编程的广受好评的技术书籍。特别是他对编程语言、Unix和其上的应用、系统和网络管理感兴趣。Mike是《系统性能调优》和《Unix上的强大工具》的作者之一。近年来,关注于数据和数据分析领域、分析语言(如R)、数学、Octave以及思考如何让书籍更加社交化。
This article originally appeared in English: " What machine learning means for software development ".
本文转自:O'Reilly,转载此文目的在于传递更多信息,版权归原作者所有。
原文链接:http://www.oreilly.com.cn/ideas/?p=1876