如何準備機器學習工程師的面試?

七月線上實驗室發表於2018-04-18

人們用很多東西來比喻準備面試的過程。有人說這像準備一場戰爭,也有人說像邀請某人出去約會,還有人說像在高爾夫大師賽上打進最後一個洞。準備面試是一個令人興奮,又或者是令人恐懼的過程。準備一場面試更是如此。那麼我們要如何準備機器學習面試才能最後通過面試,斬獲offer呢?


成功的關鍵在於思維方式和充分的準備。


公司和角色640?wx_fmt=png&wxfrom=5&wx_lazy=1

你首先要思考為什麼你所申請的公司會有這樣一個職位開放著。這是準備過程中極為重要的一個問題。如果你知道自己會被問到什麼,你就能更好地定位自己能給公司帶來的價值在哪裡。比如說,一家公司正在招聘一名機器學習工程師,那麼很顯然他們目前正在試圖解決一個傳統方案所無能為力的複雜問題。


發現核心問題640?wx_fmt=png&wxfrom=5&wx_lazy=1

你要做的第一件事情就是設想自己已經得到這份工作後的情景。為此你需要儘可能地收集和整理關於這家公司和這個職位的資訊。問自己一個問題:我能為這家公司解決一個怎樣的核心問題? 而尋找這個問題的答案的過程,應該是令人興奮的,能驅使你去了解更多關於這個問題的資訊——像是現有的解決方案、近幾年的新趨勢等——並讓你看清具體的難點在哪裡。


如果你明確地知道自己申請的職位是屬於哪個團隊的,那麼就很容易挑選一個合適的問題;否則的話就挑選一個對公司來說非常基本的問題你。除此以外,你還可以思考這家公司目前面臨著怎樣的挑戰,從而預計他們可能會問你的問題。


尋找可能的資料來源640?wx_fmt=png&wxfrom=5&wx_lazy=1

在找出問題以後,接下來你就要思考你需要怎樣的資料來解決這個問題。有些資料可能是現有的,另外一些資料可能需要你寫一些額外的程式碼來收集。嘗試去了解這家公司的基礎設施和運維情況——他們用了怎樣的技術棧、提供哪些 API、已經收集了什麼型別的資料、等等。現在很多公司都會維護一個部落格來討論他們遇到的困難、採取的解決方案以及成功和失敗的案例。你可以通過部落格來更深入地瞭解他們是怎麼運營的,他們的流水線上已經有了怎樣的產品和服務等。


討論和交流解決方案640?wx_fmt=png

好了,現在你要做一個很大的思維跳躍:如何將機器學習應用到這個問題場景中去? 給定

你想達成的目標和你認為可以獲取資料,你能把它轉化成一個機器學習問題嗎?哪些模型會比較合適?你將如何訓練和評估模型?舉個例子,像 Netflix 和 Amazon 那樣的推薦系統所面臨的主要挑戰並不是預測,而是聚類——也就是說,當你能夠將使用者劃分成購買偏好和行為相近的群組後,再給他們推薦產品就很容易了。


事先走一遍這樣的思考過程能夠幫助你在面試中很好地談論公司最關心的問題。不會有人指望你能夠走進面試房間然後把一個他們研究了幾個月甚至幾年的問題給完全解決,但面試官一定會喜歡對他所真正關心的問題展現出興趣、動力和好奇心的候選人。


根據面試官和環節的不同,你可能會被問到很理論性的問題,但你應該用這個機會來展示自己對公司的瞭解和對角色的定位。當被問到一些開放性問題,比如說“請描述一個你在做專案時遇到過的技術難題以及你是如何解決它的”時,最好選擇一個跟公司有關的話題來談。


技能及知識點總結640?wx_fmt=png

機器學習工程師所必須掌握的技能:

640?wx_fmt=jpeg

右側的技術要點從上到下分別為:

線性代數、微積分、概率和統計

資訊理論

資料分析能力

機器學習 or 深度學習建模能力

A/B 測試技能

資料密集型應用系統的設計

用於計算密集型應用程式的優化知識

可擴充套件性和容錯性知識

左邊的彩色字型分別對應了:機器學習研究員、大資料科學家、機器學習工程師、機器學習架構師。右邊相同顏色的方框裡面包含的,就是這一職位在面試前需要重點準備的科目,你可以對照著這張圖進行查漏補缺。

以下是機器學習面試常見的基礎概念。可點選文末“閱讀原文刷題

KNN

給定一個資料點,使用一定的距離度量(例如歐幾里德距離)計算 K 個最近的資料點(近鄰)。對於分類,可以取大多數近鄰的標籤;對於迴歸,我們採用標籤值的均值。

對於 KNN 來說,我們不需要訓練模型,我們只是在推理時間內進行計算。這可能在計算上很昂貴,因為每個測試樣本都需要與每個訓練樣本進行比較以瞭解它們有多接近。

有近似的方法可以有更快的推斷時間,通過將訓練資料集劃分成區域。

注意,當 K 等於 1 或其他小數字時,模型容易出現過擬合(高方差),而當 K 等於資料點數或更大的數字時,模型容易出現欠擬合(高偏差)。

640?wx_fmt=jpeg

SVM
  • 可以執行線性,非線性或異常值檢測(無監督)

  • 大間距分類器:不僅有一個決策邊界,而且希望邊界距離最近的訓練點儘可能遠

  • 最接近的訓練樣例被稱為支援向量,因為它們是繪製決策邊界所基於的點

  • SVM 對特徵縮放比較敏感

決策樹
  • 非引數,有監督的學習演算法

  • 給定訓練資料,決策樹演算法將特徵空間劃分為區域。為了推斷,我們首先觀測測試資料點落入哪個區域,並取平均標籤值(迴歸)或多數標籤值(分類)。

  • 構造:自上而下,選擇一個變數來分割資料,使得每個區域內的目標變數儘可能均勻。兩個常見的指標:基尼不純或資訊增益,在實驗中兩者結果差異不大。

  • 優點:簡單地理解和解釋,模仿人類決策過程

  • 壞處:

    • 如果我們不限制樹的深度,可以容易地過度擬合可能不夠魯棒:訓練資料的小改動

    • 可能導致完全不同的樹

    • 不穩定性:由於其正交決策邊界,對訓練集旋轉敏感

640?wx_fmt=jpeg

Bagging

為了解決過擬合問題,我們可以使用稱為 bagging(bootstrap aggregating)的整合方法,它減少了元學習演算法的方差。bagging 可以應用於決策樹或其他演算法。

這是一個很好的例子:

640?wx_fmt=jpeg

  • bagging 是有放回取樣。在子取樣無放回時,則稱為 pasting。

  • bagging 因其對效能的提高而廣受歡迎,也因為單獨的機器學習模型可以並行訓練,並且可以很好地擴充套件。

  • 當機器學習模型儘可能彼此獨立時,整合方法效果最好

  • 投票: 軟投票(對所有演算法的預測概率取平均值)通常比硬投票更有效。

  • 袋外(out-of-bag)例項(37%)可以作為 bagging 的驗證集。

隨機森林

隨機森林通過增加一些隨機性來進一步改善 bagging。在隨機森林中,只隨機選擇一部分特徵來構建樹(而不是子取樣例項)。好處是隨機森林減少了樹之間的相關性。

假設我們有一個資料集。有一個資訊增益很高的特徵,以及一些預測性較弱的特徵。在 bagging 樹中,大多數樹將在頂部拆分時使用這個預測性很強的特徵,因此使得大部分樹看起來相似,並且高度相關。與互不相關的結果相比,對高度相關的結果取平均不會大量降低方差。在隨機森林中,每一次劃分節點我們只考慮特徵的一個子集,並因此通過引入更多不相關的樹來進一步減少方差。

在實踐中,調整隨機森林需要擁有大量的樹(越多越好,但需要考慮計算約束)。此外,用 min_samples_leaf(葉節點的樣本的最小數量)來控制樹大小和過擬合。

特徵的重要性:

在決策樹中,更重要的特徵可能更接近樹的頂部。通過計算它在森林中所有樹上出現的平均深度,我們可以得到一個特徵對於隨機森林的重要性。

Boosting 樹

原理

Boosting 樹以迭代方式建立在弱學習器身上。在每次迭代中,都會新增一個新的學習器,而所有現有的學習器都保持不變。所有的學習器根據他們的表現(例如,準確性)進行加權,並且在加入弱學習器之後,對資料進行重新加權:錯誤分類的樣例獲得更多的權重,而正確分類的樣例減少權重。因此,未來的弱學習器會更多地關注之前的弱學習器錯誤分類的樣例。

與隨機森林(RF)的區別

  • RF 是並行訓練,而 Boosting 是按順序訓練

  • RF 降低了方差,而 Boosting 通過減少偏差來減少誤差

XGBoost(極端梯度提升):

XGBoost 使用更正則化的模型來控制過擬合,從而使其具有更好的效能。

Stacking
  • 不是使用簡單的函式 (例如硬投票) 來整合單個學習器的預測,而是訓練一個模型來執行這個整合過程。

  • 首先將訓練集分為兩個子集:第一個子集用於訓練第一層的學習器

  • 接下來,第一層學習器被用於對第二子集進行預測(元特徵),並且這些預測被用於在第二層訓練另一個模型(以獲得不同學習器的權重)

  • 可以在第二層中訓練多個模型,但這需要將原始資料集分為三部分

CNN

Conv 層是卷積神經網路的基礎結構。Conv 層由一組可學習的濾波器(例如 5 × 5 × 3,寬×高×深)組成。在前向傳遞期間,我們將濾波器在輸入上滑動(或更準確地說,卷積)並計算點積。當網路反向傳播誤差時,再次進行學習。

初始層可以捕捉低階特徵(如角度和邊緣),而後面的層可以學習前一層低階特徵的組合,因此可以表示高階特徵,如形狀和目標部分。

RNN 和 LSTM

RNN 是神經網路的另一個正規化,有不同層的神經元,每個神經元不只把前一層神經元的輸出作為輸入,而且把同一層的前一個神經元的輸出作為輸入。

640?wx_fmt=jpeg

這看起來很棒,但實際上由於相同矩陣的一系列乘法運算,會造成梯度消失或梯度爆炸,使 RNN 幾乎不能運作。為了解決這個問題,我們可以使用 RNN 的一個變種,長短時記憶(LSTM),它能夠學習長期的依賴關係。

LSTM 背後的數學演算法可能相當複雜,但直觀上 LSTM 引入了輸入門 - 輸出門 - 遺忘門 - 記憶單元(內部狀態)

LSTM 模仿人類的記憶過程:忘記舊的東西(舊的內部狀態×遺忘門)並重新輸入(輸入節點×輸入門)

640?wx_fmt=jpeg


最後,記得用可量化的方式去介紹你之前的專案。

舉個簡單的例子:

1.曾參與訓練了 XX 機器學習系統,取得了不錯的成果。

2.分別使用 Keras,Tensorflow 和 Node.js 設計並部署了一個深度學習模型,進行目標識別。與傳統神經網路(例如 ResNet)相比,該模型具有 1/30 的模型大小,1/3 的訓練時間,1/5 的推理時間,以及 2 倍的收斂速度。

如何?是不是明顯感覺到第二個更好?因為它量化了你的貢獻,並突出了你使用的特定技術(證明你具有相關專業知識)。僅僅需要簡單記錄你在實驗過程中所做的事情。但不要誇大,多花一些時間瀏覽你的簡歷以及過去的專案,以確保你在面試現場可以解釋得很好。


根據面試的階段,你可能會被問到不同的事情,你會被問到幾乎所有科技工作中可能要求的東西,比如幾個簡單的程式設計問題。

很多時候,看似簡單的問題反映了面試官真正關心的東西。 你有解決這個問題的好方法嗎? 你收集要求還是隻是做出假設?你測試了你的程式碼嗎? 你是如何選擇你的測試用例的? 你做了什麼折衷? 你是否意識到需要做一個權衡?

當被問到機器學習的內容時,面試官首先希望知道你熟悉這個術語,並且知道常用的技術框架。 沒有必要知道每種演算法的所有細節,但是在回答中需要證明你知道各種框架的基本屬性。 你還可能會被問到你將如何處理一個特定的問題。

另外,不要陷入假設每個問題都是機器學習問題的陷阱。 有些面試官經常看到應聘者在回答問題時答非所問,不能因為你懂機器學習,就把所有問題都歸結為機器學習的問題。


推薦閱讀

如何利用深度學習寫詩歌

獲贊2萬,一文讀懂深度學習

用Python實現圖片的清晰掃描

用“深度學習”寫個老闆探測器(附原始碼)

書單 | 深度學習修煉祕籍 (文末贈書)

使用 Python 實現資料視覺化(完整程式碼)

640?wx_fmt=png


640?wx_fmt=gif

點選“閱讀原文”獲取面試刷題地址


相關文章