天天看點

從啥也不會的小白,如何才能成為合格的算法工程師?

大家好,今天這篇文章同樣來自于大家的提問。之前有一個小夥伴在留言當中問我,說自己想要從事算法工程師的工作,但是不知道應該從哪裡入手,請問我應該怎麼辦。

這其實是一個老生常談的話題,也是一個很大的概念。我很難用三言兩語告訴你究竟應該如何做,但我可以告訴你一個合格的算法工程師應該至少需要具備什麼樣的能力,也許可以幫助你們找到前進的方向。

基礎

算法、資料結構

這倆是基礎中的基礎,作為一個合格的算法工程師,你可以寫不出來紅黑樹,也可以不懂網絡流,但是最基礎的排序、遞歸、動态規劃、樹、堆棧、隊列等算法和資料結構是一定要會的,并且還需要有一定的造詣。

很多不明就裡的人,會秉持着它們不重要的觀點,并且以此宣揚不休。但是就我個人的經驗以及觀察而言,我發現無論大小網際網路公司,一個算法工程師的表現,和他的算法、資料結構的水準是呈正相關的。而且這兩塊也是面試考察的重點,想要去比較好的公司鍛煉學習,算法和資料結構作為基本功是一定要會的。另外,這兩塊的能力對于我們持續學習以及研究網際網路行業的其他技術非常有幫助,像是分布式系統、機器學習當中的很多内容都和資料結構以及算法相關。你會發現算法大牛學習其他技術的速度和品質都非常可怕,這并不是沒有道理的。

對于普通的從業者而言,這兩塊的要求不是非常高,可以刷一下LeetCode前300題,基本上包含了所有常用的算法。也可以閱讀一下本公衆号的算法、資料結構專題,基本上也覆寫了所有基礎的内容。

機器學習

既然是算法工程師,機器學習的相關知識也自然是不可或缺的。

建議可以從Andrew NG的機器學習課程開始,他講解得非常清楚,基本上該涵蓋的知識點都涵蓋了。如果是初學的話,會覺得吃力是非常正常的,這個時候可以找一本紙質書印證着一起看。聽完Andrew的講課内容之後,再去對比書上的描述,以及其他大牛的部落格或者是相關内容。這樣對比着學習的品質和效率都是最高的。

對于機器學習的常用模型來說,使用Python實作的難度都不是很大,在了解了模型的相關原理之後,最好能親自使用Python實作一下模型,體會一下其中的細節。另外,各種模型并不是機器學習的全部,其他的很多内容一樣非常重要。比如過拟合的原因,比如正則項,比如損失函數的推導過程,以及AUC等名額的計算方法等等。

說起來機器學習領域中的模型并不少,但是常用的,面試當中經常問到的并不多。說來說去,也就LR,邏輯回歸,貝葉斯,決策樹,随機森林,GBDT,XGboost、KNN、Kmeans等十餘個。我們學習的時候可以隻聚焦其中一些模型,把它們完全吃透,而不是貪多嚼不爛,每個都知道一點,但每個都不精通。

深度學習

深度學習需要區分領域,如果是推薦、廣告、搜尋等CTR預估等領域來說,要求相對要低一些,在面試的時候也不會太過深入。這也是因為這些領域的模型和做法比較固定,相比于模型對于特征、資料以及系統的要求更高。

另外一個原因是深度學習相關的内容在面試的時候也不太好考察,舉個例子來說,如果候選人之前沒有做過相關業内的工作。他可能根本不知道推薦領域内使用哪些模型和哪些做法,我們去問他DIN或者是FM,也就無從問起了。而且深度學習目前的架構也分成兩派,如果他剛好沒有深入用過同樣的架構,所謂架構的細節也沒辦法多問。并且這塊也不是重點,架構不會學起來也很快,基礎紮實幾天就可以有模有樣。

是以作為初學者,如果決心做推薦、廣告等領域的算法工程師的話,甚至可以連卷積神經網絡都不用了解(我甚至沒在工作中見過卷積)。把時間省下來去讀一些業内的paper,以及做一些比賽練練手,得到的效果會更好。

資料處理

很多人在介紹算法工程師入門的時候不會提到這塊,但其實這塊非常重要,也一樣是算法工程師的基礎技能。

資料處理主要包含兩塊,一塊是模型訓練之前的資料處理流程。比如特征加工、采樣、異常值過濾、特征分布的分析等等,這些可以通過學習numpy、pandas來搞定。可以看一看kaggle大牛的一些kernel或者是文章了解學習一下,這塊比較簡單,一般來說做過kaggle的多少都會一些。

第二塊是基于hadoop叢集的大資料處理平台,比如MapReduce、spark、flink、hive等平台和工具的使用。這些内容除了業内人士一般也很少了解,就更不用說有這個意識去學習了,但是又是實際工作當中實實在在會用到的東西。現在純MapReduce的做法有些過時了,一般業内常用得比較多的是spark、hive和flink。這些技能我們也沒有必要什麼都學,能夠對其中一個有所了解和掌握就可以了。因為不同公司的做法一般都不太一樣,入職的時候都是要重新學過的,面試的時候一般也不會要求剛好完全對口。

開發能力

這一點提的不多,但是也很重要。畢竟算法工程師也是工程師,也是需要寫代碼的。在日常工作當中,算法工程師的開發領域主要有三塊,分别是模型、腳本以及系統。

模型這個好了解,比如複現paper當中的做法,或者是複現某一個經典模型之類的。但是我們實作模型,也并不是就僅僅實作模型本身,往往也需要實作很多額外的内容。比如拆分訓練以及驗證資料,比如記錄模型訓練的日志,再比如讀取資料,轉化格式等等。

腳本主要指的是特征以及資料處理的腳本,這個依賴于公司使用的資料處理平台。比如spark需要寫scala,比如hive需要些SQL等等。這些腳本往往都會涉及到非常複雜的特征生成,以及資料關聯的邏輯,非常麻煩,稍不小心就會搞錯。

最後是系統,算法工程師同樣也需要參與一些系統的開發。比如說,像是線上的排序系統,線上調用模型的打分系統等等。這些系統的細節往往和模型以及算法挂鈎,普通的開發往往不了解這些細節,是以還是需要算法工程師參與開發,那麼最基本的開發能力也就必不可少了。

架構

架構指的是深度學習模型的架構,市面上現在已有的架構其實不少,除了常用的TensorFlow、Pytorch之外,還有像是Keras、MXNet、Caffe等等。一般來說在TensorFlow和Pytorch當中任選一個進行深入學習即可,掌握了一個之後再去學另外一個會容易得多。

我前面也說過了,架構并不是技術的核心重點,使用什麼架構并不重要。就我個人而言的話,如果你從來沒有學過任何架構的話,我更加建議你去學Pytorch。因為Pytorch的學習曲線更加平緩,并且它對于面向對象的支援更加友好,文法也更加簡潔。你會發現學習Pytorch的體驗要比TensorFlow好非常多,學起來也會更快。

對于面試的問題也不用過多擔心,因為一般來說崗位對候選人的要求寫的都是TensorFlow、Pytorch、Keras等常用架構熟悉其中的一個即可。如果問到TensorFlow相關的問題,你大可以直接告訴面試官,我用Pytorch比較多,TensorFlow我不熟。

實戰

我們學習了一堆理論知識之後,肯定還是需要實際使用一下,才能檢驗我們學習的效果,并且也才可以了解更加到位。機器學習相關應用的實戰管道有很多,比如著名的kaggle以及阿裡舉辦的天池大資料等等。除了這兩家之外,其實很多公司也都在舉辦各自的算法競賽,對于小白來說,這些都是非常珍貴的練手的機會。

kaggle當中的比賽非常多,并不是每一個都有意義,我們可以找到和我們應聘的方向比較緊密的。比如你要面搜尋、廣告,那你就去做做CTR預估,如果你做NLP,也可以去找找文本處理的問題。kaggle當中的比賽實在是太全了,隻有你想不到,幾乎沒有找不到。相比之下天池大資料的題目要少一些,但是它可以使用阿裡巴巴真實的平台以及脫敏之後的資料,這些相比kaggle我個人感覺更加逼真。我們親自做一下,基本上就了解了阿裡這樣的大公司做模型的整個流程,還能體驗一下阿裡雲的強大計算能力。

最後說一點,當我們做某一個比賽或者是題目的時候,我們的目标并不僅僅是做出一個比較好的成績。而是要盡量去思考問題的場景,以及模型在這樣場景當中的作用和原理。也就是說我們不能幹做,我們做了還得要思考,思考過後還需要總結。隻有這樣,我們才能獲得真正的成長。

怎麼樣,看到這些要求是不是覺得算法崗位的門檻還是挺高的,要學的東西也不少?實際上也的确如此,算法工程師是一個很特殊的崗位,模型、資料、算法、系統,各個方面都需要有所涉獵。不過,我們也并不需要各個領域都面面俱到,抓大放小,從這幾個核心領域入手才可以做到事半功倍。

今天的内容就到這裡,衷心祝願大家每天都有所收獲。如果還喜歡今天的内容的話,請來一個三連支援吧~(點贊、關注、轉發)

原文連結,求個關注

{{uploading-image-344312.png(uploading...)}}

繼續閱讀