如果谷歌是今天初建的,大部分功能实现将是基于学习的,而不是编码。目前谷歌的25000个开发人员中,大约10%的人精通ML;但是应该是100%的都精通才对 --Jeff Dean
编程就像天气一样,每个人都抱怨他,但没人做些什么。这种状态正在发生变化,如同一场不期而遇的暴风雨。变化来自于一个意想不到的方向:机器学习/深度学习。
我知道,你已经厌倦听到深度学习。现在谁不是这样?但是,编程已经陷入循规蹈矩很长一段时间了,是时候该做一些什么来改变。
许多愚蠢的关于程序设计争辩角逐一直都在进行,却没有任何的结果。面向函数与面向对象;这种语言与那种语言;这种公共云对比那种公共云对比私有云对比所谓的‘fill in the blank’;REST架构对比非REST;这个字节级编对比另外一种;这个框架和框架;这种方法对比另外一种方法;裸机对比容器对比虚拟机对比各种单核心;巨服务对比微服务对比纳服务;最终一致性对比事务性;可变与不可变的;DevOps对比noops对比sysOps;垂直扩展对比水平扩展;集中对比分散;单线程对比并行,同步与异步。诸如此类的东西。
每天我们只是在创造不同的函数调用,这些函数还是需要我们人类来编写。真正改变应该是在让机器来来编写这些函数。为我们写函数就是机器学习可以做的事情。
我最初了解将深度学习作为一种编程方式是在Jeff Dean做的一次谈话中。我写了关于这次对话的文章:Jeff Dean On Large-Scale Deep Learning At Google(Jeff Dean谈Google大规模深度学习)。很显然这是一篇很好的介绍深度学习的文章。从谈话中获取到,深度学习能够有效的取代人工编码程序:
Google发现他们能够将一系列的那些可以通过机器学习的子系统,使用一种更加通用的端到端的机器学习组件来实现。通常当你遇到比较复杂的子系统,需要比较多的复杂代码去整合他们的时候,Google推荐你采用数据和非常简单的算法来取代。
Google的研究总监Peter Norvig有一个关于如下主题的完整对话: 深度学习和理解与软件工程和验证的对比(Deep Learning and Understandability versus Software Engineering and Verification). 大致观点如下:
软件. 你可以认为软件是为功能创造一个规范,同时实现该功能就是满足所定义的规范
机器学习. 给定一些样本 (x,y) 对,可以估计函数功能是输入x作为参数,输出y作为结果。并且可以通用化适应不同的x输入值。
深度学习. 仍然给定一些样本 (x,y) 对, 但是深度学习可以给你呈现不同程度的抽象而不是直接的给出输出。也可以通用化适应不同的输入x值.
软件工程师不需要介入。而是数据流入到机器学习组件数据的抽象表示就能够输出。
抽象表示看起来不像代码,而是如下的样子:
新的编程类型不是一种人可以理解的功能分解,看起来更像像一堆的参数。
在机器学习驱动编程中,仍然需要人,只是不在称这些人做为程序员,因为更多的是数据科学家。
我们可以从例子中学习程序的部分吗? 可以。
例子是一个2000多行的开源拼写程序,还是存在错误。一个17行的Navie Bayes分类器版本的程序,就可以具有相同的性能,减少了100多倍的代码数量,同时也达到了更好的效果。
另一个例子是AlphaGo,程序的架构是人工写的,但是所有的参数都是通过学习得来的。
我们能够通过例子来学习整个程序吗? 对短程序,答案是是的. 但是传统的大程序却不行。
在Jeff Dean的谈话中,他详细介绍了Sequence to Sequence Learning with Neural Networks. 通过这种方法,就有可能从零开始构建一个高水平的机器翻译程序,该方法是一个完全的端到端的学习系统,没有许多的人工手写代码也没有各种解决子问题的机器训练学习的不同模型。
另外一个例子是学习怎么去玩Atari的游戏, 很多游戏机器均能够达到和人差不多的水平. 但是机器学习处理那些如果需要比较长时间的策划的内容,效果不太好。
神经网络图灵机(Neural Turing Machines)是一个如何学习编写大型程序的尝试,但是Peter觉得它前景不乐观。
你也许可以去看看Norvig先生的精彩谈话.
深度学习需要数据,因此如果你想要构建一个AI,能从例子中学习怎么去编程,你就需要很多的程序或者例子去学习。
Google和Github已经为了是的开源数据能够更好的获取这一目标(Making open source data more available)走在一起。 从GitHub存档上传到BigQuery的数据集的量已经有 3TB+,该数据集中包含了超过2百8十万Github项目的活动数据,其中有1亿4千5百万的单独提交,超过20亿的不同文件路径。
也许这是一个很好的训练数据源。
当然不是.。神经网络黑盒子的本质使得他们很难使用,它好像在质询把人类的潜意识作为我们有意识活动背后的原因。
Jeff Dean谈到了Google搜索排名团队在使用神经网络来做搜索排名时的犹豫和担心。在搜索排名中,你希望能够理解模型,你可以理解为什么要做某种决策。但系统出现错误的时候,他们也希望理解为什么它这么做以及它干了哪些事情。
必须创建专门的调试工具同时也必须在构建这些模型的时候加入足够的可理解性支持,来克服这些不足。
方法肯定是可行的。 RankBrain就是一个用机器学习技术实现的搜索结果,于2015年出现了。并且是第三个最重要的搜索排名因素(共100多个因素)。更多的信息可以查看:谷歌将其利润丰厚的网络搜索转向依赖人工智能机器(Google Turning Its Lucrative Web Search Over to AI Machines).
Peter通过谈论在一篇论文中提到的问题,深入探讨更多的细节。该论文题目是:机器学习:技术争论中的高信用度的信用卡(Machine Learning: The High Interest Credit Card of Technical Debt)。缺少清晰的抽象层.如果有bug,你很难定位.。动一发动全身. 很难去修复错误也很难预测修复错误后的结果。 循环反馈. 当一个机器学习系统产生的数据能够有作为输入数据反馈到系统中。 吸引力困扰. 一旦一个系统每一个人都想用, 它就有可能在某一上下文就不能用了。 非稳定性. 数据总在变化,因此你必须考虑使用什么样的数据。没有很好的答案。. 配置依赖. 数据从哪里来?是否精确? 是否已经被其他的系统改动,今天看到的数据同昨天看到的可能不一样?训练数据不同于后续生成中的数据? 当系统过载的时候,是否有数据被丢失了? 缺少工具. 标准的软件开发,已经有很多的好用的工具,但是机器学习驱动编程这块比较新,还没有工具。
这不是一篇 “天哪,世界末日到来了“之类的文章。而是一篇”hi朋友,这里有些你可能没有听过的东西,世界将会如此改变是不是很酷“之类的文章。
目前还在很初期的阶段。基于学习的编程虽然已经可以做了,但是学习大型复杂程序还不现实。但是当我们看诸如这样的文章标题:Google是怎么样标称自己为机器学习优先公司的(How Google is Remaking Itself as a “Machine Learning First” Company)的时候,可能不是很清楚到底是什么意思。机器学习驱动编程不仅仅是用于构建如AlphaGo这样的系统,终端游戏将是更加的深入应用。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务