掌握核心原理的技能mysql
數學:微積分,統計學,線性代數web
周邊學科:信息論基礎redis
推薦算法:CF,LR,SVM,FM,FTRL,GBDT,RF,SVD,RBM,RNN,LSTM,RL算法
數據挖掘:分類,聚類,迴歸,降維,特徵選擇,模型評價sql
實現系統檢驗想法的技能:mongodb
操做系統:Linuxshell
編程語言:Python/R, Java/C++/C,sql,shell數據庫
RPC框架:thrift, Dubbo,gRPCdjango
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上和人交流探討;
代碼閱讀;能閱讀開源代碼,從中學習優秀項目對經典算法的實現;
溝通表達;可以和其餘崗位的人員溝通交流,講明白所負責模塊的原理和方法,能聽懂非技術人員的要求和思惟,能分別真需求和僞需求而且能達成一致。
圖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環境供本身平時練習,買一臺常備的雲服務器是一個不錯的選擇。這裏有兩個關鍵點:
用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上是搜索爲王,移動下是推薦爲王,天然愈來愈重要。隨着各類可穿戴設備的豐富,愈來愈多的推薦產品還會涌現出來。產品和技術相互協同發展,將來會有更多有意思的推薦算法和產品形式問世,成爲一名推薦系統工程師永遠都不晚。