Reza Zadeh是斯坦福大学工程计算和数学研究所顾问教授,也是Databricks公司技术顾问,他主要专注于机器学习理论和应用,分布式计算,以及离散应用数学。近日,他接受了oreilly网站的采访,尝试谈论了人工智能的各方面。
神经网络已卷土重来,并且作为一种新方法,在机器学习中发挥着越来越重要的角色
通过利用已有算法的监督学习解决方案,最伟大成就已经实现
Spark是一种特别适合分布式机器学习的环境
在斯坦福大学,我设计并教授分布式算法和优化,此外我还教授一门离散数学和算法的课程。在离散数学课程里,我是完全从理论角度来教算法的,这意味着我所教授的算法完全不依赖于任何编程语言或框架,我们会直接把许多理论和证明写在白板上。
但是如果想要更实际些的话,那就得来我的分布式算法课了,我们会在Spark编程环境下工作,而我几乎会花一半时间在Spark上面。在这个平台上,我所教授的,设计分布式算法和机器学习的理论都可以执行,而且非常具体。
2006年我来到Google负责MapReduce编程模型,实际上之前Hadoop已经广为人知,也非常流行了,但在Google,MapReduce已经十分成熟。当时我只有18岁,也非常看好这个项目。于是,我花了很多时间在MapReduce上构建、思考算法,甚至在离开Google之后的很长一段时间依然持续这么做。后来有了Spark计算框架,它是开源的,大家都可以了解其核心,为其做贡献。我感觉Spark的时代已经到来了,因为对绝大多数分布式计算来说,弹性分布式数据集是非常抽象的。
从你在Google工作,到现在Spark计算框架上工作,应该有机会看到机器学习的进化吧,因为它们和分布式计算的联系都非常紧密,你会如何描述这种进化呢?
从上世纪90年代开始,机器学习已经过了一些过渡时期。从1995年到2005年,很多人专注在自然语言,搜索,以及信息检索领域。机器学习工具比如今我们使用的要更加简单,他们包括逻辑回归分析,SVMs(支持向量机),支持向量机内核,网页排名等。利用这些技术,Google获得了巨大成功,比如Google News就非常成功,还有Gmai垃圾邮件分类器,它利用易分布式算法进行排名和文本分类。到了上世纪90年代中期,这些技术已经变得十分成熟了。
大约在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是一种集群计算环境,可以为你提供分布式矢量,这种矢量与我们在独立机器上编程所使用的矢量非常相似。在常规矢量下,有很多事情是做不到的,举个例子,仅通过目录,你无法做到随机访问,但是如果有两个矢量交集就能做到这一点,你可以并集,也可以分类,还可以做很多常规矢量无法做到的事情。
Spark让机器学习变得简单,其中一个原因是它可以尽可能多的在内存中保存数据的重要部分,而且无需写入磁盘。在一个分布式环境下,获取故障恢复的常规方法是进行磁盘写入,在网络中使用分布式文件系统对一个磁盘复制三次。
Spark之所以非常适合机器学习,是因为数据进入到内存之后,就可以保存其中。如果它不适合内存,也没关系,有需要时它就会离开磁盘。但关键是,它能够适应内存,对于任何一个需要处理多次数据的进程来说,比如机器学习,都非常棒。几乎每个机器学习算法都需要处理海量数据,而且是十倍,百倍的数据。
你觉得Spark和MapReduce比较呢?是否有一处可以让它们两者能够处理不同的工作负荷或职责?
我必须要明确表达一下,在很长一段时间里,Hadoop都是作为一个生态系统在茁壮成长。我不认为Hadoop生态系统的MapReduce组件也会这样。
如果要回答你的问题的话,我的答案是不,我不认为他们能够处理不同的工作负荷或职责。老实说,我认为如果你启动一项新工作,除非你已经有了需要维护的代码群,否则使用MapReduce一点儿意义都没有。如果现在还用MapReduce的话,似乎显得有点二了,换而言之,如果你能写C++代码,写集合代码是毫无意义的。
RZ:目前来说,Spark本身是非常稳定的。目前,或许也是未来几年可能会发生的最大变化,或者说最大提升吧,就是Spark的代码库。机器学习代码库,图像处理代码库,SQL代码库,以及流媒体代码库,所有这些都在快速发展,至少在未来两年内,它每一个变化都令人兴奋。Spark所有的功能都是我想要的,而且很高兴看到它执行起来也非常便捷。同时,对于社区驱动的贡献我也感到由衷的高兴,如今 在网站上 开发者社区对Spark进行支持,这样对长尾用户来说是非常有帮助的。
随着时间的沟渠,我认为Spark会成为一个真正的分布式引擎,帮助我们大规模构建机器学习算法。
via radar