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