AI演算法工程師必備技術,快快積累!
技術
計算機基礎
重要程度:**
本部分大多出現在筆試中,面試中也略有出現。
計算機基礎雖然不是重點,但是很容易被忽略掉的內容,一來是本科學的課程,研究生早忘光了;二來很多同學覺得我是搞演算法的,這些不是開發問的問題麼?殊不知計算機基礎是非常重要的部分,演算法工程師首先要是一個工程師,對計算機不夠了解怎麼做出更魯棒的網路結構,怎麼能提高計算效率?
這部分主要是4門最重要的基礎課和對linux操作部分:計算機網路、作業系統、組成原理、資料結構。網路和作業系統是非常常問的學科。
其中最常問的是作業系統,參考書目:《作業系統概念》就是恐龍書啦。核心、程序、執行緒、排程演算法、死鎖等等都是常問問題。
計算機網路,參考書目《計算機網路》,其中TCP協議、還有擁塞控制都被問過。
組成原理,參考書目《計算機組成與設計 硬體/軟體介面》,比較少見吧。
資料結構,參考書目《演算法導論》,求複雜度,紅黑樹、B+樹的一些結構和優點,有些跟演算法題一起考察了,也不太分得清,求演算法複雜度是最重要的部分,主定理背一背就搞定。
Linux操作,參考書目《鳥哥的linux私房菜》,講真問的還挺多,不過都是基本操作,比如查詢啊,幾千條資料的移動啊之類。
程式語言
重要程度:***
本部分筆試中非常常見,面試中也比較常見。
公司都會對語言有要求,再次強調,不要以為自己是演算法崗就可以忽略語言和計算機基礎部分。一般來說,根據公司和業務的不同對語言的要求也不一樣,很多是會一種即可,不過對口是最好的嘛,比如騰訊是c++,阿里是java,百度是c++,其他大部分是java,python一般都要求,阿里有些還要求sql,畢竟在阿里,演算法工程師 = sql工程師(開個玩笑)。
C++,參考書《C++ Primer》當字典書吧,常見問題:多型、虛擬函式,指標、函式指標,指標函式,巨集和內聯,記憶體分配類問題。
Java,參考書...算了我覺得java沒有參考書,筆者是個野路子出身,直接看了spring框架就槓槓造了,java方面面試沒有問過,並不是很懂。
Python,沒有參考書,人生苦短,請看文件。修飾符、多執行緒等基礎問題,還有numpy、pandas的一些問題,這裡其實還涉及到常用的深度學習框架,TF最多吧,筆者基本沒有被問到,有的同學被問過,網上可以看看他們的面經。
數學
重要程度:***
本部分筆試中非常常見,面試中也比較常見。
機器學習的知識說白了無非就是數學,但這裡的數學特指面試官會單獨問的一些數學知識。講真啊,無論是筆試還是面試,筆者感覺自己總會碰到幾道線代、概率、統計或者高數題。
尤其是概率題,幾乎必考,大多是古典概型,什麼不外乎摸球、抽牌求概率之類,有些需要算一算,有些可以直接往統計分佈上靠,比如百度的一道面試題:n個人進餐館吃飯,把帽子放在衣架上,走的時候隨機拿一頂,問拿到屬於自己帽子的人數量的期望,你要用排列組合算也可以算,但是往二項分佈上想可以直接得到答案:每個人拿對概率是p= 1/n,期望不就是E_x=np=1嘛。
統計考察的也很多,畢竟傳統機器學習就是統計,常用的分佈,性質,變換清楚熟記就可以。還有一種題也很常見,就是給你某個概率1/n的隨機數生成器讓你求一個概率1/m的生成器,演算法導論課後有類似的題,其實套路都一樣,就是扔掉重來,比如給你一個均勻的正4面體,給出一個方案,得到每個數概率為1/7的隨機數生成器,4<7<16,那就投兩次,隨便選7種排列,其他全部重新投就ok了。
線代部分主要還是跟著機器學習知識一起考的,比如PCA/SVD神馬的。
高數比較少,曠視的筆試題有很多這方面的考題,其他考的較少。
演算法題
重要程度:*****
很多筆試只有演算法題,面試幾乎必考
演算法題最重要的兩部分之一,即使是研究崗,寫好程式碼也很重要。很多公司面試只有這部分考察,比如ms,google,很多公司作為最大重點,比如頭條、滴滴,可以說,你可以沒有專案經驗沒有paper沒有實習,但你不能不會程式設計。
這部分很難講,因為不同公司的偏重不一樣,難度差別也很大,甚至說同一個公司不同部門,差別都很大。難度最大的是google,非OI和ACM選手連筆試都很難通過,頭條、滴滴、依圖、MS難度是leetcode mid +少量hard難度,其他公司一般是mid或者easy-mid。
不過好在演算法題可以刷題突擊,而且有一個很明顯的現象:面試難度<<筆試難度,其實非常好理解,筆試是線上oj,機器判卷,直接比對case的結果就好。但是面試要肉眼debug,這就難得多,而且很多題有多種不同解法,面試官自己也不是很懂,自己只會一種解法。如果出一道難題,沒有很深功力的面試官你給出一個不同解法他短時間很難判斷對錯。於是乎,除了上面提到的幾家公司,絕大部份的面試官都只在現場出一些經典問題,比如百度系的巨喜歡問樹的深度、公共父節點、最大路徑等二叉樹經典題的各種變種。然而經典代表著網上解法到處都是,代表著即使不刷題,刷刷面經也可以搞定。
筆試一般是1.5-2個小時做3-5道題,難度一般是幾道mid一道hard,時間很緊迫,思路正確但是怎麼寫都不對是常有的事。所以能提前批儘量提前批,能學長部門內推,儘量部門內推,筆試過了,演算法題這部分你就成功了一半。
演算法題準備最主要的是刷題,這個跟數學考試一樣的,需要靈感也需要手感,很多題看似不一樣,解法也不同,但大多都是一個套路,比如DP啊、DFS啊、遞增棧啊,能夠抓住題的考察點,接下來就是實現問題了。這個時候手感就很重要,規定時間內寫對並不是件容易的事,筆者前幾個公司的筆試題就因為2年沒刷題沒有手感,做的稀爛。刷題的網站很多,最推薦的是leetcode,好處是題多;牛客也不錯,而且還有企業真題,但是很奇怪,有些企業的真題跟筆試實際做的題不太一樣。另外看書的話,《劍指offer》還是非常推薦,你可能覺得這些題都考爛了,不過別筆試,今年考的還是這些題,面試官很忙的,很多永遠都是老三樣。
演算法題的另一個準備方法,可以說是價效比最高的準備方法就是:看面經,前面說過,面試官很忙的,大部分公司並沒有為了秋招單獨準備題庫,所以面試官考來考去都是那些題,比如同一個崗位,昨天問的問題基本就是今天要問的問題,瘋狂搜面經吧,撞原題概率非常大。
機器學習知識
重要程度:*****
演算法工程師啊,最重要的當然是你的演算法能力,其實這個突擊不來,很靠積累。很多東西看得多了才能融會貫通,這點好實驗室,本方向出身的同學會有極大的優勢,如果還有一兩篇不錯的工作,那你就是ssp收割機,甚至可以不需要演算法題能力,筆者周圍就有演算法題一個不答都進大牛組的同學,沒辦法,積累足夠深嘛。但半路出家也不是完全沒有機會,這裡主要講機器學習常見問題:
1 邏輯迴歸&交叉熵(重點)
LR真的是經久不衰啊,其實能問的地方好多好多,關於sigmoid函式其實可以從指數函式族的角度推導推導,然後就是交叉熵啦,最基本的就是從極大似然角度推導交叉熵。LR的基礎推導看這裡:https://zhuanlan.zhihu.com/p/34325602。
2 GBDT系列(重點)
機器學習的話,gbdt肯定是重中之重了,跟LR一樣是最最最常見的問題,工業界應用也很多,打比賽就不用說,xg,blgb是歷屆kaggle的兩把快刀。
其實gbdt沒有太多可說的,無非是boosting思想啊,為啥用負梯度啊之類。重點是在lgb和xgb對傳統gbdt的優化上,這部分內容很多,這個部落格做了一些總結:
http://djjowfy.com/2017/08/01/XGBoost%E7%9A%84%E5%8E%9F%E7%90%86/,但我覺得還是看原始paper和原始碼比較好。具體就不展開說了。
3 SVM
這玩意貌似去年很火?說實話啊,我沒怎麼見過哪裡用SVM,好像就RCNN用過SVM當分類器,後來就換成了softmax,我的面試也沒人問過,曾經看了好久,後來忘了還很忐忑,結果卻是沒有被問到。推導:
https://www.zhihu.com/question/21094489 @靠靠靠譜 的回答
4 RF&bagging
隨機森林本身沒啥東西,不過bagging的思想倒是非常有用,比賽中常用的降低過擬合方案,簡單來說就是選xgb中偏差低方差高的模型,做bagging,效果非常顯著。再有一點就是RF可以用oob做特徵選擇,效果也不錯。
5 決策樹
怎麼說呢,問的也比較少了,就是三種樹,ID3,C4.5,CART,區別和剪枝記一記。
6 特徵選擇方法(重點)
特徵選擇是模型預處理的重要部分。方法很多:方差、相關係數、卡方檢驗、互資訊、遞迴特徵消除、基於懲罰的方法、樹模型方法、單特徵AUC、IV。
7 取樣方法
主要有過取樣和欠取樣。
過取樣:Smote方法及各種變種
欠取樣:ensemble、nearMiss、Tomeklink、ENN
還有複雜分佈的取樣會用到MCMC。
8 聚類方法
也沒多少,經典的就是:k-means、k-means++、meanshift、DBSCAN、EM聚類、層次聚類。
9 評估指標(重點)
精準率、召回率、ACC、AUC、F1、KS、熵系列、資訊增益、CTR、CVR、MSE系列。其中AUC是重點中的重點,被問了好多次,而且很細節,包括本質意義、計算方法等等,注意AUC是有兩種計算方法的,這裡有介紹:
https://www.cnblogs.com/peizhe123/p/5081559.html
10 過擬合(重點)
起因基本不太會考,解決方法就多了,降低模型複雜程度啊,dropout啊、bagging、正則、earlystop,資料增強、交叉驗證。Dropout本質也是個bagging。
11 batch normalization
這個問題下的回答很有價值 ,BN問的還挺多的。
12 梯度彌散/爆炸,怎麼解決
改啟用函式啊,BN啊,想lstm一樣把*變+啊,加恆等對映的跳躍層啊,都可以。沒有太好的文章,看看這篇講resnet的吧
13 啟用函式,比較
sigmod/tanh/relu/maxout... 好多,這個隨便一搜就一堆,放一個不太切題的文章吧,我偶像何之源奆佬的回答,手動滑稽
14 優化方法(重點)
這就很多了,梯度下降系列、牛頓法系列,還有傳統的模擬退火、遺傳演算法。牛頓法這回問的很多,不知道為啥。lan大神的花書講的就很好,梯度下降的可以看這個。這裡要注意,有些面試官會讓你實操,就比如給你一個方程,讓你用梯度下降求解。
15 各種網路結構&模型(重點)
這個就太多了,CNN、RNN就一堆,推薦的也是一堆,基本的DNN、CNN、RNN的forward和back prob都要熟悉,然後lstm、gru、attention也要會,還有各種encoder-decoder結構,這個就看積累了。
推薦部分有自己的一些模型,比如FM系列,lookalike、協同過濾之類的非深度學習模型,後面的W&D為首的融合模型也是搭積木。
專案
這塊是很重點的部分,面試的大部分時間都是在聊你的專案,所以,寫在簡歷上的專案一定要保證自己能說的頭頭是道,怎麼做的,為什麼這麼做,最後的效果如何。還要把這樣做的原因想清楚,面試官一定會找漏洞challenge你,一旦被問住了那就不好辦了。
心態
人是感性動物,會隨著自己的境遇和周圍人的改變而受到極大影響。好的心態會幫助你超常發揮;差的心態可能直接導致秋招的失敗。筆者在秋招的過程中就經歷了大起大落,好在及時調整,否則肯定拿不到心儀的offer。
雖然這隻能靠自己,但是有一個很重要的地方就是:不要主動打聽別人的offer,我所見過的心態崩潰,幾乎都是因為與別人比較:周圍同學/朋友有offer自己沒有,別人薪資高自己低。其實可能只是時候沒到,我有個同學十一前0 offer,心情很崩潰,十一後迅速接到多個offfercall,最終拿到周圍同學中薪資數一數二的工作。所以不是沒offer,只是時候沒到,不要瞎打聽,相信自己的能力。
定位&規劃
GM面或者HR面一般就不聊技術了,然而GM權利卻比前幾個面試官大的多,可以直接決定你的生死,所以技術之外,個人的定位規劃、對公司的理解、願景就很重要了,自我剖析、個人定位,這些往往是終面這個級別的大佬們所看重的。
彼
秋招就是鬥智鬥勇,就像因為考題有套路,考試不一定100%反應能力一樣,秋招也有套路。A會80%的知識,但很可惜面試官問的都是後20%,那結果一定悲劇;B只會40%的知識,但恰巧包含了面試官問的那20%,恭喜你,你就是sp。
準備秋招就像打仗,對對手瞭解的深,就能不戰而屈人之兵。
1 收集資訊
什麼公司什麼時候提前批,什麼時候正式批,招什麼崗位。公司業界風評如何,技術如何,這些在你投遞之前必須搞清楚,很多同學都會因為錯過投遞或者乾脆不知道公司而錯過機會。筆者在百度提前批的時候就沒有收集好資訊,本來是內部直招,掛了一個可以投另一個沒有限制,筆者以為掛了就涼了,錯失機會。
2 提前批&內推
內推其實沒有以前那麼有用了,也許只能保證你的簡歷不石沉大海,可以說,以前的內推是面筆試,直通車,沒有內推就筆試;現在是有內推就筆試,沒有內推就沒戲。不過如果是部門直招就不同了。這種一般都免掉筆試,而且部門自己招人可以直接進入改部門工作而不用大類分配,如果是學長內推還有更大的sp機率。
3 針對面試官
期末考試是有重點的,還可能有往年或者課後的原題,面試也一樣。前面說過,很多面試官年年都是老三樣,而且面誰都是這些題。所以面試前瘋狂找面經對著準備,很大機率碰原題。更狠一點可以假裝有事往後拖一批(如果面試不止一批),然後問前一批同樣崗位的同學問過什麼問題,如果更幸運遇到了同一個面試官,那你的技術面就沒什麼問題了。
4 瞭解公司情況
很多業務大公司都做,但是做的水平就很不一樣,不僅公司跟公司不一樣,公司內部的組實力差距也非常大,所以一定要考察清楚。內部同學/學長啊,面試官水平啊,業界風評啊,這個組有沒有公開的工作或者發表的paper啊,都是衡量標準。
一定要避免坑,應屆生第一份工作很重要,如果不慎進了一個外表光鮮內在稀爛的組,工作這個頭就開不好了。
5 積極總結面試經驗
面試後第一件事不是如釋重負的玩,而是記錄自己遇到的面試題,尤其是錯的或者沒答好的,查清楚。同一個崗位,不同公司很大程度上是重複的,因為重點就是那些個嘛,A公司認為重點的,B公司認為是重點也會考察。這也是學長的面試複習法效果的由來:不準備,先面一些不想去的公司,以面試代複習,面了幾家後,後面的公司就好說啦。另外,總結經驗並分享出來,不僅是對自己的成長,也是幫助他人,畢竟你在搜面經的時候也希望別人有分享的吧。