貝葉斯個性化排序(BPR)算法小結

矩陣分解在協同過濾推薦算法中的應用中,咱們討論過像funkSVD之類的矩陣分解方法如何用於推薦。今天咱們講另外一種在實際產品中用的比較多的推薦算法:貝葉斯個性化排序(Bayesian Personalized Ranking, 如下簡稱BPR),它也用到了矩陣分解,可是和funkSVD家族卻有不少不一樣之處。下面咱們來詳細討論。html

1、BPR算法使用背景

    在不少推薦場景中,咱們都是基於現有的用戶和商品之間的一些數據,獲得用戶對全部商品的評分,選擇高分的商品推薦給用戶,這是funkSVD之類算法的作法,使用起來也頗有效。可是在有些推薦場景中,咱們是爲了在千萬級別的商品中推薦個位數的商品給用戶,此時,咱們更關心的是用戶來講,哪些極少數商品在用戶心中有更高的優先級,也就是排序更靠前。也就是說,咱們須要一個排序算法,這個算法能夠把每一個用戶對應的全部商品按喜愛排序。BPR就是這樣的一個咱們須要的排序算法。算法

2、排序推薦算法背景介紹

     排序推薦算法歷史很悠久,早在作信息檢索的各類產品中就已經在使用了。最先的第一類排序算法類別是點對方法(Pointwise Approach),這類算法將排序問題被轉化爲分類、迴歸之類的問題,並使用現有分類、迴歸等方法進行實現。第二類排序算法是成對方法(Pairwise Approach),在序列方法中,排序被轉化爲對序列分類或對序列迴歸。所謂的pair就是成對的排序,好比(a,b)一組代表a比b排的靠前。咱們要講到的BPR就屬於這一類。第三類排序算法是列表方法(Listwise Approach),它採用更加直接的方法對排序問題進行了處理。它在學習和預測過程當中都將排序列表做爲一個樣本。排序的組結構被保持。微信

    本文關注BPR,這裏咱們對排序推薦算法自己很少講,若是你們感興趣,能夠閱讀李航的A Short Introduction to Learning to Rank.函數

3、BPR建模思路

    在BPR算法中,咱們將任意用戶u對應的物品進行標記,若是用戶u在同時有物品i和j的時候點擊了i,那麼咱們就獲得了一個三元組\(<;u,i,j>;\),它表示對用戶u來講,i的排序要比j靠前。若是對於用戶u來講咱們有m組這樣的反饋,那麼咱們就能夠獲得m組用戶u對應的訓練樣本。post

    既然是基於貝葉斯,那麼咱們也就有假設,這裏的假設有兩個:一是每一個用戶之間的偏好行爲相互獨立,即用戶u在商品i和j之間的偏好和其餘用戶無關。二是同一用戶對不一樣物品的偏序相互獨立,也就是用戶u在商品i和j之間的偏好和其餘的商品無關。爲了便於表述,咱們用\(>;_u\)符號表示用戶u的偏好,上面的\(<;u,i,j>;\)能夠表示爲:\(i>;_uj\)學習

    在BPR中,這個排序關係符號\(>;_u\)知足徹底性,反對稱性和傳遞性,即對於用戶集U和物品集I:優化

    完整性:\(\forall i,j \in I: i \neq j \Rightarrow i >;_u j\; \cup\;  j>;_u i\)ui

    反對稱性:\(\forall i,j \in I: i >;_u j\; \cap\;  j>;_u i \Rightarrow i=j\)spa

    傳遞性:\(\forall i,j,k \in I: i >;_u j\; \cap\;  j>;_u k \Rightarrow i>;_uk\)htm

    同時,BPR也用了和funkSVD相似的矩陣分解模型,這裏BPR對於用戶集U和物品集I的對應的\(U \times I\)的預測排序矩陣\(\overline{X}\),咱們指望獲得兩個分解後的用戶矩陣\(W\)(\(|U| \times k\))和物品矩陣\(H\)(\(|I| \times k\)),知足
\[ \overline{X} = WH^T \]

    這裏的k和funkSVD相似,也是本身定義的,通常遠遠小於\(|U|,|I|\)

    因爲BPR是基於用戶維度的,因此對於任意一個用戶u,對應的任意一個物品i咱們指望有:
\[ \overline{x}_{ui} = w_u \bullet h_i = \sum\limits_{f=1}^kw_{uf}h_{if} \]

    最終咱們的目標,是但願尋找合適的矩陣\(W,H\),讓\(\overline{X}\)\(X\)最類似。讀到這裏,也許你會說,這和funkSVD之類的矩陣分解模型沒有什麼區別啊? 的確,如今還看不出,下面咱們來看看BPR的算法優化思路,就會慢慢理解和funkSVD有什麼不一樣了。

4、BPR的算法優化思路

    BPR 基於最大後驗估計\(P(W,H|>;_u)\)來求解模型參數\(W,H\),這裏咱們用\(\theta\)來表示參數\(W\)\(H\), \(>;_u\)表明用戶u對應的全部商品的全序關係,則優化目標是\(P(\theta|>;_u)\)。根據貝葉斯公式,咱們有:
\[ P(\theta|>;_u) = \frac{P(>;_u|\theta)P(\theta)}{P(>;_u)} \]

    因爲咱們求解假設了用戶的排序和其餘用戶無關,那麼對於任意一個用戶u來講,\(P(>;_u)\)對全部的物品同樣,因此有:
\[ P(\theta|>;_u) \propto P(>;_u|\theta)P(\theta) \]

    這個優化目標轉化爲兩部分。第一部分和樣本數據集D有關,第二部分和樣本數據集D無關。

    對於第一部分,因爲咱們假設每一個用戶之間的偏好行爲相互獨立,同一用戶對不一樣物品的偏序相互獨立,因此有:
\[ \prod_{u \in U}P(>;_u|\theta) = \prod_{(u,i,j) \in (U \times I \times I)}P(i >;_u j|\theta)^{\delta((u,i,j) \in D)}(1-P(i >;_u j|\theta))^{\delta((u,j,i) \not\in D) } \]

    其中,
\[ \delta(b)= \begin{cases} 1&amp; {if\; b\; is \;true}\\ 0&amp; {else} \end{cases} \]
   

    根據上面講到的完整性和反對稱性,優化目標的第一部分能夠簡化爲:
\[ \prod_{u \in U}P(>;_u|\theta) = \prod_{(u,i,j) \in D}P(i >;_u j|\theta) \]

    而對於\(P(i >;_u j|\theta)\)這個機率,咱們可使用下面這個式子來代替:
\[ P(i >;_u j|\theta) = \sigma(\overline{x}_{uij}(\theta)) \]

    其中,\(\sigma(x)\)是sigmoid函數。這裏你也許會問,爲何能夠用這個sigmoid函數來代替呢? 其實這裏的代替能夠選擇其餘的函數,不過式子須要知足BPR的完整性,反對稱性和傳遞性。原論文做者這麼作除了是知足這三個性質外,另外一個緣由是爲了方便優化計算。

    對於\(\overline{x}_{uij}(\theta)\)這個式子,咱們要知足當\(i >;_u j\)時,\(\overline{x}_{uij}(\theta) >; 0\), 反之當\(j >;_u i\)時,\(\overline{x}_{uij}(\theta) <; 0\),最簡單的表示這個性質的方法就是
\[ \overline{x}_{uij}(\theta) = \overline{x}_{ui}(\theta) - \overline{x}_{uj}(\theta) \]

    而\(\overline{x}_{ui}(\theta) , \overline{x}_{uj}(\theta)\),就是咱們的矩陣$ \overline{X}\(對應位置的值。這裏爲了方便,咱們不寫\)\theta$,這樣上式能夠表示爲:
\[ \overline{x}_{uij} = \overline{x}_{ui} - \overline{x}_{uj} \]

    注意上面的這個式子也不是惟一的,只要能夠知足上面提到的當\(i >;_u j\)時,\(\overline{x}_{uij}(\theta) >; 0\),以及對應的相反條件便可。這裏咱們仍然按原論文的式子來。

    最終,咱們的第一部分優化目標轉化爲:
\[ \prod_{u \in U}P(>;_u|\theta) = \prod_{(u,i,j) \in D} \sigma(\overline{x}_{ui} - \overline{x}_{uj}) \]
    

    對於第二部分\(P(\theta)\),原做者大膽使用了貝葉斯假設,即這個機率分佈符合正太分佈,且對應的均值是0,協方差矩陣是\(\lambda_{\theta}I\),即
\[ P(\theta) \sim N(0, \lambda_{\theta}I) \]

    原做者爲何這麼假設呢?我的以爲仍是爲了優化方便,由於後面咱們作優化時,須要計算$lnP(\theta) \(,而對於上面假設的這個多維正態分佈,其對數和\)||\theta||^2$成正比。即:
\[ lnP(\theta) = \lambda||\theta||^2 \]

    最終對於咱們的最大對數後驗估計函數\(ln\;P(\theta|>;_u) \propto ln\;P(>;_u|\theta)P(\theta) = ln\;\prod\limits_{(u,i,j) \in D} \sigma(\overline{x}_{ui} - \overline{x}_{uj}) + ln P(\theta) = \sum\limits_{(u,i,j) \in D}ln\sigma(\overline{x}_{ui} - \overline{x}_{uj}) + \lambda||\theta||^2\;\)   

    這個式子能夠用梯度上升法或者牛頓法等方法來優化求解模型參數。若是用梯度上升法,對\(\theta\)求導,咱們有:
\[ \frac{\partial ln\;P(\theta|>;_u)}{\partial \theta} \propto \sum\limits_{(u,i,j) \in D} \frac{1}{1+e^{\overline{x}_{ui} - \overline{x}_{uj}}}\frac{\partial (\overline{x}_{ui} - \overline{x}_{uj})}{\partial \theta} + \lambda \theta \]

    因爲
\[ \overline{x}_{ui} - \overline{x}_{uj} = \sum\limits_{f=1}^kw_{uf}h_{if} - \sum\limits_{f=1}^kw_{uf}h_{jf} \]

    這樣咱們能夠求出:
\[ \frac{\partial (\overline{x}_{ui} - \overline{x}_{uj})}{\partial \theta} = \begin{cases} (h_{if}-h_{jf})&amp; {if\; \theta = w_{uf}}\\ w_{uf}&amp; {if\;\theta = h_{if}} \\ -w_{uf}&amp; {if\;\theta = h_{jf}}\end{cases} \]
 

    有了梯度迭代式子,用梯度上升法求解模型參數就容易了。下面咱們概括下BPR的算法流程。

5、BPR算法流程

    下面簡要總結下BPR的算法訓練流程:  

    輸入:訓練集D三元組,梯度步長\(\alpha\), 正則化參數\(\lambda\),分解矩陣維度k。          

    輸出:模型參數,矩陣\(W,H\)

    1. 隨機初始化矩陣\(W,H\)

    2. 迭代更新模型參數:

\[ w_{uf} =w_{uf} + \alpha(\sum\limits_{(u,i,j) \in D} \frac{1}{1+e^{\overline{x}_{ui} - \overline{x}_{uj}}}(h_{if}-h_{jf}) + \lambda w_{uf}) \]

\[ h_{if} =h_{if} + \alpha(\sum\limits_{(u,i,j) \in D} \frac{1}{1+e^{\overline{x}_{ui} - \overline{x}_{uj}}}w_{uf} + \lambda h_{if}) \]

\[ h_{jf} =h_{jf} + \alpha(\sum\limits_{(u,i,j) \in D} \frac{1}{1+e^{\overline{x}_{ui} - \overline{x}_{uj}}}(-w_{uf}) + \lambda h_{jf}) \]

    3. 若是\(W,H\)收斂,則算法結束,輸出W,H,不然回到步驟2.

    當咱們拿到\(W,H\)後,就能夠計算出每個用戶u對應的任意一個商品的排序分:$\overline{x}_{ui} = w_u \bullet h_i $,最終選擇排序分最高的若干商品輸出。

6、BPR小結

    BPR是基於矩陣分解的一種排序算法,可是和funkSVD之類的算法比,它不是作全局的評分優化,而是針對每個用戶本身的商品喜愛分貝作排序優化。所以在迭代優化的思路上徹底不一樣。同時對於訓練集的要求也是不同的,funkSVD只須要用戶物品對應評分數據二元組作訓練集,而BPR則須要用戶對商品的喜愛排序三元組作訓練集。

    在實際產品中,BPR之類的推薦排序在海量數據中選擇極少許數據作推薦的時候有優點,所以在某寶某東等大廠中應用也很普遍。因爲BPR並不複雜,下一篇我會用tensorflow來作一個BPR的實踐,敬請期待。

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

相關文章
相關標籤/搜索