1. 程式人生 > >推薦系統:矩陣分解與鄰域的融合模型

推薦系統:矩陣分解與鄰域的融合模型

critical with 分析 但是 rac 公式 download pearson 情況

推薦系統通常分析過去的事務以建立用戶和產品之間的聯系,這種方法叫做協同過濾

協同過濾有兩種形式:隱語義模型(LFM),基於鄰域的模型(Neighborhood models)。

本篇文章大部分內容為大神Koren的Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model ,這篇文章發表時我還在上初中。文章內容並未過時,主要介紹SVD,SVD++,以及SVD與基於鄰域模型的融合。


一、Basic

基於鄰域的模型:計算item與item(或者user與user)之間的聯系。用戶對於一個物品的評分預測主要基於該用戶對其他相似物品的評價。這個方法只用到了一個維度,要麽item to item,要麽user to user。

隱語義模型,例如SVD,用到了item和user兩個維度,使他們直接進行比較。隱語義模型嘗試解釋一些物品的特征,具體可見從SVD到推薦系統。

基於鄰域的模型對於檢測局部化關系的數據很有效,因為它只依賴於小部分很重要的關系數據,且通常將大部分的用戶數據丟掉。相反的是,隱語義模型對於評估整體更有效,它會用到全部的數據,但是這個模型對於預測有強烈聯系的小集合數據很不好。

1.1 Baseline

我們把用戶符號記為u、v,物品符號為i、j,則\(r_{ui}\)表示用戶u對物品i的真實評分。 \(\hat r_{ui}\) 表示用戶u對物品i評分的預測值。

很多因素影響著用戶的評分,以下三點需要考慮:

  • 對於不同平臺來說,有的平臺評分高,有的平臺評分低(如貓眼和豆瓣)
  • 在同一個平臺上,不同人的評分標準不一樣,有的人很嚴格,有的人很寬容
  • 在同一個平臺上,不同item的評分平均也不一樣,有大眾一致認為的好片,也有大眾一致認為的渣片(如《肖申克的救贖》和《小時代》)

根據以上三點,一個對用戶評分的預測的baseline可以用下式表示:

\(b_{ui}=\mu+b_{u}+b_{i}\)

參數\(\mu\)表示平臺的分數平均,參數\(b_{u}\)\(b_{i}\)分別表示用戶與物品的平均程度。舉個例子,在某個電影評分平臺上,所有電影的評分為3.7,則\(\mu\)為3.7。《泰坦尼克號》比平均電影評分要好,且高了0.5分。Joe是一個不茍言笑的人,俗稱critical user,他的所有評分比大眾的平均要低0.3。所以Joe對《泰坦尼克號》的評分使用baseline可以預測為3.9分(3.7-0.3+0.5)。為了得到\(b_{u}\)

\(b_{i}\),我們可以嘗試解決一下優化問題:

\(min\sum_{(u,i)\in\kappa}(r_{ui}-\mu-b_{u}-b_{i})^2+\lambda_{1}(\sum_{u} b_{u}^2+ \sum_{i} b_{i}^2)\tag{1}\)

這是一個典型問題,第一項為均方誤差,第二項為正則化項。

1.2 基於鄰域的模型(Basic Neighborhood models)

基於鄰域的模型分為兩種,一種以用戶user為導向,評分預測基於識別與該用戶相類似的其他用戶。另一種以物品item為導向,評分預測基於物品之間的相似度。相似度的相關計算可以看我的這篇博客推薦系統中物品相似度計算。在文章中,我們關註以item為導向的預測模型。

我們通常來 統計喜歡兩個不同物品的人數交集 計算物品的相似度,如pearson相似度,用\(\rho_{ij}\)表示。但是有一些統計的計算只依賴於一小部分數據集合(如兩個很冷門的電影,只被小部分專業人士同時看過),那麽,這樣的統計就不具有代表性了。這時,我們可以添加一個懲罰,即:

\(s_{ij}=\frac{n_{ij}}{n_{ij}+\lambda_{2}}\rho_{ij}\tag{2}\)

參數\(n_{ij}\)表示同時喜歡物品i和j的人數。可以看到,當n小的時候,與\(\lambda_{2}\)(通常為100)同數量級或小於它,相似度會收到縮減的懲罰。如果n非常大,則沒有懲罰。

我們的目標是預測\(r_{ui}\),即用戶u沒有評分過的物品i。根據物品相似度,我們提取與物品i最相似的k個的物品(用戶u有過評分的),並將這k個物品的集合表示為\(S^{k}(i;u)\)。那麽我們的預測\(\hat r_{ui}\)則為在baseline的基礎上,加上k個物品的加權平均,即:

\(\hat r_{ui}=b_{ui}+\frac {\sum_{j\in S^{k}(i;u)}s_{ij}(r_{uj}-b_{uj})}{\sum_{j\in S^{k}(i;u)}s_{ij}}\tag{3}\)

但是,(3)式的方法存在幾個問題:

  1. 這個方法不能被正式的模型證明
  2. 兩個物品之間的相似度的衡量在沒有考慮整個鄰域集的相互作用下是否適合
  3. (3)式中權重的計算方法太依賴於鄰域集,但是有的物品可能鄰域集為空(如用戶u沒有對與物品i相似的任何物品有過評分)。

所以,為了克服以上三點,我們采用的以下學習方法:

\(\hat r_{ui}=b_{ui}+\sum_{j\in S^{k}(i;u)}\theta_{ij}^u(r_{uj}-b_{uj})\)

這裏的插入權重\(\theta_{ij}^u\)不是一個個單獨計算的,而是依賴於許多鄰項的交叉,這是一個統計數,而不是學習得到的。(By globally solving a suitable optimization problem, this simultaneous interpolation accounts for the many interactions between neighbors leading to improved accuracy.)

詳見:Scalable Collaborative Filtering with Jointly Derived Neighborhood Interpolation Weights

1.3 隱語義模型(Latent factor models)

如果說前面的基於鄰域的模型是統計方法,那麽隱語義模型就是機器學習方法了,它有一個學習過程。例子很多,SVD,NMF,pLSA,以至於神經網絡都可以算作隱語義模型。

對於基於SVD的隱語義模型具體介紹可見:從SVD到推薦系統。

這裏說一點:對於推薦系統來說,評分矩陣是稀疏的。然而傳統的SVD分解並沒有告訴我們矩陣不完整的情況。對此,可以選擇將稀疏的矩陣進行填充,使之變的dense後進行分解學習。但是,這無疑產生了很多無意義的數據和額外計算。而且,數據可能變得畸形。所以,對此,我們可以只選擇有數據的評分進行分解,即:

\(min\sum_{(u,i)\in \mathcal{k}}(r_{ui}-\mu - b_i - b_u - \mathbf{q}_i^T\mathbf{p}_u)^2 + \lambda_{3} (\lVert p_u \rVert^2 + \lVert q_i \rVert^2 + b_u^2 + b_i^2)\tag{5}\)

以上為最小化損失函數,\(\mathcal{k}\)為用戶u所有評分過的集合。

解決(5)式,一個簡單的梯度下降就可以!??

1.4 隱式反饋(Implicit feedback)

有兩種用戶偏好:

  • 顯式偏好(也稱為“顯式反饋”),比如用戶對商品的“評分”

  • 隱式偏好(也稱為“隱式反饋”),比如“瀏覽”和“購買”歷史記錄

一個用戶通過瀏覽或者某些歷史記錄來告訴我們他們對於某些物品的偏好。如用戶在淘寶上購買了某個物品,即使該用戶沒有對此物品評分,但是這個購買記錄也證明用戶對這個物品有興趣。所以,這裏,我們新建一個二值矩陣,跟評分矩陣一樣size。“1”代表有隱式偏好,“0”代表無隱式偏好。為了將這個東西一般化,我們定義兩個集合:

  • R(u): 用戶u評分過的物品集合
  • N(u): 用戶u有過隱式偏好的物品集合

二、基於領域的模型

1.2節是基於鄰域模型的一個basic,是一個基於統計的模型。本節介紹一種新的可進行全局優化方法的基於鄰域的模型。這個模型有效的改善了準確度且結合了1.4節介紹的隱式偏好。

如1.2節,如(4)式,模型主要是求解插入權重\(\theta_{ij}^{u}\),為了更便於進行全局優化,我們使用了全局的權重\(\omega_{ij}\),而不在限定於某個用戶。這個權重\(\omega_{ij}\)跟隱語義模型一樣,是學習而來的,而不只是基於統計的量。一個簡單的該模型的輪廓如下:

\(\hat r_{ui} = b_{ui}+\sum_{j\in R(u)}(r_{uj}-b_{uj})\omega_{ij}\tag{6}\)

這裏的\(\omega_{ij}\)與(4) 式中的\(\theta_{ij}^{u}\)不同之處在於,前者跟user是沒關系的,而後者有關系。

我們可以將\(\omega_{ij}\)看成baseline估計的一個抵消權重:\(r_{uj}-b_{uj}\)為實際值與baseline估計的殘差,前面的系數即\(\omega_{ij}\)。對於兩個很相似的物品i和j,\(\omega_{ij}\)會很大。那麽,當用戶u評分物品j時比估計得要高(即\(r_{uj}-b_{uj}\)大),那麽我們可以在baseline的基礎上增加\((r_{uj}-b_{uj})\omega_{ij}\)。相反的,如果用戶評分j與baseline預測的一樣(即即\(r_{uj}-b_{uj}\)接近0),那麽\((r_{uj}-b_{uj})\omega_{ij}\)也接近於0,即物品j不對物品i的評分產生影響。(6)式其實可以總結為一句話:

用戶的個性化評分(即與平均不一樣)對推薦影響程度更大

我們加上1.4節提到的隱式偏好,用\(c_{ij}\)表示:

\(\hat r_{ui} = b_{ui}+\sum_{j\in R(u)}(r_{uj}-b_{uj})\omega_{ij}+\sum_{j\in N(u)}c_{ij}\tag{7}\)

\(\omega_{ij}\)一樣\(c_{ij}\)也可以看作是加在baseline上的一個抵消(offset)。對於兩個物品i和j,用戶u對物品j隱式偏好可以通過\(c_{ij}\)影響\(\hat r_{ui}\)

另外,一個用戶opinion的組成不僅僅通過他評分的物品,也通過它沒有評分的物品。例如,數據顯示用戶對《復仇者聯盟3》評分高的人對《復仇者聯盟1-2》也評分高。對此,評價了《復仇者聯盟1-2》的人對評價《復仇者聯盟3》有一個很高的權重。換句話說,如果一個用戶沒有評價過《復仇者聯盟1-2》,那麽對於該用戶對《復仇者聯盟3》的評價預測會有一個懲罰,分數會低一點。

在前面的模型(3),(4)中,都用到了\(b_{ui}\)這個值,即baseline的預測值。這裏我們可以將\(b_{ui}\)\(\widetilde b_{ui}\)代替。\(\widetilde b_{ui}\)為其他模型的預測(如SVD)。那麽,我們可以將(7)式寫成下面的形式:

\(\hat r_{ui} = \mu + b_{u}+b_{i}+\sum_{j\in R(u)}(r_{uj}-b_{uj})\omega_{ij}+\sum_{j\in N(U)}c_{ij}\tag{8}\)

\(b_{ui}\)是常值,仍然是baseline的預測。\(b_{u}\)\(b_{i}\)是參數,這裏通過學習得到。

至此為止,當前方法的一個特點為它對於評分多的用戶(R(u)大)或者隱式偏好多的用戶(N(u)大)有更大的偏離。即 \(\sum_{j\in R(u)}(r_{uj}-b_{uj})\omega_{ij}+\sum_{j\in N(U)}c_{ij}\) 越大。通常來說,這對推薦系統來說是一個好事。對於這些用戶,我們可以提供更多冷門的推薦。另一方面,對於那些少操作的用戶來說,我們只會給他們提供一些安全的大眾的推薦。

然而,當前的模型(8)過分強調了重度使用用戶和輕度用戶的區別。所以,我們可以嘗試做一個衰減,將(8)擴充為:

\(\hat r_{ui} = \mu + b_{u}+b_{i}+|R(u)|^{-\frac{1}{2}}\sum_{j\in R(u)}(r_{uj}-b_{uj})\omega_{ij}+|N(u)|^{-\frac{1}{2}}\sum_{j\in N(u)}c_{ij}\tag{9}\)

為了減小計算的復雜度,我們可以通過使用k items來減少一些參數。定義 \(S^{k}(i)\) 為物品i最相似的k個物品的集合。再定義\(R^{k}(i;u)=R(u)\cap S^{k}(i)\)\(N^{k}(i;u)=N(u)\cap S^{k}(i)\)

仍然,對i的評分影響最大的依然是與i相似度最大的k個物品,則:

\(\hat r_{ui} = \mu + b_{u}+b_{i}+|R^{k}(i;u)|^{-\frac{1}{2}}\sum_{j\in R(u)}(r_{uj}-b_{uj})\omega_{ij}+|N^{k}(i;u)|^{-\frac{1}{2}}\sum_{j\in N(u)}c_{ij}\tag{10}\)

當k取無窮大時,(10)與(9)等價。以上就是我們這節最終的模型,與1.2最大的不同就是它是一個全局優化的過程,而不是僅僅依賴與統計。所以,我們寫出最小化損失函數:

\(min_{b*,\omega*,c*}\sum_{(u,i)\in k }(r_{ui}-\mu - b_{u}-b_{i}-|R^{k}(i;u)|^{-\frac{1}{2}}\sum_{j\in R(u)}(r_{uj}-b_{uj})\omega_{ij}-|N^{k}(i;u)|^{-\frac{1}{2}}\sum_{j\in N(U)}c_{ij})^2+\lambda_{4}(b_{u}^2+b_{i}^2+\sum_{j\in R^{k}(i;u)}\omega_{ij}^2+\sum_{j\in N^{k}(i;u)}c_{ij}^2)\tag{11}\)

我們定義預測誤差為\(e_{ui}=r_{ui}-\hat r_{ui}\),利用梯度下降,我們的的參數更新循環為:

技術分享圖片

\(\gamma\)為學習率。

三、隱語義模型

我們這裏介紹一個SVD-like的分解隱語義模型。首先,如1.3節介紹的SVD模型那樣,我們可以把預測模型寫成:

\(\hat r_{ui}=b_{ui}+p_{u}^Tq_{i}\tag{12}\)

這個預測函數對應的損失函數是公式(5)。現在,我們將這個模型引入隱式反饋已經我們在第二章介紹的東西,則式(12)可延伸為:

\(\hat r_{ui}=b_{ui}+ q_{i}^T( |R(u)|^{-\frac{1}{2}}\sum_{j\in R(u)}(r_{uj}-b_{uj})x_{j}+|N(u)|^{-\frac{1}{2}}\sum_{j\in N(u)}y_{j})\tag{13}\)

可以看到,每一個物品i與三個變量有聯系:\(q_{i}, x_{i},y_{i}\in R^f\)。另一方面,我們沒有直接用\(p_{u}\)這麽顯式的參數代表用戶,而是通過用戶喜歡的物品items來代表,即用\(|R(u)|^{-\frac{1}{2}}\sum_{j\in R(u)}(r_{uj}-b_{uj})x_{j}+|N(u)|^{-\frac{1}{2}}\sum_{j\in N(u)}y_{j}\)代替\(p_{u}\)。這個模型,我們叫做非對稱SVD(Asymmetric-SVD)。以下介紹這個模型的幾個優點:

  1. 更少的參數。 有人說(13)式明顯比(12)式參數多,但是(12)式的\(p_{u}\)的行數為用戶數,是一個巨大的量,而(13)式所有的參數都只跟物品數量有關。而在推薦系統中,用戶數是遠遠大於物品數的。
  2. 新用戶的冷啟動。 因為Asymmetric-SVD沒有參數化用戶,只要新用戶給予反饋該模型可以很快給出推薦,而不需要重新訓練這個模型獲取新參數。但是,如果一個新的物品引入進系統,那麽這個模型需要一個waiting period來訓練新的參數。
  3. 可解釋性。 用戶通常喜歡看到社區推薦物品的原因。這不僅提升了用戶體驗,同時增加了用戶與社區的交互。事實上,標準的SVD模型無法很好提供解釋,因為他是模型自己創造出來的特征。而Asymmetric-SVD的預測是直接通過用戶的反饋來預測的。基於鄰域的模型都有解釋性好的優點。
  4. 隱式反饋的加入。 在(13)中,隨著\(|N(u)|\)的增大,隱式反饋的影響也越大。另一方面,顯式反饋也隨著\(|R(u)|\)的增大而影響增大。

至此為止,我們可以寫出(13)的最小化損失函數:

\(min_{q*,x*,y*,b*}\sum_{(u,i)\in k}(r_{ui}-b_{u}-b_{i}-q_{i}^T( |R(u)|^{-\frac{1}{2}}\sum_{j\in R(u)}(r_{uj}-b_{uj})x_{j}+|N(u)|^{-\frac{1}{2}}\sum_{j\in N(u)}y_{j}))^2+\lambda_{5} (\sum_{j\in R(u)}\lVert x_i+\sum_{j\in N(u)}\lVert y_i \rVert^2 + \lVert q_i \rVert^2 + b_u^2 + b_i^2)\tag{14}\)

上式在Netflix data的檢驗中的準確率比標準SVD有輕微的提高。這個改善應該感謝隱式反饋。

事實上,在SVD的基礎上,如果只考慮隱式反饋的結合,更簡單的寫法,可以從(12)式直接加上隱式反饋量:

\(\hat r_{ui}=b_{ui}+ q_{i}^T(p_u+|N(u)|^{-\frac{1}{2}}\sum_{j\in N(u)}y_{j})\tag{15}\)

與(12)式不同的只在於對於用戶user的表示。我們把(15)式的模型叫做SVD++(我寫這篇博客的初衷)。

SVD++沒有提供上述提到的優點的1,2,3,然而他已經足夠的準確。

四、An Integrated Model

顧名思義,就是把兩種方法結合。之前已經討論過,隱語義模型和鄰域模型的方法各有各的優點。在這一節,我們將鄰域模型與SVD++模型進行結合。即:

這個公式相當於三個部分 的結合:

技術分享圖片

  1. \(\mu+b_u+b_i\)提供了user和item的基本屬性,但並沒有提供他們之間的interactions。
  2. \(q_{i}^T(p_u+|N(u)|^{-\frac{1}{2}}\sum_{j\in N(u)}y_{j})\)提供了user和item之間的interactions。
  3. 剩余部分式基於領域的部分,很難定義哈哈哈。

同樣,我們的參數更新變成了以下過程:

技術分享圖片

推薦系統:矩陣分解與鄰域的融合模型