推薦系統架構

2022-07-15 19:36:17 字數 4110 閱讀 8267

實時性:推薦系統要根據使用者的上下文來實時更新推薦內容,使用者的興趣也是隨著時間而改變的,需要實時更新。

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

核心模組

資料路徑

1、請求的重新整理從gateway,經過流量分配模組,傳到業務gateway,業務gateway支援http,tcp(使用thirtf協議或者protobuf 協議)等多種型別介面;

2、使用者行為資料,從gateway到flume agent,然後到kafka,為後面online,realtime userprofile部分的提供實時資料,也為offline部分的資料儲存系統提供資料。

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

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

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

sessionlog:對原始資料進行清洗合併,sessionlog一般就是清洗合併後的資料,後續的演算法和統計都是根據sessionlog進行再加工。

userprofile:對使用者屬性和行為等資訊進行採集和統計,為後續演算法提供特徵支援。

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

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

資料決定了特徵,特徵決定了效果的上限,模型決定了接近效果上限的程度。

行為類別

行為表現

使用者主動行為

點選、分享、評分

使用者畫像

負反饋負評

負反饋資料反映了當前的結果可能在某些方面不能滿足使用者的需求,因此在後續的候選集觸發過程中需要考慮對特定的因素進行過濾或者降權,降低負面因素再次出現的機率,提高使用者體驗;同時在重排序的模型訓練中,負反饋資料可以作為不可多得的負例參與模型訓練,這些負例要比那些展示後未點選、未下單的樣本顯著的多。

使用者畫像是刻畫使用者屬性的基礎資料,其中有些是直接獲取的原始資料,有些是經過挖掘的二次加工資料,比如使用者的聚類和向量化,這些屬性一方面可以用於候選集觸發過程中對deal進行加權或降權,另外一方面可以作為重排序模型中的使用者維度特徵。

協同過濾(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實現,可以很輕易地將內容的一些語義特徵,以及使用者的固有屬性與行為特徵拼接在一起作為神經網路輸入來訓練,可以在之前行為協同的前提下加入對內容特徵的學習,從而解決冷啟動問題。感興趣的同學可以閱讀相關**,在此不做展開。

基於使用者群

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

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

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

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

tag-itemlist,對每個使用者的tag進行遍歷,然後通過倒排鏈快速找到含有該tag的itemlist然後topn抽取。

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

加權型:最簡單的融合方法就是根據經驗值對不同演算法賦給不同的權重,對各個演算法產生的候選集按照給定的權重進行加權,然後再按照權重排序。

分級型:優先採用效果好的演算法,當產生的候選集大小不足以滿足目標值時,再使用效果次好的演算法,依此類推。

調製型:不同的演算法按照不同的比例產生一定量的候選集,然後疊加產生最終總的候選集。

過濾型:當前的演算法對前一級演算法產生的候選集進行過濾,依此類推,候選集被逐級過濾,最終產生乙個小而精的候選集合。

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

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

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

主要的步驟如下:

storm解析實時點選和**日誌流,改寫hbase中對應特徵向量的label

通過ftrl更新模型權重

將新的模型引數應用於線上

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

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

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

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

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

推薦系統架構 推薦系統(1) 業界推薦系統架構

1.1業界主流推薦系統架構 業界推薦系統通用架構 1.2使用者本身資料 1.3物品本身資料 1.4使用者行為資料 2.1基於離線訓練的推薦系統架構設計 常用演算法 邏輯回歸 logistics regression 梯度提公升決策樹 gbdt 和因式分解 fm 架構設計 2.2面向深度學習的推薦系統...

推薦系統實時推薦架構演進

離線推薦存量問題,在feed架構儲存的資料也有比較多,原有設計都是為了避免離線推薦資料消費完無資料可推薦,但這個對於業務的調整都沒感知,比如內容敏感下架,使用者興趣變化 推薦資料不足,離線推薦的資料會很快受到使用者的重新整理過量快速消費完,導致召回源資料不足,多樣性不夠,需要補充引擎 目前解決方式是...

推薦系統的架構

本文從網際網路收集並整理了推薦系統的架構,其中包括一些大公司的推薦系統框架 資料流儲存 計算 模型應用 可以參考這些資料,取長補短,最後根據自己的業務需求,技術選型來設計相應的框架。後續持續更新並收集。介面ui那一塊包含3塊東西 1 通過一定方式展示推薦物品 物品標題 縮圖 簡介等 2 給的推薦理由...