矩陣分解在協同過濾推薦算法中的應用


    在協同過濾推薦算法總結中,我們講到了用矩陣分解做協同過濾是廣泛使用的方法,這里就對矩陣分解在協同過濾推薦算法中的應用做一個總結。(過年前最后一篇!祝大家新年快樂!明年的目標是寫120篇機器學習,深度學習和NLP相關的文章)

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

    在推薦系統中,我們常常遇到的問題是這樣的,我們有很多用戶和物品,也有少部分用戶對少部分物品的評分,我們希望預測目標用戶對其他未評分物品的評分,進而將評分高的物品推薦給目標用戶。比如下面的用戶物品評分表:

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

    對於每個用戶,我們希望較准確的預測出用戶對未評分物品的評分。對於這個問題我們有很多解決方法,本文我們關注於用矩陣分解的方法來做。如果將m個用戶和n個物品對應的評分看做一個矩陣$M$,我們希望通過矩陣分解來解決這個問題。

2. 傳統的奇異值分解SVD用於推薦

    說道矩陣分解,我們首先想到的就是奇異值分解SVD。在奇異值分解(SVD)原理與在降維中的應用中,我們對SVD原理做了總結。如果大家對SVD不熟悉的話,可以翻看該文。

    此時可以將這個用戶物品對應的$m \times n$矩陣$M$進行SVD分解,並通過選擇部分較大的一些奇異值來同時進行降維,也就是說矩陣$M$此時分解為:$$M_{m \times n}=U_{m \times k}\Sigma_{k \times k}V_{k \times n}^T $$  

    其中k是矩陣$M$中較大的部分奇異值的個數,一般會遠遠的小於用戶數和物品樹。如果我們要預測第i個用戶對第j個物品的評分$m_{ij}$,則只需要計算$u_i^T\Sigma v_j$即可。通過這種方法,我們可以將評分表里面所有沒有評分的位置得到一個預測評分。通過找到最高的若干個評分對應的物品推薦給用戶。

    可以看出這種方法簡單直接,似乎很有吸引力。但是有一個很大的問題我們忽略了,就是SVD分解要求矩陣是稠密的,也就是說矩陣的所有位置不能有空白。有空白時我們的$M$是沒法直接去SVD分解的。大家會說,如果這個矩陣是稠密的,那不就是說我們都已經找到所有用戶物品的評分了嘛,那還要SVD干嘛! 的確,這是一個問題,傳統SVD采用的方法是對評分矩陣中的缺失值進行簡單的補全,比如用全局平均值或者用用戶物品平均值補全,得到補全后的矩陣。接着可以用SVD分解並降維。

    雖然有了上面的補全策略,我們的傳統SVD在推薦算法上還是較難使用。因為我們的用戶數和物品一般都是超級大,隨便就成千上萬了。這么大一個矩陣做SVD分解是非常耗時的。那么有沒有簡化版的矩陣分解可以用呢?我們下面來看看實際可以用於推薦系統的矩陣分解。

3. FunkSVD算法用於推薦

    FunkSVD是在傳統SVD面臨計算效率問題時提出來的,既然將一個矩陣做SVD分解成3個矩陣很耗時,同時還面臨稀疏的問題,那么我們能不能避開稀疏問題,同時只分解成兩個矩陣呢?也就是說,現在期望我們的矩陣$M$這樣進行分解:$$M_{m \times n}=P_{m \times k}^TQ_{k \times n}$$

    我們知道SVD分解已經很成熟了,但是FunkSVD如何將矩陣$M$分解為$P$和$Q$呢?這里采用了線性回歸的思想。我們的目標是讓用戶的評分和用矩陣乘積得到的評分殘差盡可能的小,也就是說,可以用均方差作為損失函數,來尋找最終的$P$和$Q$。

    對於某一個用戶評分$m_{ij}$,如果用FunkSVD進行矩陣分解,則對應的表示為$q_j^Tp_i$,采用均方差做為損失函數,則我們期望$(m_{ij}-q_j^Tp_i)^2$盡可能的小,如果考慮所有的物品和樣本的組合,則我們期望最小化下式:$$\sum\limits_{i,j}(m_{ij}-q_j^Tp_i)^2$$

    只要我們能夠最小化上面的式子,並求出極值所對應的$p_i, q_j$,則我們最終可以得到矩陣$P$和$Q$,那么對於任意矩陣$M$任意一個空白評分的位置,我們可以通過$q_j^Tp_i$計算預測評分。很漂亮的方法!

    當然,在實際應用中,我們為了防止過擬合,會加入一個L2的正則化項,因此正式的FunkSVD的優化目標函數$J(p,q)$是這樣的:$$\underbrace{arg\;min}_{p_i,q_j}\;\sum\limits_{i,j}(m_{ij}-q_j^Tp_i)^2 + \lambda(||p_i||_2^2 + ||q_j||_2^2 ) $$

    其中$\lambda$為正則化系數,需要調參。對於這個優化問題,我們一般通過梯度下降法來進行優化得到結果。

    將上式分別對$p_i, q_j$求導我們得到:$$\frac{\partial J}{\partial p_i} = -2(m_{ij}-q_j^Tp_i)q_j + 2\lambda p_i$$$$\frac{\partial J}{\partial q_j} = -2(m_{ij}-q_j^Tp_i)p_i + 2\lambda q_j$$ 

    則在梯度下降法迭代時,$p_i, q_j$的迭代公式為: $$p_i = p_i + \alpha((m_{ij}-q_j^Tp_i)q_j - \lambda p_i)$$$$q_j =q_j +  \alpha((m_{ij}-q_j^Tp_i)p_i - \lambda q_j)$$

    通過迭代我們最終可以得到$P$和$Q$,進而用於推薦。FunkSVD算法雖然思想很簡單,但是在實際應用中效果非常好,這真是驗證了大道至簡。

4. BiasSVD算法用於推薦

    在FunkSVD算法火爆之后,出現了很多FunkSVD的改進版算法。其中BiasSVD算是改進的比較成功的一種算法。BiasSVD假設評分系統包括三部分的偏置因素:一些和用戶物品無關的評分因素,用戶有一些和物品無關的評分因素,稱為用戶偏置項。而物品也有一些和用戶無關的評分因素,稱為物品偏置項。這其實很好理解。比如一個垃圾山寨貨評分不可能高,自帶這種爛屬性的物品由於這個因素會直接導致用戶評分低,與用戶無關。

    假設評分系統平均分為$\mu$,第i個用戶的用戶偏置項為$b_i$,而第j個物品的物品偏置項為$b_j$,則加入了偏置項以后的優化目標函數$J(p,q)$是這樣的$$\underbrace{arg\;min}_{p_i,q_j}\;\sum\limits_{i,j}(m_{ij}-\mu-b_i-b_j-q_j^Tp_i)^2 + \lambda(||p_i||_2^2 + ||q_j||_2^2 + ||b_i||_2^2 + ||b_j||_2^2) $$

    這個優化目標也可以采用梯度下降法求解。和FunkSVD不同的是,此時我們多了兩個偏執項$b_i,b_j$,,$p_i, q_j$的迭代公式和FunkSVD類似,只是每一步的梯度導數稍有不同而已,這里就不給出了。而$b_i,b_j$一般可以初始設置為0,然后參與迭代。這里給出$b_i,b_j$的迭代方法$$b_i = b_i + \alpha(m_{ij}-\mu-b_i-b_j-q_j^Tp_i -\lambda b_i)$$$$b_j = b_j + \alpha(m_{ij}-\mu-b_i-b_j-q_j^Tp_i -\lambda b_j)$$

    通過迭代我們最終可以得到$P$和$Q$,進而用於推薦。BiasSVD增加了一些額外因素的考慮,因此在某些場景會比FunkSVD表現好。

5. SVD++算法用於推薦

    SVD++算法在BiasSVD算法上進一步做了增強,這里它增加考慮用戶的隱式反饋。好吧,一個簡單漂亮的FunkSVD硬是被越改越復雜。

    對於某一個用戶i,它提供了隱式反饋的物品集合定義為$N(i)$, 這個用戶對某個物品j對應的隱式反饋修正的評分值為$c_{ij}$, 那么該用戶所有的評分修正值為$\sum\limits_{s \in N(i)}c_{is}$。一般我們將它表示為用$q_s^Ty_i$形式,則加入了隱式反饋項以后的優化目標函數$J(p,q)$是這樣的:$$\underbrace{arg\;min}_{p_i,q_j}\;\sum\limits_{i,j}(m_{ij}-\mu-b_i-b_j-q_j^Tp_i - q_j^T|N(i)|^{-1/2}\sum\limits_{s \in N(i)}q_{s})^2+ \lambda(||p_i||_2^2 + ||q_j||_2^2 + ||b_i||_2^2 + ||b_j||_2^2 + \sum\limits_{s \in N(i)}||q_{s}||_2^2) $$

    其中,引入$|N(i)|^{-1/2}$是為了消除不同|N(i)|個數引起的差異。式子夠長的,不過需要考慮用戶的隱式反饋時,使用SVD++還是不錯的選擇。

6. 矩陣分解推薦方法小結

    FunkSVD將矩陣分解用於推薦方法推到了新的高度,在實際應用中使用也是非常廣泛。當然矩陣分解方法也在不停的進步,目前張量分解和分解機方法是矩陣分解推薦方法今后的一個趨勢。

    對於矩陣分解用於推薦方法本身來說,它容易編程實現,實現復雜度低,預測效果也好,同時還能保持擴展性。這些都是它寶貴的優點。當然,矩陣分解方法有時候解釋性還是沒有基於概率的邏輯回歸之類的推薦算法好,不過這也不影響它的流形程度。小的推薦系統用矩陣分解應該是一個不錯的選擇。大型的話,則矩陣分解比起現在的深度學習的一些方法不占優勢。

 

(歡迎轉載,轉載請注明出處。歡迎溝通交流: liujianping-ok@163.com) 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM