在矩陣分解在協同過濾推薦算法中的應用中,我們討論過像funkSVD之類的矩陣分解方法如何用於推薦。今天我們講另一種在實際產品中用的比較多的推薦算法:貝葉斯個性化排序(Bayesian Personalized Ranking, 以下簡稱BPR),它也用到了矩陣分解,但是和funkSVD家族卻有很多不同之處。下面我們來詳細討論。
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來說我們有m組這樣的反饋,那麼我們就可以得到m組用戶u對應的訓練樣本。
4. BPR的算法優化思路
5. BPR算法流程
6. BPR小結
BPR是基於矩陣分解的一種排序算法,但是和funkSVD之類的算法比,它不是做全局的評分優化,而是針對每一個用戶自己的商品喜好分貝做排序優化。因此在迭代優化的思路上完全不同。同時對於訓練集的要求也是不一樣的,funkSVD只需要用戶物品對應評分數據二元組做訓練集,而BPR則需要用戶對商品的喜好排序三元組做訓練集。
在實際產品中,BPR之類的推薦排序在海量數據中選擇極少量數據做推薦的時候有優勢,因此在某寶某東等大廠中應用也很廣泛。由於BPR並不複雜,下一篇我會用tensorflow來做一個BPR的實踐,敬請期待。
閱讀更多 機器不學習 的文章