移動端開發工程師的AI突圍之路

biaoxiaoduan發表於2018-07-31

“古典程式設計師”集體恐慌

隨著2007年第一臺iPhone問世,隨後Android的猛烈跟進,蘋果和谷歌推動了長達10年的移動網際網路浪潮。在此期間,移動端開發工程師可謂是風生水起,幾乎人們日常生活中接觸網際網路90%的途徑,都是通過一個叫App的東西,基於iOS/Android這兩大系統平臺。

然而好日子似乎也快到頭了,隨著行業巨頭的逐步壟斷,小App生存空間日漸萎縮,App排名靠前的幾乎都是幾家巨頭的產品,市場上對移動端開發人員的需求也在下降。同時由於近些年學校裡面學生也學,外面培訓機構也教,開發人員的供給還在上升,大家似乎感受到了一絲絲涼意。

近兩年,人工智慧的浪潮洶湧而來,“古典”程式設計師們更是集體陷入了恐慌,不會點深度學習,是不是過兩年就找不到工作了

今天的AI就像十年前的Android/iOS一樣,一夜之間需求暴漲,人才短缺。市面上的培訓課程層出不窮,各種《21天學會深度學習》,《手把手教你神經網路》之類的課程,動輒幾千,多者上萬,跟當年的Android/iOS真的很像。

人工智慧可沒換一種程式語言那麼簡單

當然了,作為一個“科班出身”的AI從業人員,我想說還是有點不一樣的。Android/iOS更多的是語言上的不同,或者介面互動方式的創新,本質上的思想和邏輯跟之前的VC/塞班也都一樣。

狹義的人工智慧應用,在思考問題的方式上是完全不同的,大家考慮的更多的是模型、資料,跟資料結構課裡面學的排序/查詢也不是一個概念。各種數學概念搞得人暈頭轉向,可以說,對於普通程式設計師來說,AI的學習曲線是非常陡峭的。

以Facial Landmark Detection(人臉特徵點定位)為例,輸入很多標註了特徵點的人臉圖片,經過一個應用程式很久的運算,儲存一個模型檔案。然後用另一個應用程式,輸入一張人臉圖片,就能把特徵點給自動標註出來,這個過程無論從數學的角度還是從程式設計的角度來看,都極其複雜,以後的文章裡我會試圖解釋。

模型只是很小一部分

大多數人工智慧的教程裡面,主要講的內容我都可以歸納為模型和演算法,你經常看到的各種術語,比如決策樹、支援向量機、邏輯迴歸、神經網路,到後來的CNN,RNN,LSTM,GAN等,都是模型。在學術圈模型和演算法基本上就是全部,這也是對於普通程式設計師來說,最難以理解的部分,就像前面提到的Facial Landmark Detection的例子。

對於工業界來說模型和演算法只是一部分,甚至可能是一小部分

大家的模型可能差不多

在深度學習流行之前,學術界解決問題很多都是靠特徵設計,這裡面會有很多的技巧(trick),很多時候一篇論文的效果好不好,主要不是取決於那幾個數學公式,而是程式碼裡面的trick。所以那個時候除非是SVM這種通用的演算法框架,很少有人公佈自己的程式碼。

而深度學習流行之後,似乎大家不那麼吝惜自己的程式碼了,很多人都選擇了開源。帶來的結果是,每年一批論文和對應的程式碼釋出之後,任何一個人下載一套程式碼,就能達到State-of-Art。這對研究人員來說是非常殘酷的,可能你辛辛苦苦研究一年剛剛超過去年的水平,人家一公佈,你又落後所有人了。

而世界上真正有能力設計網路的人並不多,而且訓練網路的代價非常的大,大部分AI工作者的主要工作還是在公認的比較好的基礎上,進行小修小補,甚至都不做修改,只是優化優化資料。這就導致了,大部分人的模型都差不多,你折騰半天,可能沒比別人強多少。當然我這裡不包括那些頂尖的選手,頂尖的AI人才,也不是我們普通程式設計師的目標,看看他們的簡歷你就知道我為什麼這麼說了,而且這樣的人一個公司也不需要幾個,太貴。。。

開源的那套東西沒法直接用

既然開源的東西那麼多,為什麼AI應用仍然有很高的門檻呢。因為開源的東西通常是沒法直接用的,原因總結有兩個:

  1. 多數開原始碼是無法直接在移動端執行的,Tensorflow Lite是一個強大的存在,一定要緊密關注。
  2. 移動端的運算能力較弱,而且不同硬體和平臺有很多適配問題,這對於一個應用是否能夠大規模應用是決定性的。

先推理(Inference)再學習(Training)

什麼是Training和Inference

幾乎所有機器學習的任務都可以抽象成一件事情,設計一個方程y=f(x),通過Training得到函式f的所有引數。然後再輸入一個新的x,得到輸出y,這個叫Inference。

我試圖用一種最粗糙的方法解釋一下這兩個過程。
先說Inference,比如我有函式Y=f(X)=aX*X+bX+c。假設a=b=c=1,如果現在有一個輸入x=1,那麼輸出y=3,這就是一次Inference。
再說Training,如果我知道輸入x=1的時候,y=10,那說明a=b=c=1肯定是錯的,利用優化演算法,改變a,b,c的值,使得輸出y更接近1一些。那麼現在有很多的x和對應的y,要找到一組a,b,c,使得總體的錯誤最小,這就是Training。

你可能暫時不用理解Training

好訊息是,真正的人工智慧應用中,你只需要使用Inference,也就是f(x)是已知的,是由其他大牛在計算能力很強的一臺機器或者一個叢集上,訓練了幾個小時甚至幾天得到的。應用在執行的時候,要做的只是把輸入送到方程裡,得到輸出。

掌握了Inference,Training也不會很難

還是負責任的補充一下,這裡講的是突圍,強調效率,先推理再學習不是說學習不重要,Training仍然是人工智慧的核心。前面的例子也大體描述了Training的過程,其實Training就是根據Inference結果的錯誤,不斷優化引數,然後再Inference,反覆迭代的過程。所以掌握好了Inference,也是為掌握Training打基礎。

客戶端的機會就在於Inference的優化和部署

現在主流的Training和Inference主要都在服務端

Training不用說,需要大量的計算資源和儲存,而且通常離線完成,現在基本上都是在服務端上完成。
主流的Inference,比如大家常用到的商品識別(淘寶客戶端的拍立淘)、語音識別(天貓精靈)等,核心的運算也都在服務端,因為演算法模型巨大,客戶端記憶體可能都放不下,速度也達不到。

邊緣計算(Edge Computing)的興起

近年邊緣計算這個詞開始興起,而近幾天Google釋出的Edge TPU把這件事情推到了極致。所謂邊緣,就是在雲的邊緣,或者外面。要解決的問題有以下兩點:

  1. 雲端計算資源貴
  2. 網路傳輸實時性和穩定性問題

大家考慮的解決問題的方法主要是:

  1. 把一些對計算要求不是特別高的運算放到邊緣裝置上
  2. 對演算法本身進行優化和簡化
  3. 提升邊緣裝置的運算能力

這裡的邊緣裝置是一個抽象的概念,包含但不限於:

  1. 手機
  2. 帶有處理晶片的攝像頭
  3. 架設在本地的小型伺服器

從計算資源成本來說,手機最極致,你自己花錢買的,不管算什麼都不會耗費伺服器的資源,架設在本地的攝像頭或者伺服器通常也是客戶一次性花費,不會帶來後續的負擔。

從網路角度來說,實時性取決於演算法本身執行的速度,如果太慢,可能還不如上傳,但穩定性一定更優。

從業態來說,新零售興起的今天,像盒馬鮮生這樣的領軍隊伍,也是邊緣計算的先行者。

“抖音”——“部署”和“優化”極致典範

抖音大家都知道,他的美顏/長腿/手勢識別等技術大大提升了生產力,為社會低成本地創造了無數的大長腿大眼網紅。

從AI工作者的角度來看,抖音是把端上人工智慧應用的部署和優化發揮到了極致。還以Facial Landmark Detection為例,抖音的美顏能夠做那麼好,人臉特徵點的定位功不可沒。目前主流的演算法基本都是基於CNN的,運算量極大,而且各種磨皮/瘦臉的影像處理,也非常複雜。這裡商湯科技可能結合了多種優化技術,才能達到如此快的效果。CPU的Neon優化和GPU優化應該都有應用。

此外,抖音這種億級使用者的產品,一定會覆蓋非常多的手機機型,如此複雜的演算法,能夠在這麼多不同的手機上執行,這也是一件很不容易的事情。

我再不懷好意地猜測一下,抖音上的人臉,除了用來定位,有可能還會被用來做人臉識別/聚類的訓練資料,這裡就涉及到了邊緣和雲之間的協同工作。

而上面說的這些事情,都是當今移動端開發者的機會。

突圍之路

基本功

如果是視覺方面,就是影像處理,語音方面就是音訊處理。以視覺為例,現在深度學習基本輸入都是原始畫素,也不用做複雜的特徵提取,所以這一塊要求不是太高。當然隨著應用的深入,很多東西還是慢慢要學。

動手把流行的演算法移植到手機上

這件事情可能是最重要的,就是動手,動手,動手。很多人學習深度學習,就是先把Tensorflow在自己的機器上安裝一遍,然後把Tutorial裡面的幾個例子跑一跑,就完事了。加起來也沒幾行python程式碼,其實你什麼也沒學會,就是照書敲程式碼。

我說的動手,還是針對Inference,建議先從Tensorflow Lite開始,一步步把訓練好的模型通過量化處理變成簡化的模型,然後在Android或者iOS上呼叫API,做一個App。

Tensorflow官方有開源的sample,是1000類的影像分類,可以在這個基礎上改模型,改程式碼,逐步嘗試。比如把1000類變成狗的品種識別,或者實現一個手寫數字識別,再複雜一點,做一個人臉檢測。後面會專門寫一些教程,把不同演算法移植到手機上。

緊密關注Tensorflow Lite的發展

Google釋出Tensorflow之後,生態日漸完善,開發社群非常活躍,遠遠把Caffe甩在了身後。隨後釋出的TPU,專門針對Tensorflow優化的AI晶片,提供了Cloud服務,Tensorflow Lite也是對移動平臺支援最好的Inference框架,近日推出的Edge TPU,同樣完美支援Tensorflow Lite,大有一統江湖之勢。所以一定要關注Tensorflow的發展。

作為移動端開發人員,Tensorflow Lite是重中之重。目前來看,Tensorflow Lite的優化還主要限於CPU,之後還會有什麼發展也是關注重點。Tensorflow Lite的程式碼量也不是太大,有時間閱讀原始碼,甚至進行一些優化,都是非常有價值的事情。

學習效能優化的方法

前面提到了,效能優化是客戶端智慧的重中之重,可以著重學習一下技術:

  1. C++效能優化
  2. Neon/SSE指令集優化
  3. GPU優化

這些技術難度都不低,而且通常跟應用場景本身相關,不容易有通用解決方案,在實際應用中可能會成為核心突破點。

除了手機,玩玩別的裝置

邊緣計算不只包含手機,手機重介面和互動,有很多AI應用其實是不強調介面和互動的,比如安防領域,試試更多的裝置,會擴充更多的可能性。比如Nvidia的TX2,Raspberry PI,以及即將上市的Edge TPU。

有時間多看看書

前面幾乎沒有提到看書,不是看書不重要,而是隻看書不動手是沒有效果的。在實踐中,不明白的地方一定需要網上查或者翻看資料。在這個基礎上,系統的學習理論知識,也是很有必要的。理想情況下,我認為可以重點關注一下幾點:

  1. 主流深度神經網路的架構,設計的思想,理解不同層到底在幹什麼,對應的程式碼在哪
  2. 人工智慧發展的歷程,怎麼一步步發展到深度學習的
  3. 曾經流行的一些經典演算法,很多思想其實在深度學習中都有應用

多一種思路,更廣闊的天地

最後,我想說很多人的焦慮其實大可不必,人工智慧一定是未來,但人工智慧不可能是全部,術業有專攻,你在自己的領域如果足夠強,是很難被取代的。

但是人工智慧提供了一種新的思路,就是通過資料和模型,能夠把一些以前需要人來判斷的事情變成自動的。最重要的就是,以前需要你定義好的if else規則,現在是一個動態可學習的東西,這本身不就是一件很妙的事情嗎?

多一門知識,多一種思路,我相信會給每個人帶來更廣闊的天地,加油!

相關文章