推薦系統架構


推薦系統介紹

當下,個性化推薦成了互聯網產品的標配。但是,人們對推薦該如何來做,也就是推薦技術本身,還不甚了解。為此,好學的你肯定在收藏着朋友圈里流傳的相關文章,轉發着微博上的相關討論話題,甚至還會不斷奔走在各種大小行業會議之間,聽着大廠職工們講那些干貨。我知道,這樣碎片化的吸收,增加了知識的同時,也增加了焦慮。因為技術的不平等廣泛存在於業界內,推薦系統也不例外。推薦系統從搜索引擎借鑒了不少技術和思想,比如內容推薦有不少技術就來自搜索引擎, 由 Amazon 發揚光大的。推薦系統也是現在熱門的人工智能分支之一,但凡人工智能類的落地,都需要具備這幾個基本元素才行:數據、算法、場景、計算力。推薦系統也不例外,而剛好,現在的時代,這些元素的獲得成本相比十年前已經小了很多。未來隨着各種硬件設備越來越智能,萬物互聯得越來越緊密,人們的個性化需求、場景的多樣性、數據的復雜性都對推薦系統提出了更高的要求。

推薦系統概括一下,其實就是以下的的目標主要包括: 

  • 用戶滿意性:首當其沖的,推薦系統主要就是為了滿足用戶的需求,因此准確率是評判一個推薦系統好壞的最關鍵指標。
  • 多樣性:雖然推薦系統最主要還是滿足用戶的興趣,但是也要兼顧內容的多樣性,對於權重不同的興趣都要做到兼顧。
  • 新穎性:用戶看到的內容是那些他們之前沒有聽說過的物品。簡單的做法就是在推薦列表去掉用戶之前有過行為的那些內容。
  • 驚喜度:和新穎性類似,但新穎性只是用戶沒看到過的但是確實是和他行為是相關的,而驚喜度是用戶既沒有看過和他之前的行為也不相關,但用戶看到后的確是喜歡的。
  • 實時性:推薦系統要根據用戶的上下文來實時更新推薦內容,用戶的興趣也是隨着時間而改變的,需要實時更新。
  • 推薦透明度:對於用戶看到的最終結果,要讓用戶知道推薦此內容的原因。比如,“買過這本書的人同時也買過”、”你購買過的xx和此商品類似”。
  • 覆蓋率:挖掘長尾內容也是推薦系統很重要的目標。因此,推薦的內容覆蓋到的內容越多越好。

基於這些目標,推薦系統包括四種推薦方式:

  • 熱門推薦:就是熱門排行榜的概念。這種推薦方式不僅僅在IT系統,在平常的生活中也是處處存在的。這應該是效果最好的一種推薦方式,畢竟熱門推薦的物品都是位於曝光量比較高的位置的。
  • 人工推薦:人工干預的推薦內容。相比於依賴熱門和算法來進行推薦。一些熱點時事如世界杯、nba總決賽等就需要人工加入推薦列表。另一方面,熱點新聞帶來的推薦效果也是很高的。
  • 相關推薦:相關推薦有點類似於關聯規則的個性化推薦,就是在你閱讀一個內容的時候,會提示你閱讀與此相關的內容。
  • 個性化推薦:基於用戶的歷史行為做出的內容推薦。也是本文主要講述的內容。

其中,前三者是和機器學習沒有任何關系的,但卻是推薦效果最好的三種方式。一般說來,這部分內容應該占到總的推薦內容的80%左右,另外20%則是對長尾內容的個性化推薦。

推薦系統架構

 

online部分架構

核心模塊

  • 業務網關,推薦服務的入口,負責推薦請求的合法性檢查,組裝請求響應的結果。

  • 推薦引擎,推薦系統核心,包括online邏輯,召回、過濾、特征計算、排序、 多樣化等處理過程。

數據路徑

1、請求的刷新從gateway,經過流量分配模塊,傳到業務gateway,業務gateway支持http,tcp(使用thirtf協議或者protobuf 協議)等多種類型接口;

2、用戶行為數據,從gateway到Flume agent,然后到kafka,為后面online,realtime userprofile部分的提供實時數據,也為offline部分的數據存儲系統提供數據。

offline部分架構

本文從大框架上介紹推薦系統架構,在許多公司面試中會給你一個推薦或者數據挖掘的問題,比如讓你簡單設計一個feed流推薦系統,所以需要對推薦系統的整體框架要了解。下面是一個推薦系統的主要部分

 

從框架的角度看,推薦系統基本可以分為數據層、召回層、排序層。

數據層包括數據生成和數據存儲,主要是利用各種數據處理工具對原始日志進行清洗,處理成格式化的數據,落地到不同類型的存儲系統中,供下游的算法和模型使用。

sessionlog:對原始數據進行清洗合並,sessionlog一般就是清洗合並后的數據,后續的算法和統計都是根據sessionlog進行再加工。

userprofile:對用戶屬性和行為等信息進行采集和統計,為后續算法提供特征支持。

itemDoc:對視頻、商品等屬性、曝光、點擊等字段進行統計, 為后續算法提供特征支持。

召回層主要是從用戶的歷史行為、實時行為等角度利用各種觸發策略產生推薦的候選集,對不同的策略和算法產生的候選集進行融合並按照產品規則進行過濾,一般融合和過濾后的候選集還是比較多的,一次線上請求過來之后線上系統無法對那么多的候選集進行排序,所以在召回層一般還會有粗排序,對融合的候選集進行一次粗排序,過濾掉粗排分數較低的候選集。

排序層主要是利用機器學習的模型對召回層篩選出來的候選集進行精排序。

數據特征

數據決定了特征,特征決定了效果的上限,模型決定了接近效果上限的程度。

行為類別

行為表現

用戶主動行為

點擊、分享、評分

用戶畫像

用戶屬性(性別、年齡、收入)、視頻分類興趣分布、地域、時間

負反饋

負評

  1. 用戶主動行為數據記錄了用戶在平台的的各種行為,這些行為一方面用於候選集觸發算法(在下一部分介紹)中的離線計算(主要是瀏覽、下單),另外一方面,這些行為代表的意圖的強弱不同,因此在訓練重排序模型時可以針對不同的行為設定不同的回歸目標值,以更細地刻畫用戶的行為強弱程度。此外,用戶對deal的這些行為還可以作為重排序模型的交叉特征,用於模型的離線訓練和在線預測。
  2. 負反饋數據反映了當前的結果可能在某些方面不能滿足用戶的需求,因此在后續的候選集觸發過程中需要考慮對特定的因素進行過濾或者降權,降低負面因素再次出現的幾率,提高用戶體驗;同時在重排序的模型訓練中,負反饋數據可以作為不可多得的負例參與模型訓練,這些負例要比那些展示后未點擊、未下單的樣本顯著的多。
  3. 用戶畫像是刻畫用戶屬性的基礎數據,其中有些是直接獲取的原始數據,有些是經過挖掘的二次加工數據,比如用戶的聚類和向量化,這些屬性一方面可以用於候選集觸發過程中對deal進行加權或降權,另外一方面可以作為重排序模型中的用戶維度特征。

召回層(ReCall)

協同過濾

協同過濾(Collaborative Filtering)可說是推薦系統里資歷最老最經典的一種算法了,如 userCF、itemCF。原理是基於用戶對內容的行為協同,為某一用戶沒有看過的某條內容作出點擊預測。實現方法有很多種,如傳統的 Memory-based 方法、基於矩陣分解的方法(LFM/SVD/SDV++)、基於 DNN 的方法。

Memory-based 方法很簡單,是基於統計的一種算法。以 item-based CF 舉例:

 

根據用戶點擊行為,我們可以統計出 item-item 的共現矩陣(矩陣單元內為 item i 與 item j 共同被用戶點擊的次數),再依此通過Jaccard相似度/余弦相似度/歐氏距離得出 item 相似度矩陣,最后根據用戶的點擊記錄檢索出 topK 相似的內容推薦給用戶。在計算過程中需要考慮一些因素,比如熱門物品對相似度計算的影響、不同傾向的用戶的影響等等。

然而 Memory-based 方法不能解決的問題是,當我們的矩陣很稀疏時,大多數 item 和 item 之間是沒有關聯的(相似度為0),這也就造成最后我們召回的內容覆蓋率很低,也許大多集中在頭部內容。於是基於矩陣分解的方法誕生了。

MF(Matrix Factorization)的原理是將一個高維稀疏矩陣分解成兩個低秩矩陣,其中 k 被稱為隱向量維度。在原始的稀疏矩陣 R 中,大部分二階特征的關系系數是缺失的。而通過訓練模型最小化 R 和預測矩陣 R‘ 的損失(如最小二乘),可以求出任意 Ri,j 的值。

MF 可說是大部分推薦系統里協同過濾的標桿方法了,但仍然存在一些問題。比如過於稀疏的矩陣對於最后評分的預測依然有很大影響,並且當用戶特征或者內容特征缺失(即冷啟動)時,無法進行合理的預測。此時,基於深度學習的一些嘗試開始了。如基於DNN實現,可以很輕易地將內容的一些語義特征,以及用戶的固有屬性與行為特征拼接在一起作為神經網絡輸入來訓練,可以在之前行為協同的前提下加入對內容特征的學習,從而解決冷啟動問題。感興趣的同學可以閱讀相關論文,在此不做展開。

基於內容的召回

主要是以之前 NLP 得到的內容畫像為基礎,以item 對應分類/主題/關鍵詞的權重建立召回,依據用戶畫像的相應權重和內容畫像的距離排序召回。

基於用戶群

首先我們需要對用戶分群,聚類的方案有很多,

  1、對item進行向量化(w2v)然后對item進行聚類,用戶對item的行為就可以把item的簇賦值到user身上。

  2、直接對用戶進行向量化,比如降維。

總之最終的目的就是將用戶embedding成一個向量,然后在對用戶向量進行聚類,一般k-means就可以勝任大部分的場景。

倒排鏈

tag-itemList,對每個用戶的tag進行遍歷,然后通過倒排鏈快速找到含有該tag的itemList然后topN抽取。

子策略融合

為了結合不同觸發算法的優點,同時提高候選集的多樣性和覆蓋率,需要將不同的觸發算法融合在一起。常見的融合的方法有以下幾種[3]:

  1. 加權型:最簡單的融合方法就是根據經驗值對不同算法賦給不同的權重,對各個算法產生的候選集按照給定的權重進行加權,然后再按照權重排序。
  2. 分級型:優先采用效果好的算法,當產生的候選集大小不足以滿足目標值時,再使用效果次好的算法,依此類推。
  3. 調制型:不同的算法按照不同的比例產生一定量的候選集,然后疊加產生最終總的候選集。
  4. 過濾型:當前的算法對前一級算法產生的候選集進行過濾,依此類推,候選集被逐級過濾,最終產生一個小而精的候選集合。

目前我們使用的方法集成了調制和分級兩種融合方法,不同的算法根據歷史效果表現給定不同的候選集構成比例,同時優先采用效果好的算法觸發,如果候選集不夠大,再采用效果次之的算法觸發,依此類推。

模型排序(Ranking)

       如上所述,對於不同算法觸發出來的候選集,只是根據算法的歷史效果決定算法產生的item的位置顯得有些簡單粗暴,同時,在每個算法的內部,不同item的順序也只是簡單的由一個或者幾個因素決定,這些排序的方法只能用於第一步的初選過程,最終的排序結果需要借助機器學習的方法,使用相關的排序模型,綜合多方面的因素來確定。

1、模型選擇和比較  

  非線性模型能較好的捕捉特征中的非線性關系,但訓練和預測的代價相對線性模型要高一些,這也導致了非線性模型的更新周期相對要長。反之,線性模型對特征的處理要求比較高,需要憑借領域知識和經驗人工對特征做一些先期處理,但因為線性模型簡單,在訓練和預測時效率較高。因此在更新周期上也可以做的更短,還可以結合業務做一些在線學習的嘗試。在我們的實踐中,非線性模型和線性模型都有應用。

非線性模型  

       目前我們主要采用了非線性的樹模型gbdt,相對於線性模型,非線性模型可以更好的處理特征中的非線性關系,不必像線性模型那樣在特征處理和特征組合上花費比較大的精力。gbdt是一個加性模型,由很多個樹組成,后面的樹不斷擬合前一顆樹的殘差,而且每一個樹帶入的都是全訓練集,由此可以減小過擬合的影響。后續的文章會單獨總結gbdt的應用和落地細節、公式推導、面試問點等細節.

線性模型

  目前應用比較多的線性模型非Logistic Regression莫屬了。為了能實時捕捉數據分布的變化,我們引入了online learning,接入實時數據流,使用google提出的FTRL[5]方法對模型進行在線更新。后續也會單獨寫一篇FTRL的應用、特征、落地、面試問點等細節。


Alt text

主要的步驟如下:

  • 在線寫特征向量到HBase
  • Storm解析實時點擊和曝光日志流,改寫HBase中對應特征向量的label
  • 通過FTRL更新模型權重
  • 將新的模型參數應用於線上

2. 數據

  • 采樣:對於點擊率預估而言,正負樣本嚴重不均衡,所以需要對負例做一些采樣。 
  • 負例:正例一般是用戶產生點擊、下載、分享等轉換行為的樣本,但是用戶沒有轉換行為的樣本是否就一定是負例呢?其實不然,很多展現其實用戶根本沒有看到,所以把這樣樣本視為負例是不合理的,也會影響模型的效果。比較常用的方法是skip-above,即用戶點擊的item位置以上的展現才可能視作負例。當然,上面的負例都是隱式的負反饋數據,除此之外,我們還有用戶主動刪除的顯示負反饋數據,這些數據是高質量的負例。
  • 去噪:對於數據中混雜的刷單等類作弊行為的數據,要將其排除出訓練數據,否則會直接影響模型的效果。

3. 特征

在我們目前的重排序模型中,大概分為以下幾類特征:

  • item維度的特征:主要是item本身的一些屬性,包括category、pv、ctr、sub-category、tag等
  • user維度的特征:包括用戶等級、用戶的人口屬性、用戶的客戶端類型等
  • user、deal的交叉特征:包括用戶對item的category的點擊、收藏等

對於非線性模型,上述特征可以直接使用;而對於線性模型,則需要對特征值做一些分桶、歸一化等處理,使特征值成為0~1之間的連續值或01二值。

推薦系統架構面試問題總結

1、推薦系統的架構流程圖和每一個模塊的作用一定要了解,一般會讓你一邊畫流程圖一邊講解每個模塊。

2、召回模塊一般就是在做候選集篩選和粗排序,原因是item太多了,一個user的請求過來線上系統不能在100ms以內對所有的item進行排序。

 

后面的章節會針對各個模塊進行具體的算法和架構講解、踩過的坑、落地、面試問題等。

 

 


轉載請注明——redbear博客

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM