關于推薦系統,如果在忘掉所有的公式和代碼,忘記所有的語言描述,腦海里就剩下幾張圖景,會是什么?一張二維表格,一個拓撲圖,一條時間線。這三幅圖景,是我看待推薦算法的三種視角。
視角一:矩陣視角
在腦中想象一個二維的表格,每一行代表一個用戶,每一列代表一個物品,表格里的每一個點代表用戶對物品的操作,這個操作可以是評分,點擊,點贊。其中,有些格子記錄了行為,有些格子是空的。到這里,我們就建立了基本的矩陣視角,推薦問題轉化成了如何補上那些空格子。
用戶對物品的評分等于相似用戶對該物品評分的加權平均值,這就是user-base的協同過濾了。換一個方向,用戶對物品的評分等于該用戶對其他物品的評分按物品相似加權平均值,這就是item-base的協同過濾。度量用戶之間的相似度,把矩陣的一行——對物品的評分向量作為該用戶的表示向量,那么用戶之間可以計算向量的距離,可以選擇任何距離公式,如余弦距離,皮爾森距離。對于物品之間的相似度,換一個方向即可。
對于任何兩個物品,可以計算它們的評分差值。具體來說,兩個物品有一批共同的歷史評分用戶,也就是矩陣里兩列有交集的行,每一行可以計算一個差值,將差值平均起來,作為兩個物品的距離。和上面的距離不同的,這個差值可以想象成物理中的位移,帶著符號的。推薦時,某用戶對于某個物品的評分,等于某用戶對其他物品評分加上這個位移,再進行平均得到的平均評分。和上面的item-base一樣的,都是列向量計算相似度,只不過相似度由距離變成了位移。這就是著名的Slope-One算法。
物品直接的相似度,除了上面的啟發式算法,能不能通過數據本身學習所得?這就誕生了SLIM(Sparse Linear Methods)方法。矩陣A是n*m評分矩陣,要學習一個n*m維的物品相似的矩陣W。
A的每一行是用戶的歷史評分,w的每一列是每一個物品和該列對應物品的相似度,計算內積即為該用戶對該列物品的評分,通過梯度下降訓練來擬合真實評分。其中,w非負體現了相似度的物理意義;對角線限制為0避免對角線全都學習到1完美過擬合;添加L1正則產生稀疏的w,使得結果在大規模物品集上可用;w的每一列的學習都可以看作一個線性回歸模型,訓練時可以彼此相互獨立,因而可以分布式學習。
在矩陣視角下,很自然可以進行矩陣分解。SVD矩陣分解將n個用戶m個物品的大矩陣分解成三個矩陣相乘,中間的矩陣越靠近左上角的特征值越大,代表矩陣分解的主要成分,也就是說保留左上角的
k*k維矩陣D,其余的都置為零,將原來的等于變為約等于。將藍色和紅色的矩陣合并,得到一個
m*k維的矩陣,每一個行代表一個k維的用戶向量,對于黃色矩陣保留其前k行(后面的不影響計算了),每一列代表一個物品向量,用戶和物品向量的內積也就是矩陣相乘后對應矩陣的值,也就是空缺處的評分,將向量索引起來就可以推薦了。
要使用SVD分解,待分解矩陣要是稠密的,稀疏的評分矩陣要按照統計學方法填充,如填充均值。另外,SVD過擬合現象嚴重,泛化誤差太大。在2006年Netflix Prize的百萬推薦大獎賽上, Simon Funk 在博客公開FunkSVD算法。直接將評分矩陣分解成兩個矩陣相乘,n*k維度的用戶矩陣,每一行是用戶的隱式向量表示,k*m維的物品矩陣,每一列是物品的隱式向量表示,用戶和物品向量的內積即為預估的評分。那如何進行分解呢?隨機初始化矩陣,使用均方誤差作為loss,梯度下降進行學習。這個過程中還可以加入正則項,降低泛化誤差。由FunkSVD開始,基于Matrix factor(MF)的方法大放異彩。
在MF的基礎上,考慮推薦中的side information,如用戶的年齡性別,物品的類目價格。用戶和物品自身或屬性稱作一個field,field之間可以兩兩進行矩陣分解,這個被稱作二階項,類似BiasSVD考慮每一個field都有一個bias,這個被稱作一階項,再加上一個全局的bias項。這就是著名的Factorization machines(FM)。
如果把上面介紹的SLIM和MF解結合起來,將物品的相似度矩陣
W分解成P*Q兩個低維矩陣,用戶對某物品的評分,等于他過去評分過的物品在P中對應的向量和
Q中該物品向量內積的和,這就是FISM算法。相比SLIM的稀疏處理,變為分解降維。最后再附上一張圖,說明MF,SLIM和FISM之間的關系。
視角二:圖視角
把用戶和物品看作頂點,用戶的評分在用戶和物品之間建立起邊,就得到了一個二部圖;在二部圖的基礎上添加更多的頂點和邊,形成一個更為復雜的圖,輔助二部圖的計算。在圖的視角下,推薦問題轉化成了在圖上尋找高效的鏈接模式。
我們認為在同一個用戶的歷史行為中,那么兩個物品之間有一條邊,現在要計算兩個物品之間的相似度,最樸素的思想就是數一數他們之間有多少條邊。考慮每一條邊權重不一樣,邊是通過用戶建立的,用戶的點擊的物品越多,對應邊的權重就越小。這就是Adamic/Adar算法的思想。
阿里著名的協同過濾推薦算法swing,尋找圖中更加穩固的形狀,共同評分過兩個物品的用戶集合中,每兩個用戶和這個兩個物品形成了一個四邊形(下圖紅邊為一個swing結構),統計有多少個這樣的結構,每一個結構的權重是不同的,這個結構里兩個用戶共同評分過的物品的數量越多權重就越小。
從用戶和物品的二部圖出發進行構圖,再結合隱因子模型(Latent Factor Model),就進入了Graph-Embedding的領域。DeepWalk算法在圖上隨機游走深度優先遍歷得到序列,然后和word2vec類似地使用Skip-Gram(A和B序列中相鄰,用A的embedding作為特征最大化B的選中概率)進行訓練。Node2Vec算法在DeepWalk的基礎上,考慮隨機游走的方式,引入深度優先和廣度優先的權衡,能夠得到更好的更靈活的頂點隱式表示。LINE算法考慮頂點的二階相似,兩個頂點有邊為一階相似,兩個頂點有共同的鄰居頂點為二階相似,它雖不做隨機游走,但可以看作是廣度優先的采樣。Graph-Embedding取得了頂點的embedding,計算相似度可以得到用戶物品距離,物品物品距離,用于推薦。
GCN(圖卷積)接收拓撲圖作為網絡輸入,可以計算每一個頂點更好的表示,相比graph-embedding可以有監督地為推薦目標而訓練。但GCN在運算時,每一層都要輸入整個圖,在推薦系統里,物品和用戶都可以是百萬級別以上,實際中無法使用。GraphSAGE通過RandomWalk采樣,解決了這個問題,用在推薦領域就是PinSage算法。從某頂點出發,深度優先走k步,得到多個子圖,組成一個batch進行訓練,。然后按照采樣的反方向做前向傳播,這就是一個k層的圖網絡,下圖是一個k為2的例子。
在用戶和物品的二部圖基礎上,用戶和用戶根據社會關系建立起邊來,這就是社會化推薦。
在用戶和物品的二部圖基礎上,增加物品的屬性作為頂點,建立新的邊,就得到了一個異質信息網絡。比如一個電影推薦系統,除了用戶和電影外,還有導演,演員,電影類型,導演拍攝電影,電影屬于某種類型,演員出演電影,導演與演員合作,諸如此類就能建立很多邊。其中一類推薦算法叫做meta-path,通過專家經驗人工挑選出一些圖中路徑,如用戶->演員->電影,用戶->導演->電影,這樣的路徑稱之為meta-path,計算每一條meta-path的權重,將用戶和物品間的所有meta-path聯合計算評分。
視角三:時間線
把用戶對物品的行為想象成一條時間線,我們已知當前時刻前用戶的物品行為序列,推薦問題被轉化成了預測下一個時刻用戶發生行為的物品。
假設序列中下一個物品只與上一個物品有關,可以使用馬爾科夫模型MC(Markov Chains),序列中相鄰的物品間進行矩陣分解。結合上文提到的用戶和物品間矩陣分解MF,用戶,當前行為物品和下一個物品三者之間兩兩進行矩陣分解,將三個值加起來擬合評分,就得到了FPMC(Factorizing Personalized Markov Chains)算法。
Translation-based推薦在序列建模中引入Metric Learning(把行為關系和高維空間距離映射起來),用戶u,當前行為物品i,下一個物品j三者向量化表示,訓練使得它們滿足u+i≈j,推薦時只需拿到用戶歷史行為的物品向量加上用戶向量得到下一個物品向量,然后在推薦集合中KNN尋找即可完成推薦。
以前模型的輸入形式有限,人們通過特征處理將數據組織成模型可以接受的形式;隨著深度學習的發展,數據越來越傾向于保存其原有的形式,人們通過模型設計來學習有效的模式。在時間線的視角下,直接用深度模型結構建模序列,預測下一物品,形成了一個可以發揮想象力和燃燒算力的領域——Sequential/Session-base推薦。在2016年的時候,RNN是處理序列問題的標配,它從NLP領域走來,誕生了GRU4Rec算法。受到NLP領域Char-CNN啟發,CNN的結構也逐漸用于建模序列結構,Attention機制大火之后,RNN+Attention,CNN+Attention,RNN+CNN+Attention被枚舉了一遍。隨著google老師的BERT取得NLP領域巨大成就,Self-Attention以及多層的Transformer結構開始成為序列建模的常規配置。最近的文章里,圖神經網絡(GNN),Memory networks,變分自編碼器(VAE)也成為了序列推薦領域的深度樂高積木。
在CTR預估領域,越來越多的模型直接將用戶歷史行為序列按照時間順序排列,使用深度模型結構直接建模。
總結
其實如果要細數,還有一個視角叫做高維空間視角。用戶和物品都是一個高維度空間里的點,空間里點之間的距離越近,代表著物品和物品越相關,用戶對物品越偏好,推薦問題轉化成了如何將用戶和物品嵌入到高維空間里。典型的主題如Metric Learning。不過這個視角的正交性不好,深度學習席卷推薦系統后,embedding是個太常見的思路,前面很多的方法也都是最終把問題轉化成了高維空間嵌入,如graph-embedding,Transition-base推薦。為了避免歸類上的糾結;再加上任何一個深度網絡作為Encoder把用戶和物品embedding,都可以歸在這個視角,沒有那么多令人印象深刻的典型方法,就不做單獨梳理了。
To My Best Knowledge,我把自己認為推薦系統里經典且令人印象深刻的方法歸在三種視角中——矩陣,圖,時間線。本來想談談認識的,寫著寫著寫多了,變成了一篇梳理文章。如果對你從偏算法的角度理解推薦系統有所助益,我就很開心了。后面有所學習所得,也會持續更到這篇文章,感興趣的收藏關注一下吧!






