天天看點

項亮《推薦系統實踐》——使用LFM隐語義模型進行Top-N推薦使用LFM(Latent factor model)隐語義模型進行Top-N推薦

使用LFM(Latent factor model)隐語義模型進行Top-N推薦

參考 https://blog.csdn.net/HarryHuang1990/article/details/9924377

https://blog.csdn.net/m0_37788308/article/details/78846429

最近在拜讀項亮博士的《推薦系統實踐》,系統的學習一下推薦系統的相關知識。今天學習了其中的隐語義模型在Top-N推薦中的應用,在此做一個總結。

隐語義模型LFM和LSI,LDA,Topic Model其實都屬于隐含語義分析技術,是一類概念,他們在本質上是相通的,都是找出潛在的主題或分類。這些技術一開始都是在文本挖掘領域中提出來的,近些年它們也被不斷應用到其他領域中,并得到了不錯的應用效果。比如,在推薦系統中它能夠基于使用者的行為對item進行自動聚類,也就是把item劃分到不同類别/主題,這些主題/類别可以了解為使用者的興趣。

對于一個使用者來說,他們可能有不同的興趣。就以作者舉的豆瓣書單的例子來說,使用者A會關注數學,曆史,計算機方面的書,使用者B喜歡機器學習,程式設計語言,離散數學方面的書, 使用者C喜歡大師Knuth, Jiawei Han等人的著作。那我們在推薦的時候,肯定是向使用者推薦他感興趣的類别下的圖書。那麼前提是我們要對所有item(圖書)進行分類。那如何分呢?大家注意到沒有,分類标準這個東西是因人而異的,每個使用者的想法都不一樣。拿B使用者來說,他喜歡的三個類别其實都可以算作是計算機方面的書籍,也就是說B的分類粒度要比A小;拿離散數學來講,他既可以算作數學,也可當做計算機方面的類别,也就是說有些item不能簡單的将其劃歸到确定的單一類别;拿C使用者來說,他傾向的是書的作者,隻看某幾個特定作者的書,那麼跟A,B相比它的分類角度就完全不同了。

顯然我們不能靠由單個人(編輯)或team的主觀想法建立起來的分類标準對整個平台使用者喜好進行标準化。

此外我們還需要注意的兩個問題:

  1. 我們在可見的使用者書單中歸結出3個類别,不等于該使用者就隻喜歡這3類,對其他類别的書就一點興趣也沒有。也就是說,我們需要了解使用者對于所有類别的興趣度。
  2. 對于一個給定的類來說,我們需要确定這個類中每本書屬于該類别的權重。權重有助于我們确定該推薦哪些書給使用者。

下面我們就來看看LFM是如何解決上面的問題的?對于一個給定的使用者行為資料集(資料集包含的是所有的user, 所有的item,以及每個user有過行為的item清單),使用LFM對其模組化後,我們可以得到如下圖所示的模型:(假設資料集中有3個user, 4個item, LFM模組化的分類數為4)

項亮《推薦系統實踐》——使用LFM隐語義模型進行Top-N推薦使用LFM(Latent factor model)隐語義模型進行Top-N推薦

R矩陣是user-item矩陣,矩陣值Rij表示的是user i 對item j的興趣度,這正是我們要求的值。對于一個user來說,當計算出他對所有item的興趣度後,就可以進行排序并作出推薦。LFM算法從資料集中抽取出若幹主題,作為user和item之間連接配接的橋梁,将R矩陣表示為P矩陣和Q矩陣相乘。其中P矩陣是user-class矩陣,矩陣值Pij表示的是user i對class j的興趣度;Q矩陣式class-item矩陣,矩陣值Qij表示的是item

j在class i中的權重,權重越高越能作為該類的代表。是以LFM根據如下公式來計算使用者U對物品I的興趣度

項亮《推薦系統實踐》——使用LFM隐語義模型進行Top-N推薦使用LFM(Latent factor model)隐語義模型進行Top-N推薦

我們發現使用LFM後, 

  1. 我們不需要關心分類的角度,結果都是基于使用者行為統計自動聚類的,全憑資料自己說了算。
  2. 不需要關心分類粒度的問題,通過設定LFM的最終分類數就可控制粒度,分類數越大,粒度約細。
  3. 對于一個item,并不是明确的劃分到某一類,而是計算其屬于每一類的機率,是一種标準的軟分類。
  4. 對于一個user,我們可以得到他對于每一類的興趣度,而不是隻關心可見清單中的那幾個類。
  5. 對于每一個class,我們可以得到類中每個item的權重,越能代表這個類的item,權重越高。

那麼,接下去的問題就是如何計算矩陣P和矩陣Q中參數值。一般做法就是最優化損失函數來求參數。在定義損失函數之前,我們需要準備一下資料集并對興趣度的取值做一說明。

資料集應該包含所有的user和他們有過行為的(也就是喜歡)的item。所有的這些item構成了一個item全集。對于每個user來說,我們把他有過行為的item稱為正樣本,規定興趣度RUI=1,此外我們還需要從item全集中随機抽樣,選取與正樣本數量相當的樣本作為負樣本,規定興趣度為RUI=0。是以,興趣的取值範圍為[0,1]。

采樣之後原有的資料集得到擴充,得到一個新的user-item集K={(U,I)},其中如果(U,I)是正樣本,則RUI=1,否則RUI=0。損失函數如下所示:

項亮《推薦系統實踐》——使用LFM隐語義模型進行Top-N推薦使用LFM(Latent factor model)隐語義模型進行Top-N推薦

上式中的

項亮《推薦系統實踐》——使用LFM隐語義模型進行Top-N推薦使用LFM(Latent factor model)隐語義模型進行Top-N推薦

是用來防止過拟合的正則化項,λ需要根據具體應用場景反複實驗得到。損失函數的優化使用随機梯度下降算法:

  1. 通過求參數PUK和QKI的偏導确定最快的下降方向;
項亮《推薦系統實踐》——使用LFM隐語義模型進行Top-N推薦使用LFM(Latent factor model)隐語義模型進行Top-N推薦
  1. 疊代計算不斷優化參數(疊代次數事先人為設定),直到參數收斂。
項亮《推薦系統實踐》——使用LFM隐語義模型進行Top-N推薦使用LFM(Latent factor model)隐語義模型進行Top-N推薦

其中,α是學習速率,α越大,疊代下降的越快。α和λ一樣,也需要根據實際的應用場景反複實驗得到。本書中,作者在MovieLens資料集上進行實驗,他取分類數F=100,α=0.02,λ=0.01。

               【注意】:書中在上面四個式子中都缺少了

項亮《推薦系統實踐》——使用LFM隐語義模型進行Top-N推薦使用LFM(Latent factor model)隐語義模型進行Top-N推薦

綜上所述,執行LFM需要:

  1. 根據資料集初始化P和Q矩陣(這是我暫時沒有弄懂的地方,這個初始化過程到底是怎麼樣進行的,還懇請各位童鞋予以賜教。)
  2. 确定4個參數:分類數F,疊代次數N,學習速率α,正則化參數λ。

LFM的僞代碼可以表示如下:

[python]
  1. def LFM(user_items, F, N, alpha, lambda):  
  2.     #初始化P,Q矩陣  
  3.     [P, Q] = InitModel(user_items, F)  
  4.     #開始疊代  
  5.     For step in range(0, N):  
  6.         #從資料集中依次取出user以及該user喜歡的iterms集  
  7.         for user, items in user_item.iterms():  
  8.             #随機抽樣,為user抽取與items數量相當的負樣本,并将正負樣本合并,用于優化計算  
  9.             samples = RandSelectNegativeSamples(items)  
  10.             #依次擷取item和user對該item的興趣度  
  11.             for item, rui in samples.items():  
  12.                 #根據目前參數計算誤差  
  13.                 eui = eui - Predict(user, item)  
  14.                 #優化參數  
  15.                 for f in range(0, F):  
  16.                     P[user][f] += alpha  (eui  Q[f][item] - lambda  P[user][f])  
  17.                     Q[f][item] += alpha  (eui  P[user][f] - lambda  Q[f][item])  
  18.         #每次疊代完後,都要降低學習速率。一開始的時候由于離最優值相差甚遠,是以快速下降;  
  19.         #當優化到一定程度後,就需要放慢學習速率,慢慢的接近最優值。  
  20.         alpha *= 0.9  

本人對書中的僞代碼追加了注釋,有不對的地方還請指正。

當估算出P和Q矩陣後,我們就可以使用(*)式計算使用者U對各個item的興趣度值,并将興趣度值最高的N個iterm(即TOP N)推薦給使用者。

總結來說,LFM具有成熟的理論基礎,它是一個純種的學習算法,通過最優化理論來優化指定的參數,建立最優的模型。

繼續閱讀