本文主要做推薦系統淺析,主要介紹推薦系統的定義,推薦系統的基礎框架,簡單介紹設計推薦的相關方法以及架構。適用於部分對推薦系統感興趣的同學以及有相關基礎的同學,本人水平有限,歡迎大家指正。 ...
一、綜述
本文主要做推薦系統淺析,主要介紹推薦系統的定義,推薦系統的基礎框架,簡單介紹設計推薦的相關方法以及架構。適用於部分對推薦系統感興趣的同學以及有相關基礎的同學,本人水平有限,歡迎大家指正。
二、商品推薦系統
2.1 推薦系統的定義
推薦系統本質上還是解決信息過載的問題,幫助用戶找到他們感興趣的物品,深度挖掘用戶潛在的興趣。
2.2 推薦架構
其實推薦系統的核心流程只有召回、排序、重排。
請求流程
當一個用戶打開一個頁面,這個時候前端會攜帶用戶信息(pin或者uuid等)去請求後臺介面(通過color間接調用),當後臺收到請求後一般會先根據用戶標識進行分流獲取相關策略配置(ab策略),這些策略去決定接下來會調用召回模塊、排序模塊以及重排模塊的哪個介面。一般召回模塊分多路召回,每路召回負責召回多個商品,排序和重排負責調整這些商品的順序。最後挑選出合適的商品併進行價格、圖片等相關信息補充展現給用戶。用戶會根據自己是否感興趣選擇點擊或者不點擊,這些涉及用戶的行為會通過日誌上報到數據平臺,為之後效果分析和利用用戶行為推薦商品奠定基礎。
其實有些問題想說一說:
為什麼要採取召回、排序、重排這種漏斗分層架構?
(1)從性能方面
終極:從百萬級的商品庫篩選出用戶感興趣的個位數級別的商品。
複雜的排序模型線上推斷耗時嚴重,需要嚴格控制進入排序模型的商品數量。需要進行拆解
(2)從目標方面
召回模塊:召回模塊的任務是快速從大量的物品中篩選出一部分候選物品,目的是不要漏掉用戶可能會喜歡的物品。召回模塊通常採用多路召回,使用一些簡化的特征或模型。
排序模塊:排序模塊的任務是精準排序,根據用戶的歷史行為、興趣、偏好等信息,對召回模塊篩選出的候選物品進行排序。排序模塊通常使用一些複雜的模型。
重排模塊:重排模塊的任務是對排序模塊的結果進行二次排序或調整,以進一步提高推薦的準確性和個性化程度。重排模塊通常使用一些簡單而有效的演算法。
什麼是ab實驗?
參考論文:Overlapping Experiment Infrastructure: More, Better, Faster Experimentation(google2010)
只有線上實驗才能真正評估模型優劣,ab實驗可以快速驗證實驗的效果,快速迭代模型。減少上線新功能的風險。
ab演算法:Hash(uuid+實驗id+創建時間戳)%100
特性:分流+正交
2.3召回
召回層的存在僅僅是為用戶從廣闊的商品池子中初篩出一批還不錯的商品。為了平衡計算速度與召回率(正樣本占全部正樣本的比例)指標之間的矛盾,採用多路召回策略,每路召回策略只考慮其中的單一特征或策略。
2.3.1多路召回的優劣
多路召回:採用不同的策略、特征或者簡單模型分別召回一部分候選集,然後把候選集混合在一起供排序使用。召回率高,速度快,多路召回相互補充。
多路召回中每路召回的截斷個數K是個超參數,需要人工調參,成本高;召回通路存在重合問題,冗餘。
是否存在一種召回可以替代多路召回,向量召回應用而生,就目前而言,仍然是以向量召回為主,其他召回為輔的架構。
2.3.2召回分類
主要分為非個性化召回,個性化召回兩大類。非個性化召回主要是進行熱點推送,推薦領域馬太效應嚴重,20%的商品貢獻80%的點擊。個性化召回主要是發掘用戶感興趣的商品,著重處理每個用戶的差異點,提高商品的多樣性,保持用戶的粘性。
非個性化召回
(1) 熱門召回
近7天高點擊、高點贊、高銷量商品召回
(2)新品召回
最新上架的商品召回
個性化召回
(1)標簽召回、地域召回
標簽召回:用戶感興趣的品類、品牌、店鋪召回等
地域召回:根據用戶的地域召回地域內的優質商品。
(2)cf召回
協同過濾演算法是基於用戶行為數據挖掘用戶的行為偏好,從而根據用戶的行為偏好為其推薦物品,其根據的是用戶和物品的行為矩陣(共現矩陣)。用戶行為一般包括瀏覽、點贊、加購、點擊、關註、分享等等。
協同過濾分為三大類:基於用戶的協同過濾(UCF)和基於物品的協同過濾(ICF)和基於模型的協同過濾(隱語義模型)。是否為用戶推薦某個物品,首先要把用戶和物品進行關聯,而進行關聯的點是另一個物品還是另一個用戶,決定了這屬於哪個類型的協同過濾。而基於隱語義模型是根據用戶行為數據進行自動聚類挖掘用戶的潛在興趣特征。從而通過潛在興趣特征對用戶和物品進行關聯。
基於物品的協同過濾(ICF):判斷是否為用戶推薦某個物品,首先根據用戶歷史行為記錄的物品和這個物品的相似關係來推斷用戶對這個物品的興趣度,從而判斷我們是否推薦這個物品。整個協同過濾過程主要分為以下幾步:計算物品之間的相似度,計算用戶對物品的興趣度,排序截取結果。
商品相似度計算:
衡量相似度主要有以下幾種方式:夾角餘弦距離,傑卡德公式。由於用戶或物品的表示方式的多樣性,使得這些相似度的計算非常靈活。我們可以利用用戶和物品的行為矩陣來去計算相似度,也可以根據用戶行為、物品屬性和上下文關係構造用戶和物品的向量表示去計算相似性。
夾角餘弦距離公式: cosθ=(x1*x2+y1*y2)/(√(x12+y12 )*√(x22+y22 ))
傑卡德公式J(A,B)=(|A⋂B|)/(|A⋃B|)
商品a | 商品b | 商品c | 商品d | |
---|---|---|---|---|
用戶A | 1 | 0 | 0 | 1 |
用戶B | 0 | 1 | 1 | 0 |
用戶C | 1 | 0 | 1 | 1 |
用戶D | 1 | 1 | 0 | 0 |
夾角餘弦距離公式計算商品a和b的相似度:
Wab=(1*0+0*1+1*0+1*1)/(√(12+02+12+12 )*√(02+12+02+12 ))=1/√6
spark實現ICF:https://zhuanlan.zhihu.com/p/413159725
問題:冷啟動問題,長尾效應。
(3)向量召回
向量化召回:通過學慣用戶與物品低維向量化表徵,將召回建模成向量空間內的近鄰搜索問題,有效提升了召回的泛化能力與多樣性,是推薦引擎的核心召回通道。
向量:萬物皆可向量化,Embedding就是用一個低維稠密的向量表示一個對象(詞語或者商品),主要作用是將稀疏向量轉換成稠密向量(降維的效果),這裡的表示蘊含著一定的深意,使其能夠表達出對象的一部分特征,同時向量之間的距離反映對象之間的相似性。
向量召回步驟:離線訓練生成向量,線上向量檢索。
1.離線訓練生成向量
word2vec:詞向量的鼻祖,由三層神經網路:輸入層,隱藏層,輸出層,隱藏層沒有激活函數,輸出層用了softmax計算概率。
目標函數
網路結構:
總的來說:輸入是詞語的序列,經過模型訓練可以得到每個詞語對應的向量。應用在推薦領域就是輸入是用戶的點擊序列,經過模型訓練得到每個商品的向量。
優劣:簡單高效,但是只考慮了行為序列,沒有考慮其他特征。
雙塔模型:
網路結構:分別稱為User塔和物品塔;其中User塔接收用戶側特征作為輸入比如用戶id、性別、年齡、感興趣的三級品類、用戶點擊序列、用戶地址等;Item塔接受商品側特征,比如商品id、類目id、價格、近三天訂單量等。數據訓練:(正樣本數據,1)(負樣本,0)正樣本:點擊的商品,負樣本:全局隨機商品樣本(或者同批次其他用戶點擊樣本)
優劣:高效,完美契合召回特性,線上請求得到用戶向量,檢索召回item向量,泛化性高;用戶塔和item塔割裂,只在最後做了交互。
2.線上向量檢索
向量檢索:是一種基於向量空間模型(Vector Space Model)的信息檢索方法,用於在大規模文本集合中快速查找與查詢向量最相似的文檔向量。在信息檢索、推薦系統、文本分類中得到廣泛應用。
向量檢索的過程是計算向量之間的相似度,最後返回相似度較高的TopK向量返回,而向量相似度計算有多種方式。計算向量相似性得方式有歐式距離、內積、餘弦距離。歸一化後,內積與餘弦相似度計算公式等價。
向量檢索的本質是近似近鄰搜索(ANNS),儘可能減小查詢向量的搜索範圍,從而提高查詢速度。
目前在工業界被大規模用到的向量檢索演算法基本可以分為以下3類:
- 局部敏感性哈希(LSH)
- 基於圖(HNSW)
- 基於乘積量化
簡單介紹LSH
LSH演算法的核心思想是:將原始數據空間中的兩個相鄰數據點通過相同的映射或投影變換後,這兩個數據點在新的數據空間中仍然相鄰的概率很大,而不相鄰的數據點被映射到同一個桶的概率很小。
相比於暴力搜索遍曆數據集中的所有點,而使用哈希,我們首先找到查詢樣本落入在哪個桶中,如果空間的劃分是在我們想要的相似性度量下進行分割的,則查詢樣本的最近鄰將極有可能落在查詢樣本的桶中,如此我們只需要在當前的桶中遍歷比較,而不用在所有的數據集中進行遍歷。當哈希函數數目H取得太大,查詢樣本與其對應的最近鄰落入同一個桶中的可能性會變得很微弱,針對這個問題,我們可以重覆這個過程L次(每一次都是不同得哈希函數),從而增加最近鄰的召回率。
案例:基於word2vec實現向量召回
2.4排序
推薦系統的掌上明珠
排序階段分為粗排和精排,粗排一般出現在在召回結果的數據量級比較大的時候。
進化歷程
簡單介紹Wide&Deep
背景:手動特征組合實現記憶性效果不錯但是特征工程太耗費人力,並且未曾出現的特征組合無法記憶,不能進行泛化。
目的:使模型同時兼顧泛化和記憶能力(有效的利用歷史信息並具有強大的表達能力)
(1)記憶能力 模型直接學習並利用歷史數據中物品或者特征共現頻率的能力,記憶歷史數據的分佈特點,簡單模型容易發現數據中對結果影響較大的特征或者組合特征,調整其權重實現對強特征的記憶
(2)泛化能力 模型傳遞特征的相關性,以及發掘稀疏或者從未出現過的稀有特征和最終標簽相關性的能力,即使是非常稀疏的特征向量輸入也能得到穩定平滑的推薦概率。提高泛化性的例子:矩陣分解,神經網路
兼顧記憶和泛化能力 (結果的準確性和擴展性) wide部分專註模型記憶,快速處理大量歷史行為特征,deep部分專註模型泛化,探索新世界,模型傳遞特征的相關性,發掘稀疏甚至從外出現過的稀有特征與最終標簽的相關性的能力,具有強大的表達能力。最終將wide部分和deep部分結合起來,形成統一的模型。
wide部分就是基礎的線性模型,表示為y=W^T X+b X特征部分包括基礎特征和交叉特征。交叉特征在wide部分很重要,可以捕捉到特征間的交互,起到添加非線性的作用。
deep部分為embeding層+三層神經網路(relu),前饋公式
聯合訓練
優劣:為推薦/廣告/搜索排序演算法之後的發展奠定了重要基礎,從傳統演算法跨越到深度學習演算法,里程碑意義。兼顧記憶和泛化能力但是Wide側仍需要手工組合特征。
參考論文:Wide & Deep Learning for Recommender Systems
2.5 重排
定義:對精排後的結果順序進行微調,一方面實現全局最優、一方面滿足業務訴求提升用戶體驗。比如打散策略,強插策略,提高曝光,敏感過濾
MMR演算法
實現商品多樣性問題
目的:在推薦結果準確性的同時保證推薦結果的多樣性,為了平衡推薦結果的多樣性和相關性
演算法原理,如公式
D:商品集合,Q:用戶,S:已被選中的商品集合, R\S:R中未被選中的商品集合
def MMR(itemScoreDict, similarityMatrix, lambdaConstant=0.5, topN=20):
#s 排序後列表 r 候選項
s, r = [], list(itemScoreDict.keys())
while len(r) > 0:
score = 0
selectOne = None
# 遍歷所有剩餘項
for i in r:
firstPart = itemScoreDict[i]
# 計算候選項與"已選項目"集合的最大相似度
secondPart = 0
for j in s:
sim2 = similarityMatrix[i][j]
if sim2 > second_part:
secondPart = sim2
equationScore = lambdaConstant * (firstPart - (1 - lambdaConstant) * secondPart)
if equationScore > score:
score = equationScore
selectOne = i
if selectOne == None:
selectOne = i
# 添加新的候選項到結果集r,同時從s中刪除
r.remove(selectOne)
s.append(selectOne)
return (s, s[:topN])[topN > len(s)]
意義是選擇一個與用戶最相關的同時跟已選擇物品最不相關的物品。時間複雜度O(n2) 可以通過限制選擇的個數進行降低時間複雜度
工程實現:需要用戶和物品的相關性和物品之間的相似性作為輸入,用戶和物品的相關性可以用排序模型的結果作為代替,物品之間的相似性可以通過協同過濾等演算法得到商品向量,計算餘弦距離。也可以簡單得是否同一三級類目、同一店鋪等表徵
三、總結
就簡單嘮叨這麼多啦,主要想讓大家瞭解一下推薦系統,向大家介紹一下整個推薦架構,以及整個推薦都有哪些模塊。由於本人水平有限,每個模塊也沒有講的特別細,希望之後能在工作中繼續學習這個領域,深挖細節,產出更好的東西呈現給大家。感謝!!!
作者:京東零售 閆先東
來源:京東雲開發者社區