本文為閱讀 MF 經典論文 Matrix Factorization Techniques for Recommender Systems 的筆記。
推薦系統算法
從推薦系統做推薦的依據,大體上可以將推薦系統分為兩種:
- 基於內容
- 協同過濾
基於內容的推薦算法
對於用戶,根據個人身份信息或者回答相關問題,來構造用戶的特征。對於物品,則根據物品自身的內容,或屬性來構造特征。例如電影,其特征可以是類型、風格、參演演員等等。有了用戶信息和物品信息之后,將兩者特征向量化,然后用某種策略,來給各個用戶匹配合適的物品。
基於內容的推薦系統,需要較多的領域知識。用戶和物品的特征需要針對不同場景來選擇和設計。
協同過濾推薦算法
協同過濾算法依賴於用戶過去的行為信息,過去的購買記錄、點贊記錄、評分等等。協同過濾類的算法往往和領域無關,因為它不直接分析用戶和物品自身的屬性,只是基於用戶與物品之間的交互信息(用戶行為)來生成推薦。
協同過濾算法又可分為兩大類:
1. Neighborhood methods
這類方法會尋找相似用戶或相似物品,以相似關系為依據來生成推薦。包括 Item-based CF 和 User-based CF 兩類。
2. Latent factor models
latent factor models 也基於 user-item 評分矩陣,但它並不用此矩陣來計算 user 或 item 間的相似度。而是用這個矩陣找出隱因素(factors),比如在電影推薦領域,喜劇、悲劇、動作、情感等都是會影響用戶是否喜歡某特征。
latent factor models 通常采用矩陣分解的方法,將 user-item 評分矩陣分解為 user 和 item 矩陣。
圖片來自於 推薦系統之矩陣分解模型
user 矩陣的各行是 user 的向量表示 \(p_u\),item 矩陣各列是 item 的向量表示 \(q_i\)。user 和 item 向量的每一維代表一種隱因子的強度。矩陣分解時可以控制 user 和 item 向量的維度,即控制隱因子的數量。
假如第一維代表的隱因子是電影的喜劇,那么 user 向量第一維的值表示該用戶喜歡喜劇的程度,而 item 向量的第一維代表電影的喜劇成分的多少。
user 和 item 向量的內積就是 user 對 item 的評分,可以看出 user 和 item 向量越契合,即 item 的各種特征恰好是 user 喜歡的,那么評分就高。
矩陣分解
矩陣分解的策略有很多,常見的有 SVD (Singular Value Decomposition),NMF (Nonnegative Matrix Factorization) 等。
因為 user-item 矩陣往往是非常稀疏的,直接采用線性代數中的矩陣分解策略是行不通的。一種想法是利用矩陣中已有的值,期望 \(q_{i}^{T} p_{u}\) 盡可能地接近這些值。得到 user 和 item 矩陣后,就可以恢復出完整的 user-item 評分矩陣,以此預測 user 對於沒有評分過的 item 的評分。
這樣以來矩陣分解可以轉變成下面的優化問題:
對原評分矩陣中存在的值,希望 user 向量和 item 向量相乘后盡可能地接近該值。上式中另外加入了正則化項,防止過擬合。因為目的不單單是逼近 user-item 矩陣中存在的值,也希望能夠最好地預測未知的數。
解上面的優化問題,可以使用隨機梯度下降法,也可以使用交替最小二乘法。
隨機梯度下降法(Stochastic gradient descent, SGD)
為了公式更短,先定義:
求偏導,即可得出更新公式:
交替最小二乘法(Alternating least squares, ALS)
因為 \(q_i\) 和 \(p_u\) 都是未知的,前面的優化目標,公式 1 是非凸函數,不好求解。但是如果能夠固定 \(q_i\) 和 \(p_u\) 中的一個,交替地更新另外一個,公式中只有一個變量,而且是二次的,優化問題就更容易得到最優解。
SGD 更容易實現且更快,但 ALS 可以並行化獨立更新 \(q_i\) 和 \(p_u\)。
優化策略
相較於簡單的矩陣分解,作者提出了下面四點優化策略。
Adding biases
考慮到不同用戶評分嚴格程度不同,打分范圍不同。比如有的用戶對很差的電影打 6 分,對好電影一律 10 分。而有的用戶對差電影會打 1 分,好電影打分 9 分。這就是用戶的偏差。
另外電影本身因為某種原因,也可以存在偏差,比如因為某些流量明星的加入,很爛的電影,也可以有 6 分。
因此可以將評分值分解為 4 部分:global average,item bias,user bias 和 user-item interaction。舉個例子,已知所有電影的平均評分是 3.7 分,而 Titanic 是不錯的電影,會比平均分高,其 item bias 為 +0.5,另外 Joe 是一個嚴格的人,一向打分就偏低,存在 user bias -0.3。因此 Joe 對 Titanic 的評分為:\(3.7 + 0.5 - 0.3 + q^{T}p\)。
考慮到上面這些因素,對評分的估計為:
優化目標就變成了:
對每個用戶和物品學習一個偏置項。
Additional Input Sources
推薦系統往往需要處理冷啟動問題,很多用戶可能只對個別物品進行了評分,這就很難得出可靠的用戶向量表示。引入其他的信息能夠解決這種信息較少的問題。
推薦系統可以利用隱式信息,比如用戶的瀏覽記錄、搜索記錄、鼠標停留信息等,在沒有足夠多的明確信息(購買、評分)時,此類信息也能在一定程度上對用戶進行刻畫。
考慮到上面這些,作者引入用戶的 implicit feedback 和 user attributes 等信息。
implicit feedback 指的是瀏覽記錄、搜索記錄等。定義 \(N(u)\) 為用戶有過 implicit feedback 的 items 集合,每一個 item 對應一個向量 \(x_{i} \in R^{f}\) ,\(N(u)\) 中的 items 給用戶帶來的特征可以表示為:
前面的 \(|N(u)|^{-0.5}\) 用於歸一化。
另外用戶自身的屬性也是一個信息來源,設用戶有一組特征 \(A(u)\),每個特征用向量表示 \(y_{a} \in \mathbb{R}^{f}\),用戶的屬性給用戶來的特征可以表示為:
如此以來,用戶對物品的評分可以表示為:
和 \(\eqref{2}\) 比起來,就相當於 \(p_u\) 做了些調整。
Temporal dynamics
有很多因素會隨時間變化,比如用戶看的電影越來越多,眼光越來越刁鑽,以前喜歡給電影打 4 星,現在傾向於打 3 星。引入時序信號,可以捕獲到用戶或物品隨着時間的改變。
引入時序信號后,對 \(\hat{r}\) 的估計變為:
\(b_{i}(t)\) 是物品的 bias,它會隨時間改變,比如電影剛上映時很好評如潮,后來人們越來越理智,評分漸漸變低。\(b_{u}(t)\) 是用戶偏置,如前面所述,用戶的品味會變化。\(p_{u}(t)\) 是用戶向量,用戶對各種電影的喜好會變化,比如之前喜歡看喜劇片,最近喜歡看驚悚片。\(q_i\) 是隱因素向量,因為電影的各種因素相對穩定,因此不需要加時間因子。
加入了時間維度,式中 \(b_{i}, b_{u}, p_{u}\) 就變成了和時間相關的變量了。是不是說它們在不同的時間就有不同的值呢?是不是將時間分段,每一段得到一組參數呢?詳情可以參考文獻[1]。
大體思路是,假設這些變量是隨時間線性變化的,於是用一個線性模型來表示這些變量。線性模型 \(y=at+b\),對每個變量學習一個斜率和截距,代入時間就可以得到對應時間的估計值了。
思考:
作者的這篇論文中的方法是用來評分預測的,Netflix 的比賽評估的是 RMSE,所以作者需要盡可能准確地預測缺失的值。加入時間信息,考慮到了用戶品味等的變化。
這里是使用過去的部分信息,來預測過去的另一部分信息。但在實際的推薦系統中,需要用過去的數據預測未來的用戶的評分。模型需要定期重新訓練,以盡可能准確地預測用戶在接下來的一端實際的評分。
Inputs With Varying confidence Levels
不是所有評分都有一樣的權重,有些評分可能受到了廣告的影響,這對刻畫長期的特征貢獻不大。因此,作者對每個觀察到的評分引入了 confidence level,然置信度低的評分貢獻小一點。如此,優化目標變為:
實驗結果
使用的數據是 Netflix 2006 年的比賽數據,作者獲得了冠軍,下圖為上述幾種算法的實驗結果。圖中曲線上的 50,100,200 表示 latent factor 橫軸是模型參數量。根據縱軸的 RMSE 可以看出各種模型的性能。
總結
相比於最為基本的矩陣分解,本文考慮到了 bias,冷啟動,特征隨時間變化等事實,並將其融入到矩陣分解的策略中。本文是 Latent factor models 的經典之作,值得學習。
Y. Koren, “Collaborative Filtering with Temporal Dynamics,” Proc. 15th ACM SIGKDD Int’l Conf. Knowledge Discovery and Data Mining (KDD 09), ACM Press, 2009, pp. 447-455. ↩︎