贈(zèng)書(shū) | 從啥也不會(huì)的小白,如何才能成為合格的算法工程師?

大家好,今天是周末,我們不聊技術(shù)。
今天這篇文章同樣來(lái)自于大家的提問(wèn)。之前有一個(gè)小伙伴在留言當(dāng)中問(wèn)我,說(shuō)自己想要從事算法工程師的工作,但是不知道應(yīng)該從哪里入手,請(qǐng)問(wèn)我應(yīng)該怎么辦。
這其實(shí)是一個(gè)老生常談的話題,也是一個(gè)很大的概念。我很難用三言兩語(yǔ)告訴你究竟應(yīng)該如何做,但我可以告訴你一個(gè)合格的算法工程師應(yīng)該至少需要具備什么樣的能力,也許可以幫助你們找到前進(jìn)的方向。
基礎(chǔ)
算法、數(shù)據(jù)結(jié)構(gòu)
這倆是基礎(chǔ)中的基礎(chǔ),作為一個(gè)合格的算法工程師,你可以寫(xiě)不出來(lái)紅黑樹(shù),也可以不懂網(wǎng)絡(luò)流,但是最基礎(chǔ)的排序、遞歸、動(dòng)態(tài)規(guī)劃、樹(shù)、堆棧、隊(duì)列等算法和數(shù)據(jù)結(jié)構(gòu)是一定要會(huì)的,并且還需要有一定的造詣。
很多不明就里的人,會(huì)秉持著它們不重要的觀點(diǎn),并且以此宣揚(yáng)不休。但是就我個(gè)人的經(jīng)驗(yàn)以及觀察而言,我發(fā)現(xiàn)無(wú)論大小互聯(lián)網(wǎng)公司,一個(gè)算法工程師的表現(xiàn),和他的算法、數(shù)據(jù)結(jié)構(gòu)的水平是呈正相關(guān)的。而且這兩塊也是面試考察的重點(diǎn),想要去比較好的公司鍛煉學(xué)習(xí),算法和數(shù)據(jù)結(jié)構(gòu)作為基本功是一定要會(huì)的。另外,這兩塊的能力對(duì)于我們持續(xù)學(xué)習(xí)以及研究互聯(lián)網(wǎng)行業(yè)的其他技術(shù)非常有幫助,像是分布式系統(tǒng)、機(jī)器學(xué)習(xí)當(dāng)中的很多內(nèi)容都和數(shù)據(jù)結(jié)構(gòu)以及算法相關(guān)。你會(huì)發(fā)現(xiàn)算法大牛學(xué)習(xí)其他技術(shù)的速度和質(zhì)量都非??膳拢@并不是沒(méi)有道理的。
對(duì)于普通的從業(yè)者而言,這兩塊的要求不是非常高,可以刷一下LeetCode前300題,基本上包含了所有常用的算法。也可以閱讀一下本公眾號(hào)的算法、數(shù)據(jù)結(jié)構(gòu)專題,基本上也覆蓋了所有基礎(chǔ)的內(nèi)容。
機(jī)器學(xué)習(xí)
既然是算法工程師,機(jī)器學(xué)習(xí)的相關(guān)知識(shí)也自然是不可或缺的。
建議可以從Andrew NG的機(jī)器學(xué)習(xí)課程開(kāi)始,他講解得非常清楚,基本上該涵蓋的知識(shí)點(diǎn)都涵蓋了。如果是初學(xué)的話,會(huì)覺(jué)得吃力是非常正常的,這個(gè)時(shí)候可以找一本紙質(zhì)書(shū)印證著一起看。聽(tīng)完Andrew的講課內(nèi)容之后,再去對(duì)比書(shū)上的描述,以及其他大牛的博客或者是相關(guān)內(nèi)容。這樣對(duì)比著學(xué)習(xí)的質(zhì)量和效率都是最高的。
對(duì)于機(jī)器學(xué)習(xí)的常用模型來(lái)說(shuō),使用Python實(shí)現(xiàn)的難度都不是很大,在理解了模型的相關(guān)原理之后,最好能親自使用Python實(shí)現(xiàn)一下模型,體會(huì)一下其中的細(xì)節(jié)。另外,各種模型并不是機(jī)器學(xué)習(xí)的全部,其他的很多內(nèi)容一樣非常重要。比如過(guò)擬合的原因,比如正則項(xiàng),比如損失函數(shù)的推導(dǎo)過(guò)程,以及AUC等指標(biāo)的計(jì)算方法等等。
說(shuō)起來(lái)機(jī)器學(xué)習(xí)領(lǐng)域中的模型并不少,但是常用的,面試當(dāng)中經(jīng)常問(wèn)到的并不多。說(shuō)來(lái)說(shuō)去,也就LR,邏輯回歸,貝葉斯,決策樹(shù),隨機(jī)森林,GBDT,XGboost、KNN、Kmeans等十余個(gè)。我們學(xué)習(xí)的時(shí)候可以只聚焦其中一些模型,把它們完全吃透,而不是貪多嚼不爛,每個(gè)都知道一點(diǎn),但每個(gè)都不精通。
深度學(xué)習(xí)
深度學(xué)習(xí)需要區(qū)分領(lǐng)域,如果是推薦、廣告、搜索等CTR預(yù)估等領(lǐng)域來(lái)說(shuō),要求相對(duì)要低一些,在面試的時(shí)候也不會(huì)太過(guò)深入。這也是因?yàn)檫@些領(lǐng)域的模型和做法比較固定,相比于模型對(duì)于特征、數(shù)據(jù)以及系統(tǒng)的要求更高。
另外一個(gè)原因是深度學(xué)習(xí)相關(guān)的內(nèi)容在面試的時(shí)候也不太好考察,舉個(gè)例子來(lái)說(shuō),如果候選人之前沒(méi)有做過(guò)相關(guān)業(yè)內(nèi)的工作。他可能根本不知道推薦領(lǐng)域內(nèi)使用哪些模型和哪些做法,我們?nèi)?wèn)他DIN或者是FM,也就無(wú)從問(wèn)起了。而且深度學(xué)習(xí)目前的框架也分成兩派,如果他剛好沒(méi)有深入用過(guò)同樣的框架,所謂框架的細(xì)節(jié)也沒(méi)辦法多問(wèn)。并且這塊也不是重點(diǎn),框架不會(huì)學(xué)起來(lái)也很快,基礎(chǔ)扎實(shí)幾天就可以有模有樣。
所以作為初學(xué)者,如果決心做推薦、廣告等領(lǐng)域的算法工程師的話,甚至可以連卷積神經(jīng)網(wǎng)絡(luò)都不用了解(我甚至沒(méi)在工作中見(jiàn)過(guò)卷積)。把時(shí)間省下來(lái)去讀一些業(yè)內(nèi)的paper,以及做一些比賽練練手,得到的效果會(huì)更好。
數(shù)據(jù)處理
很多人在介紹算法工程師入門(mén)的時(shí)候不會(huì)提到這塊,但其實(shí)這塊非常重要,也一樣是算法工程師的基礎(chǔ)技能。
數(shù)據(jù)處理主要包含兩塊,一塊是模型訓(xùn)練之前的數(shù)據(jù)處理流程。比如特征加工、采樣、異常值過(guò)濾、特征分布的分析等等,這些可以通過(guò)學(xué)習(xí)numpy、pandas來(lái)搞定??梢钥匆豢磌aggle大牛的一些kernel或者是文章了解學(xué)習(xí)一下,這塊比較簡(jiǎn)單,一般來(lái)說(shuō)做過(guò)kaggle的多少都會(huì)一些。
第二塊是基于hadoop集群的大數(shù)據(jù)處理平臺(tái),比如MapReduce、spark、flink、hive等平臺(tái)和工具的使用。這些內(nèi)容除了業(yè)內(nèi)人士一般也很少了解,就更不用說(shuō)有這個(gè)意識(shí)去學(xué)習(xí)了,但是又是實(shí)際工作當(dāng)中實(shí)實(shí)在在會(huì)用到的東西。現(xiàn)在純MapReduce的做法有些過(guò)時(shí)了,一般業(yè)內(nèi)常用得比較多的是spark、hive和flink。這些技能我們也沒(méi)有必要什么都學(xué),能夠?qū)ζ渲幸粋€(gè)有所了解和掌握就可以了。因?yàn)椴煌镜淖龇ㄒ话愣疾惶粯樱肼毜臅r(shí)候都是要重新學(xué)過(guò)的,面試的時(shí)候一般也不會(huì)要求剛好完全對(duì)口。
開(kāi)發(fā)能力
這一點(diǎn)提的不多,但是也很重要。畢竟算法工程師也是工程師,也是需要寫(xiě)代碼的。在日常工作當(dāng)中,算法工程師的開(kāi)發(fā)領(lǐng)域主要有三塊,分別是模型、腳本以及系統(tǒng)。
模型這個(gè)好理解,比如復(fù)現(xiàn)paper當(dāng)中的做法,或者是復(fù)現(xiàn)某一個(gè)經(jīng)典模型之類的。但是我們實(shí)現(xiàn)模型,也并不是就僅僅實(shí)現(xiàn)模型本身,往往也需要實(shí)現(xiàn)很多額外的內(nèi)容。比如拆分訓(xùn)練以及驗(yàn)證數(shù)據(jù),比如記錄模型訓(xùn)練的日志,再比如讀取數(shù)據(jù),轉(zhuǎn)化格式等等。
腳本主要指的是特征以及數(shù)據(jù)處理的腳本,這個(gè)依賴于公司使用的數(shù)據(jù)處理平臺(tái)。比如spark需要寫(xiě)scala,比如hive需要寫(xiě)SQL等等。這些腳本往往都會(huì)涉及到非常復(fù)雜的特征生成,以及數(shù)據(jù)關(guān)聯(lián)的邏輯,非常麻煩,稍不小心就會(huì)搞錯(cuò)。
最后是系統(tǒng),算法工程師同樣也需要參與一些系統(tǒng)的開(kāi)發(fā)。比如說(shuō),像是線上的排序系統(tǒng),線上調(diào)用模型的打分系統(tǒng)等等。這些系統(tǒng)的細(xì)節(jié)往往和模型以及算法掛鉤,普通的開(kāi)發(fā)往往不了解這些細(xì)節(jié),所以還是需要算法工程師參與開(kāi)發(fā),那么最基本的開(kāi)發(fā)能力也就必不可少了。
框架
框架指的是深度學(xué)習(xí)模型的框架,市面上現(xiàn)在已有的框架其實(shí)不少,除了常用的TensorFlow、Pytorch之外,還有像是Keras、MXNet、Caffe等等。一般來(lái)說(shuō)在TensorFlow和Pytorch當(dāng)中任選一個(gè)進(jìn)行深入學(xué)習(xí)即可,掌握了一個(gè)之后再去學(xué)另外一個(gè)會(huì)容易得多。
我前面也說(shuō)過(guò)了,框架并不是技術(shù)的核心重點(diǎn),使用什么框架并不重要。就我個(gè)人而言的話,如果你從來(lái)沒(méi)有學(xué)過(guò)任何框架的話,我更加建議你去學(xué)Pytorch。因?yàn)镻ytorch的學(xué)習(xí)曲線更加平緩,并且它對(duì)于面向?qū)ο蟮闹С指佑押?,語(yǔ)法也更加簡(jiǎn)潔。你會(huì)發(fā)現(xiàn)學(xué)習(xí)Pytorch的體驗(yàn)要比TensorFlow好非常多,學(xué)起來(lái)也會(huì)更快。
對(duì)于面試的問(wèn)題也不用過(guò)多擔(dān)心,因?yàn)橐话銇?lái)說(shuō)崗位對(duì)候選人的要求寫(xiě)的都是TensorFlow、Pytorch、Keras等常用框架熟悉其中的一個(gè)即可。如果問(wèn)到TensorFlow相關(guān)的問(wèn)題,你大可以直接告訴面試官,我用Pytorch比較多,TensorFlow我不熟。
實(shí)戰(zhàn)
我們學(xué)習(xí)了一堆理論知識(shí)之后,肯定還是需要實(shí)際使用一下,才能檢驗(yàn)我們學(xué)習(xí)的效果,并且也才可以理解更加到位。機(jī)器學(xué)習(xí)相關(guān)應(yīng)用的實(shí)戰(zhàn)渠道有很多,比如著名的kaggle以及阿里舉辦的天池大數(shù)據(jù)等等。除了這兩家之外,其實(shí)很多公司也都在舉辦各自的算法競(jìng)賽,對(duì)于小白來(lái)說(shuō),這些都是非常珍貴的練手的機(jī)會(huì)。
kaggle當(dāng)中的比賽非常多,并不是每一個(gè)都有意義,我們可以找到和我們應(yīng)聘的方向比較緊密的。比如你要面搜索、廣告,那你就去做做CTR預(yù)估,如果你做NLP,也可以去找找文本處理的問(wèn)題。kaggle當(dāng)中的比賽實(shí)在是太全了,只有你想不到,幾乎沒(méi)有找不到。相比之下天池大數(shù)據(jù)的題目要少一些,但是它可以使用阿里巴巴真實(shí)的平臺(tái)以及脫敏之后的數(shù)據(jù),這些相比kaggle我個(gè)人感覺(jué)更加逼真。我們親自做一下,基本上就了解了阿里這樣的大公司做模型的整個(gè)流程,還能體驗(yàn)一下阿里云的強(qiáng)大計(jì)算能力。
最后說(shuō)一點(diǎn),當(dāng)我們做某一個(gè)比賽或者是題目的時(shí)候,我們的目標(biāo)并不僅僅是做出一個(gè)比較好的成績(jī)。而是要盡量去思考問(wèn)題的場(chǎng)景,以及模型在這樣場(chǎng)景當(dāng)中的作用和原理。也就是說(shuō)我們不能干做,我們做了還得要思考,思考過(guò)后還需要總結(jié)。只有這樣,我們才能獲得真正的成長(zhǎng)。
怎么樣,看到這些要求是不是覺(jué)得算法崗位的門(mén)檻還是挺高的,要學(xué)的東西也不少?實(shí)際上也的確如此,算法工程師是一個(gè)很特殊的崗位,模型、數(shù)據(jù)、算法、系統(tǒng),各個(gè)方面都需要有所涉獵。不過(guò),我們也并不需要各個(gè)領(lǐng)域都面面俱到,抓大放小,從這幾個(gè)核心領(lǐng)域入手才可以做到事半功倍。
今天的內(nèi)容就到這里,衷心祝愿大家每天都有所收獲。如果還喜歡今天的內(nèi)容的話,請(qǐng)來(lái)一個(gè)三連支持吧~(點(diǎn)贊、在看、轉(zhuǎn)發(fā))
-END-
文末推薦一本算法相關(guān)的書(shū)Tensorflow深度學(xué)習(xí)實(shí)戰(zhàn)大全(本書(shū)以TensorFlow為核心,分為3篇,共計(jì)15章節(jié)。第1篇主要介紹什么是深度學(xué)習(xí)、深度學(xué)習(xí)的本質(zhì)是什么、深度學(xué)習(xí)所使用的教材和方法,以及深度學(xué)習(xí)在圖像識(shí)別(MNIST)領(lǐng)域的應(yīng)用。第2篇是主要介紹在圖像識(shí)別領(lǐng)域深度學(xué)習(xí)技術(shù)的發(fā)展與演變。第3篇是介紹了生成對(duì)抗神經(jīng)網(wǎng)絡(luò)(GAN)現(xiàn)在京東和當(dāng)當(dāng)網(wǎng)購(gòu)買本書(shū)均有優(yōu)惠,點(diǎn)擊下方圖片可以直達(dá)購(gòu)買頁(yè)面查看詳情!

