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

「古典程序員」集體恐慌

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

然而好日子彷佛也快到頭了,隨着行業巨頭的逐步壟斷,小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規則,如今是一個動態可學習的東西,這自己不就是一件很妙的事情嗎?

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

相關文章
相關標籤/搜索