2021 年,我同時挑戰了 數據分析 以及機器學習領域的職缺,這兩個領域可能會被通稱為資料科學家,但是實際工作內容與面試會遇到的考驗大大不同!
這篇文章是寫給跟我一樣不是資工或統計系背景的讀者,我將分享我從商管學士跨領域,應徵機器學習工作投了 10 家公司的履歷、經歷了 9 場面試、最終拿到 1 間錄取的歷程,我也寫下我遇到的機器學習面試題、以及準備方法與學習資源,希望為同樣跨領域挑戰的讀者增加信心:非本科系是有機會拿到機器學習工作錄取的!
本文分享的工作類型,將以機器學習演算法應用為主,不包含資料分析師(Data Analyst)、軟體工程師(Software Engineer)、或者機器學習工程師(Machine Learning Engineer)。
聲明:基於 NDA,本文寫出的面試題都是提及關鍵考點,並沒有直接對應到任何公司的真實面試題
目錄
求職背景與結果
我在此用條列的方式簡介自己 2021 年求職時的背景:
- 商管學院學士學歷,在校修過一些資工相關的課但是成績不佳,有修過機器學習相關專題課
- 在手機遊戲公司擔任資料科學家兩年半,工作中機器學習的專案不多
- 曾在中研院擔任一年的研究助理,負責金融業的深度學習與推薦系統產學合作專案,沒發過 Paper
- 會打 機器學習競賽,都是國內賽事、沒有 Kaggle 成績
關於我的更詳細專業背景,請參考我的 LinkedIn 與 Github。
以下是我 2021 年在機器學習領域求職的公司與結果:
公司 | 工作地點 | 職稱 | 投履歷管道 | 結果 |
---|---|---|---|---|
Dcard | 台灣 | Machine Learning Engineer | 官網直接投 | 拒絕信,無面試 |
Mercari | 日本 | Machine Learning Intern | Connect Jobs | 線上程式與筆試題後,拒絕信 |
Whoscall | 台灣 | ML Engineer | 官網直接投 | 拒絕信,無面試 |
Agoda | 泰國 | Senior Data Analyst (Data Science) | 內推 | 推薦人說我被拒絕了 |
SEA | 新加坡 | Engineer, Data Analyst | 內推 | 無回應 |
騰訊(WeChat) | 新加坡 | Security Data Scientist | 內推 | 兩次面試後,主動放棄 |
Garena | 台灣 | Data Scientist (Booyah) | 內推 | Offer |
ByteDance | 新加坡 | Data Scientist, Growth | 內推 | 推薦人說我被拒絕了 |
趨勢科技 | 台灣 | Sr. Data Scientist (System Kernel) | 官網直接投 | 無回應 |
KKLab | 台灣 | Data Scientist | Yourator | 無回應 |
面試經驗與建議
程式能力
既然是機器學習工作,寫程式的能力當然是必考的,不只考程式語言特性、也考資料結構與演算法。但是跨領域求職者也不用太擔心,有個幾乎所有工程師都知道的練習秘訣:LeetCode!到這個網站拼命練習題目就對了。
在我的面試經驗中,機器學習工作對演算法程式題的難度要求,比軟體工程師稍微低一點點,以 LeetCode 的難度標準來說,筆者好豪面試只有遇過 Easy 跟 Medium 難度的題目,Hard 等級的考題從沒有遇到過。
對於程式題練習,我想分享最重要的技巧是:分類。演算法跟資料結構的題型,可以有很多種分類法,包括 Linked List、Graph、Dynamic Programming 等等,練習的時候,如果沒有分類、只是隨機選題來練,可能會變成每個分類只練習一、兩題,結果上了戰場遇到某分類的變化題,實力卻不足以應對,練習不就白費了嗎?
因此,我的策略是在各個分類都挑出數題重要題目、有條理地練習。具體來說,我參考了 AH Tech 在 YouTube 影片中分享的 LeetCode 分類方法與表格,在每個分類中,我會把 Easy 到 Medium 難度而且免費的題目全部練習過,Hard 的題目則是最多只寫一題。並且,我會幫自己設定日曆、在隔一週後複習剛練過的那個分類,因為,只要是不熟悉的題型,即使練習過一遍,下次看到一模一樣的題目,還是有可能寫不出來!所以請別忘了安排複習行程,如果面試題(好運地)出現看過的題目,務必要追求 100% 拿分!
我使用這些練習方法,總共只練習了約 100 題,相對於軟體工程師、的確題目數量算是少的,我主觀認為夠用了。我通過的四場 Python 程式面試、總共近 20 題的題目中,至少一半題目是我在這 100 題中看過的,我可以穩妥地拿分;另外一半則是用這 100 題練習過的技巧稍微變形就能過關。我猜想,或許大家不會拿聘用資深軟體工程師的程式題難度標準來刁難資料科學家應徵者吧。
除了上述的 AH Tech 分類法,我在練習 Python 演算法程式題目還用了以下幾樣資源:
- Udemy 知名講師 Colt Steele 的 演算法課程,講師用很多圖解、方便快速複習
- (延伸閱讀:輕鬆自學 JavaScript 演算法與資料結構 — Udemy 課程心得)
- Code Interview 的臨場技巧:問題拆解與架構、如何與面試官溝通
- 花花醬的 YouTube 頻道,LeetCode 題目卡關的話,我會看他怎麼解
- 解題高手安妮的分享:如何高效率的刷 LeetCode
機器學習技術問題
機器學習領域的專業知識問題,範圍超級廣,從 20 世紀就提出的模型、到前兩個月剛發表的新論文,都有可能是面試會問到的。為了更有效率地準備,我蒐集了許多人的面試經驗、也整理自己的面試經歷後,總結出最重要的準備要點是:
Why A, not B?
資料科學家會用到機器學習模型的時機,是針對一個定義好的商業問題,選擇一個適合的模型。因此,面試中會考驗應徵者,是否了解模型的特性、以及不同模型選擇可能造成的差異。
舉例來說,常見的面試題像是:
- L1 與 L2 Regularization 有什麼不同?
- DenseNet 與 VGGNet 有什麼差別?
- 為何你在履歷中的專案經驗使用 Random Forest 而不用 XGBoost?
- Transformer 在近年幾乎是顯學,它在任何場景都比 RNN 好用嗎?
- 深度學習的 Optimizer 怎麼選擇?你為什麼用 Adam?
- 什麼時候該用 ROC 曲線 或 PR 曲線來評估分類問題?
- 遇到不平衡資料該怎麼處理,不同的處理策略之間有什麼優劣差異?
回答或介紹某個模型時,如果你把每個模型的每個元件都詳細地介紹一遍,想必要花不少時間、面試官大概會聽到打呵欠,因此筆者好豪認為專注回答模型的「特色」、並提出為何你會為某場景使用 A 模型而不用 B 模型,會是其中一種有效的面試策略。
例如,當我被問到 DenseNet 與 VGGNet 的區別,我會為每個模型只挑出幾個重要特性來講、而不是鉅細靡遺地描述:
- VGGNet 的特色
- VGGNet 的架構與 AlexNet 相似,但是用到更少參數、且引入更多卷積層來增加非線性關係
- 例如一層 7 乘 7 的卷積用三層 3 乘 3 卷積取代,卷積層涵蓋的圖片大小相同,但是參數量從 49 減少到 27
- 也引入 1 乘 1 的卷積,用來增強模型對特徵非線性關係的表述
- DenseNet 的特色
- 準確度近似於 ResNet 但是參數量更少、計算效率較高
- DenseBlock 設計讓深層網路也可以看到所有淺層網路所看到的內容,在原始特徵特別重要的場景會有更好的效果
- 在我參加過的音訊分析競賽,原始特徵對於音訊表示特別重要,所以 DenseNet 比起其他影像辨識 CNN 模型有較好的效果
像這樣,只選幾個特色來講、每個模型都只濃縮成幾句話,兩分鐘內就可以回答完一個貌似範圍超廣的問題。我認為,不要讓面試官聽到不耐煩、比回答的完備性重要。
機器學習面試問題,具體該要如何準備?任何人問我這項問題,我都會給他這個毫無創意的回答:
瘋狂蒐集題目、然後背答案!
機器學習有太多重要但是容易忘記的細節,求職前沒有複習的話,上了面試戰場肯定會十分慌張,例如:
- Vanishing gradient 是什麼意思?怎麼解決?
- 決策樹是怎麼建立的(要解釋 Information gain 與 Gini impurity)
- 隨機森林實際上是指什麼東西隨機?
- 請解釋 Precision 與 Recall 兩個 Metrics
- Batch / Layer / Group / Instance Normalization 之間的差別
- 什麼是 Bagging (Bootstrap + Aggregating)
- 請介紹深度學習會遇到的 Underflow 與 Overflow 以及建模過程怎麼看出這兩個問題
我會地毯式地到處搜索蒐集題目,記下不會的地方,整理在自己的筆記本裡,時時複習,我使用過的學習資源包括:
- 《機器學習工程師面試全破解》,這本書蒐集了 124 題重要的面試題與解答,筆者用盡全力把這本書寫到的重點全都背下來了(除了強化學習與 GAN 的章節),覺得內容應付面試算夠用
- 到 PTT Soft_Job 板找其他人分享的面試題,例如 DrTech 分享的 NLP 面試經驗 對我超有幫助
- Sroy20 的 GitHub,這裡條列了許多面試題,但是解答要自己找
這段拼命蒐集面試題與背答案的過程,是真的不輕鬆、常常背了又忘,對此,我採取我在《超速學習》這本書學到的自由回想以及間隔重複法技巧來幫助我有效記憶,推薦有興趣的讀者閱讀我的 《超速學習》讀書筆記 來認識這些記憶法。
寫到這裡,我得強調,上述的「背答案」策略只是為了找工作採取的不得已手段,它並不是研讀機器學習的好方法。機器學習模型背後的數學原理毫無疑問地非常重要,資料科學家需要了解這些數學知識才能正確使用模型,但是,面對現實吧,如果你未來兩個月內就要開始面試,根本來不及研讀所有數學公式與細節! 那就先拼命背答案,等到找完工作,再為自己規劃更扎實的學習方法。
此外,對於短期衝刺,果斷放棄沒接觸過的領域也是我採取的其中一種策略。例如在深度學習領域,筆者好豪只有耳聞過、卻沒有實作過跟強化學習還有生成對抗網路的相關專案,我就直接放棄這兩個領域、面試前完全不花時間準備。面試被問到這兩個領域時,我會乾脆地回答「沒有實作經驗 (˚∀˚)」,珍惜時間、讓面試官問我其他領域的問題,更好拿分。
專案經歷
非本科系、或者跨領域轉職找機器學習工作常有的困境,是相關作品不足,或者專案在工作中沒有太多實際成果。而在我的面試經驗中:
有機器學習相關實戰成果很好,但是就算成果不多,面試官也會重視你遇到什麼困難以及如何找出問題點並解決
筆者好豪會在履歷中列出參加機器學習競賽的經驗,但是名次從沒拿過最亮眼的前三名,參加比賽也都是國內舉辦的、不是知名的 Kaggle 國際競賽,即使如此,只要有事先梳理內容,小型或者名次不是頂尖的比賽也非常值得在面試中分享。為了引起面試官興趣,我在整理經歷時,會為我的比賽作品強調以下兩點:
- 比賽的困難點:資料型態哪裡複雜、遇到過的「髒資料」、過擬合問題
- 與眾不同的做法:特殊的特徵工程、或者超參數調整策略等等,就算不是第 1 名,也可以分享自己如何從最後一名進步到前 20 名
資料科學競賽類型的作品經歷,強調的不只是建立最複雜的機器學習模型,資料觀察與清理能力、還有為分析流程找出錯誤的 Debug 能力,也都是資料科學家所重視的,有競賽經驗的讀者,可以透過介紹困難點、以及與眾不同做法的方式,向面試官展現出自己在不同分析流程的實力。
對機器學習競賽有興趣的讀者,推薦你延伸閱讀:
- 資料科學競賽,能獲得什麼?
- 好豪的 音訊辨識 以及 影像分析 競賽心得
- 入門 Kaggle 競賽的好用工具書:《Kaggle 競賽攻頂秘笈》
非本科系到底能不能應徵機器學習工作?
在這個小節,筆者試著回答太多人都想知道的問題:
不是資工系或統計系,也能做機器學習工作嗎?
我投了 10 家公司,只有 3 間履歷過關、進入面試,最後只有 1 間拿到錄取。根據這個經驗,我會回答:可以,但是請先整理自己的心態、並且分析自己的弱點。
首先,沒有資工系學歷,找機器學習工作時就該整理好心態。就如本文第一小節分享的求職結果,筆者好豪投的台灣公司機器學習職缺,全都沒辦法進入面試關卡,我個人主觀猜想,在台灣要是沒有資工背景、或者沒有碩士學歷,找機器學習工作時,履歷特別容易被忽略。因此我認為,非本科系的畢業生、或者從業人員,要準備好正確心態,在台灣跨領域求職不順利的話,不要太難過!而是該盡快練練英文能力,鼓起勇氣往新加坡、日本、澳洲、或者中國投遞履歷,海外的職缺對碩士學歷的硬性要求相對較低,而且海外的職位總數也比台灣多得多,履歷多一些機會被看見。
其次,雖然現在網路上開源的學習資源超多,有熱情的資料科學家們即使不是本科系也能積極自學,但是,非本科難以自學練成的最大弱點會是:機器學習實務經驗。以筆者自己的經驗出發,可以舉例兩個方面,第一是 MLOps,包括了後端 API 開發與串接、模型大小與準確度之間的權衡、串流資料的 Incremental learning、還有平行化運算等等議題,在校沒有做過大型專題、或者沒有機器學習領域的工作經驗,就很難講出 MLOps 要解決的痛點、也不容易扎實累積 MLOps 的知識,我面試的每家公司都有問我 MLOps 相關經驗,我也感覺得出來自己對此回答較薄弱,總會讓面試官眉頭一皺。如果你距離開始求職還有時間,請記得為自己補充點 MLOps 知識,至少不要上了面試戰場完全講不出一個字,例如,筆者自己現在就在 Udemy 上修習 機器學習模型部署 的線上課程,充實機器學習上線運作每個環節要注意的知識。
第二個值得提的非本科系弱點是完整的專案開發經驗。看書與上課自學、或者透過 Kaggle 競賽練習,通常只會學到資料科學流程的建模與特徵工程,而一開始怎麼把模糊的商業問題定義成機器學習能解決的問題、如何選擇好的訓練資料、以及模型上線後如何驗證成效等等,都需要從頭到尾參與過一項機器學習專案開發,才能在面試中講出有見地的回答。我有通過面試的兩間公司,都被問到「我們發現使用者有某種濫用 APP 的行為,請問你如何用機器學習來捕捉這項行為?」或者「我們公司的主要產品是有某某特色的影像串流,請問你會怎麼設計推薦系統來改進使用者體驗?」這類開放式系統設計問題。不害臊地說,我運氣好在這兩間公司提問的領域有一些些相關經驗才能面試過關,因此,建議非本科系又有志於機器學習工作的朋友,請在鑽研酷炫機器學習與深度學習模型以外,規劃時間研究一些如上述舉例的實務議題,並且為你有興趣的公司蒐集領域知識,對此,筆者好豪非常推薦你到 PyData 的 YouTube 頻道 向全世界的高手學習他們在實戰中遇到過的問題。
求職流水帳
以下為有進入面試關卡的公司寫下超隨意流水帳,希望能讓大家很大致地了解這三家公司聘用機器學習專家的狀況。
Mercari
- 應徵了 Machine Learning 實習職缺,號稱其中六個月可以遠端實習,在台灣 ConnectJob 看到的機會
- 雖然是日本公司,看起來用英文也可以
- 程式關卡是用 HackerRank 系統,總共八題都可以用 Python
- 有兩題只是測試程式語法的超送分題,其他題目演算法難度不會超過 LeetCode Medium
- 有線上問卷讓要我填寫相關資歷
- 我在第一關的程式關卡 + 線上問卷就被拒絕了 QQ
(延伸閱讀:資料科學家的薪水究竟多高?薪水資訊去哪裡找?)
騰訊(WeChat)
- 騰訊 WeChat 產品在新加坡的網路安全相關(Security)資料科學家職缺,請認識的朋友牽線內推的
- 兩個關卡都是中國面試官,用中文面試
- 問法都是從履歷出發,然後延伸出相關的技術問題與經歷問題
- 經歷問題都是 STAR 架構 可以解決的
- 技術問題被問到很細,面試當下會覺得滿緊湊的,例如:
- 你在履歷上的某某專案用到的機器學習,怎麼選特徵(feature)的?
- (我答 feature importance)請解釋 feature importance
- feature importance 看不出與目標變數的正負相關性怎麼辦?
- 聽過在線性模型加入 L1 或 L2 正則化嗎?哪個跟特徵選擇有關?
- 你說 L1 更傾向讓 feature 參數變成 0 達到特徵選取,為什麼 L1 有這種特性?
- 兩場面試都包含了半小時的程式題、各三題,會開一個線上白板,你寫下的每一行程式碼、面試官都會即時看到
- 難度沒超過 LeetCode Medium,而且我確定有幾題跟我之前寫過的一模一樣,對這家有興趣的朋友請好好練習 LeetCode
- 題目寫完會要求你解釋為什麼這樣寫、複雜度、還有如何改進,面試前最好要練習 Code Interview 溝通技巧
- 第三場面試開始前,人資突然告訴我(因為 Covid-19)新加坡的職缺數量不夠了、問我要不要去中國的部門,我沒做好心理準備所以主動放棄了
Garena
- 應徵職位是 BooYah 遊戲直播平台的資料科學家
- 面試歷程:程式關卡 -> HR -> 兩場與未來前輩的面試 -> 主管 -> 產品經理
- 雖然工作地點是在台灣,但是主管人在新加坡總部,需要英文面試
- 被問到的機器學習技術問題很硬,我覺得需要有大量機器學習建模與犯錯的經驗,才能答得好
- 我遇到的面試官會當場對我的回答給予回饋,我學到很多,十分感恩
- 在職缺描述就寫明了要做推薦系統,所以領域知識確實被問得非常詳細,只是聽過兩、三個推薦系統演算法就來面試的話,大概無法過關
- 例如,給你某個推薦情境,問你某幾種推薦演算法有什麼優劣勢、該用哪個
- HR 非常專業且誠懇
- LinkedIn 上其他 HR 的公開資訊表示,可以在台灣工作、拿到新加坡等級的薪資
- 我在此面試遇到的人都是強者,專案內容也很有挑戰性,這個團隊如果還有開缺、而你又是在推薦系統領域有經驗的人,相當推薦挑戰這裡的職缺
結語
不是資工系能找到機器學習工作嗎?可以!但是,即使我自認本業外的時間花了很多力氣鑽研機器學習與深度學習、最後也的確拿到一封機器學習工作的錄取信,我還是認為自己還有太多資料科學知識需要加強才能跟上業界標準,拿到錄取大概是運氣與實力的成分各佔一半,成功換了工作後也依然不敢懈怠下班後的進修。所以,對於非本科系的畢業生或已經在工作的朋友,既然要跨領域挑戰機器學習工作,就要比一般人投入兩倍以上的努力、好好準備!希望這篇文章分享可以給大家跨領域的準備方向與啟發。
除了這篇文章的機器學習開發求職經驗,筆者 2021 年同時也挑戰外商的數據分析職缺、順利拿到錄取,面試準備方向與這篇文章所述大不相同,有志於資料科學與數據分析職缺的讀者,推薦你繼續閱讀:好豪的外商資料科學家求職經驗分享(2021 年);另外,2024 年筆者也繼續挑戰新的一輪面試旅程,請參考閱讀這一篇:2024 年資料科學面試經歷。
此外,筆者在換工作以前,也想要進修、推甄過台灣的電腦科學研究所,但是全軍覆沒 QQ,若你同樣有幾年的資料分析工作經驗,想知道有沒有機會推甄研究所,可以參考我的 資工所推甄經驗分享(110 年度)。
也請熱愛資料科學的讀者追蹤 好豪的 Facebook 粉絲專頁 與 Threads 帳號,我會繼續寫更多面試與資料科學工作經驗等等心得文章。也請點選下方按鈕,將本文分享給正在往資料科學家職涯邁進的朋友!