本文做者:天诺 | 2015-05-05 16:54 |
Reza Zadeh是斯坦福大学工程计算和数学研究所顾问教授,也是Databricks公司技术顾问,他主要专一于机器学习理论和应用,分布式计算,以及离散应用数学。近日,他接受了oreilly网站的采访,尝试谈论了人工智能的各方面。html
神经网络已卷土重来,而且做为一种新方法,在机器学习中发挥着愈来愈重要的角色算法
经过利用已有算法的监督学习解决方案,最伟大成就已经实现编程
Spark是一种特别适合分布式机器学习的环境网络
在斯坦福大学,我设计并教授分布式算法和优化,此外我还教授一门离散数学和算法的课程。在离散数学课程里,我是彻底从理论角度来教算法的,这意味着我所教授的算法彻底不依赖于任何编程语言或框架,咱们会直接把许多理论和证实写在白板上。架构
可是若是想要更实际些的话,那就得来个人分布式算法课了,咱们会在Spark编程环境下工做,而我几乎会花一半时间在Spark上面。在这个平台上,我所教授的,设计分布式算法和机器学习的理论均可以执行,并且很是具体。app
2006年我来到Google负责MapReduce编程模型,实际上以前Hadoop已经广为人知,也很是流行了,但在Google,MapReduce已经十分红熟。当时我只有18岁,也很是看好这个项目。因而,我花了不少时间在MapReduce上构建、思考算法,甚至在离开Google以后的很长一段时间依然持续这么作。后来有了Spark计算框架,它是开源的,你们均可以了解其核心,为其作贡献。我感受Spark的时代已经到来了,由于对绝大多数分布式计算来讲,弹性分布式数据集是很是抽象的。框架
从上世纪90年代开始,机器学习已通过了一些过渡时期。从1995年到2005年,不少人专一在天然语言,搜索,以及信息检索领域。机器学习工具好比今咱们使用的要更加简单,他们包括逻辑回归分析,SVMs(支持向量机),支持向量机内核,网页排名等。利用这些技术,Google得到了巨大成功,好比Google News就很是成功,还有Gmai垃圾邮件分类器,它利用易分布式算法进行排名和文本分类。到了上世纪90年代中期,这些技术已经变得十分红熟了。iphone
大约在2005年左右,神经网络又开始卷土重来。神经网络其实算是上世纪80年代的技术,一些人甚至认为它起源于上世纪60年代,得益于计算机视觉的技术的最新进展,让(卷积)神经网络的使用显得卓有成效。事实上,神经网络已经开始在其余应用上“大展宏图”,包括天然语言处理和机器翻译等领域。机器学习
可是有一个问题:在全部说起的机器学习分布式模型中,神经网络多是最具挑战性的。那些早期模型都已经训练成功被分布。咱们不须要太过麻烦,就能使用100台机器,并训练一个逻辑回归或支持向量机,可是开发一个分布式神经网络学习设置却难的多。编程语言
那么,猜猜看如今神经网络这块谁作的最成功?到目前为止,惟一的公司就是Google。他们是这一领域里的先驱。如今就像是回到了2005年,当时Google发布了MapReduce,每一个人都争相创建一样的基础设施。Google实现了分布神经网络,也获得了更多回报,现在,每一个人都但愿他们也能像Google同样得到成功,可是好事儿不会发生两次。
首先,评估一个支持向量机要简单得多。当你学习了一个支持向量机模型或逻辑回归模型(或者任何一个线性模型)以后,实际评估就会很是快。好比说你构建一个垃圾邮件分类器,一个新电子邮件过来后,把它归到垃圾邮件仍是非垃圾邮件只须要花很短期就能完成,由于它只是一个点积(线性代数术语)。
可是当涉及神经网络,你的计算量将会大大增长,即使你已经学习了相关模型,但仍然要搞明白该模型的输出。并且,这还不是最大的问题,一般一个支持向量机应对一百万个参数还游刃有余,可是我所见过一个成功的最小神经网络,涉及的参数就多达600万个,并且这仍是最小的。另外一个问题是训练算法并无从最优化理论中得到太多好处。咱们所使用的绝大多数线性模型基本上都有数学理论支持,而且能够肯定什么时候完成训练。这种模式能够确保你能发现最好的模型,可是神经网络现有的最优化算法没法支持这样的保证。在你训练了一个神经网络以后,其实没法判断出它是不是最好的模型。一旦这样,你就会不自觉的去想是否还会有更好的模型,所以就会不断训练下去。
是的,我是这样认为的。事实上,这种情况如今就正在发生。总有一些线性模型问题,仅能靠线性来辨别。为了让非线性参与,你不得不增长或改变一些功能,所以就会涉及到大量工做。举个例子,计算机视觉科学家花了十年时间开发、调试一种名为SIFT的功能,能够支持图像分类和其余使用线性方法的视觉任务。但以后,神经网络出现了,筛选功能变得再也不必要,做为训练的一部分,神经网络的解决方法是让这些功能自动化。
可是我认为,如今说神经网络能够去到全部功能建设技术彷佛还为时过早。并且,我也不认为会发生这种状况,线性模型和优秀的人为驱动功能引擎总会有它的一席之地。就像此次参加神经信息处理系统进展大会的研究人员,他们绝大多数已经开始评估本身应用程序的神经网络。你们都在测试他们的应用程序是否可以从神经网络的非线性模式中获益。
这毫不是说咱们以前就没有过非线性模式,实际上,咱们有许多非线性模式。但问题是,神经网络碰巧出现,并且异常强大,在一些应用程序上,它更奏效,所以才会值得尝试。这也是不少人正在作的事情。目前为止,在语音识别,计算机视觉,以及机器翻译上神经网络的应用都很是成功。它还能够应用在许多难度更大的任务上,所以将来仍是十分使人兴奋的。
当你有一个线性模型,每个功能要么对你有帮助,要么对你有伤害,这种假设是线性模型中固有的。所以线性模型要么功能异常强大,用类1表示;要么则毫无用处,用类2表示。全部的解决方案,要么致使该功能得到巨大的价值;要么价值变得微不足道。你永远不会有这么一个状态说,在这个区间,该功能就是表明类1;可是在另外一个区间,它表明类2。
线性和非线性方法局限性很大。也就是说,若是你分析图片,举个例子,寻找狗狗的照片,它极可能会进入到一个特定的子集里面,好比只显示有一只狗的照片,或是显示某一像素和其余类型的图片。在线性模式里面,你没法肯定复杂的关系集。相比于线性模型,非线性模型可能会显得更强大一些,可是这种模式一样难以训练。咱们会再一次进入到所谓最优化理论的问题之中,这也是咱们在很长一段时间里认为神经网络还不是足够好的缘由之一,由于他们会“过拟合”,通俗的说,就是太过强大。咱们没法作预测,也没法确保最优化方案。或许,这可能就是为何神经网络从当下暂时消失的缘由吧。
到目前为止,最成功的方法是监督学习方法,它使用了一个比较老的算法,称为反向传播,构建了一个拥有许多不一样输出的神经网络。
让咱们看下一个神经网络构建,这个网络已经很是流行了,叫作卷积神经网络。这个理念是机器学习研究人员构建了一个多层架构的模型,每一层均可以用不一样的方法处理以前一层的链接。
在第一层,你有一个窗口,上面会给图像分配权值,它也变成了该层的输入。因为权值“卷积”,该层也被称为卷积层,它会自我重叠。接着后面会有若干个不一样类型的层,每层都有不一样的属性,绝大多数都是非线性的。
最后一层会有1万个潜在神经元输入,那些激活的神经输出,每个都对应了一个特殊的标签,能够用来识别图像。第一类多是一只猫,第二类多是一辆车,以此推到全部一万个类,这样一张“图像网”就出来了。若是第一个神经元(一只猫)与1万个神经元中绝大多数都匹配,那么这张图像就能被识别出来,是一张猫的图像。
这种监督学习方法的缺点是,在训练的时候,你必需要在图像上应用标签,这是一辆车,这是一个动物园等。
无监督学习方法还不是那么受欢迎,它涉及到“自编码器”。这种神经网络不会用来分类图像,可是能够压缩图像。同我刚才说起的方法来读取图像,识别一个权值,并在一个卷积层内用像素填满。其余若干层也这样,包括相比于其它层小的多的中间层。这样作的话,相关的神经元会变得不多,基本上,你读取图像时会进入到一个瓶颈,以后从另外一边走出来,并尝试从新构建该图像。
在无监督学习训练下,不须要打标签,由于你所作的就是把图像放入到神经网络的两端,而后训练网络适应图像,特别是训练中间层。一旦你这么作了,那么就拥有了一个知道如何压缩图像的神经网络。无监督学习方法能够给你提供能应用在其余分类器的功能,所以若是你有哪怕一点点标签训练数据,没问题,它同样能够为你提供大量图像。你能够把这些图像看作是无标签训练数据,并使用这些图像构建一个“自编辑器”,而后从这个自编辑器中导出一些功能,这些功能适合使用一些训练数据,以此找到对特殊模型敏感的自动编码神经网络中的神经元。
以前我就认识Spark的创造者Matei Zaharia,咱们都是滑铁卢大学的校友。实际上,咱们仍是Google的同届实习生,他当时负责开发者生产力工具,与大数据一点儿关系都没有。Matei Zaharia在Google工做期间根本没有接触过MapReduce,那是我专一的领域,但最后由他负责收尾的确让人以为有趣。
以后Matei跳槽去了Facebook,在那里他负责Hadoop,并得到了成功。在那段时间里,我不断思考分布式机器学习,但什么计算框架都没有想出来,包括Hadoop在内,而此时Spark计算框架映入了个人眼帘,我感到很是兴奋。
Spark是一种集群计算环境,能够为你提供分布式矢量,这种矢量与咱们在独立机器上编程所使用的矢量很是类似。在常规矢量下,有不少事情是作不到的,举个例子,仅经过目录,你没法作到随机访问,可是若是有两个矢量交集就能作到这一点,你能够并集,也能够分类,还能够作不少常规矢量没法作到的事情。
Spark让机器学习变得简单,其中一个缘由是它能够尽量多的在内存中保存数据的重要部分,并且无需写入磁盘。在一个分布式环境下,获取故障恢复的常规方法是进行磁盘写入,在网络中使用分布式文件系统对一个磁盘复制三次。
Spark之因此很是适合机器学习,是由于数据进入到内存以后,就能够保存其中。若是它不适合内存,也不要紧,有须要时它就会离开磁盘。但关键是,它可以适应内存,对于任何一个须要处理屡次数据的进程来讲,好比机器学习,都很是棒。几乎每一个机器学习算法都须要处理海量数据,并且是十倍,百倍的数据。
我必需要明确表达一下,在很长一段时间里,Hadoop都是做为一个生态系统在茁壮成长。我不认为Hadoop生态系统的MapReduce组件也会这样。
若是要回答你的问题的话,个人答案是不,我不认为他们可以处理不一样的工做负荷或职责。老实说,我认为若是你启动一项新工做,除非你已经有了须要维护的代码群,不然使用MapReduce一点儿意义都没有。若是如今还用MapReduce的话,彷佛显得有点二了,换而言之,若是你能写C++代码,写集合代码是毫无心义的。
RZ:目前来讲,Spark自己是很是稳定的。目前,或许也是将来几年可能会发生的最大变化,或者说最大提高吧,就是Spark的代码库。机器学习代码库,图像处理代码库,SQL代码库,以及流媒体代码库,全部这些都在快速发展,至少在将来两年内,它每个变化都使人兴奋。Spark全部的功能都是我想要的,并且很高兴看到它执行起来也很是便捷。同时,对于社区驱动的贡献我也感到由衷的高兴,现在在网站上开发者社区对Spark进行支持,这样对长尾用户来讲是很是有帮助的。
随着时间的沟渠,我认为Spark会成为一个真正的分布式引擎,帮助咱们大规模构建机器学习算法。
via radar
雷锋网原创文章,未经受权禁止转载。详情见转载须知。