搭建一個最簡單的推薦系統,應該如何入手呢?
推薦系統目前已經深入到了網際網路的各類產品中。不管是到電子商務網站購物,還是到新聞閱讀網站獲取信息,甚至是在出行的時候希望聽到不同的音樂,不同種類的推薦系統都在我們的生活中發揮著舉足輕重的作用。我們就來聊一個最基本的推薦模型:
基於流行度的推薦模型
。
最簡單的流行度估計
什麼是基於流行度(Popularity-based)?通俗地說,就是什麼內容吸引用戶,就給用戶推薦什麼內容。
這裡面其實有一個隱含的假設,那就是物品本身的質量好壞和流行度有一定的正比關係。什麼意思呢?就是說好的東西,關注的人自然就多,自然就會有更多的談論。當然,這是一個主觀的假設,並不是所有質量高的物品都會有很高的流行度。然而,在不需要過多其他信息和假設的情況下,流行度可以算是衡量物品質量好壞的一個最簡單的測度。
如果我們能夠在每一個時間點上準確地估計到一個物品的流行度,就只需要按照流行度的數值從高到低排序顯示所有的物品就可以了。
然而,這裡牽涉到一個問題,那就是如何判斷一個物品在任何時間點上的流行度呢?有兩個重要的因素影響著物品流行度的估計,那就是時間和位置。
先來說下時間因素。用戶訪問每一個應用或者服務都有一定的規律,這種規律導致每一個應用的流量規律也不一樣。比如,人們可能更傾向於在早上或者傍晚打開新聞網站,看一看一天都發生了什麼事情。因此,任何文章投放到這兩個時段自然就會有比較高的關注度。這並不代表這些文章就要好於其他的文章,可能僅僅是由於時間的關係。因此,我們在對流行度建模的時候就需要考慮時間的因素。
另外一個重要的因素是位置。這個「位置」並不是真正的地理位置,而是在一個服務或者網站的什麼位置顯示你的物品。因為用戶心理對於不同位置的感受,在很多類型的服務中常常都有隱含的「位置偏差」(Position Bias)。
這些偏差給我們估計某個物品的流行度帶來了很大的困難。比如說,在絕大多數的搜尋引擎服務中,排名第一的物品所受到的關注度很可能大大高於排名第二和之後的物品。因此,一個物品只要放到第一的位置,關注度自然就會升高。當然,這並不能完全代表這個物品本身的屬性。
因此,我們在估計物品的流行度時就需要考慮上面所說的這兩個重要因素。
要解決剛才說的兩個問題,我們就不能使用絕對數值來對流行度建模。比如我們使用在單位時間內點擊的數目,購買的數目,或者點讚的數目,都會受到剛才所說的兩種偏差的影響。假設一篇文章在9點到10點這個時段被點擊了100次,在10點到11點這個時段被點擊了50次,這並不能代表這個文章在10點到11點這個時段就變得不受歡迎了,很可能是這個時段的總的用戶量比較多。
因此,對於流行度的衡量,我們往往使用的是一個「比值」(Ratio),或者是計算某種「可能性」(Probability)。也就是說,我們計算在總的用戶數是N的情況下,點擊了某個文章的人數。這個比值,如果是點擊,往往叫做點擊率;然而,點擊率本身雖然解決了一部分時間和位置偏差所帶來的影響,但是點擊率的估計所需要的數據依然會受到偏差的影響。因此,我們往往希望能夠建立無偏差的數據。
關於如何能夠無偏差地估計,這是一個研究課題,我們今天不詳細展開。不過,有一種比較經濟的方法可以收集沒有偏差的數據,那就是把服務的流量分成兩個部分。
一個部分,利用現在已有的對物品流行度的估計來顯示推薦結果。另外一個部分,則隨機顯示物品。這種方法是一種特殊的EE算法(Exploitation & Exploration),叫「epsilon貪心」(epsilon-Greedy)。
根據這樣的方式搜集的數據可以認為是沒有位置偏差的。我們從隨機顯示物品的這部分流量中去估計流行度,然後在另外一個部分的流量裡去顯示物品。
如果從數學上對點擊率建模,其實可以把一個物品在顯示之後是否被點擊看成是一個「伯努利隨機變量」,於是對點擊率的估計,就變成了對一個伯努利分布參數估計的過程。
有一種參數估計的方法叫做「最大似然估計法」(Maximum Likelihood Estimation)。簡而言之,就是說,希望找到參數的取值可以最大限度地解釋當前的數據。我們利用最大似然法就可以求出在某一段時間內的點擊率所代表的伯努利分布的參數估計。這個估計的數值就是某個物品當前的點擊總數除以被顯示的次數。通俗地講,如果我們顯示某個物品10次,被點擊了5次,那麼在最大似然估計的情況下,點擊率的估計值就是0.5。
顯然,這樣的估計有一定的局限性。如果我們並沒有顯示當前的物品,那麼,最大似然估計的分母就是0;如果當前的物品沒有被點擊過,那麼分子就是0。在這兩種情況下,最大似然估計都無法真正體現出物品的流行度。
高級流行度估計
從統計學的角度來講了講,如何利用最大似然估計法來對一個伯努利分布所代表的點擊率的參數進行估計。
這裡面的第一個問題就是剛才我們提到的分子或者分母為0的情況。顯然,這種情況下並不能很好地反應這些物品的真實屬性。
一種解決方案是對分子和分母設置「先驗信息」。就是說,雖然我們現在沒有顯示這個物品或者這個物品沒有被點擊,但是,我們「主觀」地認為,比如說在顯示100次的情況下,會有60次的點擊。注意,這些顯示次數和點擊次數都還沒有發生。在這樣的先驗概率的影響下,點擊率的估計,或者說得更加精確一些,點擊率的後驗概率分布的均值,就成為了實際的點擊加上先驗的點擊,除以實際的顯示次數加上先驗的顯示次數。你可以看到,在有先驗分布的情況下,這個比值永遠不可能為0。當然,這也就避免了我們之前所說的用最大似然估計所帶來的問題。
利用先驗信息來「平滑」(Smooth)概率的估計,是貝葉斯統計(Bayesian Statistics)中經常使用的方法。如果用更加精準的數學語言來表述這個過程,我們其實是為這個伯努利分布加上了一個Beta分布的先驗概率,並且推導出了後驗概率也是一個Beta分布。這個Beta分布參數的均值,就是我們剛才所說的均值。
在實際操作中,並不是所有的分布都能夠找到這樣方便的先驗分布,使得後驗概率有一個解析解的形式。
另外一個可以擴展的地方就是,到目前為止,我們對於流行度的估計都是針對某一個特定的時段。很明顯,每個時段的估計和前面的時間是有一定關聯的。這也就提醒我們是不是可以用之前的點擊信息,來更加準確地估計現在這個時段的點擊率。答案是可以的。當然,這裡會有不同的方法。
一種最簡單的方法還是利用我們剛才所說的先驗概率的思想。那就是,當前T時刻的點擊和顯示的先驗數值是T-1時刻的某種變換。什麼意思呢?比如早上9點到10點,某個物品有40次點擊,100次顯示。那麼10點到11點,我們在還沒有顯示的情況下,就可以認為這個物品會有20次點擊,50次顯示。注意,我們把9點到10點的真實數據乘以0.5用於10點到11點的先驗數據,這種做法是一種主觀的做法。而且是否乘以0.5還是其他數值需要取決於測試。但是這種思想,有時候叫作「時間折扣」(Temporal Discount),是一種非常普遍的時序信息處理的手法。
總結:
基於流行度的推薦系統的基本原理。
第一, 介紹了為什麼需要基於流行度進行推薦;
第二,詳細介紹了如何對流行度進行估計以及從統計角度看其含義;
第三,一些更加高級的流行度估計的方法。