iOS开发者的机器学习

bvbp7388 7年前
   <p>对于各种热门的机器学习、深度学习课程,你一定了解过不少了。但上课之后,如何把学出来的这些新方法用在你的工作项目?如何让你的移动应用也能具备机器学习、深度学习的能力?</p>    <p>具体做这事的话:你是该自己训练模型,还是用现成的模型?你是该用自己的电脑训练,还是在云端上训练?你是需要深度学习部署在云端,还是移动端?本文将对这些问题作出具体的解答。</p>    <p>作者 | Matthijs Hollemans           编译 | AI100</p>    <p>面对时下大热的机器学习和深度学习,是时候来加强你的移动应用了!</p>    <p>可你有什么好主意吗?来,听大神我娓娓道来。</p>    <p>为数众多的机器学习方案,其方法不外乎这样:</p>    <ul>     <li> <p>收集资料</p> </li>     <li> <p>用这些数据来训练一个模型</p> </li>     <li> <p>使用模型做预测</p> </li>    </ul>    <p>假设我们要做一个“名人配对”的应用程序,这个应用可以匹配出与用户最像的名人。</p>    <p>首先,你要收集大量的明星面部照片。接着,你要用这些照片训练一个深度学习网络,教会它每个名人都长什么样子。</p>    <p>你将会运用到卷积神经网络的某种模型,并且需要对它进行用户面孔和名人面孔的比较训练。</p>    <p>训练过程不仅困难而且还非常昂贵。但是一旦你训练好了这个模型,“推理”预测过程就很简单了。</p>    <p>当你把某张自拍照片展示给这个模型时,它会直接告诉你:“你和乔治·克鲁尼有85%的相似度,但是你有一双Lady Gaga的眼睛!”</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9214dfc651ba94478fd06e05abde56cc.png"></p>    <p>你想要设计出的应用程序的类型决定着你所需要的数据、应该设计出的模型类型以及训练这个模型的方法。</p>    <p>但是,你更需要在如何将这个机器学习系统投入使用方面做出选择。这也正是本篇文章的目的所在。</p>    <p>你需要做出决定的主要是以下这几件事情:</p>    <ul>     <li> <p>你是否想自己训练自己的模型?</p> </li>     <li> <p>你是要在你自己的电脑上进行训练,还是在云端进行训练?</p> </li>     <li> <p>你是要在云端进行预测,还是在移动端(离线)进行预测?</p> </li>    </ul>    <p>换句话说,你应该使用云端服务进行深度学习,还是应当在你自己的设备上进行深度学习?让我们来一探究竟!</p>    <h2>快捷、简单的选择</h2>    <p>第一个问题是:你是否想自己训练自己的模型?到目前为止,最简单的方法是使用别人的模型。现在有越来越多的公司,它们为了满足使用目的会提供定制化的机器学习服务,如语音识别服务、文本分析服务或者图像分析服务。你不能直接访问这些公司的模型——因为这是它们的秘密武器,但是你可以通过调用API接口来使用这些模型。这种机器学习的服务提供商有很多,比如:</p>    <ul>     <li> <p>Clarifai</p> </li>     <li> <p>Google Cloud Vision</p> </li>     <li> <p>Amazon Rekognition,Polly,Lex</p> </li>     <li> <p>Microsoft Azure Cognitive Services</p> </li>     <li> <p>IBM Watson</p> </li>    </ul>    <p>还有好多其他的……这种提供商比比皆是。</p>    <p>如果你的应用程序会使用到这些提供商提供的任何服务,你可以考虑直接使用。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/a6dbb3249a6a71f5712b2b9c3d4ec34b.png"></p>    <p>工作原理:你的手机应用会携带着一些必要的数据向Web服务器发送HTTPS请求,数据可能是你手机摄像头拍摄的照片。接着,在短短几秒之内,服务器会将预测的结果返回给你。</p>    <p>当然,你需要根据请求量来进行支付。但是你不用有任何担忧:你只需要在应用程序中访问API端点就可以了。通常情况下,会有已经集成好的SDK包,非常方便。</p>    <p>服务提供商通过重新训练模型来保持模型的前沿性(使用他们自己的数据),但是这一切的发生都不在我们的掌握之中。每次他们改进了模型,你都会自动受益。在使用这些服务时,你甚至不必了解机器学习。</p>    <p>使用这些集成好的机器学习的好处:</p>    <ul>     <li> <p>很好上手。(通常都有免费版)</p> </li>     <li> <p>完全无需参与其中,也无需担心。你既不用运行自己的服务器,也不用训练模型。</p> </li>     <li> <p>你不用进行任何有难度的工作就可以享受机器学习带来的便利。</p> </li>    </ul>    <p>缺点:</p>    <ul>     <li> <p>在离线的状态下,不能在设备上进行推理预测:所有预测都是通过向其服务器发送网络请求来完成的。这意味着在请求预测和获得返回数据时之间有一个延迟,如果用户没有网络连接,你的应用就没办法使用。</p> </li>     <li> <p>你要为每一次预测请求买单,比如为每1000次的请求支付1美元。</p> </li>     <li> <p>你无法使用你自己的数据进行训练,所以这个模型仅适用于常见的数据,比如图片、视频和语音。如果你的数据存在特殊之处,那么这个对你来说就不是很好的选择了。</p> </li>    </ul>    <p>注意:其中一些服务可能会允许你进行有限的培训。比如Clarifai允许你通过上传自定义训练图像来创建自己的模型。这样一来,你就可以对现有的模型进行功能扩充,以便对自己特定类型的图像得到更好的预测效果。</p>    <p>如果现有的模型可以满足你所有的需要,使用一个完全管理的机器学习是一个不错的选择。对于大部分移动端应用程序来说,这样的选择很正确。</p>    <h2>训练你自己的模型</h2>    <p>如果你的数据从某种意义上来说很特别,或者现有的解决方案并不理想,你就应该训练自己的模型。</p>    <p>数据是机器学习获得成功的关键,数据的数量和质量决定着机器学习的结果。如果你要开始自己的训练,你需要大量的数据。</p>    <p>一旦你收集好了训练数据,下一步就要决定从哪里开始训练以及怎样训练,取决于你的模型的复杂度和训练数据的数量。</p>    <ul>     <li> <p>小型模型:你可以选择在台式机上进行训练,也可以使用闲置的备用机器进行训练。</p> </li>     <li> <p>大型模型:这时候,具有多个GPU的折叠机器将会派上用场,这真的是高性能计算机集群才能完成的工作。</p> </li>    </ul>    <p>除非你有自己的数据中心或者非常有钱,否则最好的方式就是租用电脑。有很多云平台愿意为你效劳。如今你甚至可以租用云计算GPU来进行深度学习系统的训练。</p>    <p>现在你需要决定: <strong>相比购买电脑,租用电脑是不是更便宜呢?</strong> 不过,你还需要考虑其他方面,让我们一起看一下。</p>    <p>在移动设备上进行训练怎么样呢?如果所有你要预测的数据在用户的移动设备上都是有效的,你不需要获取其他资源的数据,那么你确实可以选择直接在设备上进行训练,完全不用使用云端服务。但是,这只适用于小数据集和基本机器学习算法。这不是单单运用深度学习就可以实现的。 </p>    <h2>在云端进行训练</h2>    <p>这里有两个选择:</p>    <ul>     <li> <p>通用云计算</p> </li>     <li> <p>托管式机器学习</p> </li>    </ul>    <p>我们先来看看通用云服务。</p>    <p>工作原理:在别人的数据中心租用一台或多台电脑。你可以进行任意的操作。为了训练你的模型,你可以让云计算机访问你的训练数据,运行你最喜欢的训练软件。</p>    <p>完成训练后,你需要将已经学习过的模型参数下载下来,然后删除计算实例。你只需要根据你使用计算机的时间来付钱就可以了。现在,你可以在任何地方使用你已经训练好的模型了。</p>    <ol>     <li> <p style="text-align:center"><img src="https://simg.open-open.com/show/7a62ecc5fb160b8f437cc237681e35e3.png"></p> </li>    </ol>    <p>能提供这样的服务的有Amazon EC2和Azure Virtual Machines。你甚至也可以租用配备快速GPU的实例来进行深度学习。</p>    <p>优点:</p>    <ul>     <li> <p>无与伦比的灵活性,无需您负担任何责任。如果您需要更多的计算能力,只要提供一些额外的计算实例就可以。这比购买新电脑便宜多了。</p> </li>     <li> <p>模型通常只需训练一次,因此您只需租用这些电脑一段时间。如果您想要重新训练您的模型,您只需再租用这些电脑几小时或几天。</p> </li>     <li> <p>您不受限于只训练一个特定类型的模型,您可以使用您选择的训练包。</p> </li>     <li> <p>您可以下载训练模型并以您喜欢的方式使用它。</p> </li>    </ul>    <p>缺点:</p>    <ul>     <li> <p>你必须明确你在做什么。训练模型的责任完全由你承担。如果你还不熟悉机器学习的技术和实践操作,你需要雇佣一个熟悉机器学习的人。</p> </li>     <li> <p>你还要将训练数据上传到云服务平台上。所以你不仅要为租用时长付钱,还要为数据存储空间付钱。</p> </li>    </ul>    <p>注意:以上讨论只涉及机器学习模型的训练,并不涉及推理预测过程。当你训练好自己的模型后,你要让它在你的应用程序上得以应用,使用模型做出预测。如果你决定在本地设备上进行操作,你只需要把模型嵌入进你的应用程序就可以了。如果你希望在云端进行预测,你仍然要设置自己的Web服务,这涉及其他方面的内容(以下会有更多相关内容)。</p>    <p>云端托管式机器学习</p>    <p>另一种云端选择就是托管式机器学习。</p>    <p>现在,一些公司会提供现有云服务基础上的机器学习服务,如Amazon、Microsoft、Google等。</p>    <p>工作原理:你不需要具备训练模型的专业知识。你只需要上传数据,选择你要使用的模型,然后让机器学习服务处理所有的细节。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ad77f95de6f68483bcc711c6d9cde0ee.jpg"></p>    <p>这个选择介于完全受管理的服务和自己完成所有的事情之间,绝对比自己做训练容易得多,特别是在你并不适合训练自己的模型的情况下。</p>    <p>但是……这种服务提供商大部分都不会让你下载训练好的模型。所以为了完成你的应用程序的推理预测过程,你只能选择使用他们的平台。你不能直接使用模型,你也无法将训练好的模型加载到移动设备上,无法在设备上进行预测。你每次都需要调用API并发送用户的数据,才能得到推理结果。</p>    <p>这可能不会为你的应用程序带来什么麻烦,但是你要在开发前对这件事有清醒的认识。例如,当你使用Microsoft Azure的机器学习服务时,基本来说你就要一直使用Azure了。如果你想换其他的服务供应商,你并不能从Azure带走你已有的训练好的模型,你必须要在新平台上重新训练模型,并付出相应的代价。</p>    <p>这一类服务会收取的费用包括:训练过程中的时间费用和训练数据的存储空间费用。因为该服务还向你的应用程序提供用于请求预测的API,你还要承担每次的请求费用。</p>    <p>使用托管式机器学习的优点:</p>    <ul>     <li> <p>只需要上传数据,不用操心模型的训练。</p> </li>     <li> <p>可以轻易将这些服务集成到你的应用中。你不能进行离线预测,但是至少可以轻松地让Web服务端开始运行。</p> </li>    </ul>    <p>缺点:</p>    <ul>     <li> <p>要想获得预测结果,你必须使用相关公司提供的服务,而且不能在移动设备上脱机执行。</p> </li>     <li> <p>你只有有限数量的模型可以选择,所以灵活性相对比较差。例如,Amazon的深度学习目前仅支持线性回归和逻辑回归,你不能用他们的服务来训练深度学习。</p> </li>     <li> <p>像Amazon、Microsoft和Google这样的大公司,它们能提供各种各样的云服务。但是在使用它们的机器学习云服务时,你还需要使用它们的存储服务,比如数据库服务等等。你必须把训练数据上传到云服务平台,这也是要单独支付费用的。所以,你需要买进的是将会是它们的整个云服务生态系统。</p> </li>    </ul>    <p>注意:谷歌推出的新的云机器学习平台(目前仅仅是测试版本)十分令人开心,可以说是一个例外。与其它相互竞争的品牌一样,谷歌的云服务也可以让你训练模型(如果你想布署它们)。但是你可以导出你的训练模型,也就是说你可以离线进行预测。如果你是TensorFlow的粉丝,这也不失为一个好的选择。而且,TensorFlow也可以在Amazon和Azure的计算实例上运行,价格也很可观。</p>    <h2>在你自己的电脑上进行训练</h2>    <p>工作原理:这和在云端进行训练真的没什么区别,除了你使用的是自己的一台或多台电脑外。你把自己最喜欢的机器学习包加载到计算机上,让它们可以访问你的数据,并让它们开始进行训练。</p>    <p>如果你对待深度学习的态度真的很认真,或者碰巧手头有备用电脑,那么这个选择会比租用别人的电脑更加便宜(从长远来说)。</p>    <p>提示:即使你想在云端进行训练,你最好先在自己的电脑上使用少量的数据集来确保模型正常运行。一旦你确定了这个模型可以做出有用的预测,再在更强大的计算机上继续使用完整数据集进行训练。</p>    <p>在云端进行训练的一个问题是,你要把数据上传到云服务平台。数字存储本身就是这些云服务公司的业务,它们通常能够确保你的数据的安全性。但是,你的数据可能含有十分敏感的内容,你并不希望这些数据脱离你的掌控。出于这样的原因,你也需要使用自己的计算机进行训练。</p>    <p>优点:</p>    <ul>     <li> <p>模型和数据完全受控,你可以随意训练。</p> </li>     <li> <p>你拥有这些训练好的模型,你可以用任何你认为合适的方式部署它们:作为云服务或者是在设备上脱机使用。</p> </li>     <li> <p>你不需要为使用他人的电脑或者是云存储空间支付费用。</p> </li>    </ul>    <p>缺点:</p>    <ul>     <li> <p>硬件、软件、电源以及所有保证你电脑运行的一切都需要由你承担。</p> </li>     <li> <p>如果你的模型足够小,在自己的硬件上训练模型是一个明智的选择。但是,对于需要大量训练数据的大型模型,如果你需要更多的资源,使用云服务可以更快的扩展模型。</p> </li>    </ul>    <h2>回顾:训练选择</h2>    <p>托管式的机器学习服务需要你提供你自己的数据,而服务来处理训练过程。使用这样的服务有一个非常大的缺点就是你无权拥有训练好的模型。如果你需要使用服务,你还必须通过调用API来进行预测。</p>    <p>所以如果你想用自己的数据进行训练,并且可以离线使用训练好的模型,你只有下面几种选择:</p>    <ul>     <li> <p>在你的台式电脑或者其他的电脑上进行训练</p> </li>     <li> <p>通过租用别人的计算机或计算机集群(如Amazon EC2)在云端进行训练,但是不使用其托管机器学习服务</p> </li>     <li> <p>使用如Google Cloud深度学习这样的服务,在云端训练的同时,你还可以下载相关的模型。</p> </li>    </ul>    <p>你一定要在不同的服务提供商之间比价,大部分云服务提供的功能都十分相似,所以你应该尽量选择价格较低的服务。</p>    <p>注意:另一件需要注意的事情是你需要重新训练模型的次数。也许这种情况并不多见,但是你是否会重复进行相同的过程?或者需要不断重新训练模型?并不是所有的托管机器学习提供商都支持在线学习。如果你在云端进行在线学习,你将需要长期租用那些电脑。如果这些使用场景的出现次数较高,那么你在自己的硬件上进行训练成本会比较低。</p>    <h2>推理:进行预测</h2>    <p>对于训练来说,无论模型在你自己的电脑上还是在你租用的电脑上,很明显它都是在移动设备以外进行的。</p>    <p>但是你可以选择在设备上进行推理操作,无需网络连接。</p>    <p>我们都可以有哪些选择:</p>    <ul>     <li> <p>如果你使用Clarifai或者Watson这样的服务,你需要向其服务器发送网络请求。没什么多余的选择。</p> </li>     <li> <p>如果你是用Azure Machine Learning这种托管式机器学习服务,你也需要向他们的服务器发送网络请求。你用自己的数据训练了模型,但是模型运行在他们的服务器上,想要访问模型必须调用API。</p> </li>     <li> <p>如果你自己训练了模型,你将会拥有该模型的学习参数。你可以决定是在服务器上还是在设备上进行推理预测。</p> </li>    </ul>    <p>与所有其他内容一样,无论是在服务器上进行推理预测还是在设备上进行本地化的推理预测,都取决于对以下几个条件的权衡。</p>    <p>一个是速度:在(相对慢的)移动设备上运行推理预测是否更快呢?向快速且强大的服务器发送网络请求,并在服务器做推理后返回数据,这样是否更快呢?一些推理预测任务在本地化的设备上是不可能完成的,设备可能没有足够的处理能力或者RAM,或者受到其他方面的限制。</p>    <p>采用哪种选择更实际,完全取决于你的用例。</p>    <h2>服务器上的推理预测</h2>    <p>工作原理:你设置一个服务器——不管是你自己的机器还是你从云端租用的,然后将你训练好的模型加载到服务器上。服务器在互联网上通过访问你的API端口来发布你的应用程序。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b689c6a616fe588da87b75955c493844.png"></p>    <p>假设你有一个通过深度学习将照片变成数字艺术的应用程序。用户可以为他们的照片选择不同的效果。你的应用程序将图片发送给服务器,服务器通过深度学习网络将应用程序所需的效果提供给图片,几秒过后,服务器将修改好的图片发送给应用程序。</p>    <p>使用服务器进行推理可以使移动端的应用程序变得更加简单。服务器完全受到你的控制,由服务器去处理复杂的东西。你可以优化你的模型,也可以随时增加新的功能。如果要部署更新后的模型,只需要更新服务器即可,不必更新应用程序本身。</p>    <p>优点:</p>    <ul>     <li> <p>如果你的应用程序已经有后端了,那么推理逻辑会与现有的后端融合的很好。</p> </li>     <li> <p>你可以对训练和推理过程使用相同的软件包(当在设备上进行本地推理时,你可能需要根据编程语言的不同重写逻辑。)</p> </li>     <li> <p>可以随时更新模型</p> </li>     <li> <p>当所有的机器学习逻辑都在服务器上时,将应用程序移植到不同的平台上是很容易的,这些平台包括:iOS、Android、web等。</p> </li>     <li> <p>你的秘密武器没有被嵌入到手机应用中,所以竞争对手无法逆向运行你的代码。</p> </li>    </ul>    <p>缺点:</p>    <ul>     <li> <p>用户需要在有网络的情况下才能使用你应用程序上的功能。</p> </li>     <li> <p>你需要运行你自己的服务器。即使你租借了一个服务器,你仍然需要解决一些服务器的问题,如防止黑客、拒绝服务攻击、防止停机等问题。</p> </li>     <li> <p>你需要创建自己的API来处理客户端的预测请求。这其中包括对身份验证的处理,使得授权用户才能访问该服务器。</p> </li>     <li> <p>你要为带宽付费。用户发送到服务器上的照片通过管道快速添加到大量字节中。如果你用的是自己的服务器,你也要支付电费。</p> </li>     <li> <p>如果你的应用非常流行,你可能需要扩展更多服务器。如果因为服务器负载过重而导致应用程序关闭,这会不利于你的商业运作。</p> </li>    </ul>    <p>对于托管式机器学习服务,只需要单击按钮就可以将已经训练好的模型部署到Web API上了。通过创建和托管你自己的API,你的应用程序将会更加灵活。但是最明显的缺点是……你需要自己完成所有事。</p>    <p>如果你的应用程序十分成功,拥有数百万(付费)用户,那么运行自己的推理后台至关重要。对于很多应用程序来说,使用全方位服务的机器学习云解决方案不仅价格相对低廉,而且由此带来的麻烦事也会大大减少。</p>    <p>注意:如果你不想从头开始写自己的API,你也可以使用现有的工具,例如TensorFlow Serving。</p>    <h2>设备上的推理</h2>    <p>工作原理:你将模型的学习参数加载到应用程序中。为了进行预测,应用程序会在本地设备运行所有的推理计算,并且使用自己的CPU或者GPU——它不需要与服务器通信。</p>    <p>这是iOS上的BNNS和Metal CNN等框架比较擅长的领域,但是现在一些机器学习软件包(如TensorFlow和Caffe)也可以在本地设备上运行。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e966578c7ddfe39572d1872ea33a0317.png"></p>    <p>直接在设备上进行推理的主要原因在于速度。你不需要通过互联网发送请求,也不需要去等待响应。相反,预测过程(几乎)发生在一瞬间。</p>    <p>举一个和把照片变成“深度艺术”相同的例子:如果你想实现现场摄像头的实时摄像功能会怎么样呢?你无法通过发送网络请求来执行这个操作——它必须直接在本地设备上完成。</p>    <p>注意:公平来说,这个例子并不是很现实。很多深度学习都不能快到“实时”。但是有一点很重要:为了速度,你不能忽视本地处理过程。</p>    <p>在服务器上进行推理的最大好处是你可以立即使用改进好的模型:上传新的模型到服务器,就算完成了。使用移动应用程序并不简单,因为你需要将改进的模型推送到所有现有的应用程序上进行安装。</p>    <p>如果你经常重新训练模型,那么你可能需要做一些基本的设置,以便将更新的模型参数分发到用户的设备上。所以,你可能需要保留一个服务器。</p>    <p>在设备上进行推理的优点:</p>    <ul>     <li> <p>用户在没有进行网络连接时依然可以使用应用程序。</p> </li>     <li> <p>速度:比发送网络请求更快、更可靠。</p> </li>     <li> <p>如果在本地设备上进行推理,你不必运行服务器。当应用程序变得更加流行且拥有更多的用户时,你不用扩展任何东西,因为没有集中的瓶颈。</p> </li>    </ul>    <p>注意:用户只需要关注推理过程所消耗的电池电量即可。如果电池电量使用不当,可能会造成不良的用户体验,这是不在本地设备上进行推理的原因之一。</p>    <p>缺点:</p>    <ul>     <li> <p>应用程序中包含模型会显著增加应用程序的大小,通常会增加许多兆的字节。</p> <p>这样一来,更新模型就会更加困难。用户需要下载更新包来获取更新的模型,或者应用程序需要自动更新。</p> </li>     <li> <p>将应用程序移植到其他平台也变得更加困难了。因为你需要针对每个不同的平台重写推理部分(可能还要考虑不同的设备类型)。</p> </li>    </ul>    <p>这里还有一个你需要关注的潜在问题:其他开发人员可能会窥探你的应用程序。从应用程序中复制已有的参数很容易,但是如果你的应用包中包含TensorFlow的图形定义文件或者caffemodel文件,那么对于那些不道德的人来说,窃取整个模型就会变得非常简单了。你可以混淆这些数据,让你的应用程序更加具有竞争优势。</p>    <h2>结论</h2>    <p>正如上面所说的,我们有很多选择。</p>    <p>毫无疑问,在未来的几个月或者几年中我们将看到市场上出现更多的机器学习服务。</p>    <p>你选择的机器学习类型对你的应用程序非常关键,它不仅会影响你的应用程序、你的业务,还会影响你的用户。</p>    <p>希望这篇博文能对你有所启发!</p>    <p>关于 Matthijs Hollemans: </p>    <p>Matthijs Hollemans 是一位独立技术顾问,擅长 iOS 平台上的深度学习。</p>    <p>?版权申明:该文章版权归AI100所有,如需转载、摘编、复制等,请后台留言征得同意。若有直接抄袭,AI100将追究其责任。</p>    <p> </p>    <p>来自:http://www.cocoachina.com/ios/20170511/19243.html</p>    <p> </p>