1. 程式人生 > >乾貨 | 成為一名推薦系統工程師永遠都不晚

乾貨 | 成為一名推薦系統工程師永遠都不晚

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

作者 | 陳開江

責編 | 何永燦

推薦系統工程師技能樹

掌握核心原理的技能

  • 數學:微積分,統計學,線性代數 

  • 周邊學科:資訊理論基礎 

  • 推薦演算法: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上和人交流探討; 

  • 程式碼閱讀;能閱讀開原始碼,從中學習優秀專案對經典演算法的實現; 

  • 溝通表達;能夠和其他崗位的人員溝通交流,講明白所負責模組的原理和方法,能聽懂非技術人員的要求和思維,能分別真需求和偽需求並且能達成一致。

640?wx_fmt=png

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

推薦系統工程師成長路線圖

《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實現一遍。

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

鍛鍊紮實的工程能力

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

首當其衝的常識就是Linux作業系統。由於Windows在PC的市場佔率的壟斷地位,導致很多軟體工程師只會在Windows下開發,這是一個非常普遍、嚴重、又容易被忽視的短板。我自己深有體會,一定要熟練地在Linux下的用命令列程式設計,如果你的個人電腦是Mac,會好很多,因為macOS底層是Unix作業系統,和Linux是近親,用Mac的終端基本上類似在Linux下的命令列,如果不是則一定要有自己的Linux環境供自己平時練習,買一臺常備的雲伺服器是一個不錯的選擇。這裡有兩個關鍵點:

  1. 用Linux作業系統;

  2. 多用命令列而少用IDE(Eclipse、VS等)。

為什麼呢?有以下三點原因:

  1. 幾乎所有推薦系統要用到的開源工具都是首先在Linux下開發測試完成的,最後再考慮移植到Windows平臺上(測試不充分或者根本不移植);

  2. 鍵盤比滑鼠快,用命令列程式設計會多用鍵盤,少用滑鼠,熟悉之後效率大大提升。而且Linux下的命令非常豐富,處理的也都是標準文字,掌握之後很多時候根本不用寫程式就能做很多資料處理工作。

  3. 幾乎Linux是網際網路公司的伺服器作業系統標配,不會Linux下的開發,就找不著工作,就問你怕不怕?

常常有人問我,實現推薦系統用什麼程式語言比較好。標準的官方回答是:用你擅長的語言。但我深知這個回答不會解決提問者的疑問。實際上我的建議是:你需要掌握一門編譯型語言:C++或者Java,然後掌握一門解釋型語言,推薦Python或者R。原因如下:

  1. 推薦系統的開源專案中以這幾種語言最常見;

  2. 快速的資料分析和處理、模型除錯、結果視覺化、系統原型實現等,Python和R是不錯的選擇,尤其是Python;

  3. 當Python在一些地方有效率瓶頸時,通常是用C++實現,再用Python呼叫;

  4. Java在構建後臺服務時很有優勢,一些大資料開源專案也多用Java來實現;

如果時間有限,只想掌握一門語言的話,推薦Python。從模型到後端服務到web端,都可以用Python,毋庸置疑,Python是AI時代第一程式語言。

推薦系統是一個線上的產品,無論離線時的模型跑得多麼爽,視覺化多麼酷炫,最終一定要做成線上服務才完整。這就涉及到兩方面的工作:1. 系統原型; 2. 演算法服務化 。這涉及到:

  1. 資料儲存。包括儲存模型用於線上實時計算,儲存離線計算好的推薦結果。除了傳統的關係型資料庫MySQL之外,還需要掌握非關係型資料庫,如KV資料庫Redis,列式資料庫Cassandra和HBase常常用來儲存推薦結果或模型引數。推薦的候選Item也可能存在MongoDB中。

  2. RPC和web。需要將自己的演算法計算模組以服務的形式提供給別人跨程序跨伺服器呼叫,因此RPC框架就很重要,最流行如thrift或者dubbo。在RPC服務之上,再做原型還需要會一點基本的web開發知識,Python、PHP、Java都有相應的web框架來迅速的完成最基本的推薦結果展示。

當然,最核心的是演算法實現。以機器學習演算法為主。下面詳細列舉一下常見的機器學習/深度學習工具:

  1. Spark MLib:大概是使用最廣的機器學習工具了,因為Spark普及很廣,帶動了一個並非其最核心功能的MLib,MLib實現了常見的線性模型、樹模型和矩陣分解模型等。提供Scala、Java和Python介面,提供了很多例子,學習Spark MLib很值得自己執行它提供的例子,結合文件和原始碼學習介面的使用,模型的序列化和反序列化。

  2. GraphLab/GraphCHI:GraphCHI是開源的單機版,GraphLab是分散式的,但並不開源。所以建議推薦系統工程師重點學習一下GraphCHI,它有Java和C++兩個版本,實現了常見的推薦演算法,並在單機上能跑出很高的結果。有一個不得不承認的事實是:GraphCHI和GraphLab在業界應用得並不廣泛。

  3. Angel:騰訊在2017年開源的分散式機器學習平臺,Java和Scala開發而成,已經在騰訊的10億維度下有工業級別的應用,最終的是填補了專注傳統機器學習(相對於深度學習)分散式計算的空白,值得去學習一下;由於開發團隊是中國人,所以文件以中文為主,學習的時候多多和開發團隊交流會受益良多,進步神速。

  4. VW:這是Yahoo開源的一個分散式機器學工具,也支援單機,分散式需要藉助Hadoop實現。由於主要開發者後來跳槽去了微軟,所以還支援Windows平臺。閱讀這個工具的原始碼,非常有助於理解邏輯迴歸的訓練,微博推薦團隊和廣告團隊第一版模型訓練都採用了VW,其開發者在Yahoo Group中回答問題很積極,使用期間,我在這個group裡面提了大大小小十幾個問題,基本上都得到解答,這是一個學習成長方法,建議新學者常常在郵件組或者討論組裡提問題,不要在乎問題是否愚蠢,不要在意別人的取笑。

  5. Xgboost:這個號稱kaggle神器的機器學習工具,非常值得學習和使用,尤其是對於理解Boosting和樹模型很有幫助。網上有很多教程,主要開發者陳天奇也是中國人,所以遇到問題是非常容易找到交流的人的。

  6. libxxx:這裡的xxx是一個萬用字元,包括以lib開頭的各種機器學習工具,如liblinear、libsvm、libfm、libmf。都是單機版的工具,雖然是單機版,但足夠解決很多中小型資料集的推薦問題了,著名的scikit-learn中的一些分類演算法就是封裝的libsvm等工具。另外,libsvm不但是一個機器學習工具,而且它還定義了一種應用廣泛,成為事實標準的機器學習訓練資料格式:libsvm。

  7. MXNet,TensorFlow,Caffe:深度學習大行其道,並且在識別問題上取到了驚人的效果,自然也間接推動了推薦系統的演算法升級,因此,掌握深度學習工具的就很必要,其中尤其以TensorFlow為主,它不但有深度學習模型的實現,還有傳統機器學習模型的實現,Python介面,對於掌握Python的人來說學習門檻很低。深度學習工具仍然建議去跑幾個例子,玩一些有趣的東西會快速入門,如給照片換風格,或者訓練一個動物/人臉識別器,可以有一些粗淺的認識。再系統地學習一下吳恩達的線上課程,他的課程對TensorFlow的使用也有講解,課後程式設計作業設計得也很好。

為最終效果負責的能力

推薦系統最終要為產品效果負責。衡量推薦系統效果,分為離線和線上兩個階段。

  1. 離線階段。跑出一些模型,會有定義清晰的指標去衡量模型本身對假設的驗證情況,如準確率、召回率、AUC等。這個階段的效果好,只能說明符合預期假設,但不能保證符合產品最終效果,因此還要有線上實際的檢驗。

  2. 線上階段:除了有一些相對通用的指標,如使用者留存率、使用時長、點選率等,更多的是和產品本身的定位息息相關,如短視訊推薦關注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上是搜尋為王,移動下是推薦為王,自然越來越重要。隨著各種可穿戴裝置的豐富,越來越多的推薦產品還會湧現出來。產品和技術相互協同發展,未來會有更多有意思的推薦演算法和產品形式問世,成為一名推薦系統工程師永遠都不晚。

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

責編:何永燦 

猜你喜歡

640?wx_fmt=png