1
本文作者: 陳鳴鳩 | 2017-02-28 09:55 |
雷鋒網(wǎng)按:如果您覺得,是時候給自己的手機應用添加一些熱門的機器學習或深度學習算法.....這是個好想法!但您會怎么選擇?致力于提供算法服務(wù)及小白科普的咨詢師 Matthijs Hollemans 近期在博客上分享了他的一些心得體會,雷鋒網(wǎng)獨家編譯,未經(jīng)許可不得轉(zhuǎn)載。
絕大多數(shù)機器學習實現(xiàn)方法的步驟不外乎如下三點:
采集數(shù)據(jù)
利用采集的數(shù)據(jù)來訓練一個模型
使用該模型進行預測
假設(shè)想做一個“名人匹配 (celebrity match) ”的應用程序,告訴用戶他們和哪位名人最相似。首先收集眾多名人的臉部照片; 然后基于這些照片,訓練出一個深度網(wǎng)絡(luò)上并使其能夠辨認出每個名人的模樣。這將用到某種卷積神經(jīng)網(wǎng)絡(luò),然后訓練這個網(wǎng)絡(luò),直到它能比較普通人和名人之間的臉部差異。
訓練過程困難重重且代價不菲,但一旦模型訓練有成,實現(xiàn)了“推斷 (inference) ”——換句話說,做出預測是相當容易的。上傳一張自拍給模型它會立即說:“您和George Clooney的相似度達到85%,但您有一雙Lady Gaga的眼睛!"
需要什么樣數(shù)據(jù)、設(shè)計什么樣的模型、以及該如何訓練這個模型,完全取決于您想構(gòu)建什么樣的應用程序。但如何把機器學習系統(tǒng)融合到您的產(chǎn)品中,還需做出一些抉擇,這也是本篇博客存在的原因。
需要做出決定的事情主要是:
·想訓練自己的模型嗎?
·在自己的電腦上還是在云中訓練?
·在云中進行推斷還是在本地設(shè)備上進行推斷(離線狀態(tài)下)?
換言之,應該使用云服務(wù)進行深度學習,還是應該自己一手操辦?讓我們一探究竟!
第一個問題是:真的需要擁有自己的模型嗎?
使用別人的模型是目前為止最簡單的方法。機器學習領(lǐng)域的新公司如雨后春筍般出現(xiàn),他們能提供定制服務(wù),例如語音識別,文本分析,或者圖像分類。您不能直接訪問他們的模型,因為這是他們的機密,但通過一個API接口,就可以將這些模型為己所用。
提供此類機器學習服務(wù)的供應商有:
·Amazon Rekognition, Polly, Lex
各地涌現(xiàn)的類似服務(wù)商還有很多。如果應用程序需要執(zhí)行這些特定服務(wù)中的一個,那么您應該考慮使用這些服務(wù)。
工作原理:移動應用程序僅需向此類網(wǎng)絡(luò)服務(wù)發(fā)送一個HTTPS請求以及提供預測所需的數(shù)據(jù),例如由設(shè)備的相機拍攝的照片,那么在幾秒鐘之內(nèi),設(shè)備就能接收到預測結(jié)果。一般情況下,您需要依據(jù)不同請求,支付不同的費用,除此之外不需要擔心別的。您唯一需要做的,是在應用程序內(nèi)部連接服務(wù)的API接口,通常有軟件開發(fā)工具包 (SDK) 會讓這些服務(wù)易于集成。為了讓模型保持最新,服務(wù)供應商會在后臺使用他們的數(shù)據(jù)對模型進行重復訓練。每當他們改進模型,您自然而然地能從中受益,而不必為了使用這些服務(wù)去了解任何機器學習的事。
使用這種“全包的”機器學習服務(wù)的好處是:
·易上手。(通常有免費的。)
·一勞永逸、毫無困擾,不用擔心需要運行自己的服務(wù)器或訓練模型。
·不用費力勞神,就能從機器學習中受益。
這種方法的缺點:
·無法在本地設(shè)備上執(zhí)行推斷:所有推斷都是向他們的服務(wù)器發(fā)送網(wǎng)絡(luò)請求完成的。這意味著在請求推斷和獲得結(jié)果之間存在(短暫的)延遲,而且如果用戶沒有網(wǎng)絡(luò)連接,應用程序?qū)⑼耆荒芄ぷ鳌?/p>
·需要為每個預測請求付費,例如每1000個請求需支付1美元。
·不能用自己的數(shù)據(jù)對模型進行訓練,所以模型只適用于處理常見的數(shù)據(jù),如圖片,視頻和語音。如果您的數(shù)據(jù)具有唯一性或特殊性,那么這就不是一個正確的選擇。
注意:這些服務(wù)實際上只允許有限種類的訓練。例如Clarifai,允許上傳自定義的訓練圖像來創(chuàng)建自己的模型,這樣增強他們現(xiàn)有模型的功能后,對于特定的圖像,能獲得更好的推斷結(jié)果。
如果現(xiàn)有的模型符合您所有的需求,使用全盤管理的機器學習服務(wù)是一個明智的選擇。對于大多數(shù)移動應用程序,選這個服務(wù)就對了!
如果您的數(shù)據(jù)在某種場景下上是獨一無二的,或者對現(xiàn)有的解決方案不滿意,那么您需要訓練自己的模型。數(shù)據(jù)是成功進行機器學習的關(guān)鍵,數(shù)據(jù)的質(zhì)量和數(shù)量是重中之重。如果想訓練自己的模型,您需要海量的數(shù)據(jù)。一旦收集好了訓練數(shù)據(jù),下一步是決定在哪里訓練和如何訓練,這取決于模型的復雜性和收集到的訓練數(shù)據(jù)的數(shù)量。
?小型模型:可以在個人電腦或一臺備用電腦上訓練這個模型。
?大型模型:具有多個GPU的強力機器更有利,這任務(wù)確實更適于高性能計算機集群處理。
除非您有自己的數(shù)據(jù)中心或是一個土壕,否則最實際的做法還是租用其他電腦的計算能力,許多云平臺 恭候您的光臨。如今,您可以在云中租用GPU來訓練深度學習系統(tǒng)。
所以您要決定:租用,購買,哪個更便宜嗎?然而除了價格,還有其他條件需要考慮。讓我們來看看其中一些考慮因素。
提示:在設(shè)備上訓練又怎樣呢?如果需要進行推斷的所有數(shù)據(jù)在用戶設(shè)備上都有——并且不需要其他來源的數(shù)據(jù)——完全可以不需要云端平臺,在設(shè)備上進行訓練即可,可是這方法只適用于小型數(shù)據(jù)集和基礎(chǔ)的機器學習算法。這樣的做法還沒摸到深入學習的門欄。
你的選擇有兩個:
?通用云計算
?托管機器學習
讓我們先看看通用云計算。
工作原理:在別處數(shù)據(jù)中心租用一臺或多臺計算機,在這些電腦上無論做什么都隨您喜歡。讓云計算機訪問訓練數(shù)據(jù),然后運行您喜歡的訓練軟件,模型訓練開始。完成訓練后,支付用于訓練模型所用時間消耗的費用,就可以下載模型得出的參數(shù)和刪除計算實例。這樣就有了一個訓練好的且可以用于任何地方的的模型。
提供這類服務(wù)的有Amazon EC2和Amazon Virtual Machines。針對深度學習,除了租用高速GPU,甚至可以租用案例。
好處:
?極致的靈活性,沒有責任需要承擔。如果需要更多的計算能力,僅需提供其他計算實例,這比出門購買新電腦要經(jīng)濟得多。
?訓練通常只做一次,所以只需要租用這些電腦一小段時間。如果想重新訓練模型,只需再租幾個小時或幾天的計算機時間。
?可以訓練任意類型的模型,還可以使用選好的訓練包。
?可以下載訓練好的模型,然后根據(jù)喜好使用它。
缺點:
?訓練模型完全由您負責,因此需要清楚每一步的意義。如果不熟悉機器學習或者毫無訓練經(jīng)驗,那么需要雇用一個經(jīng)驗豐富的人。
?需要將訓練數(shù)據(jù)上傳到這個云服務(wù),您不僅要購買計算時間,還要支付存儲費用。
注意:上面的討論只和訓練機器學習模型相關(guān),而不是和推斷相關(guān)。一旦訓練好模型,需要設(shè)法讓它在應用程序上可用,使得程序可以用該模型做出推斷。如果決定在本地設(shè)備上進行推斷,那么將模型嵌入到移動應用程序中即可。但是如果在云中做推斷,您仍然需要建立自己的網(wǎng)絡(luò)服務(wù)來完成推理,隨之而來的是一系列需要考慮的因素(詳情在下面討論)。
另一個云端選擇是托管機器學習。如亞馬遜,微軟和谷歌等公司,早已把提供機器學習列為云服務(wù)的首要任務(wù)。
工作原理:不需要您具備訓練模型的專業(yè)知識,只需上傳數(shù)據(jù),選擇想使用的模型型號,并讓機器學習服務(wù)接管一切。
這是個介于使用完全托管服務(wù)和自己親力親為之間的選項,絕對比自己的訓練要容易得多,特別是如果對訓練模型不是很有信心。但是大多數(shù)這類服務(wù)不允許您下載訓練好的模型,所以對于應用程序的推斷部分,您別無選擇,只能使用他們的平臺進行推斷。不能把訓練好的模型移植到移動設(shè)備上,也就是不能在設(shè)備上進行預測,每進行一次推斷,都要連接他們的API接口和發(fā)送用戶的數(shù)據(jù)。
雖然這事未必對應用程序造成困擾,但這是需要在開始之前就注意到的事情。舉個例子來說,一旦使用了 Microsoft Azure Machine Learning的服務(wù),基本上永遠被Azure套牢。如果想切換到另一個服務(wù),帶不走訓練好的模型——您必須在新平臺上從頭開始訓練,并再次承擔訓練費用。這種類型的服務(wù)收取訓練期間消耗的運算時間產(chǎn)生的租金,以及訓練數(shù)據(jù)所占的存儲空間的費用。由于該服務(wù)提供了應用程序用于請求預測的API接口,您還需要為每個預測請求支付費用。
使用托管服務(wù)的好處:
?只需上傳數(shù)據(jù),不必為訓練操心。
?容易把這些服務(wù)集成到應用程序。雖然不能做離線推斷,但很容易讓網(wǎng)絡(luò)服務(wù)方面的事情建立且運行起來。
缺點:
?需要使用他們的服務(wù),不能離線在移動設(shè)備上進行推斷。
?可供選擇的模型數(shù)量有限,因此靈活性較低,例如Amazon Machine Learning目前僅支持線性回歸和邏輯回歸,使用他們的服務(wù)不能讓你訓練出一個深度學習模型。
?大公司——亞馬遜,微軟,谷歌——擁有廣泛的云服務(wù)類型。要使用他們的機器學習服務(wù),同樣得使用他們的存儲服務(wù)、SQL服務(wù)等。因此不得不上傳訓練數(shù)據(jù)到他們的云服務(wù),這也需要單獨付費。所以要為他們整個云端生態(tài)系統(tǒng)買單。
注意:新的谷歌Cloud Machine Learning平臺(當前為測試版)似乎是一個讓人值得高興的例外。和其他競爭對手一樣,這個云服務(wù)允許訓練自己的模型(如果愿意,您還能部署它們)??梢砸浦灿柧毢玫哪P?,離線預測得以實現(xiàn),如果是TensorFlow粉絲,這項服務(wù)是一個非常好的選擇。再次注意,TensorFlow的運行也是基于亞馬遜和Azure計算實例,從價格上也看得出它總是物超所值。
原理:除了使用一臺或多臺自己的電腦外,在自己電腦上訓練和在云上訓練,真的沒有差異。在計算機上加載自己喜歡的集成庫,賦予他們訪問數(shù)據(jù)的權(quán)限,啟動它們,訓練開始。如果對深入學習的態(tài)度非常嚴肅,或者如果碰巧身邊有一些閑置的計算機,那么從長遠來看,這個選擇可能比租用別人的電腦更實惠。
提示:即使想在云端訓練,明智的做法是在自己計算機上,嘗試用簡化的數(shù)據(jù)集運行模型,確認模型運行結(jié)果的正確性。當模型給出了有效的預測且對運行結(jié)果感到滿意,再用完整的數(shù)據(jù)集在計算能力更強的計算機進一步訓練。
云訓練的一個問題是,需要將數(shù)據(jù)上傳到云服務(wù)。因為數(shù)字存儲是云公司的業(yè)務(wù)之一,一般他們都會妥善保管好您的數(shù)據(jù)。但是數(shù)據(jù)也可能敏感到不希望它離開您的住所,這種情況下,訓練同樣需要在自己電腦上進行。
好處:
?完全受控,能自己決定如何訓練和訓練什么。
?訓練好的模型歸自己所有,能以任何合適的方式進行部署:作為云服務(wù)或在設(shè)備上離線部署。
?不需要為租用他人的計算機或云存儲而支付租金。
缺點:
?不得不為硬件,軟件,電力,以及讓自己的電腦保持運行的一切所需買單。
如果模型足夠小,在自己的硬件上進行訓練是一個明智的選擇。但是,對于要處理龐大數(shù)據(jù)的大型模型,需要更多資源來訓練,這時候使用云服務(wù)就能更快地擴展規(guī)模。
使用“托管”機器學習服務(wù),您提供數(shù)據(jù),服務(wù)商接管訓練過程,其中一個很大的缺點是訓練好的模型 并不歸自己所有。如果使用此類服務(wù),則還必須使用他們的API接口執(zhí)行預測。所以如果想在模型上訓練自己的數(shù)據(jù),并且能夠離線使用訓練好的模型,那么只有這些選項:
?在個人的電腦或備用的計算機上訓練
?不使用托管機器學習服務(wù),只租用他人的計算機或計算群集(如Amazon EC2)在云中進行訓練
?使用如Google Cloud Machine Learning之類的服務(wù)在云端訓練,這類服務(wù)允許下載訓練好的模型
因為絕大多數(shù)的云服務(wù)提供的功能非常相似,所以在選擇服務(wù)商之前,一定要貨比三家,讓自己盡可能 地少花冤枉錢。
注意:另一件需要考慮的事情是重新訓練模型的頻率。是偶爾地再運行一次相同的程序?還是經(jīng)常地重新訓練模型?不是所有的托管機器學習服務(wù)商都支持在線學習,如果在云上做在線學習,需要長期租用這些電腦。如果碰到這種情況,在自己電腦上訓練會經(jīng)濟得多。
很明顯,無論是在自己的電腦或是租用的電腦,訓練都是脫機進行的。但是,能選擇在設(shè)備上推斷,這樣的推斷并不需要網(wǎng)絡(luò)連接。
讓我們看一下這些選項:
?如果使用如Clarifai 或 Watson提供的全包服務(wù),需要向其服務(wù)器發(fā)出網(wǎng)絡(luò)請求。這種全包服務(wù)選擇的余地不是很大。
?如果使用類似Azure Machine Learning的托管機器學習服務(wù),你需要向其服務(wù)器發(fā)送網(wǎng)絡(luò)請求。使用自己的數(shù)據(jù)對模型進行了訓練,但該模型依附于他們的服務(wù)器,除非連接網(wǎng)絡(luò)API接口,否則無法訪問該模型。
?如果自己訓練模型,那么該模型得出參數(shù)后,就可以選擇在服務(wù)器上還是在設(shè)備上進行推斷。
究竟是在服務(wù)器上推理好,還是在本地設(shè)備上推理更好,取決于幾個權(quán)衡。
權(quán)衡之一是速度:是在移動設(shè)備上進行推斷得出結(jié)果更快?還是發(fā)送一個網(wǎng)絡(luò)請求讓性能更優(yōu)越的服務(wù)器做出推斷后返回結(jié)果更快?
然而某些推斷任務(wù)不可能在移動設(shè)備上完成——可能設(shè)備沒有足夠的處理能力或RAM,或者可能受到其他條件約束。哪個選項更實用完全取決于案例需求。
工作原理:創(chuàng)建一個服務(wù)器——要么是在用自己的設(shè)備搭建的服務(wù)器要么是在云中租用的服務(wù)器——將訓練好的模型上傳到該服務(wù)器上。應用程序通過互聯(lián)網(wǎng)和服務(wù)器會話,服務(wù)器放出一個網(wǎng)絡(luò)API接口給應用程序使用。
假設(shè)一個應用程序能將照片轉(zhuǎn)成基于深度學習的數(shù)字藝術(shù),用戶可以在他們的照片上加不同的效果。應用程序?qū)⒄掌l(fā)送到服務(wù)器,服務(wù)器通過深度學習網(wǎng)絡(luò)給照片加上所需的效果,幾秒鐘后,程序就收到修改好的圖像。使用服務(wù)器進行推斷使移動應用本身更簡潔,所有復雜的事都在控制之下在服務(wù)器上進行處理。您可以隨時改進模型或添加新的功能,只要更新服務(wù)器,就能部署改進的模型——不必更新移動設(shè)備上的應用程序。
好處:
?如果已經(jīng)預留了一個后端給應用程序,那么推理的邏輯能很好地與現(xiàn)有的后端集成在一起。
?可以使用相同的軟件包進行訓練和推斷。(當在本地設(shè)備上進行推斷時,可能需要使用不同的編程語言重寫推斷邏輯。)
?隨時更新模型。
?當所有的機器學習邏輯都在服務(wù)器上時,很容易移植應用程序到不同的平臺:IOS,Android,Web 等。
缺點:
?用戶需要網(wǎng)絡(luò)連接權(quán)限才能利用程序的功能進行推斷。
?需要維護自己的服務(wù)器。即使租用服務(wù)器,仍然需要處理所有典型的服務(wù)器問題,例如防范黑客,拒絕服務(wù)攻擊,防止停機等。
?需要創(chuàng)建API接口處理來自客戶端的預測請求,包括進行身份驗證,這樣只有授權(quán)用戶才能訪問該服務(wù)。
?需要購買帶寬。所有用戶從網(wǎng)絡(luò)通道發(fā)送到服務(wù)器的照片占用了很大的存儲資源,如果服務(wù)器是自己的機器,為此還需要支付電費。
?如果應用程序非常受歡迎,可能需要擴展多個服務(wù)器,因為要避免因為服務(wù)器過載了造成應用程序業(yè)績不佳的情況。
使用托管機器學習服務(wù),只需點擊一個按鈕即可將訓練好的模型部署到網(wǎng)絡(luò)API接口。創(chuàng)建和托管自己的 API后,程序的靈活性將大大提高,但缺點也很明顯——所有事情都得自己動手。如果應用程序做得非常成功,有數(shù)百萬的(付費)用戶,那么它值得讓您搭建一個自己維護的推斷后端。對于很多成功的應用程序,這樣做可能更便宜,而且使用云內(nèi)全方位服務(wù)的機器學習方案,麻煩也更少。
注意:與其從頭開始搭建自己的API接口,不如使用類似TensorFlow Serving的現(xiàn)成工具。
工作原理:把模型的得出參數(shù)加載到應用程序中,應用程序在本地設(shè)備的CPU或GPU上運行所有的推理計算——全程不需要與服務(wù)器通信。這個是框架服務(wù)統(tǒng)治的領(lǐng)域,像IOS上的BNNS and Metal CNN,但是一些機器學習集成庫,例如TensorFlow和Caffe也同樣在設(shè)備上運行。
直接在設(shè)備上做推理的主要原因是即時性,不需要通過互聯(lián)網(wǎng)發(fā)送請求并等待答復——相反地,推斷(幾乎在)瞬間完成。還是把照片變成“深度藝術(shù)”的那個例子:如果把這例子移植到直播的相機里并且要求反饋實時結(jié)果呢?用發(fā)送網(wǎng)絡(luò)請求的方法來實現(xiàn)這功能是不可能的——它必須直接在設(shè)備上完成。
注意:說真的,這個例子不具備現(xiàn)實意義,很多深度學習模型都做不到實時回饋。但要知道這點:速度方面,本地處理無可匹敵。
在服務(wù)器上進行推斷的一個最大的好處是,可以將改進的模型立即投入使用:你需要做的僅僅是將新模型上傳到服務(wù)器,要在移動設(shè)備上做到這一點可沒那么簡單,因為需要設(shè)法把改進的模型推送到所有安裝了應用程序的設(shè)備上。如果經(jīng)常重復訓練模型,為了方便把更新的模型參數(shù)發(fā)送到用戶的設(shè)備上,您可能需要搭建服務(wù)器等基本設(shè)備。
在設(shè)備上做推理的好處:
?即使沒有網(wǎng)絡(luò)連接,用戶也可以輕松使用這款應用程序的功能。
?速度:相較于發(fā)送網(wǎng)絡(luò)請求到服務(wù)器進行推斷,在本地設(shè)備做推斷更快捷也更可靠。
?如果在設(shè)備上進行推斷,則您不需要維護服務(wù)器。由于不需要搭建服務(wù)器,就不會遇到服務(wù)器過載的情況,當應用程序得到更多用戶青睞,變得更受歡迎,也完全不需要您擴展任何設(shè)備。
注意:在設(shè)備上做推斷,用戶為此付出的代價是消耗更多的電量。實際上,和以免導致糟糕的用戶體驗一樣,這也是不在設(shè)備上做推斷的原因。
缺點:
?將模型移植到應用程序,下載擴大后的安裝包顯然需要更多兆字節(jié)。
?更新模型更加困難。用戶需要手動下載更新后的應用程序,或者應用程序有自動下載更新的功能,才能 讓設(shè)備上的模型得到更新。
?將應用程序移植到其他平臺可能會很困難,因為需要重寫每個平臺的推斷部分(很有可能是一種設(shè)備類型重寫一次推斷邏輯)。
還有另一個潛在問題同樣需要注意:其他開發(fā)人員可以在您的應用程序包挖掘信息。復制參數(shù)是很容易的 事情。如果使用了TensorFlow圖形定義或caffemodel文件,居心不測的人剽竊整個模型也很容易做到。如果這個模型讓您擁有了競爭優(yōu)勢,為了保持優(yōu)勢,或許您該模糊處理這些數(shù)據(jù)。
正如您所知道,選擇有很多!毫無疑問地,未來幾個月或幾年內(nèi),市面上將會冒出越來越多的機器學習服務(wù)。什么服務(wù)最適合您的app、業(yè)務(wù)還有用戶——真的取決于您正在做的機器學習的類型。所以服務(wù)商在不知道確切的細節(jié)情況下提供合適的建議,是不可能的。但至少我希望這篇博文給了您一個確切可行的想法!
更多機器學習內(nèi)容請關(guān)注雷鋒網(wǎng)。
via qbview,雷鋒網(wǎng)編譯
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。