推薦算法總結(召回+排序+工程化)


本篇文章會一直更新,主要是記錄常見的一些推薦算法。
知識框架如下
在這裏插入圖片描述

召回

內容召回

word2vec

  • 瞭解skip-gram和cbow兩種網絡的結構
    在這裏插入圖片描述
  • 瞭解優化方法:Hierarchical Softmax和Negative Sampling
    (1)Hierarchical Softmax
    霍夫曼樹,頻度高的詞越靠近根節點,複雜度從n降到log2n
    在這裏插入圖片描述
    (2)負採樣
    每次都只是通每次都只是通過採樣neg個不同的中心詞做負例,就可以訓練模型過採樣neg個不同的中心詞做負例,轉化爲二分類問題。
    採樣的詞儘量是熱門詞

LDA

我們認爲一篇文章的每個詞都是通過“以一定概率選擇了某個主題,並從這個主題中以一定概率選擇某個詞語”這樣一個過程得到。
文檔到主題服從多項式分佈,主題到詞服從多項式分佈。
核心思想:LDA的目的就是要識別主題,即把文檔—詞彙矩陣變成文檔—主題矩陣(分佈)和主題—詞彙矩陣(分佈)

對於語料庫中的每篇文檔,LDA定義瞭如下生成過程:
1.對每一篇文檔,從主題分佈中抽取一個主題;
2.從上述被抽到的主題所對應的單詞分佈中抽取一個單詞;
3.重複上述過程直至遍歷文檔中的每一個單詞。
博客

行爲召回

ItemCF

  • 對活躍用戶進行懲罰。
    在這裏插入圖片描述
  • UserCF的推薦結果着重於反映和用戶興趣相似的小羣體的熱點,而ItemCF的推薦結果着重於維繫用戶的歷史興趣
  • UserCF比較適合用於新聞推薦等熱門程度和實時性較強的場景,ItemCF則適用於圖書、電商、電影等場景

UserCF

  • 對熱門物品進行懲罰
  • 在計算用戶行爲之間的相似度時,建立Item-User的倒排表,這樣在同一個Item下面的User兩兩之間一定是在這個Item上有交集的,所以只需要遍歷所有的Item,對其下所有的User兩兩進行統計即可,這樣可以極大降低時間複雜度。

CF實效成本低,全量發現能力弱,基於歷史相似擴展;存在冷啓動問題

Swing

阿里原創算法-swing,基於圖結構做match,計算商品間的相似度
如果多個user在點擊了s的同時,都只共同點了某一個其他的item,那麼這個item和s一定是強關聯的

關聯規則

找出用戶購買的所有物品數據裏頻繁出現的項集活序列,來做頻繁集挖掘,找到滿足支持度閾值的關聯物品的頻繁N項集或者序列。如果用戶購買了頻繁N項集或者序列裏的部分物品,那麼我們可以將頻繁項集或序列裏的其他物品按一定的評分準則推薦給用戶,這個評分準則可以包括支持度,置信度和提升度等

常用的關聯推薦算法有Apriori,FP Tree和PrefixSpan。如果大家不熟悉這些算法,可以參考我的另外幾篇文章:
Apriori算法
FpGrowth算法
序列模式挖掘PrefixSpan算法

聚類協同

常用的聚類推薦算法有K-Means, BIRCH, DBSCAN和譜聚類

介紹下DBSCAN

  • DBSCAN的主要優點有:
    (1) 可以對任意形狀的稠密數據集進行聚類,相對的,K-Means之類的聚類算法一般只適用於凸數據集。
    (2) 可以在聚類的同時發現異常點,對數據集中的異常點不敏感。
    (3) 聚類結果沒有偏倚,相對的,K-Means之類的聚類算法初始值對聚類結果有很大影響。
  • DBSCAN的主要缺點有:
    (1)如果樣本集的密度不均勻、聚類間距差相差很大時,聚類質量較差,這時用DBSCAN聚類一般不適合。
    (2) 如果樣本集較大時,聚類收斂時間較長,此時可以對搜索最近鄰時建立的KD樹或者球樹進行規模限制來改進。
    (3) 調參相對於傳統的K-Means之類的聚類算法稍複雜,主要需要對距離閾值ϵ,鄰域樣本數閾值MinPts聯合調參,不同的參數組合對最後的聚類效果有較大影響

矩陣分解

隱語義LFM

  • 用兩個低階向量相乘來模擬實際的User-Item矩陣
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • label要怎麼標註?
    一般數據集裏面的都是隻有正向反饋,即只有標籤1,這時就需要進行負採樣,即採出標籤0來。採樣是針對每個用戶來進行的,對於每個用戶,負採樣的Item要遵循如下原則:
    (1)對每個用戶,要保證正負樣本的平衡(數目相似)。
    (2)對每個用戶採樣負樣本時,要選取那些很熱門,而用戶卻沒有行爲的物品。
  • 離線計算的空間複雜度:基於鄰域的方法需要維護一張離線的相關表。假設有M個用戶和N個物品,UserCF需要O(MM)O(M∗M)的空間,ItemCF需要O(NN)O(N∗N)的空間,而對於LFM,有F個隱類的話,需要O(F(M+N))O(F∗(M+N))的空間
  • LFM不太適合用於物品數非常龐大的系統,如果要用,我們也需要一個比較快的算法給用戶先計算一個比較小的候選列表,然後再用LFM重新排名。另一方面,LFM在生成一個用戶推薦列表時速度太慢,因此不能在線實時計算,而需要離線將所有用戶的推薦結果事先計算好存儲在數據庫中。因此,LFM不能進行在線實時推薦,也就是說,當用戶有了新的行爲後,他的推薦列表不會發生變化。

圖召回

PersonalRank

在這裏插入圖片描述
在這裏插入圖片描述

圖嵌入

  • deepwalk
  • line
    相比DeepWalk純粹隨機遊走的序列生成方式,LINE可以應用於有向圖、無向圖以及邊有權重的網絡,並通過將一階、二階的鄰近關係引入目標函數,能夠使最終學出的node embedding的分佈更爲均衡平滑,避免DeepWalk容易使node embedding聚集的情況發生。
  • node2vec
    在這裏插入圖片描述
  • SDNE
    相比於node2vec對遊走方式的改進,SDNE模型主要從目標函數的設計上解決embedding網絡的局部結構和全局結構的問題。而相比LINE分開學習局部結構和全局結構的做法,SDNE一次性的進行了整體的優化,更有利於獲取整體最優的embedding。
  • 阿里EGES
    阿里通過引入side information解決embedding問題非常棘手的冷啓動問題,不同的side information有權重。
    在這裏插入圖片描述

圖神經網絡模型召回

知識圖譜是圖神經網絡的特例,但是,知識圖譜編碼的是靜態知識,而不是用戶直接的行爲數據,和具體應用距離較遠,這可能是導致兩者在推薦領域表現差異的主要原因
在這裏插入圖片描述
知識圖譜其實是圖神經網絡的一個比較特殊的具體實例,但是,知識圖譜因爲編碼的是靜態知識,而不是用戶比較直接的行爲數據,和具體應用距離比較遠,這可能是導致兩者在推薦領域表現差異的主要原因。信息在圖中的傳播性,所以對於推薦的冷啓動以及數據稀疏場景應該特別有用。
圖神經網絡做推薦,因爲需要全局信息,所以計算速度是個問題
GraphSAGE 則通過一些手段比如從臨近節點進行採樣等減少計算規模,加快計算速度,很多後期改進計算效率的方法都是從這個工作衍生的;而 PinSage 在 GraphSAGE 基礎上 ( 這是同一撥人做的 ),進一步採取大規模分佈式計算,拓展了圖計算的實用性,可以計算 Pinterest 的30億規模節點、180億規模邊的巨型圖,併產生了較好的落地效果。

item2vec(embedding)

思想:用戶、物品分別embedding
好處:多路召回每路截斷條數的超參個性化問題等會自然被消解掉
壞處:召回內容頭部問題(訓練數據對頭部領域的降採樣,減少某些領域主導,以及在模型角度鼓勵多樣性等不同的方法)
注意:召回階段使用模型召回,也應該同步採用和排序模型相同的優化目標,尤其是如果排序階段採用多目標優化的情況下,召回模型也應該對應採取相同的多目標優化。

FM模型召回

FM模型召回

  1. 離線訓練
    我們想要的其實是:每個特徵和這個特徵對應的訓練好的embedding向量
  2. 映射函數
    用戶特徵,物品特徵以及上下文特徵。
    用戶向量存入在線數據庫中比如Redis,物品向量存入Faiss(Facebook開源的embedding高效匹配庫)數據庫中

雙塔模型

在這裏插入圖片描述
在這裏插入圖片描述

aribnb的embedding策略

  1. click session:切片點擊序列,然後每個序列用w2v來embedding。序列要求(停留時間超過30s纔是有效物品;超過30分鐘沒有動作就切片)。
  2. book session:購買行爲很稀疏(總量小,單一用戶行爲少),所以不能用w2v那一套,只能基於某些屬性規則做相似user和相似listing的聚合。

用戶行爲序列召回

輸入是用戶行爲過的物品序列,可以只用物品 ID 表徵,也可以融入物品的 Side Information,需要通過一定的方法把這些進行糅合到一個 embedding 裏,代表了用戶興趣。
GRU ( RNN 的變體模型 ) 可能是聚合用戶行爲序列效果最好又比較簡單的模型
在這裏插入圖片描述
用戶往往是多興趣的,所以又引申出了多興趣拆分。

多興趣拆分

用戶多興趣拆分與用戶行爲序列召回相比,輸入是一樣的,輸出不同,由輸出單獨一個用戶 embedding,換成輸出多個用戶興趣 embedding
把不同的 Item,聚類到不同的興趣類別裏去,聚類方法常用膠囊網絡和 Memory Network

知識圖譜融合

用於做推薦,一般有兩大類知識圖譜融合模式:知識圖譜 Embedding 模式 ( KGE ) 及圖路徑模式

  • 知識圖譜 Embedding 模式:用 TransE 將節點和邊轉換成 Embedding ,計算距離擴展物品的信息含量。(可解釋性不佳)
  • 圖路徑模式:人工定義的知識圖譜中知識的關聯和傳播模式,通過中間屬性來對知識傳播進行路徑搭建(效果不好)

深度樹TDM

在這裏插入圖片描述

  • 檢索方法是自頂向下Beam Search
  • 如何對每層選取Top-K節點,具體做法就如上圖中的紅色框的部分,該部分的輸入包括用戶的歷史行爲特徵以及節點的Embedding特徵,在對每一層選取Top-K的時候,需要將這一層的每一個節點輸入左側模型中得到相應的預測分數,最終根據分數來取Top。(涉及到對負樣本的採樣操作)
  • 在初始化樹結構的時候,首先借助商品的類別信息進行排序,將相同類別的商品放到一起,然後遞歸的將同類別中的商品等量的分到兩個子類中,直到集合中只包含一項,利用這種自頂向下的方式來初始化一棵樹。基於該樹採樣生成深度模型訓練所需的樣本,然後進一步訓練模型,訓練結束之後可以得到每個樹節點對應的Embedding向量,利用節點的Embedding向量,採用K-Means聚類方法來重新構建一顆樹,最後基於這顆新生成的樹,重新訓練深層網絡

因子分解排序

FM

FM和樹模型都能夠自動學習特徵交叉組合,但樹的模型只適合連續型或值空間較小的稀疏數據;另一方面樹模型也不能學習到訓練數據中很少或沒有出現的特徵組合,因爲樹模型只是對歷史的一個記憶,泛化能力較弱。相反,FM模型因爲通過隱向量的內積來提取特徵組合,對於訓練數據中很少或沒有出現的特徵組合也能夠學習到

FM可以解決特徵組合以及高維稀疏矩陣問題
在這裏插入圖片描述
在這裏插入圖片描述

FFM

FM模型中,每一個特徵對應一個向量;FFM中認爲每一個特徵對於每一個域field對應一個向量。
在這裏插入圖片描述
在這裏插入圖片描述
FFM的組合特徵有10項,如下圖所示
在這裏插入圖片描述
其中,紅色是field編號,藍色是特徵編號

樹模型排序

GBDT+LR

facebook採用了這個模型,樹的數量《=500,每棵樹的節點《=12,大致有三種組合方案

  1. 離散特徵onehot + 連續特徵gbdt
  2. 低頻離散特徵onehot + 連續特徵/高頻離散特徵 gbdt
  3. 原始特徵onehot + ID類gbdt + 非id類gbdt
    在這裏插入圖片描述
    【LR特徵如何處理】爲了讓線性模型能夠學習到原始特徵與擬合目標之間的非線性關係,通常需要對原始特徵做一些非線性轉換。常用的轉換方法包括:特徵聚類、連續特徵離散化(包括等頻離散、等間距離散,或者採用樹模型通過gain來找到最優分裂點進行劃分)、特徵交叉(數值累加、累乘,類目組合等)等

【爲什麼建樹採用GBDT而非RF】:很多實踐證明GBDT的效果要優於RF,且GBDT前面的樹,特徵分裂主要體現對多數樣本有區分度的特徵;後面的樹,主要體現的是經過前N顆樹,殘差仍然較大的少數樣本。優先選用在整體上有區分度的特徵,再選用針對少數樣本有區分度的特徵,思路更加合理,這應該也是用GBDT的原因

  • gbdt只是歷史記憶,沒有泛化能力

深度模型排序

發展歷程可以參考我的文章推薦算法—ctr預估
這裏只畫出結構,寫一些面試注意點

  • LR模型採用原始人工特徵交叉
  • FM自動學習xi和xj的二階交叉特徵
  • PNN用內積、外積做二階交叉
  • NFM、AFM採用BI-Interaction方式學習二階交叉
  • 更高階:DCN,任意進行特徵交叉,且不增加網絡參數
  • DIN在embeeding層後做了一個action unit操作,對用戶的興趣分佈進行學習後再輸入DNN

FNN

在這裏插入圖片描述

  • 利用DNN優化高階特徵
  • wide deep的深度部分就是這樣的結構

Wide Deep

在這裏插入圖片描述
特徵工程後的離散特徵:線性模型
離散+連續:DNN

Deepfm

在這裏插入圖片描述
離散+連續:線性模型
離散:FM
離散+連續:DNN

PNN

在這裏插入圖片描述

  • z是embedding層的複製,p有IPNN和OPNN兩種
  • embbeding大小:M,filed大小:N
  • IPNN是內積,OPNN是矩陣

NFM

在這裏插入圖片描述

  • Bi-Interaction Layer名字挺高大上的,其實它就是計算FM中的二次項的過程

AFM

在這裏插入圖片描述

  • attention相等於加權的過程,因此我們的預測公式變爲在這裏插入圖片描述
    圓圈中有個點的符號代表的含義是element-wise product
    在這裏插入圖片描述
  • 後面兩部分,則是AFM的創新所在,也就是我們的Attention net
    在這裏插入圖片描述
  • 沒經過DNN

DCN

  • 提出了一種新的交叉網絡,在每個層上明確地應用特徵交叉,有效地學習有界度的預測交叉特徵,並且不需要手工特徵工程或窮舉搜索
    在這裏插入圖片描述
    交叉層:
    交叉維度爲L層交叉網絡層數L + 1
    在這裏插入圖片描述
    在這裏插入圖片描述

MLR

用分片線性的模式來擬合高維空間的非線性分類面
在這裏插入圖片描述

  • MLR在建模時引入了L1和L2,模型具有較高的稀疏度, 模型的學習和在線預測性能更好

DIN

在這裏插入圖片描述

  • 用戶特徵、用戶行爲特徵、廣告特徵、上下文特徵
  • embedding之後,使用weighted-sum,即attention
    在這裏插入圖片描述
  • 評價指標是GAUC
    在這裏插入圖片描述
    根據用戶的展示數或者點擊數來對每個用戶的AUC進行加權處理
  • Dice激活函數。
    PRelu、Relu 認爲分割點都是0,Dice每一個yi對應了一個概率值pi,pi的計算主要分爲兩步:將yi進行標準化和進行sigmoid變換
    在這裏插入圖片描述
  • 自適應正則。針對feature id出現的頻率,來自適應的調整他們正則化的強度;對於出現頻率高的,給與較小的正則化強度;對於出現頻率低的,給予較大的正則化強度

DIEN

在這裏插入圖片描述

  • DIN沒有考慮用戶歷史之間的時序關係, DIEN則使用了GRU來建模用戶歷史的時間序列
  • 用戶歷史肯定是一個時間序列,將其喂入RNN,則最後一個狀態可以認爲包含了所有歷史信息。因此,作者用一個雙層的GRU來建模用戶興趣。
  • 將用戶歷史接觸過的item embedding微量,喂進第一層GRU,輸出的就是用戶各時刻的興趣。這一層被稱爲Interest Extraction Layer
  • 將第一層的輸出,喂進第二層GRU,並用attention score(基於第一層的輸出向量與候選物料計算得出)來控制第二層的GRU的update gate。這一層叫做Interest Evolving Layer。
  • Interest Evolving Layer的最後一個狀態作爲用戶興趣的向量表示,與ad, context的特徵一同喂入MLP,預測點擊率。

DSIN

DSIN
在這裏插入圖片描述
主要貢獻在於對用戶的歷史點擊行爲劃分爲不同session,對每個session使用Transformer學習session embedding,最後使用BiLSTM對session序列建模

  • Session Division Layer是對用戶的歷史行爲劃分到不同session
    將間隔超過30分鐘作爲session的劃分。
  • Session Interest Interacting Layer是學習session之間的表徵
    相同session內的行爲是高度相關的,在session內的一些隨意行爲會偏離整個session表達。爲了刻畫相同session內行爲間的相關性,同時減小不相關行爲的影響。
    DSIN使用multi-head self-attention對每個session建模。爲了刻畫不同session間的順序,DSIN使用了Bias Encoding
    Bias Encoding:
    在這裏插入圖片描述
    multi-head self-attention:
    將第k個session劃分爲H個head
  • Session Interest Interacting Layer是學習session之間的演變
    使用雙向LSTM建模session之間的演變
  • Session Interest Activating Layer是學習當前item和歷史點擊session的相關性
    通過Attention機制刻畫Item和session之間的相關性。用戶的session與目標物品越相近,越應該賦予更大的權重

MIND

召回階段建模表達用戶的多樣興趣
既然使用一個向量表達用戶多樣興趣有困難,那麼爲什麼不使用一組向量呢?具體來說,如果我們可以對用戶歷史行爲的embedding進行聚類,聚類後的每個簇代表用戶的一組興趣

膠囊網絡(Capsule Network)
Capsule輸入是一組向量,對這組向量進行仿射變換之後求加權和,把加權和輸入非線性激活函數得到一個向量的輸出
如果我們K個capsule,就會有K個輸出向量
在這裏插入圖片描述
在這裏插入圖片描述

MIMN

  • UIC的提出:( 背景)存儲用戶行爲序列需要空間太大,且RNN類模型速度慢。(改進)於是構建了一個單獨的模塊UIC來完成用戶行爲序列的建模計算工作。UIC server負責存儲每個用戶最近的行爲興趣,而且UIC server的核心在於其更新策略,即用戶行爲序列的更新只依賴於具體的觸發事件,而不依賴於請求。
  • 一方面是NTM中基本的memory read和memory write操作;另一方面是爲提取高階信息而採用多通道GRU的memory induction unit。網絡的右側則爲傳統的embedding+MLP的經典結構

DMR

DMR(Deep Match to Rank)
通過User-to-Item子網絡和Item-to-Item子網絡來表徵U2I相關性,進一步提升模型的表達能力
在這裏插入圖片描述

工程經驗

負採樣

負採樣帶來的問題是CTR預估值的漂移,,比如真實CTR是0.1%,進行0.01的負採樣之後,CTR將會攀升到10%左右。而爲了進行準確的競價以及ROI預估等,CTR預估模型是要提供準確的有物理意義的CTR值的。
在這裏插入圖片描述
其中q是校正後的CTR,p是模型的預估CTR,w是負採樣頻率。大家可以利用簡單的轉換關係就可以得出上述公式,有興趣的同學可以手動推導一下。

在線學習算法FTRL

在這裏插入圖片描述
FTRL是對w每一維分開訓練更新的,每一維使用的是不同的學習速率,這種方法考慮了訓練樣本本身在不同特徵上分佈的不均勻性。(對於稀疏特徵很好)。

  • predict:L1範數加策略,訓練結果w很稀疏,在用w做predict的時候節省了內存(w很小的時候就爲0)
  • training:先採樣減少負樣本數目,在訓練的時候再用權重彌補負樣本;在線丟棄訓練數據中很少出現的特徵

模型的實效性問題和更新策略

  1. gbdt爲例,GBDT的部分幾天更新一次,而LR的部分進行準實時的更新。
  2. 雙塔模型,embedding離線訓練存儲好,線上實現LR或淺層NN
  3. PMML。達到End2End訓練+End2End部署,PMML的全稱是“預測模型標記語言”,是一種通用的以XML的形式表示不同模型結構參數的標記語言。
  4. TensorFlow Serving。利用TensorFlow自帶的模型序列化函數可將訓練好的模型參數和結構保存至某文件路徑。最便捷的serving方式是使用Docker建立模型Serving API

線上評估方法

在這裏插入圖片描述

必須要考慮位置偏差的存在,避免來自算法A的視頻總排在第一位。因此需要以相等的概率讓算法A和算法B交替領先

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章