推薦系統學習-矩陣分解算法
基本思想
推薦系統裏面需要用到MF算法,也就是把一個矩陣(user_num x item_num)分解爲兩個矩陣(user_num x trait_num) , (trait_num x item_num) 的乘積。這個過程很好理解,就是從評分矩陣中提取出來物品的特徵,分解出來的兩個矩陣分別表明用戶對該特徵的偏好程度和物品對該特徵的包含程度。比如
U = [ 1 3 2 2 3 1 ] , V = ⎡ ⎣ ⎢ 1 0 1 ⎤ ⎦ ⎥ U = [ 1 2 3 3 2 1 ] , V = [ 1 0 1 ]
其中,三個特徵分別表示喜劇、恐怖、劇情,所以 U 矩陣的第一行就表示用戶1對喜劇愛好程度是1,恐怖愛好程度是2,劇情愛好程度是3,以此類推。而 V 的第一列就表示電影1包含了1的喜劇成分,0的恐怖成分,1的劇情成分。所以顯然就有用戶1對電影的評分是 1 × 1 + 2 × 0 + 3 × 1 = 4 1 × 1 + 2 × 0 + 3 × 1 = 4 分。
這便是基本的矩陣分解(Matrix Factorization)方法。利用這個算法,我們只需要讓最小化目標爲
min U , I ∑ i = 0 n R ( i ) − U ( i ) ⋅ V ( i ) min U , I ∑ i = 0 n R ( i ) − U ( i ) · V ( i )
R(i) 表示第 i 個評分,U(i) 表示第 i 個評分對應的用戶。
進一步可以用矩陣表示,讓R i j R i j 表示第 i 個用戶對 第 j 個商品的評分,讓
E i j = { 0 無 評 分 1 有 評 分 E i j = { 0 無 評 分 1 有 評 分
於是優化目標就可以改寫爲
min U , I E ⋅ ( R − U V ) min U , I E · ( R − U V )
但是這個算法還有諸多侷限性,比如
每個用戶的評分是不同的,有的用戶心地善良,評分都是4,5分。有的用戶眼光挑剔,評分大多是2,3分。
每個電影的評分也是不同的。有的電影由於一些原因,自帶加分Buff,有的電影則因爲某些原因自帶減分Buff。
可能會出現過擬合現象。
爲了解決以上問題,可以採用BiasedMF算法。這個算法裏面加入了用戶偏移和商品偏移。此時,一個商品的評分用以下公式表示:R p i j = U ( i ) ⋅ V ( j ) + b u ( i ) + b i ( j ) R p i j = U ( i ) · V ( j ) + b u ( i ) + b i ( j )
Rp 表示預測的評分,U V 定義同上,bu,bi 分別是用戶、商品的偏置係數。
同時,爲了防止過擬合,對U, V, bu, bi 的二範數乘以一個重整化係數(通常稱爲regularization, reg),加入損失函數中。
於是優化目標變爲
min U , I E ⋅ ( R − ( U V + b u ⋅ [ 1 1 . . . 1 ] + ⎡ ⎣ ⎢ ⎢ ⎢ 1 1 . . . 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⋅ b i ) ) + λ ( | | U | | 2 + | | V | | 2 + | | b u | | 2 + | | b i | | 2 ) min U , I E · ( R − ( U V + b u · [ 1 1 . . . 1 ] + [ 1 1 . . . 1 ] · b i ) ) + λ ( | | U | | 2 + | | V | | 2 + | | b u | | 2 + | | b i | | 2 )
但是此時可以明顯看到,重整化係數讓所有的矩陣都朝着絕對值變小的方向發展,也就是預測的評分會出現偏低。這樣顯然是不對的,所以需要對評分進行預處理,把所有評分都減去全部評分的均值。這樣重整化係數就產生了避免評分離均值太遠的趨勢,較爲合理。
具體算法
一種簡單的算法時隨機梯度下降。
即:對於每一個評分,進行誤差計算然後求導,然後根據梯度下降的方法更新權重。
如:
L o s s i j = ( r i j − r p i j ) 2 + 規 範 化 項 = ( r i j − U i ⋅ V j − b u i − b i j ) 2 + 規 範 化 項 = e r r o r 2 + 規 範 化 項 L o s s i j = ( r i j − r p i j ) 2 + 規 範 化 項 = ( r i j − U i · V j − b u i − b i j ) 2 + 規 範 化 項 = e r r o r 2 + 規 範 化 項
(1)
於是
∂ L o s s ∂ U i k = − 2 ⋅ ( e r r o r ⋅ V k j − λ ⋅ U i k ) ∂ L o s s ∂ U i k = − 2 · ( e r r o r · V k j − λ · U i k )
同理,容易看出:
∂ L o s s ∂ V k j = − 2 ⋅ ( e r r o r ⋅ U i k − λ ⋅ V k j ) ∂ L o s s ∂ V k j = − 2 · ( e r r o r · U i k − λ · V k j )
∂ L o s s ∂ b u i = − 2 ⋅ ( e r r o r − λ ⋅ b u i ) ∂ L o s s ∂ b u i = − 2 · ( e r r o r − λ · b u i )
∂ L o s s ∂ b i j = − 2 ⋅ ( e r r o r − λ ⋅ b i j ) ∂ L o s s ∂ b i j = − 2 · ( e r r o r − λ · b i j )
而根據梯度下降的公式:
θ = θ − l e a r n i n g R a t e ⋅ ∂ L o s s ∂ θ θ = θ − l e a r n i n g R a t e · ∂ L o s s ∂ θ
就可以在每一次迭代中更新參數,從而找到最優的U , V , b i , b u U , V , b i , b u
同樣的,也可以對整個矩陣進行梯度下降。這樣子方便用Tensorflow訓練。
L o s s = ∑ i j ( r i j − r p i j ) + 規 範 化 項 L o s s = ∑ i j ( r i j − r p i j ) + 規 範 化 項
(2)
規範化項的變化
(1)和(2)兩個誤差公式的區別,在於每次計算的評分的數目。在多個評分一起訓練的時候,針對某一個參數,會有多個評分的誤差對其進行修正,所以規範化項需要相應增加一定的倍數。
嚴格來說,(1)式最後的結果並不符合優化目標
min U , I E ⋅ ( R − ( U V + b u ⋅ [ 1 1 . . . 1 ] + ⎡ ⎣ ⎢ ⎢ ⎢ 1 1 . . . 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⋅ b i ) ) + λ ( | | U | | 2 + | | V | | 2 + | | b u | | 2 + | | b i | | 2 ) min U , I E · ( R − ( U V + b u · [ 1 1 . . . 1 ] + [ 1 1 . . . 1 ] · b i ) ) + λ ( | | U | | 2 + | | V | | 2 + | | b u | | 2 + | | b i | | 2 )
因爲對於每個參數,假設有 k 個評分關聯了這個參數,那麼實際上這個參數的規範化項也被帶入計算了 k 次,所以最後的優化目標近似
min U , I E ⋅ ( R − ( U V + b u ⋅ [ 1 1 . . . 1 ] + ⎡ ⎣ ⎢ ⎢ ⎢ 1 1 . . . 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⋅ b i ) ) + k ⋅ λ ( | | U | | 2 + | | V | | 2 + | | b u | | 2 + | | b i | | 2 ) min U , I E · ( R − ( U V + b u · [ 1 1 . . . 1 ] + [ 1 1 . . . 1 ] · b i ) ) + k · λ ( | | U | | 2 + | | V | | 2 + | | b u | | 2 + | | b i | | 2 )
而整體訓練,是完全符合原始的優化目標的。
數學意義
假設每個用戶的特徵是符合單位正態分佈的,即:
U i ∼ N ( 0 , σ 2 u ) U i ∼ N ( 0 , σ u 2 )
同理,對於商品的特徵,用戶偏好,商品偏好我們也做如下假設
V i ∼ N ( 0 , σ 2 v ) b i ∼ N ( 0 , σ 2 b i ) b u ∼ N ( 0 , σ 2 b u ) V i ∼ N ( 0 , σ v 2 ) b i ∼ N ( 0 , σ b i 2 ) b u ∼ N ( 0 , σ b u 2 )
然後假設評分在預測值的基礎上,加上了方差爲 σ r σ r 的噪聲。
注意符合以上條件時,很顯然評分的均值就是0,所以首先需要把所有評分都減去平均值處理。
爲了找到最好的參數組合,相當於是使得如下的概率取到最大值:
max U , V , b i , b u P ( U , V , b i , b u | R , σ 2 r , σ 2 v , σ 2 b i , σ 2 b u ) max U , V , b i , b u P ( U , V , b i , b u | R , σ r 2 , σ v 2 , σ b i 2 , σ b u 2 )
根據貝葉斯公式,有
P ( U , V , b i , b u | R , σ 2 r , σ 2 v , σ 2 b i , σ 2 b u ) = P ( R , U , V , b i , b u | σ 2 r , σ 2 v , σ 2 b i , σ 2 b u ) P ( R | σ 2 r , σ 2 v , σ 2 b i , σ 2 b u ) P ( U , V , b i , b u | R , σ r 2 , σ v 2 , σ b i 2 , σ b u 2 ) = P ( R , U , V , b i , b u | σ r 2 , σ v 2 , σ b i 2 , σ b u 2 ) P ( R | σ r 2 , σ v 2 , σ b i 2 , σ b u 2 )
很顯然,我們只改變 U , V , b i , b u U , V , b i , b u 四個參數,所以這個式子的分子相當於一個常數,可以不去考慮。
而分子又可以化爲
P ( R , U , V , b i , b u | σ 2 r , σ 2 v , σ 2 b i , σ 2 b u ) = P ( R | U , V , b u , b i ) ⋅ P ( U | σ 2 u ) P ( V | σ 2 v ) ⋅ P ( b i | s i g m a 2 b i ) ⋅ P ( b u | σ 2 b u ) P ( R , U , V , b i , b u | σ r 2 , σ v 2 , σ b i 2 , σ b u 2 ) = P ( R | U , V , b u , b i ) · P ( U | σ u 2 ) P ( V | σ v 2 ) · P ( b i | s i g m a b i 2 ) · P ( b u | σ b u 2 )
很容易就可以看出
P ( R i j | U , V , b u , b i ) = 1 2 π σ 2 r − − − − √ e − ( R i j − P r e d i j ) 2 2 σ 2 r P ( R i j | U , V , b u , b i ) = 1 2 π σ r 2 e − ( R i j − P r e d i j ) 2 2 σ r 2
其中,P r e d i j = U ( i ) ⋅ V ( j ) + b u ( i ) + b i ( j ) P r e d i j = U ( i ) · V ( j ) + b u ( i ) + b i ( j )
因爲每個評分的噪聲是獨立的,因此總的概率就是所有單個評分的概率連乘:
P ( R | U , V , b u , b i ) = ∏ i j [ 1 2 π σ 2 r − − − − √ e − ( R i j − P r e d i j ) 2 2 σ 2 r ] I i j P ( R | U , V , b u , b i ) = ∏ i j [ 1 2 π σ r 2 e − ( R i j − P r e d i j ) 2 2 σ r 2 ] I i j
其中,
I i j I i j
爲 1 表示有評分,爲0則無評分(不貢獻乘積)。
同理有:
P ( U | σ 2 u ) = ∏ i j 1 2 π σ 2 u − − − − √ e − U 2 i j 2 σ 2 u P ( U | σ u 2 ) = ∏ i j 1 2 π σ u 2 e − U i j 2 2 σ u 2
P ( V | σ 2 v ) = ∏ i j 1 2 π σ 2 v − − − − √ e − V 2 i j 2 σ 2 v P ( V | σ v 2 ) = ∏ i j 1 2 π σ v 2 e − V i j 2 2 σ v 2
P ( b u | σ 2 b u ) = ∏ j 1 2 π σ 2 b u − − − − − √ e − b u 2 j 2 σ 2 b u P ( b u | σ b u 2 ) = ∏ j 1 2 π σ b u 2 e − b u j 2 2 σ b u 2
P ( b i | σ 2 b i ) = ∏ j 1 2 π σ 2 b i − − − − √ e − b i 2 j 2 σ 2 b i P ( b i | σ b i 2 ) = ∏ j 1 2 π σ b i 2 e − b i j 2 2 σ b i 2
這些概率相乘,然後取對數,就得到了熟悉的表達式:
− E ⋅ ( R − ( U V + b u ⋅ [ 1 1 . . . 1 ] + ⎡ ⎣ ⎢ ⎢ ⎢ 1 1 . . . 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⋅ b i ) ) σ 2 r − ( | | U | | 2 σ 2 u + | | V | | 2 σ 2 v + | | b u | | 2 σ 2 b u + | | b i | | 2 σ 2 b i ) − E · ( R − ( U V + b u · [ 1 1 . . . 1 ] + [ 1 1 . . . 1 ] · b i ) ) σ r 2 − ( | | U | | 2 σ u 2 + | | V | | 2 σ v 2 + | | b u | | 2 σ b u 2 + | | b i | | 2 σ b i 2 )
於是很容易得出,U, V, bu, bi 對應的規範化係數應該分別爲:
σ 2 u / σ 2 r , σ 2 v / σ 2 r , σ 2 b u / σ 2 r , σ 2 b i / σ 2 r σ u 2 / σ r 2 , σ v 2 / σ r 2 , σ b u 2 / σ r 2 , σ b i 2 / σ r 2
在前面的推導中,我們全部用λ λ 代替了。因爲實際上我們並不能猜測出U、V、bu、bi的方差,因此這個公式只是從理論上證明了規範化係數的合理性,並沒有告訴我們如何確定規範化係數。
參考文獻
[1] [Mnih and Salakhutdinov, 2007] Andriy Mnih and Ruslan Salakhutdinov. Probabilisticmatrixfactorization. InNIPS ’07, 2007.