從菜鳥到老鳥!學習算法的三個階段
點擊上方藍字,關注并星標,和我一起學技術。
大家好,最近在知乎里看到了一個很不錯的問題,叫做你的編程能力從什么時候開始突飛猛進的?正好最近很多同學咨詢我關于算法方向的成長以及突破的問題,今天就和大家聊聊這個話題。
熟悉我的朋友們都知道,我沒有讀研,也沒有相關的工作經(jīng)驗,算是半路出家轉行從業(yè)。既然是轉行從業(yè),那么自然而然也有一個從零開始的過程。相比于很多科班出身(碩士)的從業(yè)者而言,由于沒有人引領,幾乎所有的成長和進步都是源于自己的思考。從業(yè)好幾年,不敢說有多么厲害,但對于新手入門進階突破的確有一些心得。盤算起來也算是邁過了幾道關卡,容我來一一盤點盤點。
知其然
首先是知其然,也就是知道怎么做,準確地說是知道模型究竟在系統(tǒng)當中扮演一個怎樣的角色,它又是如何與其他系統(tǒng)交互的。
這說的其實是理論和實踐的巨大gap,舉個最簡單的例子,比如說我們在學習算法的時候,無論是選擇kaggle還是天池或者是騰訊算法比賽來實踐,它的數(shù)據(jù)都是現(xiàn)成的已經(jīng)處理好的,我們直接拿過來用。并且我們用的過程當中也沒有任何的限制,不需要考慮消耗的資源,也不需要考慮數(shù)據(jù)獲取的方式,因為數(shù)據(jù)量不會很大,完全可以存在內存里,用pandas等工具庫想怎么玩就怎么玩。正統(tǒng)出身的研究生在實驗室里其實也差不太多,可能有些研究需要自己搜集數(shù)據(jù)、清理數(shù)據(jù),但本質上還是只圍繞著模型來玩。
但是在公司當中完全不是這樣的,就拿數(shù)據(jù)來說好了,數(shù)據(jù)并不是你想要就可以有的。比如說你要搜集用戶登錄APP的信息,你需要前端、后端一系列團隊給你配合,這些數(shù)據(jù)也不是放在一個文件里給你用的。必然要用到數(shù)倉,比如hadoop,既然用到了數(shù)倉,那么你就不能簡單的用一個Python來讀取或者是做處理,你顯然需要使用數(shù)倉支持的工具,比如MapReduce、Hive、Spark等等。
另外公司里做模型不是為了拿個效果就結束了,還需要上線應用。這一上線又帶來了許多問題,線上的服務怎么拿到這些特征呢?是全部存起來現(xiàn)用現(xiàn)查呢,還是臨時生成?如果是臨時運算,后端的服務往往都是Java等后端語言寫的,無論是考慮語言本身的特性還是考慮性能,往往都不能用Python的庫來直接處理,這個時候怎么辦?
我們仔細往下挖還能挖出一大堆的問題,為什么說工業(yè)界和學術界脫節(jié)呢,原因就在這。工業(yè)應用有一系列的限制,非常的麻煩。如果以為只是理解了模型的原理,能夠讀懂論文、復現(xiàn)幾個模型就可以做好算法,這無異于紙上談兵。
但問題是現(xiàn)在大公司里分工非常細,很多算法工程師的日常工作可能就是做數(shù)據(jù),訓練模型,然后點一下發(fā)布。這背后有哪些機制,每一個步驟究竟是什么作用,線上線下這一系列背后的系統(tǒng)結構很多人是沒有想過的。就盯著眼前的一畝三分地,盯著眼前的特征、數(shù)據(jù)、模型,看不到背后更深層次的系統(tǒng)。
所以這一層次的突破主要還是在于意識,不要滿足于當前的日常工作,往更深處思考。
穩(wěn)住心態(tài)、深挖細節(jié)
一般來說,只要有意識,突破第一個層次其實很快,體現(xiàn)在從小白變成了資深,對于系統(tǒng)的方方面面都有所了解,能夠獨當一面把老板安排的事情做好做出色。
但很多人會在這個時候陷入瓶頸,當下的工作已經(jīng)可以很好勝任了,也有了一定的積累,但是更高層次的挑戰(zhàn)還沒有來。之后的路有一點不知道往哪里走了,很多人到這時候就想著要么慢慢熬著謀求晉升,要么跳槽獲取更好的待遇了。這個階段最大的問題就是心態(tài)膨脹、根基不穩(wěn),實力配不上野心。看似懂得很多,但是都只有一層皮毛,往下一問一知半解。
比如有些人在后端里寫過一些功能插件就覺得自己懂系統(tǒng)了,算法、開發(fā)雙修,但一問分布式、系統(tǒng)設計一竅不通。有些人用過一些前沿的模型,看過兩篇論文就覺得自己站在行業(yè)尖端了,但是一問完全沒有自己的思考,全是照搬來的。還有些人在大公司呆過兩年,就以為自己可以指點江山了,但一問細節(jié),全是糊涂賬……
把工作當中手上的事情吃透,眼前的這個山頭占領下來之后,不要膨脹,這只是剛剛開始。這個時候應該穩(wěn)住心態(tài),好好盤點一下自己會的東西,看看哪些是實心的,哪些是空中樓閣。空中樓閣不要緊,踏踏實實好好鉆研,一點一點啃明白,其實也并不是一件很難的事情。我個人的一個建議是可以從細節(jié)入手,千萬不能浮躁,魔鬼都藏在細節(jié)里。
比如好好讀一讀你用過好幾十次的模型的代碼,看看里面的實現(xiàn)和你想的是不是一樣。再比如好好想一想你做過的一些數(shù)據(jù)的邏輯,還能不能再優(yōu)化優(yōu)化。再比如團隊里、公司的那些技術文檔,也可以翻開來看一看。在這個階段最重要的就是穩(wěn)住心態(tài),盡可能地找到方式來提升自己。
知其所以然
很多老算法經(jīng)常會掛在嘴上的一句話就是理解業(yè)務、理解業(yè)務、還是TMD理解業(yè)務。我之前每次聽到的時候都很奇怪,業(yè)務有什么好理解的,不就是推薦商品給用戶么?
直到后來,經(jīng)歷了一些事情之后才恍然大悟,理解業(yè)務其實不只是單純理解業(yè)務場景,更是琢磨模型在場景下起作用的原因。
我是做推薦的,所以拿推薦舉個例子。我在之前關于推薦系統(tǒng)的文章當中也曾經(jīng)提到過,推薦領域的模型從FM起有一個很大的趨勢就是從傳統(tǒng)意義上的機器學習模型往深度學習模型發(fā)展,而這個發(fā)展最重要的核心就是Embedding。深度學習模型當中Embedding應用得越來越多,各種各樣的Embedding應用方式,可以獲得不同的效果。
那為什么Embedding的效果就要比傳統(tǒng)模型要好呢?因為它可以用高維的向量表示一個標量,可以傳遞出更復雜的信息。比如性別,不再是一個0和1的量,更能反應一定的人群偏好。比如女性往往喜歡美妝,男性往往喜歡體育、游戲。正是因為向量可以傳遞更多的更高維的信息,而深度學習模型可以學到這些信息,所以在推薦領域,深度學習模型效果好。
上面這兩段話全是我個人的理解,我迄今沒有在任何一篇paper當中看到。倒不是說大牛們都想不到這一層,而是他們想到了也未必會告訴你,往往需要你自己體悟。我是如何get到這些信息的呢?首先需要深度了解原理,知道每一個模型的原理,知道模型迭代的方向。其次結合業(yè)務場景,比如推薦用到的多是用戶和商品的特征,比如對特征的分析,什么樣的特征效果比較好,什么樣的特征沒什么卵用。最后這些理解和思考碰撞在一起,才有了更深層次的結論。
如果只是單純的看論文,單純的做特征,不去做更深入的思考,去挖掘更底層的原理,顯然是不可能有這些洞見的。這一層的突破在于思考,思考原理,思考背后的機制、邏輯,思考行業(yè)發(fā)展的潛在規(guī)律。
尾聲
其實不僅是算法,其他行業(yè)、方向也都類似,成長途中也都有一個看山是山,看山不是山,看山還是山的過程。入門之前覺得算法好高大上,好有科技感。入門之后覺得不過如此,算法太虛了,是人是鬼都能來一下。有了一定的成長之后,又回到了從前,再一次覺得道阻且長,我輩仍需努力。
好了,就說這么多吧,感謝閱讀,喜歡的話不要忘了三連。
