1
本文作者: 陈鸣鸠 | 2017-02-28 09:55 |
雷锋网按:如果您觉得,是时候给自己的手机应用添加一些热门的机器学习或深度学习算法.....这是个好想法!但您会怎么选择?致力于提供算法服务及小白科普的咨询师 Matthijs Hollemans 近期在博客上分享了他的一些心得体会,雷锋网独家编译,未经许可不得转载。
绝大多数机器学习实现方法的步骤不外乎如下三点:
采集数据
利用采集的数据来训练一个模型
使用该模型进行预测
假设想做一个“名人匹配 (celebrity match) ”的应用程序,告诉用户他们和哪位名人最相似。首先收集众多名人的脸部照片; 然后基于这些照片,训练出一个深度网络上并使其能够辨认出每个名人的模样。这将用到某种卷积神经网络,然后训练这个网络,直到它能比较普通人和名人之间的脸部差异。
训练过程困难重重且代价不菲,但一旦模型训练有成,实现了“推断 (inference) ”——换句话说,做出预测是相当容易的。上传一张自拍给模型它会立即说:“您和George Clooney的相似度达到85%,但您有一双Lady Gaga的眼睛!"
需要什么样数据、设计什么样的模型、以及该如何训练这个模型,完全取决于您想构建什么样的应用程序。但如何把机器学习系统融合到您的产品中,还需做出一些抉择,这也是本篇博客存在的原因。
需要做出决定的事情主要是:
·想训练自己的模型吗?
·在自己的电脑上还是在云中训练?
·在云中进行推断还是在本地设备上进行推断(离线状态下)?
换言之,应该使用云服务进行深度学习,还是应该自己一手操办?让我们一探究竟!
第一个问题是:真的需要拥有自己的模型吗?
使用别人的模型是目前为止最简单的方法。机器学习领域的新公司如雨后春笋般出现,他们能提供定制服务,例如语音识别,文本分析,或者图像分类。您不能直接访问他们的模型,因为这是他们的机密,但通过一个API接口,就可以将这些模型为己所用。
提供此类机器学习服务的供应商有:
·Amazon Rekognition, Polly, Lex
各地涌现的类似服务商还有很多。如果应用程序需要执行这些特定服务中的一个,那么您应该考虑使用这些服务。
工作原理:移动应用程序仅需向此类网络服务发送一个HTTPS请求以及提供预测所需的数据,例如由设备的相机拍摄的照片,那么在几秒钟之内,设备就能接收到预测结果。一般情况下,您需要依据不同请求,支付不同的费用,除此之外不需要担心别的。您唯一需要做的,是在应用程序内部连接服务的API接口,通常有软件开发工具包 (SDK) 会让这些服务易于集成。为了让模型保持最新,服务供应商会在后台使用他们的数据对模型进行重复训练。每当他们改进模型,您自然而然地能从中受益,而不必为了使用这些服务去了解任何机器学习的事。
使用这种“全包的”机器学习服务的好处是:
·易上手。(通常有免费的。)
·一劳永逸、毫无困扰,不用担心需要运行自己的服务器或训练模型。
·不用费力劳神,就能从机器学习中受益。
这种方法的缺点:
·无法在本地设备上执行推断:所有推断都是向他们的服务器发送网络请求完成的。这意味着在请求推断和获得结果之间存在(短暂的)延迟,而且如果用户没有网络连接,应用程序将完全不能工作。
·需要为每个预测请求付费,例如每1000个请求需支付1美元。
·不能用自己的数据对模型进行训练,所以模型只适用于处理常见的数据,如图片,视频和语音。如果您的数据具有唯一性或特殊性,那么这就不是一个正确的选择。
注意:这些服务实际上只允许有限种类的训练。例如Clarifai,允许上传自定义的训练图像来创建自己的模型,这样增强他们现有模型的功能后,对于特定的图像,能获得更好的推断结果。
如果现有的模型符合您所有的需求,使用全盘管理的机器学习服务是一个明智的选择。对于大多数移动应用程序,选这个服务就对了!
如果您的数据在某种场景下上是独一无二的,或者对现有的解决方案不满意,那么您需要训练自己的模型。数据是成功进行机器学习的关键,数据的质量和数量是重中之重。如果想训练自己的模型,您需要海量的数据。一旦收集好了训练数据,下一步是决定在哪里训练和如何训练,这取决于模型的复杂性和收集到的训练数据的数量。
•小型模型:可以在个人电脑或一台备用电脑上训练这个模型。
•大型模型:具有多个GPU的强力机器更有利,这任务确实更适于高性能计算机集群处理。
除非您有自己的数据中心或是一个土壕,否则最实际的做法还是租用其他电脑的计算能力,许多云平台 恭候您的光临。如今,您可以在云中租用GPU来训练深度学习系统。
所以您要决定:租用,购买,哪个更便宜吗?然而除了价格,还有其他条件需要考虑。让我们来看看其中一些考虑因素。
提示:在设备上训练又怎样呢?如果需要进行推断的所有数据在用户设备上都有——并且不需要其他来源的数据——完全可以不需要云端平台,在设备上进行训练即可,可是这方法只适用于小型数据集和基础的机器学习算法。这样的做法还没摸到深入学习的门栏。
你的选择有两个:
•通用云计算
•托管机器学习
让我们先看看通用云计算。
工作原理:在别处数据中心租用一台或多台计算机,在这些电脑上无论做什么都随您喜欢。让云计算机访问训练数据,然后运行您喜欢的训练软件,模型训练开始。完成训练后,支付用于训练模型所用时间消耗的费用,就可以下载模型得出的参数和删除计算实例。这样就有了一个训练好的且可以用于任何地方的的模型。
提供这类服务的有Amazon EC2和Amazon Virtual Machines。针对深度学习,除了租用高速GPU,甚至可以租用案例。
好处:
•极致的灵活性,没有责任需要承担。如果需要更多的计算能力,仅需提供其他计算实例,这比出门购买新电脑要经济得多。
•训练通常只做一次,所以只需要租用这些电脑一小段时间。如果想重新训练模型,只需再租几个小时或几天的计算机时间。
•可以训练任意类型的模型,还可以使用选好的训练包。
•可以下载训练好的模型,然后根据喜好使用它。
缺点:
•训练模型完全由您负责,因此需要清楚每一步的意义。如果不熟悉机器学习或者毫无训练经验,那么需要雇用一个经验丰富的人。
•需要将训练数据上传到这个云服务,您不仅要购买计算时间,还要支付存储费用。
注意:上面的讨论只和训练机器学习模型相关,而不是和推断相关。一旦训练好模型,需要设法让它在应用程序上可用,使得程序可以用该模型做出推断。如果决定在本地设备上进行推断,那么将模型嵌入到移动应用程序中即可。但是如果在云中做推断,您仍然需要建立自己的网络服务来完成推理,随之而来的是一系列需要考虑的因素(详情在下面讨论)。
另一个云端选择是托管机器学习。如亚马逊,微软和谷歌等公司,早已把提供机器学习列为云服务的首要任务。
工作原理:不需要您具备训练模型的专业知识,只需上传数据,选择想使用的模型型号,并让机器学习服务接管一切。
这是个介于使用完全托管服务和自己亲力亲为之间的选项,绝对比自己的训练要容易得多,特别是如果对训练模型不是很有信心。但是大多数这类服务不允许您下载训练好的模型,所以对于应用程序的推断部分,您别无选择,只能使用他们的平台进行推断。不能把训练好的模型移植到移动设备上,也就是不能在设备上进行预测,每进行一次推断,都要连接他们的API接口和发送用户的数据。
虽然这事未必对应用程序造成困扰,但这是需要在开始之前就注意到的事情。举个例子来说,一旦使用了 Microsoft Azure Machine Learning的服务,基本上永远被Azure套牢。如果想切换到另一个服务,带不走训练好的模型——您必须在新平台上从头开始训练,并再次承担训练费用。这种类型的服务收取训练期间消耗的运算时间产生的租金,以及训练数据所占的存储空间的费用。由于该服务提供了应用程序用于请求预测的API接口,您还需要为每个预测请求支付费用。
使用托管服务的好处:
•只需上传数据,不必为训练操心。
•容易把这些服务集成到应用程序。虽然不能做离线推断,但很容易让网络服务方面的事情建立且运行起来。
缺点:
•需要使用他们的服务,不能离线在移动设备上进行推断。
•可供选择的模型数量有限,因此灵活性较低,例如Amazon Machine Learning目前仅支持线性回归和逻辑回归,使用他们的服务不能让你训练出一个深度学习模型。
•大公司——亚马逊,微软,谷歌——拥有广泛的云服务类型。要使用他们的机器学习服务,同样得使用他们的存储服务、SQL服务等。因此不得不上传训练数据到他们的云服务,这也需要单独付费。所以要为他们整个云端生态系统买单。
注意:新的谷歌Cloud Machine Learning平台(当前为测试版)似乎是一个让人值得高兴的例外。和其他竞争对手一样,这个云服务允许训练自己的模型(如果愿意,您还能部署它们)。可以移植训练好的模型,离线预测得以实现,如果是TensorFlow粉丝,这项服务是一个非常好的选择。再次注意,TensorFlow的运行也是基于亚马逊和Azure计算实例,从价格上也看得出它总是物超所值。
原理:除了使用一台或多台自己的电脑外,在自己电脑上训练和在云上训练,真的没有差异。在计算机上加载自己喜欢的集成库,赋予他们访问数据的权限,启动它们,训练开始。如果对深入学习的态度非常严肃,或者如果碰巧身边有一些闲置的计算机,那么从长远来看,这个选择可能比租用别人的电脑更实惠。
提示:即使想在云端训练,明智的做法是在自己计算机上,尝试用简化的数据集运行模型,确认模型运行结果的正确性。当模型给出了有效的预测且对运行结果感到满意,再用完整的数据集在计算能力更强的计算机进一步训练。
云训练的一个问题是,需要将数据上传到云服务。因为数字存储是云公司的业务之一,一般他们都会妥善保管好您的数据。但是数据也可能敏感到不希望它离开您的住所,这种情况下,训练同样需要在自己电脑上进行。
好处:
•完全受控,能自己决定如何训练和训练什么。
•训练好的模型归自己所有,能以任何合适的方式进行部署:作为云服务或在设备上离线部署。
•不需要为租用他人的计算机或云存储而支付租金。
缺点:
•不得不为硬件,软件,电力,以及让自己的电脑保持运行的一切所需买单。
如果模型足够小,在自己的硬件上进行训练是一个明智的选择。但是,对于要处理庞大数据的大型模型,需要更多资源来训练,这时候使用云服务就能更快地扩展规模。
使用“托管”机器学习服务,您提供数据,服务商接管训练过程,其中一个很大的缺点是训练好的模型 并不归自己所有。如果使用此类服务,则还必须使用他们的API接口执行预测。所以如果想在模型上训练自己的数据,并且能够离线使用训练好的模型,那么只有这些选项:
•在个人的电脑或备用的计算机上训练
•不使用托管机器学习服务,只租用他人的计算机或计算群集(如Amazon EC2)在云中进行训练
•使用如Google Cloud Machine Learning之类的服务在云端训练,这类服务允许下载训练好的模型
因为绝大多数的云服务提供的功能非常相似,所以在选择服务商之前,一定要货比三家,让自己尽可能 地少花冤枉钱。
注意:另一件需要考虑的事情是重新训练模型的频率。是偶尔地再运行一次相同的程序?还是经常地重新训练模型?不是所有的托管机器学习服务商都支持在线学习,如果在云上做在线学习,需要长期租用这些电脑。如果碰到这种情况,在自己电脑上训练会经济得多。
很明显,无论是在自己的电脑或是租用的电脑,训练都是脱机进行的。但是,能选择在设备上推断,这样的推断并不需要网络连接。
让我们看一下这些选项:
•如果使用如Clarifai 或 Watson提供的全包服务,需要向其服务器发出网络请求。这种全包服务选择的余地不是很大。
•如果使用类似Azure Machine Learning的托管机器学习服务,你需要向其服务器发送网络请求。使用自己的数据对模型进行了训练,但该模型依附于他们的服务器,除非连接网络API接口,否则无法访问该模型。
•如果自己训练模型,那么该模型得出参数后,就可以选择在服务器上还是在设备上进行推断。
究竟是在服务器上推理好,还是在本地设备上推理更好,取决于几个权衡。
权衡之一是速度:是在移动设备上进行推断得出结果更快?还是发送一个网络请求让性能更优越的服务器做出推断后返回结果更快?
然而某些推断任务不可能在移动设备上完成——可能设备没有足够的处理能力或RAM,或者可能受到其他条件约束。哪个选项更实用完全取决于案例需求。
工作原理:创建一个服务器——要么是在用自己的设备搭建的服务器要么是在云中租用的服务器——将训练好的模型上传到该服务器上。应用程序通过互联网和服务器会话,服务器放出一个网络API接口给应用程序使用。
假设一个应用程序能将照片转成基于深度学习的数字艺术,用户可以在他们的照片上加不同的效果。应用程序将照片发送到服务器,服务器通过深度学习网络给照片加上所需的效果,几秒钟后,程序就收到修改好的图像。使用服务器进行推断使移动应用本身更简洁,所有复杂的事都在控制之下在服务器上进行处理。您可以随时改进模型或添加新的功能,只要更新服务器,就能部署改进的模型——不必更新移动设备上的应用程序。
好处:
•如果已经预留了一个后端给应用程序,那么推理的逻辑能很好地与现有的后端集成在一起。
•可以使用相同的软件包进行训练和推断。(当在本地设备上进行推断时,可能需要使用不同的编程语言重写推断逻辑。)
•随时更新模型。
•当所有的机器学习逻辑都在服务器上时,很容易移植应用程序到不同的平台:IOS,Android,Web 等。
缺点:
•用户需要网络连接权限才能利用程序的功能进行推断。
•需要维护自己的服务器。即使租用服务器,仍然需要处理所有典型的服务器问题,例如防范黑客,拒绝服务攻击,防止停机等。
•需要创建API接口处理来自客户端的预测请求,包括进行身份验证,这样只有授权用户才能访问该服务。
•需要购买带宽。所有用户从网络通道发送到服务器的照片占用了很大的存储资源,如果服务器是自己的机器,为此还需要支付电费。
•如果应用程序非常受欢迎,可能需要扩展多个服务器,因为要避免因为服务器过载了造成应用程序业绩不佳的情况。
使用托管机器学习服务,只需点击一个按钮即可将训练好的模型部署到网络API接口。创建和托管自己的 API后,程序的灵活性将大大提高,但缺点也很明显——所有事情都得自己动手。如果应用程序做得非常成功,有数百万的(付费)用户,那么它值得让您搭建一个自己维护的推断后端。对于很多成功的应用程序,这样做可能更便宜,而且使用云内全方位服务的机器学习方案,麻烦也更少。
注意:与其从头开始搭建自己的API接口,不如使用类似TensorFlow Serving的现成工具。
工作原理:把模型的得出参数加载到应用程序中,应用程序在本地设备的CPU或GPU上运行所有的推理计算——全程不需要与服务器通信。这个是框架服务统治的领域,像IOS上的BNNS and Metal CNN,但是一些机器学习集成库,例如TensorFlow和Caffe也同样在设备上运行。
直接在设备上做推理的主要原因是即时性,不需要通过互联网发送请求并等待答复——相反地,推断(几乎在)瞬间完成。还是把照片变成“深度艺术”的那个例子:如果把这例子移植到直播的相机里并且要求反馈实时结果呢?用发送网络请求的方法来实现这功能是不可能的——它必须直接在设备上完成。
注意:说真的,这个例子不具备现实意义,很多深度学习模型都做不到实时回馈。但要知道这点:速度方面,本地处理无可匹敌。
在服务器上进行推断的一个最大的好处是,可以将改进的模型立即投入使用:你需要做的仅仅是将新模型上传到服务器,要在移动设备上做到这一点可没那么简单,因为需要设法把改进的模型推送到所有安装了应用程序的设备上。如果经常重复训练模型,为了方便把更新的模型参数发送到用户的设备上,您可能需要搭建服务器等基本设备。
在设备上做推理的好处:
•即使没有网络连接,用户也可以轻松使用这款应用程序的功能。
•速度:相较于发送网络请求到服务器进行推断,在本地设备做推断更快捷也更可靠。
•如果在设备上进行推断,则您不需要维护服务器。由于不需要搭建服务器,就不会遇到服务器过载的情况,当应用程序得到更多用户青睐,变得更受欢迎,也完全不需要您扩展任何设备。
注意:在设备上做推断,用户为此付出的代价是消耗更多的电量。实际上,和以免导致糟糕的用户体验一样,这也是不在设备上做推断的原因。
缺点:
•将模型移植到应用程序,下载扩大后的安装包显然需要更多兆字节。
•更新模型更加困难。用户需要手动下载更新后的应用程序,或者应用程序有自动下载更新的功能,才能 让设备上的模型得到更新。
•将应用程序移植到其他平台可能会很困难,因为需要重写每个平台的推断部分(很有可能是一种设备类型重写一次推断逻辑)。
还有另一个潜在问题同样需要注意:其他开发人员可以在您的应用程序包挖掘信息。复制参数是很容易的 事情。如果使用了TensorFlow图形定义或caffemodel文件,居心不测的人剽窃整个模型也很容易做到。如果这个模型让您拥有了竞争优势,为了保持优势,或许您该模糊处理这些数据。
正如您所知道,选择有很多!毫无疑问地,未来几个月或几年内,市面上将会冒出越来越多的机器学习服务。什么服务最适合您的app、业务还有用户——真的取决于您正在做的机器学习的类型。所以服务商在不知道确切的细节情况下提供合适的建议,是不可能的。但至少我希望这篇博文给了您一个确切可行的想法!
更多机器学习内容请关注雷锋网。
via qbview,雷锋网编译
雷峰网版权文章,未经授权禁止转载。详情见转载须知。