入行 AI,如何選個腳踏實地的崗位?

引言

AI原本是一個專業領域,沒什麼特別的。作爲碼農一枚,筆者的工作內容正好在這個領域。

近來這一年左右時間裏,連續發生了多件事情,使得筆者不得不擡起原本一直低着敲代碼的頭,看看這個爲AI狂歡的世界。

【Case 1】 
居然在一個月裏碰到兩位在相對傳統行業創業的親友,來打聽將AI技術應用到他們所在行業上的問題,例如:是聊天機器人是否可以代替人工客服。 

兩位親友居然都動了僱傭一位算法工程師的念頭。其中一位真的已經開始物色了。 

頗費周折找到一位某非 985 院校專業對口的博士,友人有點動心想要聘用,奈何人家開口就要100萬年薪。 

創業企業雖然已經拿了兩輪融資,還是不敢燒錢作死,故而多方打聽“算法”這東西的用處。 

【Case 2】 
筆者所在公司今年的校園招聘,本人照例作爲 interviewer 參加,面試了幾個來自不同 985 院校的學生(明年畢業)。順便又和幾位今年剛入職的應屆生聊了聊。 

結果發現,所有 interviewee(至少是我碰到的),全都是人工智能或機器學習方向的學生,所有交流過的新同事,在學校裏做的也全部都是機器學習 or 深度學習算法。 

而且,每一個人對於入職後工作的期望都是做算法。

人工智能,已經跌入到兩三年前大數據風口上,全民皆“數據科學家”的套路里了。

到底做什麼,算是入行AI?

這個話題其實在筆者之前的幾個chat裏面已經反覆提到過了,在此再說一遍:工業界直接應用AI技術的人員,大致可以分爲三個不同角色:算法、工程,和數據。

現在各種媒體上,包括 GitChat 中有大量的文章教大家怎麼入行AI,怎麼成爲具體某個領域的工程師,告訴大家要在某領域內發展需要掌握的技術棧是什麼,等等……

我們不說怎麼能夠成爲XXX,我們先來看看成爲XXX之後要做什麼事情,而做這些事情,需要什麼樣的能力,在擁有了這些能力、做上了這件事情之後,又能向什麼方向發展。

換言之,本文中,我們將從直觀的角度,管窺承擔不同角色工作所需要具備的素質,日常工作的狀態,和職業發展路徑。

做算法

1.1 日常工作

所有人都想做算法,那麼,說到底,在工業界做算法倒是幹什麼? 
真正的算法工程師(也有公司叫科學家),最基本的日常工作其實是:讀論文&實現之——確認最新論文中的闡述是否真實可重現,進一步確認是否可應用於本企業的產品,進而將其應用到實踐中提升產品質量。

1.2 必備能力

既然日常工作首先是讀別人論文。那麼,必不可少,作爲算法工程師得具備快速、大量閱讀英語論文的能力。

有一個網站,所有有志於算法的同學必須要知道:https://arxiv.org ——這裏有多個學科(包括computer science)大量的最新論文。

現在許多科學家、學者、研究人員和博士生在論文剛剛完成,尚未在正式期刊會議上發表時就先將論文發佈在此處,爲的是在儘量短的時間延誤下對外傳播自己的成果。

傳統的正規渠道,從論文完成到正式發表之間存在短則三四個月,長則一年半載的延遲。這對一些傳統學科,還勉強可以接受。

但計算機科學,尤其是人工智能、機器學習、深度學習這幾個當今世界最熱門的主題,大家都在爭分奪秒地搶佔制高點,幾個月的耽擱根本不能容忍。

因此,對於AI的學術性文獻而言,arxiv.org 實際上已經成爲了當前的集大成之地。

如果要做算法,平均而言,大致要保持每週讀一篇最新論文的頻率。

也許這就是爲什麼,到目前爲止,筆者所聽聞和見過的算法工程師都是名校相關專業博士的原因。

經過幾年強化學術研究訓練,這些博士們,就算英語綜合水平不過 CET-4,也能讀得進去一篇篇硬骨頭似的英語論文!

1.3 自測“算法力”

但當然不能說碩士、學士或者其他專業的有志之士就做不成算法了。人都不是生而知之,不會可以學嘛。

但是到底能不能學會,其實也並不需要三年五載的時間,花費幾萬十幾萬金錢在各種培訓或者付費閱讀上才能夠知道。

有個很簡單的驗證方法:現在就去https://arxiv.org找一篇論文(比如這篇:Dynamic Routing Between Capsules),從頭到尾讀一遍。

現在不懂沒關係,至少先試試在不懂的情況下能不能把它從頭到尾一字不漏的讀完,有不認識的字查字典。

如果這都做不到,還是當機立斷和“算法”分手吧。既然註定無緣,何必一味糾纏?

1.4 學術實踐能力

如果,碰巧你喜歡讀論文,或者就算不喜歡也有足夠強大的意志力、專注力壓迫自己去強行閱讀論文。那麼恭喜你,你已經跨上了通往算法山門的第一級臺階。

下面一級是:讀懂論文。

既然要讀論文,讀最新論文,而且閱讀的目的是指導實踐,那麼自然要讀懂。拿起一篇論文就達到的程度,至少需要下面這三種能力:

1.4.1 回溯學習能力

一篇論文拿來一看,一大堆名詞術語不懂,它們互相之間是什麼關係也不知道。怎麼辦?去讀參考文獻,去網上搜索,去書籍中查找……總之,動用一切資源和手段,搞清不明概念的含義和聯繫。

這種能力是學術研究的最基礎能力之一,一般而言,有學術背景的人這一點不在話下。

如果現在沒有,也可以去主動培養,那麼可能首先需要學習一下學術研究方法論。

1.4.2 數學能力

如果只是本着學習的目的讀經典老論文,那麼只要清楚文中圖表含義,看公式推導明白一頭一尾(最開始公式成立的物理意義,以及結束推導後最終形式所具備的基本性質)也就可以了。

但讀最新論文就不同。因其新,必然未經時光檢驗,因此也就沒人預先替你驗證的它的正確性。

在這種情況下,看公式就得看看推導了。否則,外一是數學推導有錯,導致了過於喜人的結果,卻無法在實踐中重現,豈不空耗時力?

如果目前數學能力不夠,當然也可以學。但就與後面要說的做工程用到什麼學什麼的碎片化學習不同,做算法,需要系統學習數學。

微積分、線性代數、概率統計,是無法迴避的。如果在這方面有所缺乏,那還是先從計算機系的本科數學課開始吧,個人推薦北師大教材。

1.4.3 理論聯繫實際,將學術論述與產品、業務結合的能力

一般來說,在大企業裏做到真正的算法工程師/科學家,也就不需要自己去動手開發產品了。但做 demo/prototype 還是不能避免的。

算法工程師,可不是用別人寫好的工具填幾個參數去運行就可以的,需要負責實際業務問題到數學模型的抽象,並能夠將他人最新成果(敲黑板——那些論文!!!)應用到業務數據上去。

說得更通俗一點,就算是用別人寫的工具或框架,做算法的,也得是i)第一撥、最前沿那批試用者,或者ii)工具最新玩法的發明者。

1.5 創新型人才

算法工程師,即使自己不發明新的算法,不提出新的算法優化方法,也得去嘗試最新算法的使用或者把已有算法用出新花樣來。

毋庸置疑,這是一個有着必然創新性的角色。因此,這個角色必然不適合絕大多數人!

做工程

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】簡單使用:瞭解某個算法基本原理,應用領域,功能和侷限。

  • 該算法的應用問題域是什麼?(e.g. 分類、迴歸、聚類……)
  • 該算法的應用目標是什麼?(e.g. 判別算法、生成算法……)
  • 該算法適合應用在怎樣的數據集,它能對數據造成怎樣的影響?(e.g. 適用少量高維稀疏數據……)
  • 能夠主動獲取該算法的函數庫,調用該算法生成模型。

【2】模型調優:對所採用算法和對應模型的數學公式有所瞭解。

  • 知道調用函數中各個參數的意義(e.g. 迭代次數,對應到公式中參數的含義……),能夠通過調節這些參數達到優化結果的目的。
  • 能夠通過加約束條件(e.g. L0, L1, L2 ……)來優化算法。
  • 瞭解在當前問題域,目標和輸入數據確定的情況下,還可以用哪些其他模型可替換現有模型,並進行嘗試。
  • 能夠將多個弱模型加權組成強模型(e.g. adaboost)。

【3】運行效率優化:對模型本身的數學推導過程和模型最優化方法有所掌握,對於各種最優化方法的特點、資源佔用及消耗情況有所瞭解。

  • 瞭解算法在當前數據集上的運行效率(e.g. 需要進行哪些運算,是否易於被分佈式等)。
  • 瞭解在其他語言、平臺、框架的工具包中有否同等或近似功能但在當前應用場景下效率更高的算法。
  • 能夠針對具體場景,通過轉換模型的最優化方法(optimizer)來改進運行效率。

2.4.2 數據

僅僅只有算法,並不能解決問題。算法和數據結合,才能獲得有效的模型。

對於數據,需要從:i). 具有業務含義的信息,和ii).用於運算的數字,這兩個角度來對其進行理解和掌握。

【1】特徵選取:從業務角度區分輸入數據包含的特徵,並認識到這些特徵對結果的貢獻。

  • 對數據本身和其對應的業務領域有所瞭解。
  • 能夠根據需要標註數據。
  • 知道如何從全集中通過劃分特徵子集、加減特徵等方法選取有效特徵集。

【2】向量空間模型(VSM)構建:瞭解如何將自然語言、圖片等人類日常使用的信息轉化成算法可以運算的數據。

  • 能夠把文字、語音、圖像等輸入轉化成算法所需輸入格式(一般爲實數空間的矩陣或向量)。
  • 能夠根據信息熵等指標選取有效特徵。

【3】數據清洗和處理:對直接的業務數據進行篩選並轉換爲模型可處理形式。

  • 能夠運用統計學方法等ETL手段清洗輸入數據。
  • 能夠對數據進行歸一化(normalization), 正則化(regularization)等標準化操作。
  • 能夠採用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……)來適應不同的數據集。

做數據

此處說得做數據並非數據的清洗和處理——大家可以看到做工程的崗位,有一部分工作內容就是 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技術,算法工程師不是剛需,而數據標註這個人工智能領域的“勤行”,人工智能藍領,一定是剛需!

一切標註工作的難點和潛藏的風險,也就是這項工作的潛力和從事這項工作未來職業發展的可能性所在。

認清形勢,腳踏實地

近來一段時間,能明顯感到,想入行AI的人越來越多,而且增幅越來越大。

爲什麼這麼多人想入行AI呢?真的是對計算機科學研究或者擴展人類智能抱着無限的熱忱嗎?說白了,大多數人是爲了高薪。

人們爲了獲得更高的回報而做出選擇、努力工作,原本是非常正當的事情。關鍵在於,找對路徑。

尋求入行的人雖多,能真的認清市場當前的需求,瞭解不同層次人才定位,並結合自己實際尋找一條可行之路的人太少。

人人都想“做算法”,卻不想想:大公司裏的研究院養着一羣高端科學家,有得是讀了十幾二十年論文始終站在AI潮頭的資深研究人員。

想要與他們爲伍做算法,須有可以與之並列的成就:要麼有足夠分量的學術成果,要麼解決過大用戶量產品的實際業務問題——你佔哪一條呢?

僅僅是學過課程,做過練習或實習性質的小項目,是不足以去做算法的。

誰在自己的想象世界裏不是屠龍的劍客?但現實當中能屠龍的人又有幾個?留給人去屠的龍又有幾條?養豬雖然沒那麼高大上,有豬肉吃是實實在在的。

好高騖遠只會虛擲光陰,腳踏實地才能實現理想——這也是筆者寫作此文的初衷。

轉自:https://blog.csdn.net/GitChat/article/details/80912831

給自己一個明確的定位,AI前景雖好,但是門檻卻高,需要時間踏實深耕。(這句是我寫給自己的)


發佈了27 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章