如何成功應聘機器學習工程師崗位

本文要點

  • 你可以通過閱讀書籍、學習課程、參加會議和參與項目來獲得相關的機器學習技能。
  • 確保你的簡歷裏列出了已掌握的技術以及參與過的項目。
  • 在面試過程中,你可能會被問到技術問題、洞察力問題,並且需要解決編程問題。
  • 在解決技術面試題時,要集中精力展示自己的技能,就像是在工作一樣。這個時候,代碼質量和描述與所採用的方法同樣重要。

在過去的兩年裏,我努力提升公司的機器學習能力。我查看了數百份簡歷,進行了100多次電話面試,評審了很多編碼任務,並與數十名工程師進行了現場面試。人們經常問我,他們應該爲這樣的面試做些什麼準備,所以我把我的建議和技巧寫成了這篇文章。

第一步:掌握相關技術

在申請職位之前,最重要的一點是要具備足以被錄用的技能。面試官要求機器學習工程師具備很多相關技能,因此,要儘可能多地掌握這些技術。總體而言,一名優秀的機器學習工程師應該具備計算機科學(原始編程技能)、數學和統計學(瞭解使機器學習算法知識)和特定學科知識的組合。在本文中,我將深入探討計算機科學、數學和統計學部分。

候選人需要掌握的最後一項技能是溝通——向他人解釋你正在從事的工作的能力,這一項能力也是至關重要的。你的實驗可能在數週的時間裏無法獲得更好的結果,而在這個時候,最重要的是要具備解釋問題和解決問題的技能。

應該要掌握哪些技術?

你可以學習多門編程語言、框架和其他技術。你所掌握的技術將決定你獲得什麼樣的職位以及將要從事的工作。所以,你必須明智地做出選擇。以下是我的一些建議以及原因:

  • Python——用於訓練機器學習算法的編程語言。確保你知道這門語言提供了哪些功能。除了Python,我還建議你學習另外一門語言。如果要使用嵌入式平臺,請選擇C++。如果要在企業環境中使用機器學習模型,請選擇Java。如果你想進行數據分析,請學習R語言。最後,如果你喜歡經典的AI算法和自然語言處理,請學習Lisp。
  • TensorFlow/Pytorch——深度學習正在蓬勃發展。市場上有兩個深度學習框架,但哪些項目應該使用哪個框架,它們之前的區別是非常不一樣的。首先,需要注意的是,TensorFlow通常在部署環境中更易於使用,而Pytorch在實驗環境中更易於使用。最近,TensorFlow試圖讓實驗變得更容易,而Pytorch則致力於實現更容易的部署(即使在嵌入式硬件上)。如果你想要擔當更多研究角色,我會推薦Pytorch。如果你想要在一家主要在生產環境中更新模型的公司工作,我會推薦學習TensorFlow。總體上講,全面學習一個框架要比半途學習兩個框架要好,尤其要考慮它們演化的速度。
  • Scikit-learn——scikit-learn包含了大多數經典的機器學習算法。掌握它可以讓你快速解決很多小的數據問題。如果你知道這個庫的算法原理,那麼在技術面試過程中就有領先優勢。
  • NumPy和Pandas——在使用Python處理數據時,有效且準確地選擇數據是非常重要的。大多數機器學習工程師每天都使用NumPy進行基本的數據處理。如果你有更高級的選擇標準,可以考慮Pandas!只需要用幾行代碼(並且沒有那些令人討厭的for慢循環)選擇特定的數據樣本就可以給未來的同事留下深刻的印象。
  • Apache Spark——擁有大量數據的公司將從機器學習中受益。處理大數據非常重要,Spark將大大加快你的開發工作。請注意,在處理大數據時,瞭解Hadoop可能也很有幫助。
  • OpenCV——如果你想要使用計算機視覺學習,掌握OpenCV就至關重要。它提供了很多圖像處理功能,可用於快速組建原型,或以更好的方式預處理圖像。它還提供了很多識別、檢測或定位物體的功能。

該看哪些書?

有很多書教你如何學習機器學習。不同的人有不同的學習方式,因此需要閱讀不同的書。確保你購買的是具有激勵教學風格的書籍。

對於數學和統計學書籍,我建議如下:

  • 模式識別和機器學習》(Pattern Recognition and Machine Learning),作者Bishop。這是一本包含大量數學內容的書,從機器學習的基礎講起。這是我大學課程中最艱啃的一本書。如果你是一個喜歡數學和自下而上學習方式的人,我推薦閱讀這本書。
  • 深度學習》(Deep Learning),作者Ian Goodfellow、Yoshua Bengio和Aaron Courville。這仍然是一本數學書,不過針對的是神經網絡。我已經做了一些神經網絡實驗,以便更好地瞭解背後的原理,因此我喜歡閱讀這本書。閱讀這本書將會讓你從“使用神經網絡進行隨機性的實驗”過渡到“知道哪些參數可以更好地控制神經網絡”。
  • Python機器學習》(Python Machine Learning),作者Sebastian Raschka。本書屬於實用書籍。Sebastian對scikit-learn提供的可用工具進行了廣泛的概述。在最新版本中,他還提供了TensorFlow代碼。
  • 人工智能:現代方法》(Artificial Intelligence: A Modern Approach),作者Stuart J. Russell和Peter Norvig。我主要從這本書學習博弈論和搜索算法。書中還有很多概率論方面的內容,甚至還有一些機器人技術!這本書非常好,有些章節可以讓你在面試中佔據一定的優勢。

在軟件工程技能方面,你要精通編程語言、算法和數據結構。大多數工作都需要具備Python知識,因此請確保你瞭解這門語言及其最新功能。在面試過程中,你可能需要解決白板編程任務,因此算法和數據結構知識非常重要。我會推薦這兩本書:

  • 算法簡介》(Introduction to Algorithms)作者Cormen、Leiserson、Rivest和Stein。本書對不同的算法和數據結構進行了非常完整的概述。使用正在學習的編程語言來實現算法和數據結構是一件非常有趣的事情。
  • 程序員面試經金典》(Cracking the Coding Interview)作者Gayle Laakmann McDowell。掌握所有算法將花費大量時間。本書將教你最常使用的算法和數據結構。

應該學習哪些課程?

在線課程有很多選擇。我最近沒有參加任何課程,不過聽說以下這些課程很不錯:

應該參加哪些技術大會?

我喜歡參觀技術會議或聚會,因爲它們讓你瞭解可以通過機器學習解決哪些問題、最新的技術發展水平以及行業正在使用哪些技術。學術會議可能更多地與最新技術有關,而商業會議則可能探索更多的技術應用。我關注的會議有:

  • QCon——瞭解軟件技術的最新進展
  • NVIDIA GPU技術大會——瞭解基於GPU的機器學習(神經網絡)技術
  • CVPR——一個計算機視覺技術大會
  • NeurlPS——一個神經網絡技術大會
  • ICPA——一個機器人技術大會
  • IROS——一個機器人技術大會

爲面試做準備

面試的一個祕訣是要爲面試做好準備。爲了評估候選人是否適合工作崗位,公司會對候選人提出一些小的挑戰。你可以把自己訓練成很善於解決這些挑戰!你可以這麼做:

  • 很多公司在開始面試你之前都會要求你解決一些HackerRank問題。到HackerRank網站上做一些練習,以便應對面試官。
  • 如果你想要在競賽性編程方面做得更好,就應該看一些現有的編程競賽。我比較喜歡Google Code JamAdvent of Code。Google Code Jam有各種難度級別的編程挑戰,並提供瞭解決方案的概要,這樣你就知道哪些算法最爲重要!每年12月,“Advent of Code”都會舉辦25項編程任務,這些任務在月底會變得越來越難。Advent of Code的一個特點是通常有多種方法可以解決同一個問題,而與他人交換解決方案將會給你帶來很多啓發!

儘量參與大型機器學習項目

我希望看到候選人具備一個大型機器學習項目的經驗,最好是涉及數據收集、數據清理、機器學習到部署的所有步驟。確保你在當前工作中獲得了所有這些經驗,或者嘗試在業餘時間獲得這些經驗。擁有這些經驗會讓你在申請職位時從衆多競爭者中脫穎而出。

獲得這些經驗的一種辦法是參與開源項目。你會發現,參與現有項目會有一個嚴格但很有用的評審過程。一旦你合併了第一個PR,就將成爲一個更好的開發者,知道其他開發者在乎什麼。

第二步:申請職位

在申請職位時,請確保你的求職信和簡歷可以證明你具備所申請職位所需的能力,並且簡歷清晰易讀。簡歷上可以列出你使用過的框架以及過去所做的項目。確保你可以回答出與簡歷上列出的框架和技術有關的問題!我還建議讓專業的招聘人員或外包商幫忙看一下你的簡歷,他們很樂意幫你拿到工作機會!

其中的一個祕訣是要把重點放在你想要獲得的工作上,而不是純粹羅列過去都做了什麼。我會針對我申請的職位調整自己的簡歷,重點突出過去所做的相關項目。簡歷應該突出展示你喜歡的技能和項目。你還應該在自己感興趣的領域物色職位:公司喜歡錄用對工作充滿熱情的人!

由於機器學習是一個不斷髮展的領域,很多人正在參加課程並試圖找到與機器學習相關的工作。作爲一名面試官,需要知道候選人是隻“學習”了一些在線課程,還是具備“實踐經驗”。如果你在上一份工作中做過過機器學習,請在簡歷中明確指出。如果你只是在業餘時間參與了大型項目,請在簡歷上附帶項目的鏈接!

第三步:面試

面試官可能會問很多與機器學習有關的問題。你要確保已經瞭解了很多算法的基礎知識,還應該清楚瞭解這些知識的目的和優勢。作爲一名面試官,我總是向在面試中會讓我瞭解到新知識的人提供積極的建議。如果你對某些主題有深入瞭解,那麼你更有可能被錄用,特別是如果公司剛好欠缺這些東西。

在面試中一定要問清楚問題是什麼,因爲很容易出現各講各的情況,而且過了一會兒才知道講的不是同一個東西。舉一個實際的例子:在一次面試中,我專注於如何編寫高效的列表排序算法,而面試官只想要找到列表裏最大的元素。每當遇到編碼問題時,請先編寫測試用例。這麼做可以顯示出你很在乎代碼邏輯和測試,而這恰恰是面試官喜歡的東西。在編寫測試用例時,你還有時間想一想可能的解決方案和潛在的陷阱。

在向面試官解釋答案時,請使用STAR結構來描述你的故事。你可以解釋自己所處的狀況、所執行的任務、所執行的操作以及結果。

最初幾次去面試時,你可能會感到緊張。這很正常,因爲你通常不知道面試中會發生什麼。每次面試都是不一樣的,因此,即使在這個行業工作了多年,仍然可能會有些緊張。人的思想容易對一個有信心的人造成束縛,因此做好準備是非常重要的!以下這些小技巧可以幫助你應對緊張的情緒:

  • 通常,面試官會在面試開始時會先進行一些閒聊。在此期間,收集有關面試官的信息。這總會讓我感到放鬆,並讓我能夠在接下來的面試中與他或她保持很好的互動。
  • 控制好環境:確保手機已關機,寵物呆在其他房間裏,Alexa/Siri已關閉。如果發生任何事情(例如郵遞員送包裹來),請保持鎮定,迅速處理好,再回到面試裏來。我個人不介意被打擾,這些事情可能會發生在我們任何一個人身上。
  • 在面試之前先進行練習!讓你的朋友問你問題——可以在《程序員面試金典》一書中找到一些問題,你也可以在線搜索到一些常見問題。你也可以瀏覽其中的一些問題,以便了解答案是什麼。
  • 準備“電梯遊說(elevator pitch)”。在一分鐘內總結出你是誰、你是做什麼的以及你想要什麼。每個面試官都會要求你做自我介紹,這將是最完美的答案。輕鬆的自我介紹爲面試開了一個好頭。
  • 瞭解如何輕鬆地傳達信息。我發現有時候很難用語言表達自己的想法,所以我喜歡站在白板前,一邊講一邊表達自己的想法。你會發現,一張便籤紙也可以幫助你傳達想法。無論你選擇怎麼做,都要確保事先進行練習,看看自己是否感到舒適自然。

面試之所以難,是因爲你永遠不知道會發生什麼。我主要經歷過以下這些類型的問題或面試:

  • 知識類問題。例如“LSTM的工作原理”、“二維卷積層有多少權重”、“支持向量機的核心技巧是什麼”。如果你對問題一無所知,那麼就按照你所知道的最大程度來回答。誠實很重要,但有些候選人會編造東西。你也可以說明通常該怎麼找到問題的答案,或者如何解決問題。爲了能夠解決這些問題,你需要閱讀教科書、學習特定的技術,並記住特定的事實和名字。

如果你申請的是深度學習相關的崗位,要確保你知道深度學習中使用最多的成本函數(例如二元交叉熵、分類交叉熵、均方誤差、餘弦相似度、Huber損失和Kullback-Leibler散度)。

確保你知道常見的激活函數及其派生函數(例如relu、elu、sigmoid、tanh、softmax、swish和selu),並且知道在神經網絡中可以找到的最常見的層(密集層、卷積層、可分離卷積、批處理規範化、全局和局部池化(最大池化和平均池化)、LSTM、GRU、dropout)。

如果你需要了解更多經典機器學習的知識,建議從scikit-learn中的算法開始。比如,最小二乘線性迴歸、支持向量機、最近鄰、決策樹和集成方法。

  • 洞察力類問題。面試者可能會在面試中給你一個小案例,並問你該如何處理。如果你過去曾做過一些機器學習項目,通常可以輕鬆地回答這些問題。但是,重新學習一下解決常見任務的方法還是有必要的。問題示例如下:

    • 你知道哪些預處理數據的方法?
    • 你會使用什麼方法來增強數據?
    • 你知道有哪些正規化方法?
    • 爲了完成這個任務,你將如何獲取/收集/註解數據?
    • 你將如何評估這個任務,你的模型應具備怎樣的性能?
  • 代碼類面試。有些公司會使用HackerRank,所以你可以運行自己編寫的代碼。有些公司則使用白板,或者只是要求在紙上寫。由於這種面試方式很普遍,因此務必加以練習。如果是機試,我建議你在選擇最佳解決方案之前先嚐試20行代碼。如果是寫在紙上,你只有一次寫出正確解決方案的機會。關於如何應對這類面試,有很多很棒的教程!這個時候最重要的是表達出你的想法,通常並不是要找到正確的解決方案,而是表明你是別人在解決類似問題時可以與他人一起工作的人。

  • 社交類問題。有一些常見的社交類問題,例如“別人對你的評價如何”、“你遇到的最大的挑戰是什麼”、“你覺得自己X年後會怎樣”。爲常見的問題做好準備,並確保能夠給出簡短而有說服力的答案。

第四步:完成任務

很多公司會給你分配一個技術任務。我喜歡這些任務,因爲如果給你足夠的時間,恰好是展示你能力的機會。回顧這些技術任務,我看到了很多很棒的解決方案,但也有一些人完成得不好,我不得不拒絕他們。這裏有一些完成技術任務的實用技巧:

  • 描述過程。每次上交一份簡短的報告,在報告中包含你所採取的步驟、你所嘗試的事情以及如果有更多的時間你將如何改進它。我喜歡用Jupyter Notebook來完成技術任務,因爲你可以同時進行描述和編碼!如果沒有使用,可以附上一個結構良好的PDF文檔。
  • 保持簡單。對於機器學習技術任務,你可以嘗試很多解決方案。簡單高質量地完成一項任務總比嘗試一個困難的解決方案而以低質量告終要好。
  • 說清楚哪些代碼是你複製粘貼的,哪些代碼是自己寫的。對於機器學習任務,通常有一些現有的算法和你必須實現的功能。例如,如果你要開發一個2D邊框檢測器,可以使用現有的YOLO實現。但是,一定要確保自己添加了重要的功能。人們仍然需要評估你的編碼方式,所以一定要指出哪些是你寫的代碼和哪些是你複製粘貼的代碼。
  • 重質輕量。確保遵守約定、編碼指南,並向函數中添加註釋。你可以使用所謂的linter工具,它可以分析代碼中潛在的錯誤和樣式違規。寫代碼的時候,要表現出就像是在向未來僱主提交代碼的樣子。一段高質量的簡單代碼比一個無法理解的高級解決方案要好得多。
  • 單元測試!作爲一名專業軟件工程師,爲你所寫的代碼編寫測試是工作的一部分。對於函數來說,簡單的assert語句就大有幫助。表明你對某些測試框架很熟悉,這將給評審人員留下深刻印象。

結論

希望這些能夠幫助你找到夢想的工作!機器學習很有趣,並且有解決很多問題的潛力。我寫這篇文章是基於我在技術會議和聚會上與人交談的經歷,但我意識到這並不足以讓我對機器學習世界有一個全面的認識。如果你有什麼建議或者知道你所在的工作領域有哪些重要的東西,請留下評論,以便幫助那些想要成爲機器學習工程師的人。

作者簡介:

Roland Meertens是一名機器學習工程師,研究自動駕駛車輛感知。他是InfoQ的撰稿人,在pinchofintelligence.com上有自己的博客,他在那裏列出了自己的副業項目。

原文鏈接

How to Get Hired as a Machine Learning Engineer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章