本文出自 颯然Hang算法
推薦系統是近些年很是火的技術,不論是電商類軟件仍是新聞類app,都號稱有精準的推薦系統能給你推送你最感興趣的內容。現象級的資訊類app「今日頭條」就得益於此成爲了勢頭很是猛的一款產品。本文就針對推薦系統講述一些相關概念和實踐經驗。數據庫
首先須要明確的就是推薦系統的目標,通常來講不外乎如下幾個:緩存
基於這些目標,推薦系統包括四種推薦方式:網絡
其中,前三者是和機器學習沒有任何關係的,但倒是推薦效果最好的三種方式。通常說來,這部份內容應該佔到總的推薦內容的80%左右,另外20%則是對長尾內容的個性化推薦。架構
個性化推薦是機器學習應用的一個典型場景。在本質上和搜索引擎是同樣的,一樣是爲了解決信息過載的問題。搜索引擎某種意義上也是一個個性化推薦系統,可是其輸入特徵是能夠從搜索關鍵字直接能夠獲得的。而通常的推薦系統,輸入特徵則是須要機器學習才能獲得。app
個性化推薦系統通常由日誌系統、推薦算法、內容展現UI三部分組成。框架
其中,個性化推薦中最爲核心的推薦算法,目前比較流行的有如下幾種:機器學習
個性化推薦系統的典型架構以下圖所示:分佈式
在線業務系統的日誌接入數據高速公路,再由數據高速公路迅速運轉到離線數據處理平臺和在線流計算平臺;離線數據處理平臺週期性地以批處理方式加工過去一段時間的數據,獲得人羣標籤和其餘模型參數,存放在高速緩存中,供在線業務系統使用,與此同時,在線流計算平臺實時對線上的日誌數據作處理,對離線計算出的數據進行補充、修正等;在線業務系統綜合離線特徵和在線特徵使用必定的邏輯獲得輸出供業務使用,產生的日誌流入數據高速公路。性能
基於此框架,個性化推薦系統的典型流程以下所示:
可知,一個推薦系統主要有如下模塊組成:
對原始的用戶行爲等數據進行清洗、加工,如字段、屬性、格式化等,做爲下一步推薦算法的輸入。
對於個性化推薦系統來講,推薦算法應該是其最核心的部分。目前有不少流行的算法,好比:
推薦算法的輸出結果通常是一個用戶對應一個item列表或者是一個item對應一個item列表。此部分主要考慮的是算法的時間複雜度,不論是哪種算法,一旦用戶或者內容數據上了百萬級別,都須要經過分佈式計算如MapReduce、Spark等來進行解決。
推薦算法的基本流程以下圖所示:
對推薦算法產生的結果進行清洗、格式化等,做爲下一步存儲模塊的輸入。
存儲用戶的偏好以及行爲數據等信息。對於偏好,採用標籤量化來表示,是一種隨着時間衰減的值。對於用戶畫像,是批量寫入、實時讀取,因此存儲要着重考慮讀的性能。能夠選擇使用Redis集羣做爲技術方案,可以最大知足讀的性能,缺點是Redis的成本昂貴且不支持auto index。也可以使用Hbase做爲存儲,使用ElasricSearch構建二級索引,以應對根據多種維度彙集用戶的需求(好比過濾某一個標籤下的全部用戶)。
對各類推薦算法計算出的推薦結果的存儲。存儲空間要求大,格式複雜。對於存儲的容量和讀寫性能要求都比較高。能夠選擇使用Redis集羣做爲此部分的存儲方案。
整合用戶畫像和推薦結果兩部分數據,向外提供推薦調用的接口。主要是數據庫IO調用開銷。
該模塊須要採起必定的策略聚合多種推薦算法的推薦結果,直接面向業務。策略因爲會隨着面向的業務不一樣而不一樣,須要可配置化。同時也提供對外暴露用戶畫像的接口,使得業務方可使用用戶畫像作針對性的處理。能夠採用RPC機制對外暴露服務接口。
對於一個推薦系統,結合其實現目標,還有一些須要注重考慮的問題。
因爲計算用戶、item矩陣或者進行矩陣分解是須要離線進行且比較耗時,所以協同的推薦算法是很難達到實時性的。實時部分的推薦主要依靠基於用戶畫像的推薦來進行。最終的推薦列表是根據必定的策略對這兩部分進行聚合的結果。
時效性內容指的是那些與時間強相關的內容,好比新聞、時事等。若是一條10天前xx球員得到冠軍的新聞如今被推薦了出來,可想用戶確定是莫名其妙或者是很失望的。所以,對於時效性內容,須要與普通的待推薦的內容區分開,作單獨的推薦或者不走個性化推薦。
無論使用何種推薦算法,都會面臨冷啓動問題:當用戶是新用戶,如何給用戶推薦item呢?當內容是新內容,如何推薦給用戶?
在基於用戶畫像的推薦算法中,取出用戶的多個標籤,而後根據相關度從不一樣的標籤中取不一樣數量的內容,這樣既兼顧了用戶的多種興趣也可以在必定程度上解決多樣性的問題。
如:用戶具備tag:A B C D,相關度爲wA wB wC wD,Total推薦爲總共須要推薦的條數,那麼
RecommendList(u) = A[Total推薦 * wA] + B[Total推薦 * wB] + C[Total推薦 * wC] + D[Total推薦 * wD]
不論是熱門推薦、人工推薦仍是取某一標籤下的內容列表都牽扯到的一個問題就是:如何給內容排序?
當用戶對內容的喜愛不同,能夠按照興趣度來排序;但當沒法區分興趣度的時候(好比:用戶是新用戶;內容都是新內容;用戶對於某一標籤下的內容興趣度同樣),可使用內容質量來作排序。click/pv是一種評判內容質量的方式。此外,使用卷積神經網絡相關算法也能夠構建內容質量模型。
推薦系統的驚喜目標一直是一個難題,被稱做EE(Exploit & Explore)問題,bandit算法是解決這個問題的一個派系,就是估計置信區間的作法,而後按照置信區間的上界來進行推薦,以UCB、LinUCB爲表明的。簡單點說就是先不考慮你喜不喜歡就把質量高的內容推薦給你,後面根據用戶的行爲反饋對推薦內容做調整。具體的能夠參見此篇文章:推薦系統的苟且和遠方。
借用推薦系統的那點事一文的幾句話作爲結語:
以上是推薦系統實踐的一些經驗