一個經典的推薦系統一般分為召回階段和排序階段,召回階段是指從大量的(可能高達數十億)的item中選定候選集(一般為幾千到幾百的範圍)的過程,而排序階段是指對候選集中的item按照使用者偏好進行排序。本質上來說,所有推薦演算法的目標都是識別使用者對某一item的偏好,也就是說,對於如下的一個user-item-preference矩陣,我們需要預測其中任意一點的值:
大部分情況下,這張表是相當稀疏的,而且在隨著時間不斷更新,我們也不可能把它全部算出來。所以基本上我們只有在查詢的時候才會由模型來計算某個使用者的preference的值,而不同的推薦系統即意味著:
-
對使用者preference的不同定義。有時候,使用者的評分是明確的,比如我們會在豆瓣和淘寶對item進行打分。但更多時候,我們是沒有這個明確的rank的。這種情況下,我們擁有的資料是使用者的implicit feedback(隱式反饋),比如說使用者的瀏覽、點選、播放等行為。我們需要使用使用者的行為來確定preference的值,在很多情況下,我們使用不同行為的加權和作為preference。使用者行為的權重會根據我們的關注度而改變,比如在視訊網站,我們可能關注播放行為;在淘寶,可能主要關注購買行為。我們根據不同的關注點對使用者的preference進行不同的定義,這個定義決定了推薦系統的輸入,往往也決定了推薦系統的目標。
-
對預測目標的不同定義。一個推薦系統是非常複雜的,我們會在不同場景下使用很多不同的推薦演算法,來構成整個推薦演算法。使用者的preference往往是較為複雜的,在很多場景下不能直接觀測,這時我們通常會使用另外一些指標來作為它的度量。還有很多時候preference不是一個適合作為推薦演算法目標的值,所以我們在不同的場景下還是會為推薦演算法設立不同的相關的目標值。典型的比如CTR(click rate),playback_duration之類的。
-
對評測指標的不同定義。評測指標是個整體的目標,比如使用者滿意度、使用者購買率等等,我們在最終評價一個推薦系統的好壞時會用這些指標。比如一個視訊網站,真正關注的肯定是使用者留存率、盈利等資料,這是長期評測指標;總的使用者watch minutes是短期評測指標;preference是一個使用者播放行為、點選行為、收藏行為等綜合起來決定的值;而在不同場景的推薦演算法中,預測目標可能是使用者的CTR,playback_duration等等。
-
召回階段的不同篩選策略。基本是比較大方向的規則,比如popular content + saved content + historic related content等等。
-
排序階段不同的預測模型。種類非常多,是現在推薦系統領域的主要關注方向。
-
不同的模型更新時間,即時的或者離線的。這個跟推薦系統的底層架構有關,通常是在整個系統設計的時候就已經決定了,不過還是有一些例外的情況,比如說有一些演算法本身就是即時更新不需要預訓練的,我遇到過的有MAB,kalman filter等等。 而我們日常的工作基本上只關注第5點,不同場景下,排序階段不同的預測模型。接下來我們討論的演算法都只與這一點有關。
協同過濾: Collaborative Filtering
協同過濾是最經典的鄰域推薦演算法之一。所謂鄰域演算法,就是新的推薦專案是由它的鄰居的資料生成的。在不同的協同過濾演算法中,對鄰居的定義是不同的。
User-based CF
我們考慮上面的user-item矩陣。假定我們現在有了一些user對item的preference,我們接下來的目標是把空白填滿,我們會選擇怎麼填呢?在user-based CF,我們使用兩個步驟:
(1)找到和目標使用者興趣相似的使用者集合。
(2)找到這個集合中的使用者喜歡的,且目標使用者未consume的item,更新它們的user-item preference並排序。
我們把使用者相似度定義為餘弦相似度:
即:-
召回階段,建立物品對使用者的倒排索引表,對於每個物品都儲存對該物品產生過行為的使用者,掃描該表,找到所有|N(u)∩ N(v)|不為0的使用者對,計算其餘弦相似度。對於使用者v,其所有有交集的使用者中和他最相似的k個使用者是他的鄰居。這些使用者發生過行為的item集合就是召回集合。
-
排序階段:使用者u對物品i的感興趣程度如下,其中S(u, k)是和使用者u興趣最接近的k個使用者,N(i)是對物品i有過行為的使用者集合,wuv是使用者u和v的興趣相似度,rvi是使用者v對物品i的感興趣程度。
對user-based CF的改進基本是對這兩個公式的改變,即改變使用者相似度的計算方法,或者改變物品感興趣程度的計算方法。
Item-based CF
我們還是看這個user-item矩陣。在item-based CF中,我們給使用者推薦和他們之前喜歡的物品相似的物品。而和user-based CF相對稱,它主要通過使用者的行為計算物品之間的相似度。
物品相似度:
其中N(i)表示喜歡item i的使用者
和User-CF演算法類似,使用item-CF可以先建立使用者-物品倒排索引表,從而計算物品之間的餘弦相似度,並在得到物品之間的相似度後,使用如下公式計算user u對item j的preference:
其中N(u)是使用者互動過的物品,S(j,K)是最相似的K個物品,wji是物品j和物品i的相似度,rui是user u對item i的偏好。
item-CF的最大優勢是可以從歷史資料中提供推薦解釋。
通過偏好歸一化、懲罰熱門物品,改變相似度公式等方法,我們可以不斷改進item-CF。