【轉】推薦系統演算法總結(二)——協同過濾(CF) MF FM FFM

ai_1046067944發表於2018-08-30

來源:未知,如有不妥,請隨時聯絡溝通,謝謝~

1.協同過濾(CF)【基於記憶體的協同過濾】

優點:簡單,可解釋 
缺點:在稀疏情況下無法工作 
這裡寫圖片描述
所以對於使用userCF的系統,需要解決使用者冷啟動問題 和如何讓一個新物品被第一個使用者發現 
對於只用itemCF的系統,需要解決物品冷啟動問題

如何更新推薦系統呢,答案就是離線更新使用者相似度矩陣和物品相似度矩陣【不斷刪除離開的使用者/物品,加入新來的使用者/物品】

2.MF PMF BPMF【基於模型的協同過濾】

當你有一個多維度稀疏矩陣,通過矩陣因式分解你能夠將使用者-專案矩陣(user-item matrix)重構成低評分結構(low-rank structure),並且你能夠通過兩個低評分( low-rank)矩陣相乘得出這個矩陣,其中矩陣的行包含潛在向量。

通過低評價矩陣乘積儘可能調整這個矩陣近似原始矩陣,以填充原始矩陣中缺失的項。

優點:更好解決可擴充套件性和稀疏問題而被廣泛用於推薦系統 
缺點:矩陣分解時間複雜度高,可採用梯度下降的方法減少計算複雜度

2.1 利用SVD求解MF

參考部落格https://www.cnblogs.com/AndyJee/p/7879765.html 
任意一個M*N的矩陣A(M行*N列,M>N),可以被寫成三個矩陣的乘積:

  1. U:(M行M列的列正交矩陣)

  2. S:(M*N的對角線矩陣,矩陣元素非負)

  3. V:(N*N的正交矩陣的倒置)

即 A=U*S*V’(注意矩陣V需要倒置)

簡單總結就是選取S對角陣中的前k個元素即可對U,S進行降維,利用,令U=U*S, 則U*V’可以近似還原並填充原矩陣?【這句話我認為不對的吧。還原是近似接近原矩陣, 如果原來是0,即未評分,還原的後的矩陣應該還是很接近0才對】,應該採用後面的方法對未評分的元素進行預測

這裡有一個很重要的但是很多部落格沒有明確指出的問題是,如果這時候來了一個新的使用者【不應該是新的使用者吧,應該是原來矩陣中有未評分的使用者,不然原矩陣就不是原矩陣了,SVD分解就不成立了】,我們該如何為其進行推薦呢? 
這裡始終搞不明白,看大家網上的程式碼,有直接還原矩陣直接預測的,也就計算相似度後再預測的

這裡寫圖片描述

上圖很形象,卻說的不是很透徹,回到矩陣分解用到推薦系統中的本質來看,設 訓練集使用者數(m),物品數(n),因子數(k) 
A的維度: m*n 
U的維度: m*k(代表使用者對不同因子的相關程度) 
S的維度: k*k 
V的維度: n*k(代表物品對不同因子的相關程度) 
且由 A=U*S*V’ —> U=A*V*S-1 
此時令A是一個新使用者的1*n的矩陣,就可以得到這個使用者不同因子的相關程度的向量,此後可以通過U矩陣與其他使用者進行相似度計算,從而進行相應的推薦!!!!

【上述方法是計算使用者的相似度進而進行推薦】 
也可以通過計算物品之間的相似度,然後根據物品相似度為使用者未打分的item打分,進而進行推薦。

2.2 利用梯度下降求解MF

參考部落格: 
http://www.cnblogs.com/bjwu/p/9358777.html 
【這個演算法有人叫SVD[可能因為他是SVD++的前身吧],有人叫LFM】 
這裡寫圖片描述
SVD++推薦系統: 
這裡寫圖片描述
程式碼參考: 
https://blog.csdn.net/akiyamamio11/article/details/79313339 
至於SVD++為什麼公式是這樣的,參見Yehuda Koren 大牛的論文: Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model 
寫的很複雜,但網上的解釋大都同上,很淺顯

2.3 PMF BPMF

參考部落格: 
https://blog.csdn.net/shulixu/article/details/75349138

2.4 總結

MF其實就是基於模型的協同過濾,因為協同過濾的本質就是矩陣分解和矩陣填充 
圖片來源於:https://blog.csdn.net/manduner/article/details/80564414 
這裡寫圖片描述

那麼如何得到MF的矩陣分解模型呢?

  • SVD方法,但是由於未評分元素也參與了分解,所以最後的近似矩陣會把未評分處還近似為0,所以需要利用使用者相似度矩陣或物品相似度矩陣對缺失除進行評分預測,預測方法上文也提到了,這裡補充一個有程式碼的部落格 
    http://www.cnblogs.com/lzllovesyl/p/5243370.html
  • 以最小二乘作為損失函式的隨機梯度下降優化方法: SVD++,LFM(SVD++的前身),由於只有有評分的元素在參與訓練過程,所以最後得到的近似矩陣中的對應位置的評分就是相應的預測值了,再計算得到使用者/物品相似度矩陣?

真正的大型推薦系統中,離線召回步驟儲存的是使用者相似度矩陣或物品相似度矩陣

2.5 推薦系統LFM和基於鄰域(如UserCF、ItemCF)的方法的比較

LFM是一種基於機器學習的方法,具有比較好的理論基礎。這個方法和基於鄰域的方法(比如UserCF、ItemCF)相比,各有優缺點。下面將從不同的方面對比LFM和基於鄰域的方法。

  • 理論基礎 
    LFM具有比較好的理論基礎,他是一種學習方法,通過優化一個設定的指標建立最優的模型。基於鄰域的方法更多是一種基於統計的方法,並沒有學習過程。【LFM的效能要好一些】
  • 離線計算的空間複雜度 
    基於鄰域的方法需要維護一張離線的相關表。在離線計算相關表的過程中,如果使用者/物品數很多,將會佔用很大的記憶體。假如有M個使用者和N個物品,在計算相關表的過程中,我們可能會獲得一張比較稠密的臨時相關表(儘管最終我們對每個物品只保留K個最相關的物品,但在計算過程中稠密的相關表是不可避免的),LFM則節省了大量的記憶體。【這裡節省記憶體的前提時沒有稠密化user-item矩陣吧】
  • 離線計算的時間複雜度 
    一般情況下,LFM的時間複雜度要稍微高於UserCF和ItemCF,這主要是因為該演算法需要多次迭代。但總體上,這兩種演算法在時間複雜度上面沒有本質的差別。【但也有人說LFM的計算時間複雜度更高】
  • 線上實時推薦 
    UserCF和ItemCF線上服務演算法需要將相關表快取在記憶體中,然後可以線上進行實時的預測。以ItemCF演算法為例,一旦使用者喜歡了新的物品,就可以通過查詢記憶體中的相關表將和該物品相似的其他物品推薦給使用者【因為有物品相似度矩陣啊】。因此,一旦使用者有了新的行為,而且該行為被實時地記錄到後臺的資料庫系統中,他的推薦列表就會發生變化。 
    而從LFM的預測公式可以看到,LFM在給使用者生成推薦列表時,需要計算使用者對所有物品的興趣權重,然後排名,返回全中最大的N個物品。那麼,在物品數很多時,這一過程的時間複雜度非常高,因此,LFM不太適合使用者物品數非常龐大的系統。另一方面,LFM在生成一個使用者推薦列表時速度太慢,因此不鞥呢線上實時計算,而需要離線將所有使用者的推薦結果事先計算好儲存在資料庫中【也就是user-item那張大矩陣】。因此,LFM不能進行線上試試推薦,也就是說,當使用者有了新的行為後,他的推薦列表不會發生變化。
  • 推薦解釋 
    ItemCF演算法支援很好的推薦解釋,它可以利用使用者的歷史行為解釋推薦結果。但LFM無法提供這樣的解釋,它計算出的隱類雖然在語義上卻是代表了一類興趣和物品,卻很難用自然語言描述並生成解釋展示給使用者。

3.FM Factorization Machine(因子分解機)

這裡著重強調一下MF與FM的區別,混淆了很久啊,矩陣分解MF、SVD++等,這些模型可以學習到特徵之間的互動隱藏關係,但基本上每個模型都只適用於特定的輸入和場景【因為他們都是協同過濾,都在使用者-物品評分矩陣下執行,也就是得有顯示反饋】。為此,在高度稀疏的資料場景下如推薦系統,FM(Factorization Machine)出現了。 
我認為一個很大的區別在於,MF等矩陣分解的方法都是在操作和分解使用者-物品矩陣,而FM矩陣將使用者和物品都進行了one-hot編碼作為了預測 評分 的特徵,使得特徵維度巨大且十分稀疏,那麼FM就是在解決稀疏資料下的特徵組合問題。 
參考部落格1(講解詳細,還有與SVM的區別),FM一般用於Ctr預估,其y值是用於的點選概率。【用於線上系統的精排序】 
https://www.cnblogs.com/AndyJee/p/7879765.html 
參考部落格2:有程式碼 
https://www.jianshu.com/p/152ae633fb00 
參考部落格3:有關於FM用於分類的loss的推導(用於預測CTR) 
https://blog.csdn.net/google19890102/article/details/45532745 
這裡寫圖片描述
這裡寫圖片描述 
這裡寫圖片描述

4.FFM

參考部落格: 
https://www.jianshu.com/p/781cde3d5f3d

總結

協同過濾演算法複雜度較低但是在使用者-物品矩陣稀疏時無法得到好的效果。 
MF等矩陣分解方法好理解但是計算複雜度高,且只適用於評分矩陣這種簡單的特徵計算,無法利用其他特徵 
FM與FFM在使用者量和物品量較大時,特徵維度爆炸式增長,好奇這種方法究竟如何應用到真正的系統中。

各種問號啊,後面再來補充吧,就醬~

————————————————補充劃分線———————————————— 
FM的優點是可以用於各種分類變數較多【需要one-hot】編碼的資料集中,其對於稀疏矩陣有奇效

但是在協同過濾領域,原始的MF方法需要的特徵儲存空間是 N_user*N_item。 
但FM卻需要一個N_grade*(N_user+N_item)的儲存空間大錯特錯【欸之前被一個簡化版的FM實現程式碼誤導了!!!】去看程式碼裡實現的時候,用一個原始資料大小的矩陣存特徵index,再用一個原始特徵大小的矩陣存特徵value,根本不需要儲存one-hot編碼過的龐大資料啊 
具體實現方式詳見下一篇部落格的講解: 
https://blog.csdn.net/qq_23269761/article/details/81366939

這回可以總結了~FM是真的好~!!!可能唯一的缺點是不好解釋?

【實際系統中】 協同過濾(基於記憶體/模型)大多用在召回階段,因為他可以快速的粗略的挑選出一些可解釋的推薦列表 
FM GBDT等模型用在召回後的精排序階段,利用預測出色Ctr對粗排序列表中的內容融合更高階的模型的進行更精準的計算和投放。

所以後續部落格中的演算法大多與Ctr預估有關咯,但是召回階段還有一大空白就是真正系統中是如何做到分散式計算的!

相關文章