推薦系統工程師成長路線圖
《Item-based collaborative filtering recommendation algorithms》這篇文章發表于2001年,在 Google 學術上顯示,其被引用次數已經是6599了,可見其給推薦系統帶來的影響之大。經過20多年的發展,item-based 已經成為推薦系統的標配,而推薦系統已經成為互聯網產品的標配。很多產品甚至在第一版就要被投資人或者創始人要求必須“個性化”,可見,推薦系統已經飛入尋常百姓家,作為推薦系統工程師的成長也要比從前更容易,要知道我剛工作時,即使跟同為研發工程師的其他人如 PHP 工程師(絕無黑的意思,是真的)說“我是做推薦的”,他們也一臉茫然,不知道“推薦”為什么是一個工程師崗位。如今縱然“大數據”,“AI”,這些詞每天360度無死角轟炸我們,讓我們很容易浮躁異常焦慮不堪,但不得不承認,這是作為推薦系統工程師的一個好時代。
推薦系統工程師和正常碼農們相比,無需把 PM 們扔過來的需求給像素級實現,從而堆碼成山;和機器學習研究員相比,又無需沉迷數學推導,憋出一個漂亮自洽的模型,一統學術界的爭論;和數據分析師相比,也不需繪制漂亮的圖表,做出酷炫的 PPT 能給 CEO 匯報,走上人生巔峰。那推薦系統工程師的定位是什么呢?為什么需要前面提到的那些技能呢?容我結合自身經歷來一一解答。
我把推薦系統工程師的技能分為四個維度:
掌握核心原理的技能,是一種知其所以然的基礎技能;
動手能力:實現系統,檢驗想法,都需要扎實的工程能力;
為效果負責的能力:這是推薦系統工程師和其他工種的最大區別;
軟技能:任何工程師都需要自我成長,需要團隊協作。
英文閱讀:讀頂級會議的論文、一流公司和行業前輩的經典論文和技術博客,在Quora 和 Stack Overflow 上和人交流探討;
代碼閱讀:能閱讀開源代碼,從中學習優秀項目對經典算法的實現;
溝通表達:能夠和其他崗位的人員溝通交流,講明白所負責模塊的原理和方法,能聽懂非技術人員的要求和思維,能分別真偽需求并且能達成一致。
掌握最最基礎的原理
托開源的福氣,現在有很多開箱即用的工具讓我們很容易搭建起一個推薦系統。但是浮沙上面筑不起高塔,基礎知識必須要有,否則就會在行業里面,被一輪輪概念旋風吹得找不著北。所有基礎里面,最最基礎的當然就是數學了。
能夠看懂一些經典論文對于實現系統非常有幫助:從基本假設到形式化定義,從推導到算法流程,從實驗設計到結果分析。這些要求我們對于微積分有基本的知識,有了基本的微積分知識才能看懂梯度下降等基本的優化方法。概率和統計知識給我們建立起一個推薦系統工程師最基本的三觀:不要以是非絕對的眼光看待事物,要有用不確定性思維去思考產品中的每一個事件,因為實現推薦系統,并不是像實現界面上一個按鈕的響應事件那樣明確可檢驗。
大數據構建了一個高維的數據空間,從數據到推薦目標基本上都可以用矩陣的角度去形式化,比如常見的推薦算法:協同過濾、矩陣分解。而機器學習算法,如果用矩陣運算角度去看,會讓我們更加能夠理解“向量化計算”和傳統軟件工程里面的循環之間的巨大差異。高維向量之間的點積,矩陣之間的運算,如果用向量化方式實現比用循環方式實現,高效不少。建立這樣的思維模式,也需要學好線性代數。
學好基礎的數學知識之外,我們要稍微延伸學習一些信息科學的基礎學科,尤其是信息論。信息論是構建在概率基礎上的,信息論給了很多計算機領域問題一個基本的框架:把問題看做是通信問題。推薦系統要解決的問題也是一個通信問題:用戶在以很不明確的方式向我們的產品發報,告訴我們他最喜歡/討厭的是什么,我們在收到了之后要解碼,并且還要給他們回信,如果溝通不順暢,那用戶就會失聯。我的專業是信息與通信工程。讀研時從事過 NLP 相關的課題研究,NLP 里面很多問題和方法都用到了信息論知識,這樣讓我深受信息論影響。有了這些基礎知識,再去跟蹤不斷涌現的新算法新模型,就會容易得多。
推薦系統會用到很多傳統數據挖掘和機器學習方法。掌握經典的機器學習算法是一個事半功倍的事情,比如邏輯回歸,是一個很簡單的分類算法,但它在推薦領域應用之廣,其他算法無出其右。在吳恩達的深度學習課程里,從邏輯回歸入手逐漸講到多層神經網絡,講到更復雜的 RNN 等。應該怎么掌握這些經典的算法呢?最直接的辦法是:自己從0實現一遍。
推薦系統不只是模型,推薦系統是一整個數據處理流程,所以模型的上游,就是一些數據挖掘的知識也需要掌握,基本的分類聚類知識,降維知識,都要有所掌握。
鍛煉扎實的工程能力
前面強調自己實現算法對于掌握算法的必要性,但在實際開發推薦系統的時候,如無必要,一定不要重復造輪子。推薦系統也是一個軟件系統,當然要穩定要高效。開源成熟的輪子當然是首選。實現推薦系統,有一些東西是 commonsense,有一些是好用的工具,都有必要列出來。
首當其沖的常識就是 Linux 操作系統。由于 Windows 在 PC 的市場占率的壟斷地位,導致很多軟件工程師只會在 Windows 下開發,這是一個非常普遍、嚴重、又容易被忽視的短板。
我自己深有體會,一定要熟練地在 Linux 下的用命令行編程,如果你的個人電腦是 Mac,會好很多,因為 macOS 底層是 Unix 操作系統,和 Linux 是近親,用 Mac 的終端基本上類似在 Linux 下的命令行,如果不是則一定要有自己的 Linux 環境供自己平時練習,買一臺常備的云服務器是一個不錯的選擇。這里有兩個關鍵點:
用 Linux 操作系統;
多用命令行而少用 IDE( Eclipse、VS等)。
為什么呢?有以下三點原因:
幾乎所有推薦系統要用到的開源工具都是首先在 Linux 下開發測試完成的,最后再考慮移植到 Windows 平臺上(測試不充分或者根本不移植);
鍵盤比鼠標快,用命令行編程會多用鍵盤,少用鼠標,熟悉之后效率大大提升。而且Linux 下的命令非常豐富,處理的也都是標準文本,掌握之后很多時候根本不用寫程序就能做很多數據處理工作。
幾乎 Linux 是互聯網公司的服務器操作系統標配,不會 Linux 下的開發,就找不著工作,就問你怕不怕?
常常有人問我,實現推薦系統用什么編程語言比較好。標準的官方回答是:用你擅長的語言。但我深知這個回答不會解決提問者的疑問。實際上我的建議是:你需要掌握一門編譯型語言:C++ 或者 Java,然后掌握一門解釋型語言,推薦 Python 或者 R。原因如下:
推薦系統的開源項目中以這幾種語言最常見;
快速的數據分析和處理、模型調試、結果可視化、系統原型實現等,Python 和 R 是不錯的選擇,尤其是 Python;
當Python在一些地方有效率瓶頸時,通常是用C++實現,再用Python調用;
Java在構建后臺服務時很有優勢,一些大數據開源項目也多用Java來實現;
如果時間有限,只想掌握一門語言的話,推薦 Python。從模型到后端服務到 web 端,都可以用 Python,毋庸置疑,Python 是 AI 時代第一編程語言。
推薦系統是一個線上的產品,無論離線時的模型跑得多么爽,可視化多么酷炫,最終一定要做成在線服務才完整。這就涉及到兩方面的工作:1.系統原型;2.算法服務化。這涉及到:
數據存儲。包括存儲模型用于在線實時計算,存儲離線計算好的推薦結果。除了傳統的關系型數據庫 MySQL 之外,還需要掌握非關系型數據庫,如 KV 數據庫 Redis,列式數據庫 Cassandra 和 HBase 常常用來存儲推薦結果或模型參數。推薦的候選 Item 也可能存在 MongoDB 中。
RPC 和 web。需要將自己的算法計算模塊以服務的形式提供給別人跨進程跨服務器調用,因此 RPC 框架就很重要,最流行如 thrift 或者 dubbo。在 RPC 服務之上,再做原型還需要會一點基本的 web 開發知識,Python、PHP、Java 都有相應的 web 框架來迅速的完成最基本的推薦結果展示。
當然,最核心的是算法實現。以機器學習算法為主。下面詳細列舉一下常見的機器學習/深度學習工具:
Spark MLib:大概是使用最廣的機器學習工具了,因為 Spark 普及很廣,帶動了一個并非其最核心功能的 MLib,MLib 實現了常見的線性模型、樹模型和矩陣分解模型等。提供 Scala、Java 和 Python 接口,提供了很多例子,學習 Spark MLib 很值得自己運行它提供的例子,結合文檔和源代碼學習接口的使用,模型的序列化和反序列化。
GraphLab/GraphCHI:GraphCHI 是開源的單機版,GraphLab 是分布式的,但并不開源。所以建議推薦系統工程師重點學習一下 GraphCHI,它有 Java 和 C++兩個版本,實現了常見的推薦算法,并在單機上能跑出很高的結果。有一個不得不承認的事實是:GraphCHI 和 GraphLab 在業界應用得并不廣泛。
Angel:騰訊在2017年開源的分布式機器學習平臺,Java 和 Scala 開發而成,已經在騰訊的10億維度下有工業級別的應用,最終的是填補了專注傳統機器學習(相對于深度學習)分布式計算的空白,值得去學習一下;由于開發團隊是中國人,所以文檔以中文為主,學習的時候多多和開發團隊交流會受益良多,進步神速。
VW:這是 Yahoo 開源的一個分布式機器學工具,也支持單機,分布式需要借助Hadoop 實現。由于主要開發者后來跳槽去了微軟,所以還支持 Windows 平臺。閱讀這個工具的源碼,非常有助于理解邏輯回歸的訓練,微博推薦團隊和廣告團隊第一版模型訓練都采用了 VW,其開發者在 Yahoo Group 中回答問題很積極,使用期間,我在這個group 里面提了大大小小十幾個問題,基本上都得到解答,這是一個學習成長方法,建議新學者常常在郵件組或者討論組里提問題,不要在乎問題是否愚蠢,不要在意別人的取笑。
Xgboost:這個號稱 kaggle 神器的機器學習工具,非常值得學習和使用,尤其是對于理解 Boosting 和樹模型很有幫助。網上有很多教程,主要開發者陳天奇也是中國人,所以遇到問題是非常容易找到交流的人的。
libxxx:這里的xxx是一個通配符,包括以 lib 開頭的各種機器學習工具,如liblinear、libsvm、libfm、libmf。都是單機版的工具,雖然是單機版,但足夠解決很多中小型數據集的推薦問題了,著名的 scikit-learn 中的一些分類算法就是封裝的libsvm 等工具。另外,libsvm 不但是一個機器學習工具,而且它還定義了一種應用廣泛,成為事實標準的機器學習訓練數據格式:libsvm。
MXNet,TensorFlow,Caffe:深度學習大行其道,并且在識別問題上取到了驚人的效果,自然也間接推動了推薦系統的算法升級,因此,掌握深度學習工具的就很必要,其中尤其以 TensorFlow 為主,它不但有深度學習模型的實現,還有傳統機器學習模型的實現,Python 接口,對于掌握 Python 的人來說學習門檻很低。深度學習工具仍然建議去跑幾個例子,玩一些有趣的東西會快速入門,如給照片換風格,或者訓練一個動物/人臉識別器,可以有一些粗淺的認識。再系統地學習一下吳恩達的在線課程,他的課程對TensorFlow 的使用也有講解,課后編程作業設計得也很好。
為最終效果負責的能力
推薦系統最終要為產品效果負責。衡量推薦系統效果,分為離線和在線兩個階段。
離線階段。跑出一些模型,會有定義清晰的指標去衡量模型本身對假設的驗證情況,如準確率、召回率、AUC 等。這個階段的效果好,只能說明符合預期假設,但不能保證符合產品最終效果,因此還要有線上實際的檢驗。
在線階段:除了有一些相對通用的指標,如用戶留存率、使用時長、點擊率等,更多的是和產品本身的定位息息相關,如短視頻推薦關注 vv,新聞推薦關注 CTR 等,這些和商業利益結合更緊密的指標才是最終檢驗推薦系統效果的指標,推薦系統工程師要為這個負責,而不能僅僅盯著離線部分和技術層面的效果。
了解不同產品的展現形式對推薦系統實現的要求,feed 流、相關推薦、猜你喜歡等不同產品背后技術要求不同,效果考核不同,多觀察、多使用、多思考。
最后,要學會用產品語言理解產品本身,將技術能力作為一種服務輸出給團隊其他成員是一項軟技能。
推薦系統領域現狀
協同過濾提出于90年代,至今二十幾年,推薦系統技術上先后采用過近鄰推薦、基于內容的推薦,以矩陣分解為代表的機器學習方法推薦,最近幾年深度學習的火熱自然也給推薦系統帶來了明顯的提升。推薦系統的作用無人質疑,簡單舉幾個例子,80%的 Netflix 電影都是經由推薦系統被觀眾觀看的,YouTube 上60%的點擊事件是由推薦系統貢獻的。
推薦系統領域現狀是怎么樣的呢?這里分別從技術上和產品上來看一看。先看技術上,推薦系統所依賴的技術分為三類:傳統的推薦技術、深度學習、強化學習。
首先,傳統的推薦技術仍然非常有效。構建第一版推薦系統仍然需要這些傳統推薦系統技術,這包括:User-based 和 Item-based 近鄰方法,以文本為主要特征來源的基于內容推薦,以矩陣分解為代表的傳統機器學習算法。當一個互聯網產品的用戶行為數據積累到一定程度,我們用這些傳統推薦算法來構建第一版推薦系統,大概率上會取得不俗的成績,實現0的突破。這類傳統的推薦算法已經積累了足夠多的實踐經驗和開源實現。由于對推薦系統的需求比以往更廣泛,并且這些技術足夠成熟,所以這類技術有 SaaS 化的趨勢,逐漸交給專門的第三方公司來做,中小型、垂直公司不會自建團隊來完成。
深度學習在識別問題上取得了不俗的成績,自然就被推薦系統工程師們盯上了,已經結合到推薦系統中,比如 YouTube 用 DNN 構建了他們的視頻推薦系統,Google 在Google Play 中使用 Wide & Deep 模型,結合了淺層的 logisticregression 模型和深層模型進行 CTR 預估,取得了比單用淺層模型或者單獨的深層模型更好的效果,Wide & Deep 模型也以開源的方式集成在了 TensorFlow 中,如今很多互聯網公司,都在廣泛使用這一深度學習和淺層模型結合的模型。在2014年,Spotify 就嘗試了 RNN 在序列推薦上,后來 RNN 又被 Yahoo News 的推薦系統。傳統推薦算法中有一個經典的算法叫做 FM,常用于做 CTR 預估,算是一種淺層模型,最近也有人嘗試了結合深度學習,提出 DeepFM 模型用于 CTR 預估。
AlphaGo、AlphaMaster、AlphaZero一個比一個厲害,其開掛的對弈能力,讓強化學習進入大眾視線。強化學習用于推薦系統是一件很自然的事情,把用戶看做變化的環境,而推薦系統是 Agent,在和用戶的不斷交互之間,推薦系統就從一臉懵逼到逐漸“找到北”,迎合了用戶興趣。業界已有應用案例,阿里的研究員仁基就公開分享過淘寶把強化學習應用在搜索推薦上的效果。強化學習還以 bandit 算法這種相對簡單的形式應用在推薦系統很多地方,解決新用戶和新物品的冷啟動,以及取代 ABTest 成為另一種在線實驗的框架。
除了技術上推薦系統有不同側重,產品形式上也有不同的呈現。最初的推薦系統產品總是存活在產品的邊角上,如相關推薦,這種產品形式只能算是“錦上添花”,如果推薦系統不小心開了天窗,也不是性命攸關的問題。如今推薦產品已經演化成互聯網產品的主要承載形式:信息流。從最早的社交網站動態,到圖文信息流,到如今的短視頻。信息流是一種推薦系統產品形式,和相關推薦形式比起來,不再是錦上添花,而是注意力收割利器。
推薦系統產品形式的演進,背景是互聯網從 PC 到移動的演進,PC 上是搜索為王,移動下是推薦為王,自然越來越重要。隨著各種可穿戴設備的豐富,越來越多的推薦產品還會涌現出來。產品和技術相互協同發展,未來會有更多有意思的推薦算法和產品形式問世,成為一名推薦系統工程師永遠都不晚。
文 / 陳開江
-
工程師
+關注
關注
59文章
1589瀏覽量
69313 -
深度學習
+關注
關注
73文章
5557瀏覽量
122611
發布評論請先 登錄
全球唯一?IBM更新量子計算路線圖:2029年交付!


如何成為一名合格的KaihongOS南向驅動開發工程師
如何成為一名嵌入式軟件工程師?

硬件系統工程師寶典—完整版
推薦資料!硬件系統工程師寶典,工程師必備寶典
如何成為嵌入式開發工程師?
如何成為一名合格的南向驅動開發工程師
如何成為一名合格的北向應用開發工程師
為什么嵌入式驅動開發工程師可以拿高薪?
未來10年智能傳感器怎么發展?美國發布最新MEMS路線圖


評論