推薦系統:推薦系統研究筆記


隨着信息技術和互聯網的發展,人們逐漸從信息匱乏的時代走入了信息過載(information overload)的時代。在這個時代,無論是消費者還是信息生產者都遇到了很大的挑戰:對於信息消費者,從大量信息中找到自己感興趣的信息是一件非常困難的事情;對於信息生產者,讓自己生產的信息脫穎而出,受到廣大用戶的關注,也是一件非常困難的事情。推薦系統就是解決這一矛盾的重要工具。
推薦系統的任務就是聯系用戶和信息,一方面幫助用戶發現對自己有價值的信息,另一方面讓信息能夠展現在對它感興趣的用戶面前,從而實現信息消費者和信息生產者的雙贏。
——推薦系統實戰 項亮

經典方法

協同過濾 CF

我們一般都有喜歡的演員和導演,有些人可能會打開搜索引擎,輸入自己喜歡的演員名,然后看看返回結果中還有什么電影是自己沒有看過的。比如我非常喜歡周星馳的電影,於是就去豆瓣搜索周星馳,發現他早年的一部電影我還沒看過,於是就會看一看。這種方式是尋找和自己之前看過的電影在內容上相似的電影。推薦系統可以將上述過程自動化,通過分析用戶曾經看過的電影找到用戶喜歡的演員和導演,然后給用戶推薦這些演員或者導演的其他電影。這種推薦方式在推薦系統中稱為基於內容的推薦(content-based filtering)
我們還可能查看排行榜,比如著名的IMDB電影排行榜,看看別人都在看什么電影,別人都喜歡什么電影,然后找一部廣受好評的電影觀看。這種方式可以進一步擴展:如果能找到和自己歷史興趣相似的一群用戶,看看他們最近在看什么電影,那么結果可能比寬泛的熱門排行榜更能符合自己的興趣。這種方式稱為基於協同過濾(collaborative filtering)的推薦
CF是推薦系統里的一個大課題,我們后面的研究基本上都逃脫不掉CF的思想。
CF分為ItemCF和UserCF,以及基於模型的CF,具體可以看推薦系統:協同過濾CF和基於內容的推薦CB
下面歷史的車輪滾滾向前,我們由最基本的CF過度到了基於模型的CF階段。

矩陣分解 MF

首個重要的進展就是矩陣分解(Matrix Factorization),說到矩陣分解技術,首先想到的往往是特征值分解與奇異值分解(Singular value decomposition,SVD)。這兩個詞我們貌似都在線性代數里學到過,這里就不展開了。可以看這篇博文溫習一下。奇異值σ跟特征值類似,在矩陣Σ中也是從大到小排列,而且σ的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上了。於是我們就可以用少量的信息去抽象表示UI矩陣(如果不稀疏可以學到的話),然后就可以恢復出沒有交互過的位置的潛在值。
特征值分解需要矩陣為方陣,奇異值分解又要求矩陣是稠密的,而推薦系統場景下的UI矩陣則一般是非方形的,稀疏的。
於是在2006年,Simon Funk提出了Funk-SVD算法,其主要思路是將原始評分矩陣M(mn)分解成兩個矩陣P(mk)和Q(kn),同時僅考察原始評分矩陣中有評分的項分解結果是否准確,而判別標准則是均方差(MSE)。
即對於矩陣M(m
n),我們想辦法將其分解為P(mk)、Q(kn),此時對於原始矩陣中有評分的位置MUI來說,其在分解后矩陣中對應的值就是

\[M_{UI}=\sum\limits_{k=1}^K P_{u,k}Q_{k,i} \]

這種方法就是基於隱語義模型(LFM,Latent Factor Model)的矩陣分解。其算法意義層面的解釋為通過隱含特征(latent factor)將user興趣與item特征聯系起來。
以矩陣分解為代表的隱語義模型LFM和LSI,LDA,Topic Model其實都屬於隱含語義分析技術(隱含語義分析技術是門大學問,這里就先不展開了,這里只講LFM),是一類概念,他們在本質上是相通的,都是找出潛在的主題或分類。這些技術一開始都是在文本挖掘領域中提出來的,近些年它們也被不斷應用到其他領域中,並得到了不錯的應用效果。比如,在推薦系統中它能夠基於用戶的行為對item進行自動聚類,也就是把item划分到不同隱類別中,這些隱類別可以理解為用戶的興趣,也可以理解為對物品進行的不同抽象程度的分類。
LFM的思想其實很簡單,就是人為設計一個“隱類別”的類別數,各個隱類別的意義我們不用去管,然后通過訓練user和item在每個隱類別上的“興趣”或者“比重”,進而恢復出UI矩陣的思想(后面提到的很多模型都是可以得到用戶對未交互過的物品的打分或者點擊購買概率,那也相當於恢復出了UI矩陣)。
那么使用LFM的好處是什么呢?為什么要用LFM呢?
還是回到推薦系統的場景中。我們遇到的UI矩陣都是稀疏的,即用戶基本和絕大多數的item都沒有交互過,體現在隱式反饋的數據中則是一大片的0。
那么我們比如想利用模型恢復出(i,j)位置(用戶i對物品j的打分),而這個位置正好沒有交互過,是0,那么我們是無法訓練到這個點的。使用SVD也是很難訓練出一個理想的結果的,因為矩陣太稀疏了,很難學到可以表示UI矩陣的特征值和特征向量們。
而使用了LFM之后,我們將UI矩陣抽象到了兩個矩陣P和Q上,這兩個矩陣一個代表用戶興趣矩陣,一個代表物品矩陣,兩者相乘恢復出UI矩陣。
那么只要這個用戶或者物品與其他物品或者用戶交互過,其矩陣就能得到訓練,所以不需要矩陣稠密,即可訓練。
所以我們使用LFM。
矩陣分解相關方法細節可以看推薦系統:矩陣分解方法

因子分解機 FM

前面我們提到了兩個重要的思想,協同過濾CF和隱語義模型LFM。后面的模型基本都或多或少使用了這兩個思想。
因子分解機(Factorization Machine,FM)是由Konstanz大學(德國康斯坦茨大學)Steffen Rendle(現任職於Google)於2010年最早提出的一種基於矩陣分解的方法,旨在解決大規模稀疏數據下的特征組合問題。
前面的CF,LFM,MF都是針對UI矩陣進行處理的推薦算法。而FM不同,FM是一個通用方法,不止可以用於推薦領域,它可以用於各個領域,解決回歸、二分類、排序等問題。
思考線性回歸,我們有很多的特征,這些特征中,有些特征我們是可以通過特征工程來完成特征的交叉的,比如:年齡和性別,25歲的男生和25歲的女生的購買行為必然是會有不同的。那么我們可以將這些交叉項的權重學習也放到公式里,於是有:

\[\hat{y}(x)=w_0+\sum_i^nw_ix_i+\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n w_{ij}x_ix_j \]

但是由於特征數量較多,以及推薦場景下,UI矩陣較為稀疏,特征共現少,wij難以充分學習。(只有特征i,j共同在樣本中出現,wij才能得到學習,而可能數據集中一共都沒有共現過一次,wij根本無法得到學習)。
於是FM借鑒矩陣分解思想,對參數wij進行分解,分解為兩個向量\(v_i,v_j\)的向量內積。這樣,只要特征i在樣本中出現,特征i的特征向量\(v_i\)就能得到訓練。此外,由於隱向量維度設置一般不會過大,這樣還可以有效減少模型要訓練的參數量。

\[\hat{y}(x)=w_0+\sum_i^nw_ix_i+\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n <v_i,v_j>x_ix_j \\ <v_i,v_j>=\sum\limits_{f=1}^k v_{if}v_{jf} \]

此外,上式的時間復雜度為O(kn^2),FM還通過二次項展開,將之化簡為O(kn)的模型:

\[\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n <v_i,v_j>x_ix_j=\frac{1}{2} \sum\limits_{f=1}^k[(\sum\limits_{i=1}^nv_{if}x_i)^2-\sum\limits_{i=1}^nv_{if}^2x_i^2] \]

證明過程(二次項展開):

場感知因子分解機 FFM

場感知因子分解機(Field-aware Factorization Machine,FFM)通過引入field的概念,FFM把相同性質的特征歸於同一個field。
比如,所有的日期類特征都可以歸入日期場,所有品類特征都可以歸入品類場。
假設樣本的 n個特征屬於 f 個field,那么FFM的二次項有 n*f個隱向量。而在FM模型中,每一維特征的隱向量只有一個,即總體只有n個隱向量。FM可以看作FFM的特例,是把所有特征都歸屬到一個field時的FFM模型。

\[\hat{y}(x)=w_0+\sum_i^nw_ix_i+\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n <v_{i,f_j},v_{j,f_i}>x_ix_j \]

其中,\(f_j\)是第j個特征所屬的field。如果隱向量的長度為k,那么FFM的二次參數有nfk個,遠多於FM模型的n*k個。此外,由於隱向量與field相關,FFM二次項並不能夠化簡,其復雜度為O(kn2)。

BPR和BPRLoss

在推薦系統中,我們經常可以見到implicit feedback,即訓練集中,訓練數據分為正樣本和負樣本,正樣本是用戶發生過購買行為的物品構成的樣本,而負樣本是用戶未發生過購買行為的物品構成的樣本,這不意味着用戶不喜歡該物品、未來不會購買該物品。負樣本包含兩種情況:1.用戶不知道該物品的存在;2.用戶知道該物品的存在但是沒買。而且前者的概率大一些,所以我們不能簡單的將正樣本的物品作為1,負樣本的物品作為0。
於是我們就需要使用BPRLoss在解決這個問題。
BPR Loss(Bayesian Personalized Ranking),是一種pairwise的loss。我們之前常用的交叉熵、MSE都可以認為是pointwise的loss。
pairwise loss特別適用於implicit feedback,因為我們不需要預測值和ground truth做比較形成損失,我們只需要讓正樣本的分數比負樣本高即可。


假設先驗的概率密度:


即,經過MAP,目標函數為:

Deep方法

介紹完經典的推薦算法后,我們來學習一下基於深度學習神經網絡的一些算法。

Wide&Deep

說到經典算法,首當其沖的肯定就是大名鼎鼎的Wide&Deep。這是Google在2016年提出的一個模型,個人認為更像一個框架,一種思想,內容不難,但是很有效。
論文中主要講了Memorization和Generalization兩個概念,翻譯過來一個叫記憶,一個叫泛化。Memorization就是模型可以記住見過的樣本,從而進行准確分類,但是這樣容易過擬合,在沒有見過的樣本上,模型的表現就會相對差一些。而Generalization則是泛化性能,為了在未見過的樣本上有較好的表現,讓模型具有一定的推測能力,但是推測的是會有不准確的時候存在的。所以我們最好是追求一個兩者的結合和平衡。
於是Google就推出了Wide&Deep框架。Wide部分就是一個不含隱層的單層網絡,直連最終的輸出節點,這部分體現的是Memorization。Deep部分則是一個較深的DNN,用來對高階抽象的特征進行建模,從而提升模型在Generalization方面的表現。
模型架構如圖:


我們初始的特征來自用戶的一個query,表示用戶想在google應用商店下載什么app。然后google的推薦系統會有一個retrieval給出一個物品的待選集,然后從待選集中給出評分最高的app進行推薦。
特征就是這個用戶的信息。
wide部分接收我們特征工程過的交叉項特征,由於是手工特征工程,所以這里可以對任意維交叉特征進行建模。
deep部分則接收所有的連續特征,以及embedding后的離散特征,然后將他們concat到一起。
這兩部分最終的結果被加權求和在一起得到最終結果。並一起使用logloss聯合訓練。
不過原文還說到,對於wide部分使用FTRL做優化器,對於deep部分使用AdaGrad做優化器,這個不知道是怎么實現的。

DeepFM

這是華為在2017年3月提出的一個模型,用於CTR預估。

從Wide&Deep我們可以得知,同時考慮低階和高階交叉特征能取得更好的效果。於是DeepFM將FM和DNN結合,可以更好的使用一階特征、二階交叉特征以及DNN學習到的高階抽象特征,進而取得更好的效果。
我們觀察網絡結構,其實DeepFM相比wide&deep就是將wide部分拓展了一下,wide部分使用FM部件代替,並加入了不交叉的部件來保留一階特征。
FM部件好像結構圖上畫的不是很清楚,這里用公式明確一下:

\[y_{FM}(x)=w_0+\sum_i^nw_ix_i+\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n <v_i,v_j>x_ix_j \]

其實還是FM的公式。
另外DeepFM的兩個部件都使用相同的輸入。
在DeepFM中,對於稀疏的輸入向量,模型先將他們經過一個embedding layer,轉化為稠密向量,然后再送入兩個部件做輸入。原來就是稠密向量的輸入應該就不用經過這一步了,或者也經過這一步之后仍然是稠密向量,這點原論文好像沒有提到。

其中,embedding layer的結構如圖。其中一個field可以表示一個離散變量onehot后的結果,是一個稀疏的只有一個1的向量,然后embedding layer對不同長度的field生成同樣長度的embedding向量。其實實現時就還是做一個embedding lookup。
deepFM中FM與deep部分共享一份embedding數據,有兩點好處:
1)能夠從原始特征同時學習低階和高階特征
2)不需要像W&D做特征工程

DCN Deep Cross Network

這是一篇谷歌2017年8月推出的論文,和DeepFM一樣,也是對Wide&Deep框架的改進。
它提出,DNN是對implicit交叉特征進行提取的,而explicit交叉特征也很重要,這部分在W&D中需要人工特征工程。
於是它就提出用CrossNetwork自動交叉特征,然后和DNN結合,這樣對兩種交叉特征都可以學習到,還省去了人工。

網絡結構如上,和DeepFM一樣,也是兩個部件使用了同樣的輸入。
稀疏特征經過embeddinglayer形成稠密向量和原本就稠密的特征一起作為輸入。
CrossNetwork部分不是特別清晰,具體可以見下圖和公式:


其中\(w_l\)是一個和輸入同緯度的權重向量,這樣交叉后得到的還是同樣維度的向量。這個向量還加上了偏置向量以及上個CrossLayer的結果,這樣相當於保留了(l-1)階交叉特征的信息,只不過是通過對位相加來實現的保留。

NFM Neural Factorization Machines

這是新加坡國立大學的何向南大佬2017年8月的論文。
這篇論文感覺倒是沒什么新東西。
其實就是FM的神經網絡版本。

\[\hat{y}(x)=w_0+\sum_i^nw_ix_i+\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n <v_i,v_j>x_ix_j \]

我們知道上式可以變形為復雜度為O(kn)的模型。
然后NFM提出了一個叫Bi_interaction Pooling的操作,來完成這一點,然而其實FM就已經做了。唯一的區別是,NFM在做這個操作前,將稀疏的輸入特征經過了Embedding Layer,然后對每個特征對應的新向量(1位到多位)進行特征交叉,這樣的話相當於增加了特征的參數復雜度,從而提高對特征的把控。



目標函數是MSE。

AFM Attentional Factorization Machines

這篇是新加坡國立大學的何向南大佬2017年8月的論文。

模型也是對FM做了改進,上一篇是加上了EmbeddingLayer,這篇是加了Attention。
其中Attention權值的算法:

模型整體公式:

從模型整體公式我們可以看出,AFM和FM除了Attention外還有差別。
FM中的\(v_i,v_j\)是權值\(w_{ij}\)的因子分解結果,沒有什么意義,所以直接向量內積得到權值即可。
而這里的\(v_i,v_j\)是特征\(x_i,x_j\)對應的embedding,所以相當於他們也是特征信息,所以這里采用向量對位相乘,最終乘一個weights\(\mathbf{p}\),得到最終結果。
目標函數為MSE+L2正則。

NCF Neural Collaborative Filtering TODO

又見何向南大佬!2017年4月。

如圖,MF存在將高維空間映射到低維空間表示能力不足的缺點。
本文就提出了NCF框架,使用GMF+MLP來解決這個問題(具體咋解決TODO)。
模型架構:

DIN Deep Interest Network

這是阿里媽媽定向廣告團隊2018年5月的論文。
作者們認為,我們用一個固定長度的向量來表示用戶,而不管我們的candidate ads是啥,這將成為從豐富的用戶行為歷史中捕捉用戶廣發興趣的瓶頸。於是提出DIN網絡:

網絡結構不復雜:輸入:用戶特征,多個商品的特征(商品ID,商鋪ID,品類ID),CandidateAd(商品ID,商鋪ID,品類ID),上下文特征。都是離散類別特征。
所有的離散特征經過一層embedding layer。
商品特征和CandidateAd特征經過ActivationUnit計算出權重,每個商品和權重一起加權求和sum pooling。
得到的記過和用戶特征、CandidateAd和上下文特征一起concat送入DNN。
這里用的激活函數是PRelu或者Dice。
目標是CTR,所以目標函數用交叉熵。
DIN在訓練時還用了兩個小trick:Mini-batch Aware Regularization和Data Adaptive Activation Function。
在網絡參數量非常巨大時,如果我們不對網絡加正則化約束,那么網絡的訓練效果會隨着迭代增多越來越差(train loss 越來越小,但是到了某個時間節點,test loss飛速上升)。
所以我們需要對網絡參數加正則化約束,但是對於接近上億級別的參數量,進行傳統的l1l2正則化約束會帶來巨大的計算量,而這些參數主要來自embedding參數,是稀疏的。所以作者們就提出了Mini-batch Aware Regularization來簡化計算量。
我們一般的L2正則可以用以下公式表示:

這里\(\mathbf{W}\)是DK的embedding參數,D可以理解為item個數,K為embedding維數。\(w_j\)則是其中的一列(注意不是一行!),\(n_j\)則是特征j在數據集中出現的總次數。\(I(x_j\neq 0)\)表示數據集中所有的樣本x里是否有特征j,有為1,沒有為0。其實這里這個指示函數沒什么意義,直接用1就好,因為如果沒有出現,最后一項\(||w_j||_2^2\)自然為0。
然后從全部數據集轉化為只看mini-batch里樣本的視角:

這里\(w_j\)變成了B
K中的一列。\(I(x_j\neq 0)\)表示minibatch中所有的樣本x里是否有特征j,有為1,沒有為0。
因為稀疏,所以一個batch可能也就出現一次這個參數,所以可以用參數\(w_j\)是否在minibatch m中出現過來近似其次數(即1次表示出現過,無論多少次;0表示沒出現過)。
於是得到近似:

其中\(\alpha_{mj}=max_{(x,y)\epsilon B_m}I(x_j\neq 0)\)
所以可以這么更新:

所以感覺只是以列的形式表示了這個更新過程呀?並沒有減少計算量?這個問題留待以后解決吧。
然后則是Data Adaptive Activation Function
其實就是PRelu,PRelu就是leaky Relu。

leaky Relu中,控制函數p(s)=I(s>0)。而實際應用中,每層數據分布都不一樣,PRelu的recified point 都在0,不一定合適,所以推出Dice


Dice可以看作是pRelu的泛化,根據inputdata動態調整rectified point。其實就是將控制函數變為了一個移位的sigmoid函數。

CDAE TODO

PNN TODO

https://zhuanlan.zhihu.com/p/33177517
https://zhuanlan.zhihu.com/p/56651241

DIEN TODO

以上是經典的基於深度學習的推薦算法:wide&deep,DeepFM,DCN都是wide+deep框架的模型,NFM,AFM都是基於FM的小修改,NCF則是對MF的改進。DIN則是基於Attention的模型,可以對用戶最近購買的物品重要程度進行建模。CDAE則是另外一種思路,基於AutoEncoder的。

deep方法至此寫完,這篇博文結束了。后面會新開博文介紹序列推薦、知識圖譜、GANs、CNN等,並給出鏈接。

參考資料:

《推薦系統實戰》 項亮
https://blog.csdn.net/HarryHuang1990/article/details/9924377
https://zhuanlan.zhihu.com/p/34497989
https://www.cnblogs.com/fuleying/p/4466326.html


免責聲明!

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



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