機器學習演算法面經(騰訊阿里網易)| 掘金技術徵文

一個普普通通簡簡單單平平凡凡的神發表於2018-04-18

做為一個灌水混畢業的博士,投的論文最新審稿意見看到希望,看到有工作同學發了內推的連結,就讓幫忙推了幾家機器學習演算法工程師的實習(騰訊阿里網易)。前後大半個月筆試面試好幾場,總結一下面經回饋牛客。

騰訊提前批

女朋友在廣州又不想換工作的情況下,微信的機器學習演算法工程師是最適合我實習的崗位了,因此最先讓騰訊的同學內推了一波,在基本沒有準備的情況下,接到了提前批電話一面二面,毫無意外的掛了。

電話一面

  • 聊論文,但多數聽我在說,沒插話什麼問題。最後問我第二篇論文裡RNN實現的時候有什麼trick。
  • 問了問凸優化了解嗎?傳統機器學習瞭解嗎?我答機器學習基本知識都學過,凸優化只瞭解和機器學習優化演算法相關的。也沒有繼續問細節了。
  • 程式設計題:列印所有子集,我用了迭代,但是寫的比較蠢,好在不用除錯執行

電話二面

  • 聊論文,最後問了我跟什麼演算法做了對比,問我研究的實際意義,產業界現在的水平
  • 程式設計題:列印螺旋矩陣,要我給一個可執行的結果。很簡單的題,我一個符號錯誤調了很久都沒發現,這裡應該就印象很差了。
  • linux裡檢視埠被佔用的命令,linux不熟,沒答上。
  • AUC是什麼?我說了是ROC曲線下面積,但是想不起來ROC是啥。我都是做序列資料,沒做過二分類問題。
  • LR和SVM的區別。我說了損失函式不同,然後說了SVM通過核技巧可以更好的應對非線性,但是前面好差,這裡也沒好好組織語言了。

提前批掛的沒什麼話說,就是沒準備,好久沒做過演算法題的情況下,突然出題做就很不順手。而且機器學習的基礎知識都有點忘了,像AUC這種沒用過的,基本一問就懵逼。

之後跟工作的同學聊了一下,來牛客刷了刷面經,制定了簡單的複習內容和刷題計劃。花了一週時間,複習了一下西瓜書前11章和deep learning book前11章,刷了leetcode上三四十道medium的題吧(連結串列、字串、迭代、dfs、堆、樹、動態規劃等每天刷一類題練練手),並且給自己做完2篇論文都準備了面試介紹版,又讓同學推了阿里和網易,並進入騰訊筆試流程。

騰訊線下面試

筆試沒什麼好說的,機器學習崗考的都是數學,看過樣卷在牛客上隨便刷了刷題回憶了一下知識,統計部分的都忘了也都不會,最後還是過了。
進入線下面試階段,騰訊線下兩個面試官聊論文會更多更細節。對我來說難度主要是手撕程式碼,還問到了兩個leetcode上hard難度的題,不算難其實,但是我確實程式設計題相對弱,最後面試官也給了程式設計能力有待提高的評價。

一面

  • 聊論文,一些關鍵細節都聊的很深入了,並且提出了一些合理的質疑,都做了回覆。
  • 問了一下我對深度學習的瞭解程度,然後手寫BP演算法,要我用虛擬碼寫,我就連說帶寫了一個非常偽的虛擬碼。
  • LR和boost的區別,這次吸取前面的教訓,先是細說了LR是什麼,怎麼推導來的,然後說Boost是什麼,幹什麼用,以Adaboost和GDBT簡單舉例,最後說二者聯絡和區別。
  • 順勢問我,LR/Boost和樸素貝葉斯的區別,就答了生成模型和判別模型的區別。
  • 手撕程式碼:翻轉列表前k個。翻轉連結串列題很簡單,很快寫完了,注意了頭節點處理別出錯,應該沒問題。
  • 覆蓋字串所有字元的最小子串,只提供思路就行。Leetcode第76題,hard難度裡偏簡單的吧算是。字串子串問題基本都是滑動視窗,移動頭尾指標複雜度O(n). 不過我當時沒想起滑動視窗來,只提出一個O(n^2)的。

二面

  • 聊論文,同樣聊了很久很細節,好像比一面還聊的深入。基本我每一處設計都有聊到,也都會問有沒有考慮過別的思路,或者換成別的方法會怎樣。
  • 手撕程式碼:找出0-1矩陣裡,全1組成的最大矩形面積。這題又是Leetcode第85題,hard難度。矩陣上找路徑或者覆蓋,直接上DP,我刷過對應的medium難度最大正方形,順著思路就寫了,但是程式碼寫的太醜不簡練。
  • 問我有一個地理座標,怎麼從我所有的幾千萬幾百萬個poi中快速查詢到離它最近的幾個。我是想答分治、分層索引之類的,但是面試官實際是在問,怎麼設計資料結構能最快,怎麼把x,y這樣的座標對存成key,沒答上讓他滿意的答案。
  • 總之後面兩問讓面試官留下了程式設計能力有待提高的評語。

HR面

  • 聊我做的什麼研究,有什麼用,在微信裡可以用在什麼地方
  • 提到面試官對我的評價,並聊了之前提前批電面掛了的情況,問我怎麼看,以及怎麼評價剛剛的面試官
  • 問我對微信的瞭解程度,微信事業群的瞭解程度,為什麼不夠了解就投了
  • 為什麼選廣州(因為女朋友),又問跟女朋友的簡單情況,問是不是因為女朋友在廣州所以選的微信
  • 問我還投了哪裡(阿里和網易遊戲),為什麼投阿里又不在廣州
  • 有什麼優勢是契合微信的
  • 希望工作環境是什麼樣子
  • 問實習時間

最終又等了三天,發了實習offer,微信事業群,廣州base,算是我理想的實習了。

阿里電面

除了騰訊,還讓同學內推了阿里試試,演算法工程師-機器學習。到現在電面三輪,還在等後續。

一面

  • 聊論文,跟騰訊提前批電面過程差不多,主要是我在說,沒深入太多問題。
  • 我主要針對序列資料建模,問了我Markov和RNN的區別。
  • 程式設計題:很簡單的題目,字串出現第k多的字元,leetcode上原題,寫的挺快,問我複雜度就簡單分析了一下。

感覺阿里一面面試官比我還謹慎是為啥,感覺沒聊多少就結束了。二面緊接著第二天就來了。

二面

  • 一樣聽我聊論文,沒深入太多細節。
  • 問我是怎麼訓練論文裡的RNN的,不收斂怎麼辦,答分訓練誤差測試誤差,順便說了欠擬合過擬合的應對方式,以及我模型是怎麼確定層數和hidden size的,以及用了哪些防過擬合手段。
  • 問了一個實際場景,使用者輸入一個座標,怎麼推送給他合適的POI。問題描述的有點不清楚,我理解的也有點懵。先說根據使用者特徵、相似和社交關係等做個性化推送。又說如果訓練資料中使用者資訊不是完全標註好的,就是半監督問題,可先對POI聚類或者embedding等。
  • 我提到半監督,又進一步問,在標註POI時候,如果座標資訊都是不精確的,離散的,每個使用者標註的語義也是多種多樣的,怎麼處理。答座標可以把小範圍聚集在一起的當作一個POI,標註的時候,使用者打的標籤數目有限可以投票、標註的內容較多分詞後用層次聚類、主題模型之類的辦法,給POI打上類別標籤。

二面這個場景題,我對面試官問題理解可能有偏差,他也講的不夠清楚,我都是邊猜邊答,反正儘可能把我知道的都說一下。二面三面隔了一週,中間在MSRA工作的師兄叫我去他那實習,因此我要麼就是能去微信實習在廣州陪女朋友,要麼就去MSRA實習,阿里基本不考慮了,不過三面來了還是面了一下。

三面

  • 聊論文,這次我聊的比較隨意,面試官就更多的問了一些細節,比如我第一篇文章用到張量分解,問我張量分解具體怎麼做,如果引入更多使用者特徵怎麼處理?張量分解怎麼優化的,收斂慢怎麼辦?我提到二階優化,又問我二階優化在這裡有用嗎?為什麼有用?還在講第二個文章的時候問到我word2vec有用過嗎之類的。
  • 問了我xgboost和隨機森林瞭解嗎?我不瞭解xgboost,我就說了boost的基本原理,adaboost和gdbt的基本原理,又講了bagging的原理,以及隨機森林。
  • 後面好像還問了別的,但是我忘了。。囧

三面後還是說一週內等下一輪。阿里後兩面都沒有程式設計,其實對我這種演算法題老大難來說,還是挺友好的。但是流程太拖了,投了簡歷好久才面,一週一面,然後還不知道幾面結束。

網易遊戲人工智慧研發工程師

因為想去廣州,所以還投了網易遊戲的人工智慧工程師,但是內推流程搞錯了,導致沒推上,還去答了個筆試程式設計題,三道就AC一道,最後居然也給了面試通知。
HR通知我的時候讓我準備電腦,結果面試又沒有程式設計題。13號剛面了一面,兩個面試官一起電話面,說等結果,不知道是隻有一面還是後面還有。

電話一面

  • 簡單介紹了自己的研究方向,然後開始聊論文,也是簡單介紹了一下。
  • 問我ML和DL哪個更熟悉,我說DL,然後換了個面試官專門問DL
    • 先問第二篇論文裡的RNN怎麼設計的,其中用到的多工學習結構有什麼好處,多工的權重怎麼調的
    • 網路效果不好怎麼辦,要不要增加資料量?還是按欠擬合過擬合答的,欠擬合基本沒有,過擬合可能有用
    • 進而問過擬合什麼情況沒用?答資料仍然不夠,或者跟現有訓練集一樣有偏
    • 進而問給你一個過擬合模型,和額外很大量資料,怎麼判斷這些資料有沒有用?想到了取樣,但是一時沒想起來具體怎麼辦,最後面試官說,可以取樣了用過擬合的模型去跑跑看誤差
    • 繼續問還有什麼方法解決過擬合,我的論文裡怎麼解決的過擬合
  • 然後換回另一個面試官,又開始問ML的知識
    • 先介紹了一下我論文用到過什麼傳統機器學習內容
    • LR和SVM訓練目標的區別,老問題了
    • 知道什麼引數範數懲罰?我答L1,L2是主要的,我還在別人的論文裡見過Frobenius做引數軟共享的。進而問我L1和L2的區別。
    • 特徵選擇的方法,我說我是直接用樹模型,樹模型本身可以特徵選擇,還可以L1,降維,別的不瞭解。
    • 文字二分類的場景,問怎麼提取特徵,怎麼設計評價指標,怎麼調節超引數。

網易筆試三道程式設計,面試反而沒有程式設計。感覺看了好多面經,網易這套問法是最符合面經裡問法的。

總的來說,我做了兩篇論文,所以面試會有很多時間花在聊論文上,而別的東西問的很簡單,並且我程式設計題經常出狀況的情況下,也都給過了。
如果是碩士本科,可能需要更多準備專案或者比賽來聊吧。而我論文是自己全程做全程寫的,所以跟面試官討論起來並不虛,基本沒在聊論文的時候被問住過。那碩士本科同學可能要對自己參與的專案和比賽也瞭解非常仔細深入吧,問的再細也能一條一條回覆過去,應該就問題不大了。
面試技巧方面,最重要的就是主動把自己知道的都說出來(當然要有條理有邏輯),不能面試官問什麼說什麼,尤其問到不太會的問題,更得從不太會的問題中,儘可能展示出聊出自己會的東西(比如問我xgboost我就不太會,於是就從boost的基本思路開始說,並簡單說了adaboost和gdbt)。

最後就是面經還是非常有用的,雖然這些面試官問的問題和麵試套路可能隨心所欲,但是出題範圍基本沒超出我在牛客看到的面經內容。

大家都加油,拿到大把offer,找到dream job。

掘金技術徵文連結? juejin.im/post/5aaf2a…


相關文章