AI原本是一個專業領域,沒什么特別的。作為碼農一枚,筆者的工作內容正好在這個領域。
近來這一年左右時間里,連續發生了多件事情,使得筆者不得不抬起原本一直低著敲代碼的頭,看看這個為AI狂歡的世界。
【Case 1】 居然在一個月里碰到兩位在相對傳統行業創業的親友,來打聽將AI技術應用到他們所在行業上的問題,例如:是聊天機器人是否可以代替人工客服。
兩位親友居然都動了雇傭一位算法工程師的念頭。其中一位真的已經開始物色了。
頗費周折找到一位某非 985 院校專業對口的博士,友人有點動心想要聘用,奈何人家開口就要100萬年薪。
創業企業雖然已經拿了兩輪融資,還是不敢燒錢作死,故而多方打聽“算法”這東西的用處。
【Case 2】 筆者所在公司今年的校園招聘,本人照例作為 interviewer 參加,面試了幾個來自不同985院校的學生(明年畢業)。順便又和幾位今年剛入職的應屆生聊了聊。
結果發現,所有 interviewee(至少是我碰到的),全都是人工智能或機器學習方向的學生,所有交流過的新同事,在學校里做的也全部都是機器學習 or 深度學習算法。
而且,每一個人對于入職后工作的期望都是做算法。
人工智能,已經跌入到兩三年前大數據風口上,全民皆“數據科學家”的套路里了。
到底做什么,算是入行AI?
這個話題其實在筆者之前的幾個chat里面已經反復提到過了,在此再說一遍:工業界直接應用AI技術的人員,大致可以分為三個不同角色:算法、工程,和數據。
現在各種媒體上,包括gitchat中有大量的文章教大家怎么入行AI,怎么成為具體某個領域的工程師,告訴大家要在某領域內發展需要掌握的技術棧是什么,等等……對此本文不再贅述。
我們不說怎么能夠成為XXX,我們先來看看成為XXX之后要做什么事情,而做這些事情,需要什么樣的能力,在擁有了這些能力、做上了這件事情之后,又能向什么方向發展。
換言之,本文中,我們將從直觀的角度,管窺承擔不同角色工作所需要具備的素質,日常工作的狀態,和職業發展路徑。
1. 做算法
1.1 日常工作
所有人都想做算法,那么,說到底,在工業界做算法倒是干什么?
真正的算法工程師(也有公司叫科學家),最基本的日常工作其實是:讀論文&實現之——確認最新論文中的闡述是否真實可重現,進一步確認是否可應用于本企業的產品,進而將其應用到實踐中提升產品質量。
1.2 必備能力
既然日常工作首先是讀別人論文。那么,必不可少,作為算法工程師得具備快速、大量閱讀英語論文的能力。
有一個網站,所有有志于算法的同學必須要知道:https://arxiv.org ——這里有多個學科(包括computer science)大量的最新論文。
現在許多科學家、學者、研究人員和博士生在論文剛剛完成,尚未在正式期刊會議上發表時就先將論文發布在此處,為的是在盡量短的時間延誤下對外傳播自己的成果。
傳統的正規渠道,從論文完成到正式發表之間存在短則三四個月,長則一年半載的延遲。這對一些傳統學科,還勉強可以接受。
但計算機科學,尤其是人工智能、機器學習、深度學習這幾個當今世界最熱門的主題,大家都在爭分奪秒地搶占制高點,幾個月的耽擱根本不能容忍。
因此,對于AI的學術性文獻而言,arxiv.org 實際上已經成為了當前的集大成之地。
如果要做算法,平均而言,大致要保持每周讀一篇最新論文的頻率。
也許這就是為什么,到目前為止,筆者所聽聞和見過的算法工程師都是名校相關專業博士的原因。
經過幾年強化學術研究訓練,這些博士們,就算英語綜合水平不過 CET-4,也能讀得進去一篇篇硬骨頭似的英語論文!
1.3 自測“算法力”
但當然不能說碩士、學士或者其他專業的有志之士就做不成算法了。人都不是生而知之,不會可以學嘛。
但是到底能不能學會,其實也并不需要三年五載的時間,花費幾萬十幾萬金錢在各種培訓或者付費閱讀上才能夠知道。
有個很簡單的驗證方法:現在就去https://arxiv.org找一篇論文(比如這篇:[Dynamic Routing Between Capsules](https://arxiv.org/pdf/1710.09829.pdf)),從頭到尾讀一遍。
現在不懂沒關系,至少先試試在不懂的情況下能不能把它從頭到尾一字不漏的讀完,有不認識的字查字典。
如果這都做不到,還是當機立斷和“算法”分手吧。既然注定無緣,何必一味糾纏?
1.4 學術實踐能力
如果,碰巧你喜歡讀論文,或者就算不喜歡也有足夠強大的意志力、專注力壓迫自己去強行閱讀論文。那么恭喜你,你已經跨上了通往算法山門的第一級臺階。
下面一級是:讀懂論文。
既然要讀論文,讀最新論文,而且閱讀的目的是指導實踐,那么自然要讀懂。拿起一篇論文就達到*懂*的程度,至少需要下面這三種能力:
1.4.1 回溯學習能力
一篇論文拿來一看,一大堆名詞術語不懂,它們互相之間是什么關系也不知道。怎么辦?去讀參考文獻,去網上搜索,去書籍中查找……總之,動用一切資源和手段,搞清不明概念的含義和聯系。
這種能力是學術研究的最基礎能力之一,一般而言,有學術背景的人這一點不在話下。
如果現在沒有,也可以去主動培養,那么可能首先需要學習一下學術研究方法論。
1.4.2 數學能力
如果只是本著學習的目的讀經典老論文,那么只要清楚文中圖表含義,看公式推導明白一頭一尾(最開始公式成立的物理意義,以及結束推導后最終形式所具備的基本性質)也就可以了。
但讀最新論文就不同。因其新,必然未經時光檢驗,因此也就沒人預先替你驗證的它的正確性。
在這種情況下,看公式就得看看推導了。否則,外一是數學推導有錯,導致了過于喜人的結果,卻無法在實踐中重現,豈不空耗時力?
如果目前數學能力不夠,當然也可以學。但就與后面要說的做工程用到什么學什么的碎片化學習不同,做算法,需要系統學習數學。
微積分、線性代數、概率統計,是無法回避的。如果在這方面有所缺乏,那還是先從計算機系的本科數學課開始吧,個人推薦北師大教材。
1.4.3 理論聯系實際,將學術論述與產品、業務結合的能力
一般來說,在大企業里做到真正的算法工程師/科學家,也就不需要自己去動手開發產品了。但做 demo/prototype 還是不能避免的。
算法工程師,可不是用別人寫好的工具填幾個參數去運行就可以的,需要負責實際業務問題到數學模型的抽象,并能夠將他人最新成果(敲黑板——那些論文?。。。玫綐I務數據上去。
說得更通俗一點,就算是用別人寫的工具或框架,做算法的,也得是i)第一撥、最前沿那批試用者,或者ii)工具最新玩法的發明者。
1.5 創新型人才
算法工程師,即使自己不發明新的算法,不提出新的算法優化方法,也得去嘗試最新算法的使用或者把已有算法用出新花樣來。
毋庸置疑,這是一個有著必然創新性的角色。因此,這個角色必然不適合絕大多數人!
2. 做工程
2.1 日常工作
相對于算法的創新和尖端,做工程要平實得多。
這一角色比較有代表性的一種崗位就是:機器學習工程師(或戲稱調參工程師)——他們使用別人開發的框架和工具,運行已有算法,訓練業務數據,獲得工作模型。
其間可能需要一些處理數據、選取特征或者調節參數的手段,不過一般都有據可循,并不需要自己去發明一個XXXX。
做工程也得讀論文,不過和做算法不同,做工程讀論文的一般目的不是嘗試最新方法,而是用已知有效的方法來解決實際問題。
這就導致了,做工程的,讀的經常是“舊”論文,或者相對學術含量低一些(不那么硬)的論文。
而且在閱讀時,主要是為了直接找到某個問題的處理方法,因此,可以跳讀。
對于其中的數學公式,能夠讀懂頭尾也就可以了。論文閱讀頻率和學術深度的要求,都比做算法低得多。
TIP:很多title寫的是“人工智能/機器學習/深度學習算法工程師”的招聘崗位,其實招的是做工程的人。不要執著于辭藻,看清楚具體職責和工作內容。
2.2 軟件工程師的分支
說到底,機器學習工程師,是廣義的軟件工程師(或云程序員)的一個分支。AI產品開發,是廣義軟件開發的一個領域。
說起來,每一個程序員都有一個領域。不過,不同領域在不同時期熱度不同,發展趨勢不同。
若干年前,做*底層*的程序員在程序界睥睨群雄。寫協議棧的、開發驅動的、實現各種系統接口的程序員,站在鄙視鏈的最頂端。
如今,風水輪流轉,昨日黃花已謝,輪到AI封神了。
但說到底,開發人工智能產品的程序員,也還是程序員。不過是需要懂一定程度的領域內理論知識而已,和以前開發 PCI 協議棧要懂 PCI 協議,寫網卡 driver 要懂 TCP/IP 的道理是一樣的。
2.3 程序員的基本素質
既然是程序員,首先就不能丟掉 程序員的基本素質:編碼能力,和基礎算法能力(不是前面說的那種算法,而是鏈、樹、圖的構建、刪除、遍歷、查找、排序等數據結構里講的那種算法),是最起碼要求。
其實,在AI成為潮流的今天,只要能找到一個在AI方面相對比較前沿的企業,進去做一名普通程序員。
那么即使本來開發的產品不屬于AI范疇,未來通過在舊產品上應用新的AI技術,或者在公司內部 transfer 到做 AI 產品的 team,都可能獲得入行的機會。
甚至具體知識的掌握,都可以在入職后慢慢積累——對于大多數AI工程人員,這可能才是一條自然的入行之路。
但這一切的前提是:此人首先得是一個合格的程序員!
而不是本末倒置,雖然花功夫學了幾個模型、算法,卻連最基本的編程面試題都做不對。
2.4 做工程,「機器學習」學到多深夠用
當然,既然是有領域的程序員,在專業上達到一定深度也是必要的。
雖然做工程一般要使用現成技術框架,但并不是說,直接把算法當黑盒用就可以做一名合格的“調參”工程師了。
把算法當黑盒用的問題在于:黑盒能夠解決問題的時候,使用方便,而一旦不能解決問題,或者對質量有所要求,就會感覺無所適從。
作為程序員、工程人員,想用機器學習算法解決實際問題,就得對算法有一定程度的掌握,此外對于數據處理和模型驗證,也需具備相應知識。
2.4.1算法
僅從使用角度而言,掌握算法,大致可分為如下由淺入深的幾步:
【1】簡單使用:了解某個算法基本原理,應用領域,功能和局限。
a) 該算法的應用問題域是什么?(e.g. 分類、回歸、聚類……)
b) 該算法的應用目標是什么?(e.g. 判別算法、生成算法……)
c) 該算法適合應用在怎樣的數據集,它能對數據造成怎樣的影響?(e.g. 適用少量高維稀疏數據……)
d) 能夠主動獲取該算法的函數庫,調用該算法生成模型。
【2】模型調優:對所采用算法和對應模型的數學公式有所了解。
a) 知道調用函數中各個參數的意義(e.g. 迭代次數,對應到公式中參數的含義……),能夠通過調節這些參數達到優化結果的目的。
b) 能夠通過加約束條件(e.g. L0, L1, L2 ……)來優化算法。
c) 了解在當前問題域,目標和輸入數據確定的情況下,還可以用哪些其他模型可替換現有模型,并進行嘗試。
d) 能夠將多個弱模型加權組成強模型(e.g. adaboost)。
【3】運行效率優化:對模型本身的數學推導過程和模型最優化方法有所掌握,對于各種最優化方法的特點、資源占用及消耗情況有所了解。
a) 了解算法在當前數據集上的運行效率(e.g. 需要進行哪些運算,是否易于被分布式等)。
b) 了解在其他語言、平臺、框架的工具包中有否同等或近似功能但在當前應用場景下效率更高的算法。
c) 能夠針對具體場景,通過轉換模型的最優化方法(optimizer)來改進運行效率。
2.4.2 數據
僅僅只有算法,并不能解決問題。算法和數據結合,才能獲得有效的模型。
對于數據,需要從:i)。 具有業務含義的信息,和ii)。用于運算的數字,這兩個角度來對其進行理解和掌握。
【1】特征選?。簭臉I務角度區分輸入數據包含的特征,并認識到這些特征對結果的貢獻。
a) 對數據本身和其對應的業務領域有所了解。
b) 能夠根據需要標注數據。
c) 知道如何從全集中通過劃分特征子集、加減特征等方法選取有效特征集。
【2】向量空間模型(VSM)構建:了解如何將自然語言、圖片等人類日常使用的信息轉化成算法可以運算的數據。
a) 能夠把文字、語音、圖像等輸入轉化成算法所需輸入格式(一般為實數空間的矩陣或向量)。
b) 能夠根據信息熵等指標選取有效特征。
【3】數據清洗和處理:對直接的業務數據進行篩選并轉換為模型可處理形式。
a) 能夠運用統計學方法等ETL手段清洗輸入數據。
b) 能夠對數據進行歸一化(normalization), 正則化(regularization)等標準化操作。
c) 能夠采用bootstrap等采樣方法處理有限的訓練/測試數據,以達到更好的運算效果。
2.4.3 模型驗證
算法+數據就能夠得到模型。但是,
這個模型的質量如何?
這個模型和那個模型比較,哪個更適合解決當前問題?
在做了如此這般的優化之后得出了一個新的模型,怎么能夠確認它比舊的模型好?
為了解答這些問題,就需要掌握度量模型質量的方法。為此,需要做到:
i) 了解 bias,overfitting 等基本概念,及針對這些情況的基本改進方法。
ii) 了解各種模型度量指標(e.g. Accuracy, Precision,Recall, F1Score……)的計算方法和含義,及其對模型質量的影響。
iii) 能夠構建訓練集、測試集,并進行交叉驗證。
iv) 能夠運用多種不同的驗證方法(e.g. 2-Fold cross-validation,K-Fold cross-validation, Leave-One-Out cross-validation……)來適應不同的數據集。
3. 做數據
此處說得做數據并非數據的清洗和處理——大家可以看到做工程的崗位,有一部分工作內容就是ETL和處理數據。此處說的做數據是指數據標注。
3.1 標注數據的重要性
雖然機器學習中有無監督學習,但在實踐領域被證明有直接作用的,基本上還都是有監督模型。
近年來,深度學習在很多應用上取得了巨大的成功,而深度學習的成功,無論是圖像、語音、NLP、自動翻譯還是AlphaGo,恰恰依賴于海量的標注數據。
無論是做ML還是DL的工程師(算法&工程),后者有甚,都共同確認一個事實:現階段而言,數據遠比算法重要。
3.2 數據人工標注的必要性
很多人誤以為 AlphaGo Zero 100:0大勝 AlphaGo 是無監督學習的勝利。
其實,之所以有這樣的結果,恰恰是因為 Zero 利用圍棋嚴格完備而明晰的規則,自己制造出了巨大量的標注數據——這些標注數據的數量遠超其前輩 AlphaGo 的輸入,而且可以隨時造出更多。
圍棋是一個人為定義的在19x19點陣范圍內,按完備無二義性規則運行的游戲,因此計算機程序才能依據規則自動產生標注數據。
真實人類世界的事情,基本沒有完全按矩而行無意外的情況。因此,對人類真正有用的模型,還是需要人工標注的訓練數據。
固然,目前有多種技術用以在標注的過程中輔助人工,以減小工作量及降低人工標注比例。但至今沒有能在應用領域完全自動化標注的技術出現。
換言之,在看得見的未來之內,人工標注數據仍然是AI落地的必要和主流。
3.3 人工智能的“勤行”
3.3.1 什么叫做標注
舉個很簡單的例子說明一下什么是數據標注:
在開發聊天機器人的時候,我們需要訓練意圖判定和實體識別模型,因此也就需要標注用戶問題的意圖和出現的實體。
這是用戶問題原始數據:“00183號商品快遞到伊犁郵費多少?”
這樣一句話,很顯然問它的用戶是想知道某一種商品發往某地的郵費。郵費是商品的一個屬性,我們把所有查詢商品屬性的意圖都定義為“商品查詢”。
因此,這樣一句話的意圖是“商品查詢”。其中有包含了幾個實體,分別是商品Id,目的地和商品屬性。
這句話被標注出來以后,就是下面這個樣子:
[00183]《-{商品Id}號商品快遞到[伊犁]《-{目的地}[郵費]《-{商品屬性}多少?||商品查詢
具體格式不必糾結。核心一點:標注就是將原始數據內全部或者部分內容,按照業務需求打上定義好的標簽。
3.3.2 數據標注的日常工作
簡單說:數據標注的日常工作就是給各種各樣的數據(文本、圖像、視頻、音頻等)打上標簽。
【好消息】:數據標注工作幾乎沒有門檻。一般任何專業的大學畢業生,甚至更低學歷,都能夠勝任。上手不需要機器學習之類的專業知識。
【壞消息】:這樣一份工作,是純粹的“臟活累活”,一點都不cool,起薪也很低。
打個不太恰當的比喻:
做算法是屠龍,仗劍江湖,天外飛仙;
做工程是狩獵,躍馬奔騰,縱酒狂歌;
做數據是養豬,每天拌豬食清豬糞,一臉土一身泥。
所以,雖然這是一件誰都能干的工作,但是恐怕,沒幾個人想干。
3.3.3 數據標注的難點
就單個任務而言,數據標注是一項很簡單的工作。它的難點在于數據的整體一致性,以及與業務的集合。
【1】數據一致性是指:所有數據的標注原則都是一樣的。
當數據很多的時候,一致性是相當難以保證的,尤其是在有精標需求的情況下。
如果一份 raw data 由多個人同時標注,就算是反復宣講標注原則,每個人也都有自己的理解和側重,很難保證一致,很可能一句話在某個人看來是“查詢商品”,而在另一個人看來就是“要求售后”。(即使是將所有數據交給一個人,也可能在不同時間段理解不同。)
出于對數據標注工作的不重視(正好與對算法的過分重視相映成趣),很多公司外包了數據標注工作。
對于數據標注的不一致性,則采取一種暴力解決方案:讓多個人(比如3個)同時標注同一份數據,一旦出現不一致,就采用簡單多數法,取最多人一致認定的那種結果(比如:3個人中兩個都選“查詢商品“,則選定”查詢商品“為最終 label)。
這種方案對于粗標數據還可以起到一定作用,但如果是精標,則往往連多數人一致的情況都難以出現。
如果三個人所標結果完全不一樣,那么這條數據也就失去了標注價值。
在現實中,經常會出現同一份數據因為質量過低,被要求重復標注的情況出現,費時費力。
【2】與業務的集合是數據標注面對的另一個挑戰。
這一點在目前還不是很明顯。因為:目前人工智能的落地點還比較有限,真正的商業化領域也就是語音和圖像處理的少數應用;
owner 都是大公司,有自己的標注團隊,或者雇傭有長期合作關系的第三方標注公司,標注人員都相對有經驗;
業務要求也相對穩定,所需數據標注又相對通用化,普通人都不難理解數據含義和標注原則。
一旦未來人工智能的落地點在各個領域全面鋪開,很可能需要的是針對具體企業、具體業務,不斷變更的標注需求。
標注這件事情看似容易,但是一旦標注原則有所改變,就要整個重新來過。以前的標注不但不是積累,反而是累贅。
如何應對快速變更的業務需求,同步更新標注結果,將是一個在AI真正服務于大眾時全面爆發的問題。偏偏現階段還未引起足夠重視。
3.3.4 數據標注的潛力
就目前而言,數據對模型的影響遠勝于算法。一群年薪百萬起步的算法工程師耗費經年的成果,對于模型質量直接的影響甚至比不上一個靠譜標注團隊一兩個月的精心標注。對模型的影響尚且如此,更何況是商業價值。
此時此刻,AI 在風口浪尖,大公司、拿了巨額風投的獨角獸 startup,一個個拿出千金市馬骨的氣概,將不可思議的高薪狠狠砸向 AI 領域的頂尖學者,順便捧起了一批年輕的博士,也引來了世人的垂涎。
這種情形能維持多久?商業企業能承受多少年不掙錢只燒錢?待潮涌過后,行業回歸理性,模型還是要用來掙錢的。
到了那個階段,大小企業不會去算成本收益嗎?他們會意識不到將資源投入數據和算法的不同產出比嗎?
企業為了創造利潤應用AI技術,算法工程師不是剛需,而數據標注這個人工智能領域的“勤行”,人工智能藍領,一定是剛需!
一切標注工作的難點和潛藏的風險,也就是這項工作的潛力和從事這項工作未來職業發展的可能性所在。
3.3.5 數據標注的職業發展
如前所述,數據標注的難點在于:
如何根據業務設定標注原則
如何快速統一地實現標注原則
同時,和所有門檻低的工種一樣,從事數據標注工作,要面臨如何從極大量基數資質類似的人員中脫穎而出的問題。
還有就是如何與越來越多的自動化標注技術共處的問題。
因此,筆者個人建議的數據標注職業提升路徑:經驗+業務+管理。大致步驟為:
通過實踐積累數據標注的工作經驗
深入理解業務需求并將其體現到數據的標注結果中
管理標注團隊達到高效的標注結果與業務變更align
未來也許會出現一個“數據經理”之類稱謂的職位:其職責以負責提供高質量標注數據為基礎,技術上銜接工程領域的 ETL 和數據處理,產品上對接業務,帶領團隊為公司產品或服務的 revenue 提供直接貢獻。
4. 認清形勢,腳踏實地
近來一段時間,能明顯感到,想入行AI的人越來越多,而且增幅越來越大。
為什么這么多人想入行AI呢?真的是對計算機科學研究或者擴展人類智能抱著無限的熱忱嗎?說白了,大多數人是為了高薪。
人們為了獲得更高的回報而做出選擇、努力工作,原本是非常正當的事情。關鍵在于,找對路徑。
尋求入行的人雖多,能真的認清市場當前的需求,了解不同層次人才定位,并結合自己實際尋找一條可行之路的人太少。
人人都想“做算法”,卻不想想:大公司里的研究院養著一群高端科學家,有得是讀了十幾二十年論文始終站在AI潮頭的資深研究人員。
想要與他們為伍做算法,須有可以與之并列的成就:要么有足夠分量的學術成果,要么解決過大用戶量產品的實際業務問題——你占哪一條呢?
僅僅是學過課程,做過練習或實習性質的小項目,是不足以去做算法的。
誰在自己的想象世界里不是屠龍的劍客?但現實當中能屠龍的人又有幾個?留給人去屠的龍又有幾條?養豬雖然沒那么高大上,有豬肉吃是實實在在的。
好高騖遠只會虛擲光陰,腳踏實地才能實現理想——這也是筆者寫作此文的初衷。
5. 小公司的AI之路
有開頭的Case 1,多說幾句筆者通過個人觀察和思考,對小企業應用AI提出的建議。
小公司沒有那么多錢可燒,不可能像大公司那樣,負擔研究院、科學家。因此,真心不建議小公司以技術儲備為目的雇傭做算法的人。
試想:真要是花費百萬年薪聘請到一位博士畢業生,過了半年TA什么交付都沒有,或者即使有幾個看起來很炫酷的模型,卻既不能增加流量,也無法吸引用戶付費,對公司收入沒有任何幫助,到時候,作為雇主,又如何判斷是AI技術的發展還沒有成熟到能在公司業務上落地,還是這個人尸位素餐呢?
當然,不是說小公司就不能聘用算法工程師,而是說,這種高成本的付出應該有的放矢,且公司原有成員具備評判交付成果質量的能力。
作為用人方,得知道招人進來做什么,有什么事情可以應用AI技術提高其質量或效率,而這種提升又可以用什么樣的指標來衡量。換言之,就是:小公司用AI,先定好KPI再招人。
筆者個人意見:大部分小企業真的用不著算法工程師,完全可能通過:
業務數據 + ML/DL工具 =》 工作模型
來實現應用AI技術的目的。
如此一來,小企業真正需要的是:
i)少量了解模型原理,能夠直接應用現成框架、工具、算法庫訓練模型的程序員(2中所描述的做工程的人);
ii)針對業務提出模型應用需求并提供數據的人——不僅僅是數據標注,而是綜合了業務、數據、技術的復合型人才。3中所述“數據經理”很可能首先批量地從小企業中涌現。
-END-
評論
查看更多