2017校招演算法崗筆試經驗分享

希望大家都能取得好的offer

之前分享過兩篇關於互聯網中演算法崗自己的一些體會,分別是:

今天帶來一些乾貨。演算法崗在找工作時應該如何進行準備?文章末尾還有一些資料以及今日頭條春招&實習的操作方法。並且預告一下:下一篇來談一談找工作中的一些流程、坑和重要的時間節點。

演算法崗要求總覽

廣義上的演算法崗又可以細分為機器學習、深度學習、自然語言處理、圖像處理等崗位。其中自然語言處理和圖像處理這兩個崗位有比較強的專業特性,一般需要你在學校時就接觸相應的項目實踐,或者之前就做過相應的實習,否則很難申請到這兩個崗位的工作。所以我們這裡的討論就只針對一般意義上的演算法工程師。別的我也不熟悉,也討論不了。

Advertisements

在互聯網公司的職位表中,這個演算法工程師又有幾個別名:數據挖掘工程師,數據演算法工程師。或者根據具體的方向又分為:廣告演算法工程師,推薦演算法工程師等等,本質上考察的東西都差不多。我大致整理了一下,主要有以下幾個方面:

演算法能力:

  • 三大演算法推導和細節:邏輯回歸,SVM,樹及其組合演算法(GBDT, Xgboost, 隨機森林)

  • 梯度下降演算法:給定目標函數,每一步如何迭代;牛頓法,BFGS等

  • 其他數據挖掘演算法如DBSCAN以及一些常用工具如ROC曲線,AUC值的計算方法等

  • 深度學習演算法。

數學能力:

  • 一些基礎的概率與數理統計知識。機器學習演算法的概率解釋。

計算機能力:

  • 計算機基礎知識(以計算機專業角度來看(數據結構,操作系統,網路等)),包括比如Python和C++語言的一些基礎概念,(筆試中比較常見)。

    Advertisements

  • Hadoop,Spark了解。簡單的MR會寫,原理要懂。

  • 程序設計:代碼題。

其中,數學能力的考察其實比較基礎和隨意,沒有什麼明確的章法。主要考察的能力是演算法能力和計算機能力,下面我將對這兩個能力做詳細闡述。

不論是面試也好,筆試也罷,畢竟是一次考試。任何考試都一樣,都需要花時間去準備才能考出好成績。所以大家不要對準備考試這件事掉以輕心。下功夫了,自然可以取得好成績。

演算法能力

我將分為演算法推導、項目經驗和主要參考資料三個部分來展開。

演算法推導:

  • LR(Logistic Regression, 邏輯回歸),這是機器學習的最基礎演算法,一定要熟練掌握。默寫目標函數,極大似然函數。最好由此出發掌握一些LR極大似然函數的解法,實際上就是常見的凸優化問題的解法。

  • 樹類演算法(決策樹,隨機森林,GBDT)

  • 1. 決策樹有三種演算法,分別是什麼?區別何在?節點分叉的是如何判定的?剪枝演算法的思路是什麼?

  • 2. 隨機森林。為什麼叫隨機森林?變數重要性如何度量?

  • 3. GBDT。如何實現?常見的損失函數有什麼?Xgboost與GBDT有什麼區別?Xgboost為什麼速度會快?

  • SVM。這是一個比較經典的數據挖掘演算法,因為比較容易寫出推倒公式而被經常考察,手推SVM已經基本上成為了一道必考題。從目標函數的由來,推到拉格朗日方程。如果面試官要求高,會再細問SMO解法的思路的。

  • 深度學習。BP演算法推導:包括CNN、LSTM等。在我面試的過程中深度學習被問的並不狠,但深度學習的比例肯定會越來越重。整體的深度學習的理論並不艱深,注意BP的推導就行,包括在CNN和LSTM的BP推導。

  • 一些其他演算法比如DBSCAN和演算法工具,比如AUC的計算,ROC曲線繪製等等。

項目經驗:

經驗在演算法崗還是很重要的,所以如果有演算法方面的實習那肯定是最好的。此外還可以用在學校期間和導師做的項目以及自己在各類競賽網上參加的一些比賽來充當自己的項目經驗。這些東西也是拿來填充簡歷的利器。

在面試中,一般面試官都會詳細的詢問你在自己的項目中用到了哪些演算法。具體到你要解決的問題,解決思路,最後的效果及評價指標,以及在項目過程中遇到的難點。這就需要你非常清楚整個演算法的解決思路以及曾經踩過的一些坑。如果你回答的有磕絆或者對某些細節沒有講清楚,比如你們沒有講清楚你的特徵是如何構造的,那肯定會導致你在面試官的心目中大大減分。畢竟寫在簡歷上的東西應該是你最清楚最熟悉的。所以如果有對簡歷上的細節不太熟悉的,一定要好好準備一下。

主要參考資料:

  • 李航《統計學習方法》。這本書言簡意賅,主要的機器學習演算法講的非常透徹。有關的演算法推導一定要非常熟悉。

  • 不懂的問題及時查搜索引擎,有很多技術大牛的博客是很值得參考的。

  • 不建議統計專業看周志華的《機器學習》(西瓜書),這本書的名詞表述方式和統計學中的名詞表述非常不一樣,看起來會很奇怪。當然,多看總是好事~

計算機能力

因為我們統計專業的學生通常而言計算機能力都比較薄弱,我這裡重點講一下最後一個計算機能力。

首先,我來講一下為什麼需要計算機能力。

如果我們想走演算法方向,那計算機能力就是我們手中的工具。我們想通過演算法解決問題,首先要對要解決的問題本身駕輕就熟之後才有可能解決問題。但在互聯網公司,整體的流程架構都是由計算機的那一波人來完成的。我們的模型演算法只是在某一個具體的問題上可以得到某一個看起來更科學的解。所以你如果想讓你的演算法結果對實際生產產生效用,就必須要至少學會能駕馭得了公司的業務流程架構,駕馭得了數據。我們在學習理論模型的時候,總是假設數據從一個假設的總體之中來,輸出了一個結果寫完了一個報告就算完事。須知生產過程中獲取數據可能需要從hdfs中取得,結果可能也需要打入下一個模塊之中,這些都是需要代碼來完成的。

此外,演算法的目的是為了優化某個業務問題的結果,首先我們需要做的是把業務的一般解決方法實現出來。這個實現方法可以根據直覺拍腦袋想出一些規則出來,至少可以先實現業務邏輯,使業務方的要求先實現了。如果效果不理想,在後期有精力的條件下,我們可以再對這個問題上演算法模型,做一些結果的優化。所以如果想做演算法方面的工作,必須要會做一些基本的開發工作。

對於需要的編程語言,這個其實是看團隊的。以頭條為例,主要的開發語言是C++和Python,需要Java就少一點,但一些其他公司可能就需要Java多點。但就從整體找工作的情況來看,一般是Python + (C++ / Java)。如果只會Python的話,可能會吃點虧,所以建議大家最好學一下C++和Java其中的一個。因為C++和Java很像,而Python相對來說又比較簡單,建議大家用C++進行下面的準備;當然,對於只想用Python的同學們,用純Python通過筆試面試也是可以的,不過也需要寫出正確時間複雜度的演算法。其實演算法這塊,演算法是個思路,具體你用什麼語言實現都是一樣的。

考察方式:代碼題

其實計算機能力最核心的考察是看你的代碼能力。那麼如何進行考察呢?就是給你一道代碼題,看你對這道代碼題的回答怎樣,解題的思路如何?知不知道基本概念比如時間空間複雜度?通過考察一道代碼題,至少可以確定你知道這個代碼中的基本控制結構,熟悉編程語言。最主要的是,在手寫代碼的過程中可以看你寫代碼的寫的快不快,有沒有bug。

面試演算法:本質上考察的是數據結構和演算法,比如排序,鏈表,二叉樹。對於非計算機專業的同學,面試中不會特別為難你,讓你去寫一些深搜or廣搜or動態規劃。如果是計算機專業的同學的要求高一點。因為你用好幾年的時間都在研究這個問題,自然要你掌握的牢靠一些。準備面試這件事就是,盡量要準備的多一些全一些勝算就會大一些。所以建議有空餘時間的同學還是看一看這些東西,畢竟筆試題還是有可能會涉及的。

需要準備的科目:數據結構與演算法。如果完全沒有概念的同學建議先學習一些課程;比如網上的公開課或者自己找些書看。

  • 經典教材:《演算法導論》。不過比較厚,能啃下來肯定是最好的。

  • 薄一點的教材:《數據結構與演算法分析》 有C語言實現的,也有C++、Java實現的,作者都是Mark Allen Weiss。找一個適合自己的教材即可。

  • 實在想看Python的:《數據結構與演算法:Python語言描述》作者是裘宗燕。國內作者寫的,我覺得廢話比較多,體系比較奇怪。不過好在是Python的。自己定奪吧~

有一點基礎的同學:最簡單快速的方式是直接刷題。

刷什麼題?當然是刷題庫。在筆試面試的過程中,有一個非常權威的題庫,名叫LeetCode ( https://leetcode.com/ )。這個題庫搜集的是在矽谷的互聯網公司的面試題。我們現在找工作的筆試面試的題庫基本都出自這裡或者是這裡題目的變種。在筆試面試現場屢屢能夠命中其中的原題,所以大家一定要好好刷題,認真刷題。不僅僅要看這個代碼解題思路,

怎麼刷題?當然你可以每道題目都冥思苦想自己做,鍛煉自己的思維能力,但是這並不是最有效率的做法。最有效率的做法是先看題,如果短時間內沒有思路就直接看答案,然後最好能夠在紙上默寫解題代碼。在面試中,非常重要的一個環節就是手寫代碼,所以大家一定要注意練習手寫代碼,和在電腦編輯器上的感覺還是很不一樣的。這一點我會在下一篇文章中再做強調。一些資源如下:

  • https://github.com/kamyu104/LeetCode 這份代碼庫中有一個pdf文件,有作者整理的非常全面的leetcode題目的C++題解,直接拿著這個刷答案即可。pdf文件中的題目可能略有點年代了(並沒有實時更新),但各個題目都是經典。我用的就是這個。大家可以先看C++的解題思路,再用Python自己實現一下。

  • https://github.com/soulmachine/leetcode 這份代碼庫中是一個新近整理的LeetCode題解,有C++也有Python的解法。甚至還有一些SQL和Shell的題解。應該會很有幫助。

  • 除了LeetCode之外,還值得推薦的是一個國內的刷題網站:https://www.nowcoder.com/ 牛客網。如果大家將來需要做筆試的話,應該也會在這個平台上進行筆試。所以熟悉一下這個平台肯定也是有好處的。

一些其他能力

以上為大家介紹的,都是計算機能力方面最主要的考察——代碼題。此外,可能還會有一些其他能力在筆試面試的考核過程中會涉及。這部分的要求的高度不及代碼題那麼高,屬於入職后肯定會用到,會了會很加分的那種。所以希望大家有時間的話也一定要多看一看,練一練。排名按重要性分先後。

  • MapReduce, Spark。這是現在最主流計算平台,最基本的使用是需要掌握的。常見的考題有:寫一個簡單的MapReduce程序(Word Count),hive數據偏斜問題的優化等。

  • Shell腳本。因為公司的伺服器基本都是Linux系統,所以一些Shell腳本是需要掌握的。主要考察的命令有:`awk grep sed crontab`等。推薦閱讀《Linux Shell腳本攻略》

  • git。這是一個代碼版本控制工具,能夠方便多人代碼的寫作和管理。大家可以自己弄一個Github管理自己的代碼,平時堅持命令行操作就基本上沒有問題了。兩個推薦的學習資料如下:

  • 1. https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 廖雪峰的教程,比較生動形象,但不是特別全。PS:他的Python教程也值得一看。

  • 2. https://github.com/geeeeeeeeek/git-recipes/wiki 這應該是我見過的最全講的最清楚的git教程。

  • Vim/Emacs Vim和Emacs是兩個不同的在伺服器寫代碼的編輯器,挑一個熟練掌握即可。因為我是Vim黨,就不說Emacs的事了。推薦閱讀《Vim實用技巧》。

其實筆試面試是有點玄學的。有時候你認真準備了也不一定能取得好成績,但是對於學習這件事情,一定要堅信自己學到手的東西將來有一天一定會用到的。

希望大家都能拿到自己滿意的offer~


我在準備找工作的過程中,自己也搜集了一些資料,放在了百度雲盤中。當然我只是一個搜集的功能,版權仍然是人家的。大家如果有需要的話可以關注之後回復「資料」獲取。

我是一名中國人民大學應用統計專業的學生,目標是成為一名演算法工程師。以後還會給大家分享自己的一些經驗,希望大家多多關注!

Advertisements

你可能會喜歡