机器学习对软件开发意味着什么 :“人类循环”软件开发将是未来的重要组成部分。

机器学习有望从根本上改变软件开发的性质,这可能是自FORTRAN和LISP发明以来的第一次。它给我们几十年来的编程范例提出了第一个真正的挑战。这些变化对现在从事软件开发的数百万人意味着什么?我们会看到工作流失和裁员,还是会看到编程演变成不同的东西,甚至可能会更加专注于使用户满意?

自1970年代以来,我们几乎以相同的方式构建软件。我们拥有高级语言,低级语言,脚本语言以及用于构建和测试软件的工具,但是这些工具让我们做什么并没有太大变化。我们的语言和工具比50年前要好得多,但是本质上是相同的。我们仍然有编辑。它们更奇特:具有颜色突出显示,名称补全功能,有时还可以帮助进行诸如重构之类的任务,但它们仍然是emacs和vi的后代。面向对象代表了一种不同的编程风格,而不是根本上没有什么新的事物,而且,功能编程可以一直追溯到50年代(除非我们不知道它叫什么)。我们可以做得更好吗?

我们将专注于机器学习而不是人工智能。机器学习被称为“人工智能的一部分”,但更重要的是,标签“机器学习”避免了诸如通用智能之类的概念。我们不是在讨论可以找到要解决的问题,设计解决方案并自行实现该解决方案的系统。这样的系统不存在,也可能永远不存在。为此需要人类。机器学习可能只是模式识别而已,但是我们已经看到模式识别可以完成很多工作。的确,手工编码模式识别是我们当前工具集的核心:这实际上是现代优化编译器正在做的所有事情。

我们还需要设定期望。麦肯锡估计,“使用当前技术,只有不到5%的职业可以完全自动化。但是,大约60%的职业可以自动完成其构成活动的30%或更多。” 软件开发和数据科学不会成为完全自动化的职业。但是优秀的软件开发人员一直试图使繁琐,重复的任务自动化。这就是计算机的用途。毫无疑问,软件开发本身将越来越实现自动化。

这不是一个激进的新愿景。在过去的半个世纪中,我们似乎并没有从事自动化工具的开发。编译器使编写机器代码的过程自动化。脚本语言通过将更大,更复杂的程序粘合在一起,使许多平凡的任务自动化。软件测试工具,自动部署工具,容器和容器编排系统都是用于自动化开发,部署和管理软件系统的过程的工具。这些都没有利用机器学习的优势,但这无疑是下一步。

正如Pete Warden和Andrej Karpathy所说,机器学习会吃掉软件吗?毕竟,“软件吞噬世界”一直是一个不断增长的抽象和概括过程。笔记本电脑,电话或智能手表可以代替收音机,电视,报纸,弹球机,锁和钥匙,电灯开关以及更多其他物品。所有这些技术都是可能的,因为我们逐渐将计算机视为通用计算机,而不仅仅是数字处理器。

从这个角度来看,很容易将机器学习想象成抽象的下一个层次,这是我们迄今为止发现的最通用的问题解决器。当然,神经网络已经证明它们可以执行许多特定任务:几乎可以构建一组训练数据的任何任务。Karpathy乐观地说,对于许多任务来说,收集数据比显式编写程序要容易得多。毫无疑问,他对一些非常有趣且非常困难的程序是正确的:很容易收集Go或Chess的训练数据(各个级别的玩家已经录制了150多年的游戏了),但是很难编写明确的程序来成功玩这些游戏。因此,当您不知道如何编写软件但可以收集数据时,可以选择机器学习。另一方面,数据收集并不总是那么容易。直到Flickr,Facebook和Google之类的网站收集了数十亿张图像(其中很多已经被人类标记)之后,我们甚至无法构思出能够自动标记图片的程序。对于人脸识别等任务,我们不知道如何编写软件,并且很难收集数据。对于计费等其他任务,可以根据一些简单的业务规则编写程序很容易。很难想象收集训练机器学习算法所需的数据,但是如果您能够收集数据,则生成的程序将更好地适应不同情况并检测异常,特别是如果有人在环。Google收集了数十亿张图片,其中许多已经被人类标记了。对于人脸识别等任务,我们不知道如何编写软件,并且很难收集数据。对于计费等其他任务,可以根据一些简单的业务规则编写程序很容易。很难想象收集训练机器学习算法所需的数据,但是如果您能够收集数据,则生成的程序将更好地适应不同情况并检测异常,特别是如果有人在环。Google收集了数十亿张图片,其中许多已经被人类标记了。对于人脸识别等任务,我们不知道如何编写软件,并且很难收集数据。对于计费等其他任务,可以根据一些简单的业务规则编写程序很容易。很难想象收集训练机器学习算法所需的数据,但是如果您能够收集数据,则生成的程序将更好地适应不同情况并检测异常,特别是如果有人在环。根据一些简单的业务规则编写程序很容易。很难想象收集训练机器学习算法所需的数据,但是如果您能够收集数据,则生成的程序将更好地适应不同情况并检测异常,特别是如果有人在环。根据一些简单的业务规则编写程序很容易。很难想象收集训练机器学习算法所需的数据,但是如果您能够收集数据,则生成的程序将更好地适应不同情况并检测异常,特别是如果有人在环。

学习替换代码
机器学习已经使代码更高效:Google的Jeff Dean 报告这500行TensorFlow代码已替换了Google Translate中的500,000行代码。尽管代码行数是一个值得怀疑的指标,但减少千倍是巨大的:无论是在编程工作上还是在必须维护的代码量上。但是更重要的是该代码的工作方式:它是经过训练的翻译神经网络,而不是五十万行的统计代码。随着语言的变化和用法的变化,以及偏见和偏见的发现,可以重新审视神经网络,并在新数据上对其进行重新训练。不需要重写。我们不应低估训练任何复杂度的神经网络的难度,但我们也不应低估管理和调试巨大代码库的问题。

我们已经看到研究表明神经网络可以通过组合现有模块来创建新程序。使用其他程序的执行跟踪来训练系统。尽管以这种方式构造的程序很简单,但重要的是单个神经网络可以学习执行多个不同的任务,而每个任务通常都需要一个单独的程序。

皮特·沃登(Pete Warden)将编程的未来描述为成为一名教师:“开发人员必须成为一名教师,培训数据的策展人和结果分析人员。” 我们发现此特征非常具有启发性。软件开发不会消失;开发人员必须以截然不同的方式来思考自己。您如何构建一个解决一般问题的系统,然后教该系统解决特定任务?一方面,这听起来像是冒险,麻烦的前景,就像推绳索一样。但另一方面,它假定我们的系统将变得更加灵活,灵活和适应性强。沃登(Warden)设想的未来更多的是结果,而不是编写代码行:培训通用系统,并测试它是否满足您的要求,包括公平性之类的问题。

彼得·诺维格(Peter Norvig)更系统地思考,认为机器学习可用于从训练数据生成简短的程序(但不是长的程序)。优化大型程序的一小部分,而不是整个程序;并可能(在人类的帮助下)成为入门程序员的更好的导师。

数据管理和基础架构
早期迹象表明,机器学习的性能可以胜过传统的数据库索引:它可以学习预测数据的存储位置或该数据是否存在。机器学习似乎要快得多并且需要更少的内存,但这是相当有限的:当前基于机器学习的工具并不涵盖多维索引,并且假设数据库不经常更新。与重新构建传统的数据库索引相比,重新培训花费的时间更长。但是,研究人员正在研究多维学习索引,查询优化,重新训练性能和其他问题。

机器学习已经进入了数据基础架构的其他领域。数据工程师正在使用机器学习来管理Hadoop,从而可以更快地响应问题,例如Hadoop集群中的内存不足。Kafka工程师还报告了使用机器学习来诊断问题。研究人员已经成功地使用机器学习来调整数据库为了性能,它简化了管理影响行为的许多配置设置的问题。数据工程师和数据库管理员不会过时,但他们可能必须培养机器学习技能。反过来,机器学习将帮助他们使棘手的问题更易于管理。正确地设置数百个不同的配置参数,对数据基础结构的管理要比对系统进行培训以使其在工作负载上表现良好的要少。

使棘手的问题变得易于管理仍然是数据科学最重要的问题之一。数据工程师负责维护数据管道:摄取数据,清理数据,功能工程和模型发现。他们负责在非常复杂的环境中部署软件。一旦部署了所有这些基础架构,就需要对其进行持续监控,以检测(或防止)中断,并确保模型仍能正常运行。这些都是适合机器学习的任务,而且我们越来越多地看到像MLFlow这样的软件用于管理数据管道。

数据科学
自动化编程的早期表现包括旨在使数据分析师执行更高级的分析任务的工具。该自动统计员是一个较新的工具,它可以自动探索性数据分析,提供统计模型的时间序列数据,并伴有详细的解释。

随着深度学习的兴起,数据科学家发现自己需要寻找正确的神经网络架构和参数。也可以使学习过程自动化。毕竟,神经网络即使不是自动化学习的工具,也算不上什么:尽管构建神经网络仍然需要大量的人工工作,但无法手动调整模型中的所有参数。一种应用是使用机器学习来探索可能的神经网络架构。如这篇文章所指出的,一个10层网络可以轻松拥有10 10种可能性。其他研究人员使用的强化学习,使之更容易开发神经网络结构。

更进一步:DataRobot之类的公司使整个过程自动化,包括使用多种模型和比较结果。该过程称为“自动机器学习”;亚马逊的Sagemaker和Google的AutoML提供基于云的工具,以自动创建机器学习模型。

创建模型不是一次性的事情:数据模型需要不断测试和重新调整。我们开始看到用于持续监视和调整的工具。这些工具并不是特别新颖:用于A / B测试的强盗算法已经存在了一段时间,对于许多公司而言,强盗算法将是加强学习的第一步。Chatbase是一家Google创业公司,可监控聊天应用程序开发人员可以了解其性能。应用程序是否理解用户提出的问题?他们是否能够解决问题,或者用户经常要求获得不受支持的功能?这些问题可以通过手动查看聊天日志并标记问题来解决,但即使使用单个漫游器也很难解决。Chatbase设想了一个未来,许多组织将拥有数十甚至数百个用于客户服务,帮助台支持,和许多其他应用程序。

也可以使用机器学习来查找软件中的漏洞。有些系统会检查代码并寻找已知的缺陷。这些系统不一定要修复代码,也不保证会发现每个潜在的问题。但是他们可以轻松地突出显示危险代码,并且可以使开发大型代码库的开发人员提出诸如“还有其他类似问题吗?”之类的问题。

游戏开发人员正在通过多种方式寻求机器学习。可以使用机器学习来使背景和场景看起来更逼真吗?绘制和建模逼真的场景和图像非常昂贵且耗时。当前,必须明确编程非玩家角色(NPC)所做的所有事情。可以学习机来的NPC的行为进行建模?如果NPC可以学习行为,我们可以期待更具创造力的游戏方式。

展望未来
对于软件开发人员来说,未来会是什么样?软件开发会走麦肯锡对其他行业的预测吗?30%的软件开发和数据科学活动是否可以自动化?

也许,尽管那只是对情况的简单理解。机器学习无疑将在很大程度上改变软件开发。如果我们现在认为的“编程”中的很大一部分是自动化的,也就不足为奇了。不过,这并不是什么新鲜事:编译器不进行机器学习,而是通过自动生成机器代码来改变软件行业。

重要的问题是软件开发和数据科学将如何变化。一种可能性(确实是一种确定性)是软件开发人员将在数据收集和准备方面投入更多的精力。没有训练数据,机器学习将一事无成。开发人员将要做的不仅仅是收集数据。他们将必须建立数据管道和用于管理这些管道的基础架构。我们称其为“数据工程”。在许多情况下,这些管道本身将使用机器学习来监视和优化自己。

我们可能会看到训练机器学习算法已成为一个独特的子专业。我们可能很快就会以目前谈论“数据工程师”的方式谈论“培训工程师”。在描述他的《机器学习渴望》一书时,Andrew Ng说:“这本书的重点不是教您学习ML算法,而是关注如何使ML算法起作用。” 没有编码,也没有复杂的数学。这本书几乎完全集中在培训过程上,这比编码更重要,它是使机器学习发挥作用的本质。

我们提出的想法都涉及增强人类的能力:它们使人类能够生产更快,更可靠,更好的工作产品。开发人员将能够花更多的时间在有趣的重要问题上,而不用掌握正确的基础知识。这些问题可能是什么?

尼基·凯斯(Nicky Case)在“如何成为半人马座”一书中讨论了智能增强,他认为计算机善于找到问题的最佳答案。从根本上说,它们是计算工具。但是他们并不擅长寻找有趣的问题来回答。那就是人类所做的。那么,我们需要问一些重要的问题?

我们才刚刚开始理解伦理学在计算中的重要性。诸如公平之类的基本问题并不简单,需要加以解决。我们只是开始考虑更好的用户界面,包括对话界面:它们将如何工作?即使有了AI的帮助,我们的安全问题也不会消失。无论安全问题如何,我们所有的设备都将变得“智能”。这意味着什么?我们要他们做什么?人类不会编写那么多的底层代码。但是因为他们不会编写该代码,所以他们可以自由考虑该代码应该做什么以及如何与人互动。将不乏需要解决的问题。

很难想象人类不再需要创建软件的未来。但是,很难想象“人在循环中”的软件开发将是未来的重要组成部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值