成爲一名推薦系統工程師永遠都不晚

作者簡介: 

陳開江,希爲科技CTO,曾任新浪微博資深算法工程師,考拉FM算法主管,個性化導購App《Wave》和《邊逛邊聊》聯合創始人,多年推薦系統從業經歷,在算法、架構、產品方面均有豐富的實踐經驗。 
責編:何永燦([email protected]) 


本文爲《程序員》原創文章,未經允許不得轉載,更多精彩文章請訂閱《程序員》
推薦系統工程師技能樹

 

掌握核心原理的技能

數學:微積分,統計學,線性代數
周邊學科:信息論基礎
推薦算法: CF,LR,SVM,FM,FTRL,GBDT,RF,SVD,RBM,RNN,LSTM,RL
數據挖掘:分類,聚類,迴歸,降維,特徵選擇,模型評價
實現系統檢驗想法的技能

操作系統: Linux
編程語言: Python/R, Java/C++/C,sql,shell
RPC框架: thrift, Dubbo,gRPC
web服務: tornado, django, flask
數據存儲: redis, hbase, cassandra, mongodb, mysql, hdfs,hive, kafka, elasticsearch
機器學習/深度學習: Spark MLib,GraphLab/GraphCHI,Angel,MXNet,TensorFlow,Caffe, Xgboost,VW,libxxx
文本處理: Word2vec,Fasttext,Gensim,NLTK
矩陣分解: Spark ALS,GraphCHI,implicit,qmf,libfm
相似計算: kgraph, annoy,nmslib, GraphCHI, columnSimilarities(spark.RowMatrix)
實時計算: Spark Streaming, Storm,Samza
爲效果負責的技能

熟悉常見離線效果指標:準確率,召回率,AUC,基尼係數
能夠定義產品效果指標:點擊率,留存率,轉換率,觀看完整率
會做對比試驗並分析實驗結果:指標數據可視化
知道常見推薦產品的區別: Feed流推薦,相關推薦,TopN推薦,個性化推送
其他軟技能

英文閱讀;讀頂級會議的論文、一流公司和行業前輩的經典論文和技術博客,在Quora和Stack Overflow上和人交流探討;
代碼閱讀;能閱讀開源代碼,從中學習優秀項目對經典算法的實現;
溝通表達;能夠和其他崗位的人員溝通交流,講明白所負責模塊的原理和方法,能聽懂非技術人員的要求和思維,能分別真需求和僞需求並且能達成一致。
推薦系統工程師成長路線圖

《Item-based collaborative filtering recommendation algorithms》這篇文章發表於2001年,在Google學術上顯示,其被引用次數已經是6599了,可見其給推薦系統帶來的影響之大。

經過20多年的發展,item-based已經成爲推薦系統的標配,而推薦系統已經成爲互聯網產品的標配。很多產品甚至在第一版就要被投資人或者創始人要求必須“個性化”,可見,推薦系統已經飛入尋常百姓家,作爲推薦系統工程師的成長也要比從前更容易,要知道我剛工作時,即使跟同爲研發工程師的其他人如PHP工程師(絕無黑的意思,是真的)說“我是做推薦的”,他們也一臉茫然,不知道“推薦”爲什麼是一個工程師崗位。

如今縱然“大數據”, “AI”,這些詞每天360度無死角轟炸我們,讓我們很容易浮躁異常焦慮不堪,但不得不承認,這是作爲推薦系統工程師的一個好時代。

 

圖1 推薦系統工程師技能樹


推薦系統工程師和正常碼農們相比,無需把PM們扔過來的需求給像素級實現,從而堆碼成山;和機器學習研究員相比,又無需沉迷數學推導,憋出一個漂亮自洽的模型,一統學術界的爭論;和數據分析師相比,也不需繪製漂亮的圖表,做出酷炫的PPT能給CEO彙報,走上人生巔峯。

 

那推薦系統工程師的定位是什麼呢?爲什麼需要前面提到的那些技能呢?容我結合自身經歷來一一解答。我把推薦系統工程師的技能分爲四個維度:

掌握核心原理的技能,是一種知其所以然的基礎技能;
動手能力:實現系統,檢驗想法,都需要紮實的工程能力;
爲效果負責的能力:這是推薦系統工程師和其他工種的最大區別;
軟技能:任何工程師都需要自我成長,需要團隊協作。 
英文閱讀:讀頂級會議的論文、一流公司和行業前輩的經典論文和技術博客,在Quora和Stack Overflow上和人交流探討;
代碼閱讀:能閱讀開源代碼,從中學習優秀項目對經典算法的實現;
溝通表達:能夠和其他崗位的人員溝通交流,講明白所負責模塊的原理和方法,能聽懂非技術人員的要求和思維,能分別真僞需求並且能達成一致。

 


掌握最最基礎的原理

託開源的福氣,現在有很多開箱即用的工具讓我們很容易搭建起一個推薦系統。但是浮沙上面築不起高塔,基礎知識必須要有,否則就會在行業裏面,被一輪輪概念旋風吹得找不着北。所有基礎裏面,最最基礎的當然就是數學了。

能夠看懂一些經典論文對於實現系統非常有幫助:從基本假設到形式化定義,從推導到算法流程,從實驗設計到結果分析。這些要求我們對於微積分有基本的知識,有了基本的微積分知識才能看懂梯度下降等基本的優化方法。

概率和統計知識給我們建立起一個推薦系統工程師最基本的三觀:不要以是非絕對的眼光看待事物,要有用不確定性思維去思考產品中的每一個事件,因爲實現推薦系統,並不是像實現界面上一個按鈕的響應事件那樣明確可檢驗。大數據構建了一個高維的數據空間,從數據到推薦目標基本上都可以用矩陣的角度去形式化,比如常見的推薦算法:協同過濾、矩陣分解。

而機器學習算法,如果用矩陣運算角度去看,會讓我們更加能夠理解“向量化計算”和傳統軟件工程裏面的循環之間的巨大差異。高維向量之間的點積,矩陣之間的運算,如果用向量化方式實現比用循環方式實現,高效不少。建立這樣的思維模式,也需要學好線性代數。

學好基礎的數學知識之外,我們要稍微延伸學習一些信息科學的基礎學科,尤其是信息論。信息論是構建在概率基礎上的,信息論給了很多計算機領域問題一個基本的框架:把問題看做是通信問題。

推薦系統要解決的問題也是一個通信問題:用戶在以很不明確的方式向我們的產品發報,告訴我們他最喜歡/討厭的是什麼,我們在收到了之後要解碼,並且還要給他們回信,如果溝通不順暢,那用戶就會失聯。我的專業是信息與通信工程。

讀研時從事過NLP相關的課題研究,NLP裏面很多問題和方法都用到了信息論知識,這樣讓我深受信息論影響。有了這些基礎知識,再去跟蹤不斷涌現的新算法新模型,就會容易得多。

推薦系統會用到很多傳統數據挖掘和機器學習方法。掌握經典的機器學習算法是一個事半功倍的事情,比如邏輯迴歸,是一個很簡單的分類算法,但它在推薦領域應用之廣,其他算法無出其右。在吳恩達的深度學習課程裏,從邏輯迴歸入手逐漸講到多層神經網絡,講到更復雜的RNN等。應該怎麼掌握這些經典的算法呢?最直接的辦法是:自己從0實現一遍。

推薦系統不只是模型,推薦系統是一整個數據處理流程,所以模型的上游,就是一些數據挖掘的知識也需要掌握,基本的分類聚類知識,降維知識,都要有所掌握。

 

 

鍛鍊紮實的工程能力

前面強調自己實現算法對於掌握算法的必要性,但在實際開發推薦系統的時候,如無必要,一定不要重複造輪子。推薦系統也是一個軟件系統,當然要穩定要高效。開源成熟的輪子當然是首選。實現推薦系統,有一些東西是common sense,有一些是好用的工具,都有必要列出來。

首當其衝的常識就是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模型,結合了淺層的logistic regression模型和深層模型進行CTR預估,取得了比單用淺層模型或者單獨的深層模型更好的效果,Wide&Deep模型也以開源的方式集成在了TensorFlow中,如今很多互聯網公司,都在廣泛使用這一深度學習和淺層模型結合的模型。在2014年,Spotify就嘗試了RNN在序列推薦上,後來RNN又被Yahoo News的推薦系統。傳統推薦算法中有一個經典的算法叫做FM,常用於做CTR預估,算是一種淺層模型,最近也有人嘗試了結合深度學習,提出DeepFM模型用於CTR預估。

AlphaGo、Alpha Master、Alpha Zero一個比一個厲害,其開掛的對弈能力,讓強化學習進入大衆視線。強化學習用於推薦系統是一件很自然的事情,把用戶看做變化的環境,而推薦系統是Agent,在和用戶的不斷交互之間,推薦系統就從一臉懵逼到逐漸“找到北”,迎合了用戶興趣。業界已有應用案例,阿里的研究員仁基就公開分享過淘寶把強化學習應用在搜索推薦上的效果。強化學習還以bandit算法這種相對簡單的形式應用在推薦系統很多地方,解決新用戶和新物品的冷啓動,以及取代ABTest成爲另一種在線實驗的框架。

除了技術上推薦系統有不同側重,產品形式上也有不同的呈現。最初的推薦系統產品總是存活在產品的邊角上,如相關推薦,這種產品形式只能算是“錦上添花”,如果推薦系統不小心開了天窗,也不是性命攸關的問題。如今推薦產品已經演化成互聯網產品的主要承載形式:信息流。從最早的社交網站動態,到圖文信息流,到如今的短視頻。信息流是一種推薦系統產品形式,和相關推薦形式比起來,不再是錦上添花,而是注意力收割利器。

推薦系統產品形式的演進,背景是互聯網從PC到移動的演進,PC上是搜索爲王,移動下是推薦爲王,自然越來越重要。隨着各種可穿戴設備的豐富,越來越多的推薦產品還會涌現出來。產品和技術相互協同發展,未來會有更多有意思的推薦算法和產品形式問世,成爲一名推薦系統工程師永遠都不晚。


--------------------- 
作者:CSDN人工智能 
來源:CSDN 
原文:https://blog.csdn.net/qq_40027052/article/details/78579587 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章