推薦系統學習 - (1)基本算法

最近想了解下推薦系統,閱讀了《推薦系統實踐》(項亮),本文簡單介紹推薦系統常用算法的原理,大部分內容來自項亮大牛的書籍。

1. 推薦系統簡介

1.1 推薦系統是什麼?

隨着信息技術的發展,互聯網上的信息量快速增長。爲了在衆多信息中找到想要的內容,常用的方式有——

  • 分類目錄,如雅虎、hao123,將網站分門別類,但只能覆蓋熱門網站
  • 搜索引擎,如谷歌、百度

與分類目錄和搜索引擎相同,推薦系統也是一種針對信息過載的解決方案,通過分析用戶的行爲、興趣等數據,主動給用戶推薦滿足其興趣和需求的信息,區別在於——

  • 對用戶來說,用戶不需要主動提供明確的需求,推薦系統會根據其歷史行爲等數據建模,主動推薦信息
  • 對信息來說,推薦系統可以更好地挖掘長尾信息,而不僅僅是熱門信息

推薦系統已經在很多互聯網產品中使用,常見的使用場景有——

  • 電子商務,如淘寶的【猜你喜歡】和【類似商品推薦】
  • 視頻網站,如愛奇藝的【猜你在追】和【精彩推薦】,短視頻、小說、漫畫等內容產品也類似
  • 音樂應用,如豆瓣FM、QQ音樂的【個性電臺】,根據收聽歷史推薦歌曲
  • 社交網絡,如QQ的【好友推薦】,或利用社交網絡推薦信息給用戶
  • 基於位置的服務,如美團推薦附近的美食
  • 個性化廣告,根據用戶的興趣,給不同用戶投放不同的廣告

1.2 推薦系統的類型

推薦系統根據優化目標的不同,常被分爲兩種類型——

  • 評分預測問題,即給定物品,預測用戶對其的打分情況,如Netflix的電影推薦。在評分預測問題中,損失函數是均方根誤差RMSE,最終推薦給用戶的物品是用戶對其打分最高(最喜歡)的物品
  • TopN問題,是指使用打分函數對物品進行排序,給出N個用戶最可能選擇的物品列表

由於早期推薦系統研究是基於電影評分數據的評分預測問題,因此絕大多數推薦系統研究都是基於用戶評分數據的評分預測。而在實際應用中,TopN問題更加常用,原因在於——

  • 評分預測問題依賴用戶對物品的評分這類顯性數據,而大多數場景下我們只有用戶瀏覽行爲等隱性數據
  • 推薦系統的目的是找到用戶感興趣的電影,預測用戶是否會觀看電影比預測用戶觀看電影后的評分更重要,可能存在電影用戶看過後會打出高分,但用戶看的可能性非常小

本文介紹的推薦系統算法是用於求解TopN問題的。

2. 推薦系統常用算法

實現推薦系統的算法有很多,但大致可分爲三類,下面會依次介紹其基本原理。

在介紹的過程中,使用的數據爲用戶的隱性數據,如瀏覽行爲。

2.1 協同過濾算法

協同過濾算法(也稱爲基於鄰域的算法)分爲兩大類,分別是基於用戶的協同過濾(UserCF)和基於物品的協同過濾(ItemCF),是推薦系統中最經典的算法。

2.1.1 UserCF基礎算法

UserCF的思想是根據用戶行爲數據,找到與目標用戶有相似興趣的其他用戶,給用戶推薦其他用戶喜歡的物品。

其算法流程分爲兩步:

  1. 找到與目標用戶興趣相似的K個用戶集合,計算用戶相似度可以使用餘弦相似度,如下:

wuv=N(u)N(v)N(u)N(v)N(u)u w_{uv}=\frac{|N(u)\cap N(v)|}{\sqrt{|N(u)||N(v)|}}\\其中,N(u)表示用戶u產生過行爲的物品集合

  1. 在最相似的K個用戶中找到他們喜歡且目標用戶沒有產生過行爲的物品,用以下公式計算用戶 uu 對物品 ii感興趣程度排序後推薦前N個物品給目標用戶:

p(u,i)=vS(u,K)N(i)wuvrvi,S(u,K)uK,N(i)i,rvivi,rvi1 p(u,i)=\sum_{v\in S(u,K)\cap N(i)}w_{uv}r_{vi}\\ 其中,S(u,K)是用戶u最相似的K個用戶集合,N(i)爲對i有過行爲的用戶集合,\\ r_{vi}爲用戶v對物品i的評分,由於數據爲隱性數據而不是評分數據,r_{vi}設爲常數1

這樣,就可以得到目標用戶最感興趣的TopN物品列表。

2.1.2 ItemCF基礎算法

ItemCF的思想是根據用戶行爲數據,計算物品間的相似度,基於用戶以往的喜好記錄,推薦給用戶相似的物品。

其算法流程分爲兩步:

  1. 計算物品之間的相似度,可使用餘弦相似度,如下:

wij=N(i)N(j)N(i)N(j)N(i)i w_{ij}=\frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}}\\其中,N(i)表示對物品i產生過行爲的用戶集合

  1. 用如下共識計算目標用戶 uu 對物品 jj 的感興趣程度,排序後推薦前N個物品給目標用戶。從公式可以看到,與用戶喜歡過的物品越相似,計算的值越高

puj=iN(u)S(j,K)wijrui p_{uj}=\sum_{i \in N(u)\cap S(j,K)}w_{ij}r_{ui}

這樣,就可以得到目標用戶最感興趣的TopN物品列表。

2.1.3 相似度修正

上述介紹的算法是比較簡單和原始的版本,使用的數據也只有用戶的行爲數據。

實際場景中,用戶的畫像信息、物品的屬性、時間空間信息都會加入考慮,算法也會相應地改進以適應實際需求。

以上述介紹的用戶相似度計算方式爲例,在實際場景中,我們認爲熱門物品對相似度的貢獻比冷門物品小,也就是兩個人對冷門物品都產生過行爲更能說明興趣相似,因此用戶相似度可以如下對熱門物品做懲罰:
wuv=iN(u)N(v)log11+N(i)N(u)N(v)N(u)u,N(i)i w_{uv}=\frac{\sum_{i\in N(u)\cap N(v)} log\frac{1}{1+|N(i)|}}{\sqrt{|N(u)||N(v)|}}\\其中,N(u)表示用戶u產生過行爲的物品集合,N(i)表示對物品i產生過行爲的用戶集合
類似地,在物品相似度中認爲活躍用戶的貢獻小於非活躍用戶,因此物品相似度可以如下對活躍用戶做懲罰:
wij=uN(i)N(j)log11+N(u)N(i)N(j)N(u)u,N(i)i w_{ij}=\frac{\sum_{u \in N(i)\cap N(j)}log \frac{1}{1+|N(u)|}}{\sqrt{|N(i)||N(j)|}}\\其中,N(u)表示用戶u產生過行爲的物品集合,N(i)表示對物品i產生過行爲的用戶集合

2.1.4 UserCF與ItemCF對比

從上述UserCF與ItemCF的原理看,UserCF的推薦結果反映了與目標用戶興趣相似的小羣體的熱點,ItemCF的推薦結果是維護目標用戶的歷史興趣,從不同角度對比如下:
在這裏插入圖片描述
UserCF常在新聞網站中使用,因爲新聞數量很多,時效性很強,且從冷啓動角度看,新的新聞出現後可快速用於推薦;

ItemCF則在電商、視頻網站中使用,在這些網站中物品不容易過時,用戶的興趣也更持久。

2.2 隱語義模型

LFM(Latent Factor Model),隱語義模型是推薦系統中很熱門的研究話題。

隱語義模型最開始是在NLP領域中使用,用於找到文本的隱含語義,相關的主題模型有LSA、pLSA、LDA等,在這篇回答中解釋得很清楚,建議看一下:既然 LDA 是一種比 PLSA 更高級的模型,爲啥百度還在用 PLSA?

在NLP的主題模型中,通過在單詞與文檔之間引入 【主題】 這一隱含變量,來挖掘文本的語義,比如在上面回答中舉到的例子:

文本1:“馬雲、馬化騰和李彥宏”

文本2:“阿里巴巴、騰訊和百度掌門人”

如果通過單詞來計算兩個文本的距離,可能會得出兩個文本完全不相關的結論。

但若把兩個文本的 【主題】 抽離出來,會得到“企業家”、“互聯網”、“BAT”等等這些主題,這樣就發現兩句話主題上是完全相同的,由此可知這兩句話具有很高的相似性。

將LFM應用到推薦系統中,則是在用戶和物品之間引入【類別】這一隱含變量——對於某個用戶,首先得到他的興趣分類,再從屬於該分類的物品中挑選他可能喜歡的物品。

2.2.1 算法原理

假設用戶的興趣分類(或物品的分類)有 FF 種,用如下公式表示用戶對物品的感興趣程度——
Preference(u,i)=rui=puqi=k=1Fpu,kqk,i Preference(u,i)=r_{ui}=p_uq_i=\sum_{k=1}^{F}p_{u,k}q_{k,i}
其中 ruir_{ui} 表示用戶是否對物品 ii 產生行爲,pup_u 是用戶-分類矩陣 PP 的第 uu 行,表示用戶 uu 與各個興趣分類的關係,qiq_i 是分類-物品矩陣 QQ 的第 ii 列,表示物品 ii 與各個興趣分類的關係。

因此,只要求解出兩個矩陣 PPQQ,根據感興趣程度的排序就可以推薦TopN列表給目標用戶。

求解過程如下:

  1. 由於我們的數據是隱性數據,即只有用戶對哪些物品產生過行爲,對應的 rui=1r_{ui} = 1,爲了求解矩陣,需要先按如下原則採集負樣本,對應的 rui=0r_{ui}=0——
  • 對每個用戶,保證正負樣本數平衡
  • 對每個用戶採集負樣本時,要選取熱門但用戶沒有行爲的物品
  1. 得到正負樣本後,則需要最小化以下損失函數,其中後兩項爲防止過擬合的正則化項

C=(ruir^ui)2+λpu2+λqi2=(ruik=1Fpu,kqk,i)2+λpu2+λqi2 C=\sum(r_{ui}-\hat r_{ui})^2+\lambda||p_u||^2+\lambda||q_i||^2=\sum(r_{ui}-\sum_{k=1}^{F}p_{u,k}q_{k,i})^2+\lambda||p_u||^2+\lambda||q_i||^2

  1. 對參數求偏導,有

Cpu,k=2qk,i+2λpu,kCqk,i=2pu,k+2λqk,i \frac{\partial C}{\partial p_{u,k}}=-2q_{k,i}+2\lambda p_{u,k}\\ \frac{\partial C}{\partial q_{k,i}}=-2p_{u,k}+2\lambda q_{k,i}

  1. 使用梯度下降法,迭代求解參數值,遞推公式如下,其中 α\alpha 是學習速率

pu,k=pu,k+α(qk,iλpu,k)qk,i=qk,i+α(pu,kλqk,i) p_{u,k}=p_{u,k}+\alpha(q_{k,i}-\lambda p_{u,k})\\ q_{k,i}=q_{k,i}+\alpha(p_{u,k}-\lambda q_{k,i})

2.2.2 LFM與協同過濾對比
  • 離線計算的空間複雜度:UserCF需要計算用戶相似度表,空間複雜度爲O(M2)O(M^2),ItemCF需要計算物品相似度表,空間複雜度爲 O(N2)O(N^2)。而LFM存儲兩個矩陣,假設有 FF 個隱類,則空間複雜度爲 O(F(M+N))O(F*(M+N)),在用戶數或物品數很高的情況下,LFM所需空間小得多
  • 離線計算的時間複雜度:兩種算法時間複雜度沒有大的差別
  • 在線實時推薦:UserCF和ItemCF將相似度表緩存在內存中,可以在線進行實時推薦,如用戶喜歡新的物品後,ItemCF可以實時推薦類似的物品給該用戶;而LFM需要計算用戶對所有物品的感興趣程度,複雜度太高,無法實時推薦
  • 推薦結果解釋:ItemCF支持很好的推薦解釋,LFM這類神經網絡可解釋性則比較差

2.3 基於圖的模型

用戶行爲可以用二分圖表示,如下圖所示,很多圖的算法也可以應用到推薦系統上,此處介紹基於隨機遊走的PersonalRank算法
在這裏插入圖片描述
PersonalRank算法跟用於網頁排序的PageRank算法原理基本相同,其思路是,假設給用戶 uu 做推薦,可以從對應圖上的 vuv_u 節點出發進行隨機遊走,最終每個節點被訪問的概率(Rank值)會收斂,排序即可得到用戶的推薦列表。

隨機遊走的規則爲:

  1. 初始狀態下,vuv_u 節點的Rank值爲1,其餘節點爲0,每次遊走,節點上的Rank值也會傳遞到下一個節點

  2. 在每個節點上,有 α\alpha 的概率繼續隨機遊走,即以相等的概率遊走到該節點指向的任意節點上

    • 因此,傳遞到下一節點的Rank值期望Rank(v)out(v)\frac{Rank(v)}{|out(v)|}out(v)out(v) 爲節點 vv 指向的頂點集
    • 因此,每個節點可以得到的Rank值期望αvin(v)Rank(v)out(v)\alpha \sum_{v' \in in(v)} \frac{Rank(v')}{|out(v')|}in(v)in(v) 爲指向節點 vv 的頂點集
  3. 在每個節點上,剩餘有 1α1-\alpha 的概率回到 vuv_u 起點

    • 因此,起點 vuv_u 還可以得到額外的Rank值 v(1α)Rank(v)=1α\sum_v (1-\alpha) Rank(v)=1-\alpha

因此用迭代公式表達上述隨機遊走的過程如下:
Rank(v)={αvin(v)Rank(v)out(v)(vvu)(1α)+αvin(v)Rank(v)out(v)(v=vu) Rank(v)=\left\{ \begin{aligned} \alpha & \sum_{v' \in in(v)} \frac{Rank(v')}{|out(v')|}&(v \ne v_u) \\ ( & 1-\alpha) + \alpha \sum_{v' \in in(v)} \frac{Rank(v')}{|out(v')|} &(v=v_u) \end{aligned} \right.
基於圖的推薦算法(PersonalRank),這篇博客中有詳細的代碼實現和註釋,可以參考一下。

上述算法需要在全圖進行迭代,時間複雜度很高,可以通過轉化爲矩陣運算求解,此處不再說明。

Reference

  1. 《推薦系統實踐》,項亮
  2. 既然 LDA 是一種比 PLSA 更高級的模型,爲啥百度還在用 PLSA?
  3. 基於圖的推薦算法(PersonalRank)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章