如何搭建一套個性化推薦系統?

個性化推薦系統,設計的巧妙就可以立竿見影地提升運營效率和用戶轉化率,尤其在內容分發、電商、社交等領域實踐相當出彩(微博、各新聞門戶、頭條、京東、探探等都取得了不錯的成績),個性化推薦已經成爲一個產品的基礎建設。

本文從整體上介紹一個完整的推薦系統所需的模塊(不深入到細枝末節),核心包括內容源、內容處理、用戶挖掘、算法、推薦搜索引擎、ABtest 系統。本文將逐一介紹推薦架構的各個模塊。

個性化推薦系統架構圖

一、大量級可推薦內容,即推薦的 SKU

個性化推薦的本質是提升信息篩選的效率,如果信息量級小個性化意義不大(比如一個視頻網站每天只能產生 10 條新聞,再怎麼個性化也只是在這 10 條內循環,對用戶來說沒有差別),個性化推薦的 SKU 至少是千級或萬級,而且理論上來說,優質內容越多、類別分佈越廣泛,個性化推薦效果越好。

這些內容可以是抓取的無版權內容、UGC、版權合作 PGC 等多種來源,由於來源不同,樣式和質量可能千差萬別,因此通常需要做內容抓取、清洗、轉碼等以保證樣式統一,還可能需要用戶管理體系、反垃圾等配合搭建內容生態。個性化推薦系統各家可能是相近的,推薦的內容不同就產生了不同的用戶場景和產品壁壘。內容,本質是一種資源。

二、內容的標準化處理

第一步內容已備齊,接下來是把內容處理成機器和算法可理解的特徵(比如分類、標籤、產品庫等)。具體怎麼處理要看業務需求,需要的技術:如果是文章、新聞、微博等,就需要自然語言處理;如果是圖片、視頻,就會涉及到圖像識別和處理;如果是歌曲、電影、商品等,機器直接理解內容來打標籤難度比較大,最好能建立一套用戶打標籤的機制,或者通過人工填寫或抓取的方式打標籤。

但不管什麼內容,首先都要建立一套自己的標籤體系,這是定義標準的過程,比如要給電影打標籤,先定義一下有多少種電影,通常標籤體系會是一個樹狀或網狀結構;其次可能都要收集大量訓練樣本,比如要實現給圖片打標籤,首先需要人工標註上萬張圖片,供機器學習,標註的樣本還要不斷更新,這裏面涉及到大量重複繁瑣的人力勞動。所以圈內人經常開玩笑說,“人工智能” 重點其實是 “人工”。

三、用戶行爲日誌收集、傳輸、挖掘、存儲

推薦的基礎是數據,前兩步挖掘了內容數據,第三步就是挖掘用戶行爲生成用戶畫像。

採集:通常採用前端埋點的方式,上報用戶的點擊、分享、收藏等等行爲。日誌採集是數據挖掘非常重要的環節,如果採集有缺失或錯誤(很可能的事),那麼後續不管怎麼做都沒有效果,同時前端的改動也可能影響日誌,如果不有效協同,會對後端有很大影響。

傳輸:用於用戶興趣的收集往往越快越好,這樣用戶的某個操作就能快速反饋到下一步推薦中,所以就需要日誌的穩定傳輸和更新,但由於成本考慮,用戶 profile 不是都能實時更新的,有的可能延時 1 小時,有的可能 1 天 1 更、一週 1 更,甚至更久。

挖掘:這一過程是將用戶數據計算、挖掘處理成我們想要的特徵(俗稱 “用戶畫像”,業內通常叫用戶 profile),用戶挖掘通常要與算法結合,而不能憑空挖特徵,沒有算法應用再牛逼的用戶畫像也是沒有價值的。

存儲:用戶的興趣在一段時間內不會變化太大,因此可以用用戶長期留下的行爲來積累用戶畫像,並需要把這些 profile 存起來。如果用戶量很大,那麼需要的存儲資源也是海量的,那就需要一個能對大量數據進行分佈式存儲的數據庫,並且需要可靠和廉價,例如 hdfs(Hadoop Distributed File System),如果想要實時計算用戶興趣,就需要可快速存取的數據庫比如 redis,所以購買服務器也是微博、今日頭條等公司很大的開支。

當然用戶的興趣不是一成不變的,因此用戶興趣需要隨時間 “衰減”,設置合理的衰減係數,對用戶 profile 也很重要。

除此之外,用戶行爲挖掘還有一個歷史性難題——用戶冷啓動,這個話題我們需要單起一篇文章探討。

四、排序算法

前三步有了內容和用戶的數據,第四步可以用算法對兩者做 match 了。個性化推薦本質是在做 Top N ranking,通常包括 “召回” 和 “排序” 兩個模塊。舉個例子,如果我有 10 萬條信息,但是用戶每天可能只能看 10 條,那麼推薦哪 10 條給用戶呢?我可以把這 10 萬條從 1-10 萬排個序,這樣用戶不管想看多少條,我只要從我排的 10000 個序裏從前往後挑就可以了,這個過程就是 “排序”;但這種排法在實時索引中計算量太大,可能會帶來較高延時,那麼我們先用某種相對簡單的方法從這 10 萬中選相對靠譜的 1000,再對這 1000 排序,10 萬選 10000 的過程就是 “召回”。

算法方面門道很多,可以參看公衆號之前推送的文章,詳細介紹目前了推薦系統常用的、最有效的算法。此外,不管什麼算法都需要使用內容推薦之後的 “動態指標”(比如 ctr),但沒推薦之前我們如何獲得這個動態指標呢?這裏涉及到內容的冷啓動問題,也會之後單獨討論。

五、推薦搜索引擎

怎麼還有搜索引擎?是的,你沒看錯。實際上個性化推薦和搜索是非常相似的領域,兩者都是信息篩選方式,也都是在做一種 “相關性”rank,目標函數都是很接近的(點擊率)。只不過搜索更注重用戶當下搜索關鍵詞的相關性,而推薦更注重內容與用戶 profile 的相關性。用戶每一次瀏覽都是一次實時請求,因此需要實時計算當下最符合用戶興趣的內容,這一步就是在線搜索引擎承擔的。但由於性能要求,在線索引這步不宜做太耗時的計算,一般是排序算法計算了初始結果,在線引擎做算法調度和歸一化排序,此外在線索引還會承擔接收請求、輸出數據、曝光點擊排重等服務,通常還會承擔業務和產品需求的二次排序(比如插入廣告、打散同類型內容等)。

六、ABtest 系統

ABtest 系統雖不是個性化推薦系統的必需模塊,但沒有 ABtest 的推薦系統一定是個假的推薦系統!推薦系統的優化實際上就是一個 y=f(x),y 是目標函數,首先目標函數一定要十分明確,且是可量化的指標;f(x) 是選用的算法、算法特徵參數、算法調度等等組成的,其實業界通過有效的算法一直是那麼幾個,算法原理也就是那麼幾個,但如何結合自己的產品場景選擇特徵、參數,就成了個性化推薦精準度的關鍵因素。如果有 ABtest 系統,那麼我們可以嘗試帶入多種參數、特徵,ABtest 實驗得出最佳的 y,這樣推薦系統就可以不斷迭代、優化。

當然,算法的優化不是改改參數這麼簡單,做推薦的人需要要對數據十分敏感,並能將複雜問題抽象到可量化的指標上,再結合 ABtest 實驗快速迭代。我總結的算法優化的過程是:“數據分析發現問題、合理假設、設計實驗、實現、數據分析、得出結論或新的假設”,不斷循環反覆。其中改改參數只是 “實現” 那一步,也是最簡單的一步,而往往多數人只重視“實現”,卻對分析和假設的過程重視程度太低,這樣優化的效果是沒有保障的,還有些產品、技術人員會陷入盲目 ABtest 的誤區,漫無目的的嘗試,經常做 ABtest 發現 AB 組數據沒有任何差別,甚至產生了 ABtest 效率低的想法。這些分析思路便拉開了算法工程師之間的差距。

七、總結

有了這 6 部分,一個完整的個性化推薦系統就已經搭建起來了,整個體系裏涉及到算法工程師、自然語言處理 / 圖像處理工程師、服務端工程師 / 架構師、數據挖掘工程師、數據分析師、產品經理,還需要大量標註審覈人員、內容運營,此外還會涉及到前端、客戶端技術等的支持。因此想做一個好的個性化推薦系統耗費還是比較大的,但有時候我們並不需要一個系統,可能一些簡單的規則就可以實現相對個性化、提升用戶使用效率(比如把用戶最近瀏覽過的商品放在前面),因此提升效率的思維和方法纔是最重要的,這也是我們需要長期探討的內容。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/DgJuc8mHG26hQrMoqAQOPA