推薦算法之用矩陣分解作協調過濾——LFM模型

隱語義模型(Latent factor model,如下簡稱LFM),是推薦系統領域上普遍使用的算法。它將矩陣分解應用於推薦算法推到了新的高度,在推薦算法歷史上留下了光輝燦爛的一筆。本文將對 LFM 原理進行詳細闡述,給出其基本算法原理。此外,還將介紹使得隱語義模型聲名大噪的算法FunkSVD和在其基礎上改進較爲成功的BiasSVD。最後,對LFM進行一個較爲全面的總結。html

1. 矩陣分解應用於推薦算法要解決的問題

在推薦系統中,咱們常常可能面臨的場景是:現有大量用戶和物品,以及少部分用戶對少部分物品的評分,咱們須要使用現有的用戶對少部分物品的評分去推測用戶對物品集中其餘物品的可能的評分,從而將預測中評分高的物品推薦給用戶。例以下面的用戶物品評分表:git

用戶\物品 物品 1 物品 2 物品 3 物品 4 物品 5
用戶 1 3 2
用戶 2 1 2 6
用戶 3 3 4 6
用戶 4 1 2 5
用戶 5 4 2 3

對於每一個用戶,咱們但願較準確的預測出其對未評分物品的評分。將m個用戶和n個物品的評分看作一個矩陣M,從而將矩陣分解應用到該場景,便可解決這一問題。而本文,將關注於矩陣分解用於到推薦的方法之一,即LFM算法的解決方案。github

2. LFM

LFM算法的核心思想是經過隱含特徵(Latent factor)聯繫用戶和物品,該算法最先在文本挖掘領域中被提出用於找到文本的隱含語義,相關名詞還有LDATopic Model等。算法

2.1 如何表示用戶的偏好和物品(item)屬性?

在被問到這個問題時,針對MovieLens(電影評分)數據集,你可能會說用戶是否喜歡動做片,物品所屬電影類型去回答。但用戶對其餘類型的電影的偏好程度呢?物品在其它類型所佔的權重又是多少呢?就算針對現有的電影類型去表徵用戶偏好和物品,那麼可否可以徹底的表示出用戶的偏好和物品屬性呢?答案是不能,好比用戶喜歡當作龍的電影這個偏好無法表示出來,電影由誰導演,主演是誰無法表示。但你要問我用哪些屬性去表徵呢?這個誰也沒法給出一個很好的答案,粒度很難控制。數據庫

2.2 LFM 來救場

隱語義模型較好的解決了該問題,它從數據出發,經過基於用戶行爲統計的自動聚類,可指定出表徵用戶偏好和物品的向量維度,最終獲得用戶的偏好向量以及物品的表徵向量。LFM經過如下公式計算用戶u對物品i的偏好:
\[ preference(u, i)=p^T_u q_i=\sum_f^F{p_{u,k}q_{i,k}} \]
這個公式,\(p_{u,k}\)度量了用戶u的偏好和第f個隱類的關係,\(q_{i,k}\)度量了物品i和第f個隱類的關係。編程

那麼如今,咱們指望用戶的評分矩陣M這樣分解:
\[ M_{m*n}=P^T_{m*k}Q_{k*n} \]
那麼,咱們如何將矩陣分解呢?這裏採用了線性迴歸的思想,即儘量的讓用戶的評分和咱們預測的評分的殘差儘量小,也就是說,能夠用均方差做爲損失函數來尋找最終的PQ。考慮全部的用戶和樣本的組合,咱們指望的最小化損失函數爲:
\[ \sum_{i,j}{(m_{ij}-p_i^Tq_j)^2} \]
只要咱們可以最小化上面的式子,並求出極值所對應的\(p_i\)\(q_j\),則咱們最終能夠獲得矩陣PQ,那麼對於任意矩陣M任意一個空白評分的位置,咱們就能夠經過\(p^T_i q_j\)計算預測評分。機器學習

2.3 FunkSVD用於推薦

上面是隱語義模型LFM的基本原理,但在實際業務中,爲防止過擬合,咱們經常會加入一個L2的正則化項,這也就誕生了咱們的FunkSVD算法。其優化目標函數\(J(p,q)\)定義爲:
\[ \underbrace{argmin}_{p_i,q_j}\sum_{i,j}{(m_{ij}-p^T_iq_j)^2+\lambda({\Arrowvert{p_i}\Arrowvert}^2_2+{\Arrowvert{q_i}\Arrowvert}^2_2)} \]
其中λ爲正則化係數,須要調參。對於這個優化問題,咱們通常經過梯度降低法來進行優化獲得結果。函數

將上式分別對\(p_i\)\(q_j\)求導咱們獲得:
\[ \frac{\partial{J}}{\partial{p_i}}=-2(m_{ij}-p^T_iq_j)q_j+2\lambda{p_i} \]學習

\[ \frac{\partial{J}}{\partial{q_j}}=-2(m_{ij}-p^T_iq_j)p_i+2\lambda{q_j} \]優化

則梯度降低中迭代公式爲:
\[ p_i = p_i +\alpha((m_{ij}-p^T_iq_j)q_j-\lambda{p_i}) \]

\[ q_j = q_j+\alpha((m_{ij}-p^T_iq_j)p_i-\lambda{q_j}) \]

經過迭代咱們最終能夠獲得PQ,進而用於推薦。

爲讀者進一步理解,筆者實現了基於MovieLens數據集實現了該方法。代碼詳見github: FunkSVD算法實現

2.4 BiasSVD用於推薦

BiasSVDFunkSVD較爲成功的改進版算法。BiasSVD假設評分系統包括三部分的偏置因素:一些和用戶物品無關的評分因素。用戶有一些和物品無關的評分因素,稱爲用戶偏置項。而物品也有一些和用戶無關的評分因素,稱爲物品偏置項。這很好理解,對於樂觀的用戶來講,它的評分行爲廣泛偏高,而對批判性用戶來講,他的評分記錄廣泛偏低,即便他們對同一物品的評分相同,可是他們對該物品的喜愛程度卻並不同。同理,對物品來講,以電影爲例,受大衆歡迎的電影獲得的評分廣泛偏高,而一些爛片的評分廣泛偏低,這些因素都是獨立於用戶或產品的因素,而和用戶對產品的的喜愛無關。

假設評分系統平均分爲μ,第i個用戶的用戶偏置項爲\(b_i\),而第j個物品的物品偏置項爲\(b_j\),則加入了偏置項之後的優化目標函數\(J(p_i,q_j)\)是這樣的:
\[ \underbrace{argmin}_{p_i,q_j}\sum_{i,j}{(m_{ij}-p^T_iq_j-u-b_i-b_j)^2+\lambda({\Arrowvert{p_i}\Arrowvert}^2_2+{\Arrowvert{q_i}\Arrowvert}^2_2+{\Arrowvert{b_i}\Arrowvert}^2_2+{\Arrowvert{b_j}\Arrowvert}^2_2)} \]
這個優化目標也能夠採用梯度降低法求解。和·FunkSVD不一樣的是,此時咱們多了兩個偏執項\(b_i\)\(b_j\)\(p_i\)\(q_j\)的迭代公式和FunkSVD相似,只是每一步的梯度導數稍有不一樣而已。\(b_i\)\(b_j\)通常能夠初始設置爲0,而後參與迭代。迭代公式爲:
\[ p_i = p_i +\alpha((m_{ij}-p^T_iq_j-u-b_i-b_j)q_j-\lambda{p_i}) \]

\[ q_j = q_j+\alpha((m_{ij}-p^T_iq_j-u-b_i-b_j)p_i-\lambda{q_j}) \]

\[ b_i=b_i+\alpha(m_{ij}-p^T_iq_j-u-b_i-b_j-\lambda{b_i}) \]

\[ b_j=b_j+\alpha(m_{ij}-p^T_iq_j-u-b_i-b_j-\lambda{b_j}) \]

經過迭代咱們最終能夠獲得PQ,進而用於推薦。BiasSVD增長了一些額外因素的考慮,所以在某些場景會比FunkSVD表現好。

爲讀者進一步理解,筆者實現了基於MovieLens數據集實現了該方法。代碼詳見githubBiasSVD算法實現

小結

LFM 是一種基於機器學習的方法,具備比較好的理論基礎,經過優化一個設定的指標創建最優的模型。它實質上是矩陣分解應用到推薦的方法,其中FunkSVD更是將矩陣分解用於推薦方法推到了新的高度,在實際應用中使用很是普遍。固然矩陣分解方法也在不停的進步,目前矩陣分解推薦算法中分解機方法(matrix factorization, MF)使用最爲普遍。

對於矩陣分解用於推薦方法自己來講,它容易編程實現,實現複雜度低,預測效果也好,同時還能保持擴展性。這些都是其寶貴的優勢。可是LFM沒法給出很好的推薦解釋,它計算出的隱類雖然在語義上確實表明了一類興趣和物品,卻很難用天然語言描述並生成解釋展示給用戶。

LFM 在建模過程當中,假設有 M 個用戶、 N 個物品、 K 條用戶對物品的行爲記錄,若是是 F 個隱類,那麼它離線計算的空間複雜度是$ O(F(M+N))$ ,迭代 S次則時間複雜度爲\(O(K * F * S)\)。當 M(用戶數量)和 N*(物品數量)很大時LFM相對於ItemCFUserCF能夠很好地節省離線計算的內存,在時間複雜度因爲LFM會屢次迭代上因此和ItemCFUserCF沒有質的差異。

同時,遺憾的是,LFM沒法進行在線實時推薦,即當用戶有了新的行爲後,他的推薦列表不會發生變化。而從 LFM的預測公式能夠看到, LFM 在給用戶生成推薦列表時,須要計算用戶對全部物品的興趣權重,而後排名,返回權重最大的 N 個物品。那麼,在物品數不少時,這一過程的時間複雜度很是高,可達 \(O(M*N*F)\) 。所以, LFM 不太適合用於物品數很是龐大的系統,若是要用,咱們也須要一個比較快的算法給用戶先計算一個比較小的候選列表,而後再用LFM 從新排名。另外一方面,LFM 在生成一個用戶推薦列表時速度太慢,所以不能在線實時計算,而須要離線將全部用戶的推薦結果事先計算好存儲在數據庫中。

參考:

(歡迎轉載,轉載請註明出處。歡迎溝通交流: losstie@outlook.com)

相關文章
相關標籤/搜索