iOS開發者的機器學習
對于各種熱門的機器學習、深度學習課程,你一定了解過不少了。但上課之后,如何把學出來的這些新方法用在你的工作項目?如何讓你的移動應用也能具備機器學習、深度學習的能力?
具體做這事的話:你是該自己訓練模型,還是用現成的模型?你是該用自己的電腦訓練,還是在云端上訓練?你是需要深度學習部署在云端,還是移動端?本文將對這些問題作出具體的解答。
作者 | Matthijs Hollemans 編譯 | AI100
面對時下大熱的機器學習和深度學習,是時候來加強你的移動應用了!
可你有什么好主意嗎?來,聽大神我娓娓道來。
為數眾多的機器學習方案,其方法不外乎這樣:
-
收集資料
-
用這些數據來訓練一個模型
-
使用模型做預測
假設我們要做一個“名人配對”的應用程序,這個應用可以匹配出與用戶最像的名人。
首先,你要收集大量的明星面部照片。接著,你要用這些照片訓練一個深度學習網絡,教會它每個名人都長什么樣子。
你將會運用到卷積神經網絡的某種模型,并且需要對它進行用戶面孔和名人面孔的比較訓練。
訓練過程不僅困難而且還非常昂貴。但是一旦你訓練好了這個模型,“推理”預測過程就很簡單了。
當你把某張自拍照片展示給這個模型時,它會直接告訴你:“你和喬治·克魯尼有85%的相似度,但是你有一雙Lady Gaga的眼睛!”
你想要設計出的應用程序的類型決定著你所需要的數據、應該設計出的模型類型以及訓練這個模型的方法。
但是,你更需要在如何將這個機器學習系統投入使用方面做出選擇。這也正是本篇文章的目的所在。
你需要做出決定的主要是以下這幾件事情:
-
你是否想自己訓練自己的模型?
-
你是要在你自己的電腦上進行訓練,還是在云端進行訓練?
-
你是要在云端進行預測,還是在移動端(離線)進行預測?
換句話說,你應該使用云端服務進行深度學習,還是應當在你自己的設備上進行深度學習?讓我們來一探究竟!
快捷、簡單的選擇
第一個問題是:你是否想自己訓練自己的模型?到目前為止,最簡單的方法是使用別人的模型。現在有越來越多的公司,它們為了滿足使用目的會提供定制化的機器學習服務,如語音識別服務、文本分析服務或者圖像分析服務。你不能直接訪問這些公司的模型——因為這是它們的秘密武器,但是你可以通過調用API接口來使用這些模型。這種機器學習的服務提供商有很多,比如:
-
Clarifai
-
Google Cloud Vision
-
Amazon Rekognition,Polly,Lex
-
Microsoft Azure Cognitive Services
-
IBM Watson
還有好多其他的……這種提供商比比皆是。
如果你的應用程序會使用到這些提供商提供的任何服務,你可以考慮直接使用。
工作原理:你的手機應用會攜帶著一些必要的數據向Web服務器發送HTTPS請求,數據可能是你手機攝像頭拍攝的照片。接著,在短短幾秒之內,服務器會將預測的結果返回給你。
當然,你需要根據請求量來進行支付。但是你不用有任何擔憂:你只需要在應用程序中訪問API端點就可以了。通常情況下,會有已經集成好的SDK包,非常方便。
服務提供商通過重新訓練模型來保持模型的前沿性(使用他們自己的數據),但是這一切的發生都不在我們的掌握之中。每次他們改進了模型,你都會自動受益。在使用這些服務時,你甚至不必了解機器學習。
使用這些集成好的機器學習的好處:
-
很好上手。(通常都有免費版)
-
完全無需參與其中,也無需擔心。你既不用運行自己的服務器,也不用訓練模型。
-
你不用進行任何有難度的工作就可以享受機器學習帶來的便利。
缺點:
-
在離線的狀態下,不能在設備上進行推理預測:所有預測都是通過向其服務器發送網絡請求來完成的。這意味著在請求預測和獲得返回數據時之間有一個延遲,如果用戶沒有網絡連接,你的應用就沒辦法使用。
-
你要為每一次預測請求買單,比如為每1000次的請求支付1美元。
-
你無法使用你自己的數據進行訓練,所以這個模型僅適用于常見的數據,比如圖片、視頻和語音。如果你的數據存在特殊之處,那么這個對你來說就不是很好的選擇了。
注意:其中一些服務可能會允許你進行有限的培訓。比如Clarifai允許你通過上傳自定義訓練圖像來創建自己的模型。這樣一來,你就可以對現有的模型進行功能擴充,以便對自己特定類型的圖像得到更好的預測效果。
如果現有的模型可以滿足你所有的需要,使用一個完全管理的機器學習是一個不錯的選擇。對于大部分移動端應用程序來說,這樣的選擇很正確。
訓練你自己的模型
如果你的數據從某種意義上來說很特別,或者現有的解決方案并不理想,你就應該訓練自己的模型。
數據是機器學習獲得成功的關鍵,數據的數量和質量決定著機器學習的結果。如果你要開始自己的訓練,你需要大量的數據。
一旦你收集好了訓練數據,下一步就要決定從哪里開始訓練以及怎樣訓練,取決于你的模型的復雜度和訓練數據的數量。
-
小型模型:你可以選擇在臺式機上進行訓練,也可以使用閑置的備用機器進行訓練。
-
大型模型:這時候,具有多個GPU的折疊機器將會派上用場,這真的是高性能計算機集群才能完成的工作。
除非你有自己的數據中心或者非常有錢,否則最好的方式就是租用電腦。有很多云平臺愿意為你效勞。如今你甚至可以租用云計算GPU來進行深度學習系統的訓練。
現在你需要決定: 相比購買電腦,租用電腦是不是更便宜呢? 不過,你還需要考慮其他方面,讓我們一起看一下。
在移動設備上進行訓練怎么樣呢?如果所有你要預測的數據在用戶的移動設備上都是有效的,你不需要獲取其他資源的數據,那么你確實可以選擇直接在設備上進行訓練,完全不用使用云端服務。但是,這只適用于小數據集和基本機器學習算法。這不是單單運用深度學習就可以實現的。
在云端進行訓練
這里有兩個選擇:
-
通用云計算
-
托管式機器學習
我們先來看看通用云服務。
工作原理:在別人的數據中心租用一臺或多臺電腦。你可以進行任意的操作。為了訓練你的模型,你可以讓云計算機訪問你的訓練數據,運行你最喜歡的訓練軟件。
完成訓練后,你需要將已經學習過的模型參數下載下來,然后刪除計算實例。你只需要根據你使用計算機的時間來付錢就可以了。現在,你可以在任何地方使用你已經訓練好的模型了。
能提供這樣的服務的有Amazon EC2和Azure Virtual Machines。你甚至也可以租用配備快速GPU的實例來進行深度學習。
優點:
-
無與倫比的靈活性,無需您負擔任何責任。如果您需要更多的計算能力,只要提供一些額外的計算實例就可以。這比購買新電腦便宜多了。
-
模型通常只需訓練一次,因此您只需租用這些電腦一段時間。如果您想要重新訓練您的模型,您只需再租用這些電腦幾小時或幾天。
-
您不受限于只訓練一個特定類型的模型,您可以使用您選擇的訓練包。
-
您可以下載訓練模型并以您喜歡的方式使用它。
缺點:
-
你必須明確你在做什么。訓練模型的責任完全由你承擔。如果你還不熟悉機器學習的技術和實踐操作,你需要雇傭一個熟悉機器學習的人。
-
你還要將訓練數據上傳到云服務平臺上。所以你不僅要為租用時長付錢,還要為數據存儲空間付錢。
注意:以上討論只涉及機器學習模型的訓練,并不涉及推理預測過程。當你訓練好自己的模型后,你要讓它在你的應用程序上得以應用,使用模型做出預測。如果你決定在本地設備上進行操作,你只需要把模型嵌入進你的應用程序就可以了。如果你希望在云端進行預測,你仍然要設置自己的Web服務,這涉及其他方面的內容(以下會有更多相關內容)。
云端托管式機器學習
另一種云端選擇就是托管式機器學習。
現在,一些公司會提供現有云服務基礎上的機器學習服務,如Amazon、Microsoft、Google等。
工作原理:你不需要具備訓練模型的專業知識。你只需要上傳數據,選擇你要使用的模型,然后讓機器學習服務處理所有的細節。
這個選擇介于完全受管理的服務和自己完成所有的事情之間,絕對比自己做訓練容易得多,特別是在你并不適合訓練自己的模型的情況下。
但是……這種服務提供商大部分都不會讓你下載訓練好的模型。所以為了完成你的應用程序的推理預測過程,你只能選擇使用他們的平臺。你不能直接使用模型,你也無法將訓練好的模型加載到移動設備上,無法在設備上進行預測。你每次都需要調用API并發送用戶的數據,才能得到推理結果。
這可能不會為你的應用程序帶來什么麻煩,但是你要在開發前對這件事有清醒的認識。例如,當你使用Microsoft Azure的機器學習服務時,基本來說你就要一直使用Azure了。如果你想換其他的服務供應商,你并不能從Azure帶走你已有的訓練好的模型,你必須要在新平臺上重新訓練模型,并付出相應的代價。
這一類服務會收取的費用包括:訓練過程中的時間費用和訓練數據的存儲空間費用。因為該服務還向你的應用程序提供用于請求預測的API,你還要承擔每次的請求費用。
使用托管式機器學習的優點:
-
只需要上傳數據,不用操心模型的訓練。
-
可以輕易將這些服務集成到你的應用中。你不能進行離線預測,但是至少可以輕松地讓Web服務端開始運行。
缺點:
-
要想獲得預測結果,你必須使用相關公司提供的服務,而且不能在移動設備上脫機執行。
-
你只有有限數量的模型可以選擇,所以靈活性相對比較差。例如,Amazon的深度學習目前僅支持線性回歸和邏輯回歸,你不能用他們的服務來訓練深度學習。
-
像Amazon、Microsoft和Google這樣的大公司,它們能提供各種各樣的云服務。但是在使用它們的機器學習云服務時,你還需要使用它們的存儲服務,比如數據庫服務等等。你必須把訓練數據上傳到云服務平臺,這也是要單獨支付費用的。所以,你需要買進的是將會是它們的整個云服務生態系統。
注意:谷歌推出的新的云機器學習平臺(目前僅僅是測試版本)十分令人開心,可以說是一個例外。與其它相互競爭的品牌一樣,谷歌的云服務也可以讓你訓練模型(如果你想布署它們)。但是你可以導出你的訓練模型,也就是說你可以離線進行預測。如果你是TensorFlow的粉絲,這也不失為一個好的選擇。而且,TensorFlow也可以在Amazon和Azure的計算實例上運行,價格也很可觀。
在你自己的電腦上進行訓練
工作原理:這和在云端進行訓練真的沒什么區別,除了你使用的是自己的一臺或多臺電腦外。你把自己最喜歡的機器學習包加載到計算機上,讓它們可以訪問你的數據,并讓它們開始進行訓練。
如果你對待深度學習的態度真的很認真,或者碰巧手頭有備用電腦,那么這個選擇會比租用別人的電腦更加便宜(從長遠來說)。
提示:即使你想在云端進行訓練,你最好先在自己的電腦上使用少量的數據集來確保模型正常運行。一旦你確定了這個模型可以做出有用的預測,再在更強大的計算機上繼續使用完整數據集進行訓練。
在云端進行訓練的一個問題是,你要把數據上傳到云服務平臺。數字存儲本身就是這些云服務公司的業務,它們通常能夠確保你的數據的安全性。但是,你的數據可能含有十分敏感的內容,你并不希望這些數據脫離你的掌控。出于這樣的原因,你也需要使用自己的計算機進行訓練。
優點:
-
模型和數據完全受控,你可以隨意訓練。
-
你擁有這些訓練好的模型,你可以用任何你認為合適的方式部署它們:作為云服務或者是在設備上脫機使用。
-
你不需要為使用他人的電腦或者是云存儲空間支付費用。
缺點:
-
硬件、軟件、電源以及所有保證你電腦運行的一切都需要由你承擔。
-
如果你的模型足夠小,在自己的硬件上訓練模型是一個明智的選擇。但是,對于需要大量訓練數據的大型模型,如果你需要更多的資源,使用云服務可以更快的擴展模型。
回顧:訓練選擇
托管式的機器學習服務需要你提供你自己的數據,而服務來處理訓練過程。使用這樣的服務有一個非常大的缺點就是你無權擁有訓練好的模型。如果你需要使用服務,你還必須通過調用API來進行預測。
所以如果你想用自己的數據進行訓練,并且可以離線使用訓練好的模型,你只有下面幾種選擇:
-
在你的臺式電腦或者其他的電腦上進行訓練
-
通過租用別人的計算機或計算機集群(如Amazon EC2)在云端進行訓練,但是不使用其托管機器學習服務
-
使用如Google Cloud深度學習這樣的服務,在云端訓練的同時,你還可以下載相關的模型。
你一定要在不同的服務提供商之間比價,大部分云服務提供的功能都十分相似,所以你應該盡量選擇價格較低的服務。
注意:另一件需要注意的事情是你需要重新訓練模型的次數。也許這種情況并不多見,但是你是否會重復進行相同的過程?或者需要不斷重新訓練模型?并不是所有的托管機器學習提供商都支持在線學習。如果你在云端進行在線學習,你將需要長期租用那些電腦。如果這些使用場景的出現次數較高,那么你在自己的硬件上進行訓練成本會比較低。
推理:進行預測
對于訓練來說,無論模型在你自己的電腦上還是在你租用的電腦上,很明顯它都是在移動設備以外進行的。
但是你可以選擇在設備上進行推理操作,無需網絡連接。
我們都可以有哪些選擇:
-
如果你使用Clarifai或者Watson這樣的服務,你需要向其服務器發送網絡請求。沒什么多余的選擇。
-
如果你是用Azure Machine Learning這種托管式機器學習服務,你也需要向他們的服務器發送網絡請求。你用自己的數據訓練了模型,但是模型運行在他們的服務器上,想要訪問模型必須調用API。
-
如果你自己訓練了模型,你將會擁有該模型的學習參數。你可以決定是在服務器上還是在設備上進行推理預測。
與所有其他內容一樣,無論是在服務器上進行推理預測還是在設備上進行本地化的推理預測,都取決于對以下幾個條件的權衡。
一個是速度:在(相對慢的)移動設備上運行推理預測是否更快呢?向快速且強大的服務器發送網絡請求,并在服務器做推理后返回數據,這樣是否更快呢?一些推理預測任務在本地化的設備上是不可能完成的,設備可能沒有足夠的處理能力或者RAM,或者受到其他方面的限制。
采用哪種選擇更實際,完全取決于你的用例。
服務器上的推理預測
工作原理:你設置一個服務器——不管是你自己的機器還是你從云端租用的,然后將你訓練好的模型加載到服務器上。服務器在互聯網上通過訪問你的API端口來發布你的應用程序。
假設你有一個通過深度學習將照片變成數字藝術的應用程序。用戶可以為他們的照片選擇不同的效果。你的應用程序將圖片發送給服務器,服務器通過深度學習網絡將應用程序所需的效果提供給圖片,幾秒過后,服務器將修改好的圖片發送給應用程序。
使用服務器進行推理可以使移動端的應用程序變得更加簡單。服務器完全受到你的控制,由服務器去處理復雜的東西。你可以優化你的模型,也可以隨時增加新的功能。如果要部署更新后的模型,只需要更新服務器即可,不必更新應用程序本身。
優點:
-
如果你的應用程序已經有后端了,那么推理邏輯會與現有的后端融合的很好。
-
你可以對訓練和推理過程使用相同的軟件包(當在設備上進行本地推理時,你可能需要根據編程語言的不同重寫邏輯。)
-
可以隨時更新模型
-
當所有的機器學習邏輯都在服務器上時,將應用程序移植到不同的平臺上是很容易的,這些平臺包括:iOS、Android、web等。
-
你的秘密武器沒有被嵌入到手機應用中,所以競爭對手無法逆向運行你的代碼。
缺點:
-
用戶需要在有網絡的情況下才能使用你應用程序上的功能。
-
你需要運行你自己的服務器。即使你租借了一個服務器,你仍然需要解決一些服務器的問題,如防止黑客、拒絕服務攻擊、防止停機等問題。
-
你需要創建自己的API來處理客戶端的預測請求。這其中包括對身份驗證的處理,使得授權用戶才能訪問該服務器。
-
你要為帶寬付費。用戶發送到服務器上的照片通過管道快速添加到大量字節中。如果你用的是自己的服務器,你也要支付電費。
-
如果你的應用非常流行,你可能需要擴展更多服務器。如果因為服務器負載過重而導致應用程序關閉,這會不利于你的商業運作。
對于托管式機器學習服務,只需要單擊按鈕就可以將已經訓練好的模型部署到Web API上了。通過創建和托管你自己的API,你的應用程序將會更加靈活。但是最明顯的缺點是……你需要自己完成所有事。
如果你的應用程序十分成功,擁有數百萬(付費)用戶,那么運行自己的推理后臺至關重要。對于很多應用程序來說,使用全方位服務的機器學習云解決方案不僅價格相對低廉,而且由此帶來的麻煩事也會大大減少。
注意:如果你不想從頭開始寫自己的API,你也可以使用現有的工具,例如TensorFlow Serving。
設備上的推理
工作原理:你將模型的學習參數加載到應用程序中。為了進行預測,應用程序會在本地設備運行所有的推理計算,并且使用自己的CPU或者GPU——它不需要與服務器通信。
這是iOS上的BNNS和Metal CNN等框架比較擅長的領域,但是現在一些機器學習軟件包(如TensorFlow和Caffe)也可以在本地設備上運行。
直接在設備上進行推理的主要原因在于速度。你不需要通過互聯網發送請求,也不需要去等待響應。相反,預測過程(幾乎)發生在一瞬間。
舉一個和把照片變成“深度藝術”相同的例子:如果你想實現現場攝像頭的實時攝像功能會怎么樣呢?你無法通過發送網絡請求來執行這個操作——它必須直接在本地設備上完成。
注意:公平來說,這個例子并不是很現實。很多深度學習都不能快到“實時”。但是有一點很重要:為了速度,你不能忽視本地處理過程。
在服務器上進行推理的最大好處是你可以立即使用改進好的模型:上傳新的模型到服務器,就算完成了。使用移動應用程序并不簡單,因為你需要將改進的模型推送到所有現有的應用程序上進行安裝。
如果你經常重新訓練模型,那么你可能需要做一些基本的設置,以便將更新的模型參數分發到用戶的設備上。所以,你可能需要保留一個服務器。
在設備上進行推理的優點:
-
用戶在沒有進行網絡連接時依然可以使用應用程序。
-
速度:比發送網絡請求更快、更可靠。
-
如果在本地設備上進行推理,你不必運行服務器。當應用程序變得更加流行且擁有更多的用戶時,你不用擴展任何東西,因為沒有集中的瓶頸。
注意:用戶只需要關注推理過程所消耗的電池電量即可。如果電池電量使用不當,可能會造成不良的用戶體驗,這是不在本地設備上進行推理的原因之一。
缺點:
-
應用程序中包含模型會顯著增加應用程序的大小,通常會增加許多兆的字節。
這樣一來,更新模型就會更加困難。用戶需要下載更新包來獲取更新的模型,或者應用程序需要自動更新。
-
將應用程序移植到其他平臺也變得更加困難了。因為你需要針對每個不同的平臺重寫推理部分(可能還要考慮不同的設備類型)。
這里還有一個你需要關注的潛在問題:其他開發人員可能會窺探你的應用程序。從應用程序中復制已有的參數很容易,但是如果你的應用包中包含TensorFlow的圖形定義文件或者caffemodel文件,那么對于那些不道德的人來說,竊取整個模型就會變得非常簡單了。你可以混淆這些數據,讓你的應用程序更加具有競爭優勢。
結論
正如上面所說的,我們有很多選擇。
毫無疑問,在未來的幾個月或者幾年中我們將看到市場上出現更多的機器學習服務。
你選擇的機器學習類型對你的應用程序非常關鍵,它不僅會影響你的應用程序、你的業務,還會影響你的用戶。
希望這篇博文能對你有所啟發!
關于 Matthijs Hollemans:
Matthijs Hollemans 是一位獨立技術顧問,擅長 iOS 平臺上的深度學習。
?版權申明:該文章版權歸AI100所有,如需轉載、摘編、復制等,請后臺留言征得同意。若有直接抄襲,AI100將追究其責任。
來自:http://www.cocoachina.com/ios/20170511/19243.html