薪酬那么高的機器學習崗位,究竟是怎么面試人的?
首先這個問題問的很廣。做機器學習方向很多,有些公司更偏重于數(shù)據(jù)挖掘,而有些更傾向于深度學習。同理,相對應(yīng)的崗位有些偏重理論也有些偏重實踐。這些因素疊加造成了機器學習相關(guān)的崗位分布廣,如數(shù)據(jù)分析師,算法工程師,機器學習科學家等,很難一概而論。
大概從實習生的時候就開始跟著老板招聘面試機器學習方向的候選人,到現(xiàn)在前前后后大概也參與了 20 個左右機器學習求職者的技術(shù)面試。其中有在讀的研究生(實習生崗位),也有已經(jīng)工作了多年或者學術(shù)背景深厚的名校博士(相對高級的“科學家”崗位)。
不談具體崗位的前提下,我想回答以下幾個問題: 1.為什么要避免學科性的偏見 2. 如何測試面試者的知識廣度 3. 怎樣測試面試者的知識深度 4. 為何需要確認基本的編程和數(shù)據(jù)分析能力 5. 怎么提高機器學習面試成功率
1. 避免學科間的偏見與歧視
機器學習作為一個交叉廣度大,各學科融合深的學科,各種背景的面試者都有。我建議一定不要預(yù)設(shè)立場,無論是數(shù)學、統(tǒng)計、物理、計算機,或是其他學科的面試者都有獨特的知識儲備。比如機器學習其實和統(tǒng)計學習有很大部分是重疊的,甚至和優(yōu)化(如運籌學)、數(shù)學(線代等)也有很多相關(guān)的地方。而不同領(lǐng)域的人對于同一件事情的描述可能是相似但不相同的,甚至連叫法都不同。舉個簡單的例子,統(tǒng)計學將變量叫做 predictors 而機器學習傾向于將其叫做 feature(特征)。我聽說過很多面試官就因為對方不能完全的使用他能聽懂的術(shù)語就拒掉了候選人,我覺得這個是愚蠢的。
以我們團隊為例,我的老板是統(tǒng)計學博士和教授(偏計量),而我是純粹的計算機科學出身。他喜歡用 R 來建模而我只擅長 Python 和 C++。但正是這種差異性讓我們可以更好的合作,他在無監(jiān)督學習中很喜歡用各種密度分析(density estimation)或者對分布直接進行擬合,而我可以給他介紹很多機器學習方向比較流行的算法,比如 Isolation Forests。同理,Python 和 R 都有各自擅長的領(lǐng)域,比如 Python 做時序分析的難度就遠遠大于 R,因為 R 有非常成熟的 package。
因此,我們不要因為領(lǐng)域不同,叫法不同,編程語言不同,或者模型的解釋思路不同就輕易的否定一個面試者。長此以往,我們的思路會越來越窄,而一定程度的包容能拓展思路。
2. 通過廣度測試劃定面試者的知識面
機器學習的項目一般都牽扯數(shù)據(jù)處理,建模,評估,可視化,和部署上線等一系列流程,我們希望面試者對于每個步驟都有最基本的了解。因為其范圍很廣,我們希望首先在短時間內(nèi)了解一個面試者的知識范圍。有很多基本但經(jīng)典的問題可以用于了解面試者的素質(zhì),給出一些例子:
- 數(shù)據(jù)處理:如何處理缺失數(shù)據(jù)(missing value)? 各種處理方法有什么利弊?
- 數(shù)據(jù)處理:如何將描述變量(categorical variables)轉(zhuǎn)為連續(xù)變量(continuous variables)?
- 如何處理有序變量?
- 如何處理無序變量?
- 數(shù)據(jù)處理:如何進行選擇特征選擇?如何進行數(shù)據(jù)壓縮?
- 特征選擇:包裹式,過濾式,嵌入式
- 數(shù)據(jù)壓縮:主成分分析,自編碼等
- 模型解釋: 試解釋什么是欠擬合與過擬合?如何應(yīng)對這兩種情況?
- 模型解釋: 什么是偏差與方差分解(Bias Variance Decomposition)?與欠擬合和過擬合有什么聯(lián)系?
- 評估模型一般有什么手段?
- 分類模型評估方法?
- 回歸問題評估方法?
- 數(shù)據(jù)不均衡的評估方法?
- 深度學習是否比其他學習模型都好?為什么?
以如何處理缺失數(shù)據(jù)為例,可能的回答有:1. 分析缺失比例決定是否移除 2. 用均值,眾數(shù),回歸代替 3. 用 0 代替等。比如深度學習是否比別的模型好,我們就期待面試者能說“分情況討論”,若是能提到“沒有免費的午餐定理”更是加分。在這個階段,我們不會深入追問,僅想對面試人的知識范圍有一個了解。
這類問題的共性就是無論你是在校學生還是資深科學家都應(yīng)該有一個基本的水準在,不過沒有必要***的回答正確,因為本身很多答案都沒有標準答案。大部分時候,這個環(huán)節(jié)我們對于是否錄用這個人就已經(jīng)有了答案。如果面試者答錯或者不知道其中百分之八十的概念,錄取的概率就很低了。
3. 根據(jù)崗位和求職者背景進行深入挖掘
在經(jīng)過上一階段以后,我們已經(jīng)對求職者的素養(yǎng)有了大概的判斷,下一步就需要進行深入了解,一般根據(jù)兩點進行追問:
- 面試者的背景: 如果有與崗位特別相關(guān)的工作經(jīng)歷,會深入詢問。如果有高引用了的文章,也會讓他講一下他的研究。
- 所面試的崗位: 如果沒有與崗位特別相關(guān)的經(jīng)歷,會根據(jù)崗位需求進行詢問。
進入這個環(huán)節(jié)其實就已經(jīng)沒有模板了。假設(shè)我們現(xiàn)在要為保險公司招聘一個機器學習工程師來自動化”騙保檢測”,我們的求職者是一位計算機系剛畢業(yè)的碩士生。那我們可能深入詢問的話題包括:
- 在只有少量的有標簽數(shù)據(jù)的情況下,如何構(gòu)建一個反保險欺詐系統(tǒng)?
- 如果面試者回答先用監(jiān)督學習來做,那么我們可能問:
- 這種情況下數(shù)據(jù)是不均衡的,你是采用過采樣還是欠采樣?如何調(diào)整代價函數(shù)和閾值?
- 有些人可能會提到使用 One-class SVM?那么我們可能會追問一下 SVM 相關(guān)的問題,比如什么是***間隔分類器啊什么是 Kernel,如何選擇 Kernel 等。
- 如果面試者回答用無監(jiān)督學習,那我們可能會問:
- 為什么 K-Means 不適合異常值檢測?K-Means 和 GMM 是什么關(guān)系?是否可以用 FMM 來直接擬合異常值。
- 如何可以得到無監(jiān)督學習中的分類規(guī)則?
這一類問題的特點是隨機應(yīng)變,一般都是在一個方向上深入。比如其他答案提到的 L1 和 L2 正則化,我們可能希望面試者在白板上畫圖介紹為什么 L1 可以得到稀疏解,以及和嵌入式特征選擇有什么聯(lián)系。這一類問題我們不期待求職者完全答對或者講得清楚無誤,我們同時也想觀察其在壓力和追問下的心理素質(zhì)。因為整個過程中肯定會有一些知識盲點,我們會盡量避免尷尬的氣氛,所以作為求職者不必過分緊張。同時,通過和面試者一起了解他 / 她曾做過的項目,可以看出其對于這個專業(yè)的興趣 — 興趣是很難演出來的。
在這個環(huán)節(jié),如果一個面試者可以有能力進入深入交談,甚至提到一些我們從來沒想過的思路,都是加分的表現(xiàn)。
4. 基本的編程能力和數(shù)據(jù)挖掘能力
機器學習崗位,不管你是統(tǒng)計出身還是計算機出身,都避不開建模的過程,因此基本的編程能力是必須的。一般對于數(shù)學或者統(tǒng)計學出身的面試者,我們會額外給出一個簡單的小程序測試。這種小程序可能簡單如將讀取數(shù)據(jù)后并保存為矩陣。這倒不是因為我們喜歡沒事找事,而是因為機器學習太容易成為紙上談兵,而從業(yè)者缺乏最基本的編程能力。
相似的,我們也希望面試者談?wù)剰哪P椭锌梢缘玫绞裁唇Y(jié)論。我們曾把 Kaggle 上泰坦尼克的那個數(shù)據(jù)集處理過以后,讓面試者談?wù)勑掖媛实降缀褪裁从嘘P(guān),如何分析。同樣的,我們不追求***答案,只是希望看到求職者可以解釋一些簡單的模型結(jié)果,從中攫取商業(yè)價值。
5. 讓面試者有所收獲 & 如何準備機器學習面試
面試不該是一場單純的考試,在參加面試的過程中,也是一個學習過程。拋磚引玉,對于機器學習的崗位面試我有幾點小建議:
5.1. 根據(jù)崗位,準備一份項目策劃書。
這個乍聽下來有點虛,但我曾無數(shù)次使用這個小技巧得到良好的面試反饋和機會。假設(shè)你今天面試的崗位是我提到的保險公司的反詐騙組,那么如果你可以寫一個如何使用機器學習進行反詐騙的項目策劃書。這個過程對于面試者也是一個練習: a. 閱讀論文和新聞收集材料的能力 b. 總結(jié)分析的能力 c. 總結(jié)的能力。
以我曾經(jīng)面試過的一個人力資源相關(guān)的崗位為例,我準備了一份如何用機器學習來進行員工離職預(yù)測的策劃書(中間省略掉了幾頁并馬賽克處理了敏感的地方):
在策劃書中,你可以分析項目需求,提出相關(guān)解法,并建議后續(xù)計劃和列出相關(guān)文獻。這樣的行為不僅可以讓雇主看到你的誠意,并看到你的的領(lǐng)域知識和獨立分析問題能力。
在適當?shù)臅r機(比如開始面試的時候或者談到崗位職責的時候),你拿出準備好的策劃書,開始談你的思路。這種做法我曾做過幾次,效果都很驚艷,因為反被動為主動,從被考察變成了講解你所了解的知識。作為一個面試官,如果被面試者能做到這個程度,我會在內(nèi)心對錄取他比較有信心。
5.2. 真誠并且實事求是
大家都是理工科出身,行家一出手便知有沒有。在這種技術(shù)性比較強的學科,完全沒有必要假裝自己了解一個知識點。同理心告訴我們,大部分人都有知識盲區(qū),我們不期待***的回答。當你真的不知道一個問題的答案時候,真誠的希望對方能講得更明白或者承認自己不太了解。
如果你假裝自己很了解一個不明白的領(lǐng)域,我們一般會問的更深入。你成功的引起了我的注意,那個時候就真的收不了場了。相似的,簡歷上請真的不要夸大其詞的描述自己的經(jīng)歷。我見過很多人只用過 Naive Bayes 就在簡歷上號稱自己是機器學習專家,我現(xiàn)在還記得他們被面試到面紅耳赤的樣子。在這個浮躁的年代,對于高薪的機器學習崗位,希望大家都能守住最起碼的誠信底線。
5.3. 確保自己對基本的概念有所了解
再一次,保證對基本知識的了解(有基本的廣度)是對面試者自己和面試官的尊重。什么程度就算基本了解呢?我的感受是:
- 對基本的數(shù)據(jù)處理方法有所了解
- 對基本的分類器模型有所了解并有所使用(調(diào)包),大概知道什么情況使用什么算法較好
- 對基本的評估方法有所掌握,知道常見評估方法的優(yōu)劣勢
- 有基本的編程能力,能夠獨立的完成簡單的數(shù)據(jù)分析項目
- 有基本的數(shù)據(jù)挖掘能力,可以對模型進行調(diào)參并歸納發(fā)現(xiàn)
其中每一條都說來簡單,但都是血與淚的過程,請勿操之過急。如何就能保證自己有了足夠的基礎(chǔ)知識呢?我覺得能基本看懂周志華老師《機器學習》的前十章,并相對熟練的使用 Sklearn 中基礎(chǔ)的 API 進行建模就可以了。也請勿矯枉過正,如果你面試的崗位不是理論性科學家崗位,不要和數(shù)學推導(dǎo)死磕。這也是為什么我說寫一個項目策劃書很有幫助,在查閱文獻和總結(jié)的過程中,你對想要面試的領(lǐng)域有了更加深刻的了解,有助于提高信心和知識。
5.4. 享受面試
請不要把技術(shù)面試當做一場噩夢,或是一個難關(guān)。作為一個冉冉升起的新領(lǐng)域,我們大家都是這么一路摸爬滾打過來的,至少我自己是很理解這一路的不容易。
因為機器學習領(lǐng)域的人才稀缺,一般而言你的面試官的時間都是很寶貴的,即使你最終沒有通過面試,請抓住機會從他們身上有所學習的機會。從我的角度來看,你不僅可以借此發(fā)現(xiàn)自己知識點上的缺失,也可以聽到在特定領(lǐng)域的流行的算法和模型,這些都是從書上很難學到的。如果你為了準備面試還閱讀了相關(guān)領(lǐng)域的論文和總結(jié),那我想來面試這件事已經(jīng)遠遠超過了你是否被錄取的意義。