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

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

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

基礎

演算法、數據結構

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

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

對於普通的從業者而言,這兩塊的要求不是非常高,可以刷一下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…)}}