互聯網推薦系統漫談
讀書總結:項亮《推薦系統實踐》
推薦系統這個東西其實在我們的生活中無處不在,比如我早上買包子的時候,老闆就經常問我要不要來杯豆漿,這就是一種簡單的推薦。隨著互聯網的發展,把線下的這種模式搬到線上成了大勢所趨,它大大擴展了推薦系統的應用:亞馬遜的商品推薦,Facebook的好友推薦,Digg的文章推薦,豆瓣的豆瓣猜,Last.fm和豆瓣FM的音樂推薦,Gmail里的廣告......在如今互聯網信息過載的情況下,信息消費者想方便地找到自己感興趣的內容,信息生產者則想將自己的內容推送到最合適的目標用戶那兒。而推薦系統正是要充當這兩者的中介,一箭雙鵰解決這兩個難題。
推薦系統的評判標準
首先我們得明確什麼是好的推薦系統。可以通過如下幾個標準來判定。
- 用戶滿意度
描述用戶對推薦結果的滿意程度,這是推薦系統最重要的指標。一般通過對用戶進行問卷或者監測用戶線上行為數據獲得。
- 預測準確度
描述推薦系統預測用戶行為的能力。一般通過離線數據集上演算法給出的推薦列表和用戶行為的重合率來計算。重合率越大則準確率越高。
- 覆蓋率
描述推薦系統對物品長尾的發掘能力。一般通過所有推薦物品佔總物品的比例和所有物品被推薦的概率分布來計算。比例越大,概率分布越均勻則覆蓋率越大。
- 多樣性
描述推薦系統中推薦結果能否覆蓋用戶不同的興趣領域。一般通過推薦列表中物品兩兩之間不相似性來計算,物品之間越不相似則多樣性越好。
- 新穎性
如果用戶沒有聽說過推薦列表中的大部分物品,則說明該推薦系統的新穎性較好。可以通過推薦結果的平均流行度和對用戶進行問捲來獲得。
- 驚喜度
如果推薦結果和用戶的歷史興趣不相似,但讓用戶很滿意,則可以說這是一個讓用戶驚喜的推薦。可以定性地通過推薦結果與用戶歷史興趣的相似度和用戶滿意度來衡量。
簡而言之,一個好的推薦系統就是在推薦準確的基礎上,給所有用戶推薦的物品盡量廣泛(挖掘長尾),給單個用戶推薦的物品盡量覆蓋多個類別,同時不要給用戶推薦太多熱門物品,最牛逼的則是能讓用戶看到推薦後有種「相見恨晚」的感覺。
推薦系統的分類
推薦系統是建立在大量有效數據之上的,背後的演算法思想有很多種,要大體分類的話可以從處理的數據入手。
1. 利用用戶行為數據
互聯網上的用戶行為千千萬萬,從簡單的網頁瀏覽到複雜的評價,下單......這其中蘊含了大量的用戶反饋信息,通過對這些行為的分析,我們便能推知用戶的興趣喜好。而這其中最基礎的就是「協同過濾演算法」。
「協同過濾演算法」也分兩種,基於用戶(UserCF)和基於物品(ItemCF)。所謂基於用戶,就是跟據用戶對物品的行為,找出興趣愛好相似的一些用戶,將其中一個用戶喜歡的東西推薦給另一個用戶。舉個例子,老張喜歡看的書有A,B,C,D;老王喜歡看的書有A,B,C,E。通過這些數據我們可以判斷老張和老王的口味略相似,於是給老張推薦E這本書,同時給老王推薦D這本書。對應的,基於物品就是先找出相似的物品。怎麼找呢?也是看用戶的喜好,如果同時喜歡兩個物品的人比較多的話,就可以認為這兩個物品相似。最後就只要給用戶推薦和他原有喜好類似的物品就成。舉例來說,我們發現喜歡看《從一到無窮大》的人大都喜歡看《什麼是數學》,那如果你剛津津有味地看完《從一到無窮大》,我們就可以立馬給你推薦《什麼是數學》。
至於什麼時候用UserCF,什麼時候用ItemCF,這都要視情況而定。一般來說,UserCF更接近於社會化推薦,適用於用戶少,物品多,時效性較強的場合,比如Digg的文章推薦;而ItemCF則更接近個性化推薦,適用於用戶多,物品少的場合,比如豆瓣的豆瓣猜,同時ItemCF還可以給出靠譜的推薦理由,例如豆瓣的「喜歡OO的人也喜歡XX」和亞馬遜的「買了XX的人也買了OO」。
協同過濾演算法也有不少缺點,最明顯的一個就是熱門物品的干擾。舉個例子,協同過濾演算法經常會導致兩個不同領域的最熱門物品之間具有較高的相似度,這樣很可能會給喜歡《演算法導論》的同學推薦《哈利波特》,顯然,這不科學!要避免這種情況就得從物品的內容數據入手了,後文提到的內容過濾演算法就是其中一種。
除了協同過濾演算法,還有隱語義模型(LFM)應用得也比較多,它基於用戶行為對物品進行自動聚類,從而將物品按照多個維度,多個粒度分門別類。然後根據用戶喜歡的物品類別進行推薦。這種基於機器學習的方法在很多指標上優於協同過濾,但性能上不太給力,一般可以先通過其他演算法得出推薦列表,再由LFM進行優化。
2. 利用用戶標籤數據
我們知道很多網站在處理物品條目的時候會通過用戶自己標註的標籤來進行分類,比如網頁書籤Delicious,博客的標籤雲,豆瓣書影音的標籤。這些標籤本身就是用戶對物品的一種聚類,以此作為推薦系統的依據還是很有效的。
關於標籤的推薦,一種是根據用戶打標籤的行為為其推薦物品,還有一種是在用戶給物品打標籤的時候為其推薦合適的標籤。
根據標籤推薦物品的基本思想就是找到用戶常用的一些標籤,然後找到具有這些標籤的熱門物品,將其推薦給用戶。這裡要注意兩個問題,一個是要保證新穎性和多樣性,可以用TF-IDF方法來降低熱門物品的權重;另一個則是需要清除某些同義重複標籤和沒有意義的標籤。
在用戶打標籤時為其推薦標籤也是相當重要的,一方面能方便用戶輸入標籤,一方面能提高標籤質量,減少冗餘。典型的應用場景就是用豆瓣標記書影音。這裡的思想就是將當前物品上最熱門的標籤和用戶自己最常用的標籤綜合在一起推薦給用戶。其實豆瓣就是這麼做的,它在用戶標記物品的時候,給用戶推薦的標籤就分為「我的標籤」和「常用標籤」兩類,而在「我的標籤」里也考慮了物品的因素。
基於標籤的推薦有很多優點,一方面可以給用戶提供比較準確的推薦理由;另一方面標籤雲的形式也提高了推薦的多樣性,給了用戶一定的自主選擇。標籤其實可以看做一種物品的內容數據,比如書的作者,出版社,類型;音樂的國別,風格,作者等等,基於這些信息的推薦可以彌補上述基於用戶行為推薦的一些弱點。
3. 利用上下文信息
此處所謂的上下文,是指用戶所處的時間,地點,心情等。這些因素對於推薦也是至關重要的,比如聽歌的心情,商品的季節性等等。
這裡主要以時間為例說說,在很多新聞資訊類網站中,時效性是很重要的一點,你要推薦一篇一年前的新聞給用戶,估計會被罵死。在這種推薦中就需要加入時間衰減因子,對於越久之前的物品,賦予越小的權重。同樣的思想也可以用在基於用戶行為的推薦中,這裡有很多可以優化的地方。對於ItemCF來說,同一用戶在間隔很短的時間內喜歡的不同物品可以給予更高的相似度,而在找相似物品時也可以著重考慮用戶最近喜歡的物品;對於UserCF,如果兩個用戶同時喜歡了相同的物品,那麼可以給予這兩個用戶更高的相似度,而在推薦物品時,也可著重推薦口味相近的用戶最近喜歡的物品。我們可以給相似度和用戶的行為賦予一定權重,時間間隔越久權重越低,經過這種改進的「協同過濾演算法」往往能得到用戶更滿意的結果。
類似的,在LBS成為應用標配的今天,可以根據物品與用戶的距離賦予相應的權重,再綜合其他因素得到靠譜的地點推薦。
4. 利用社交網路數據
如今以Facebook,Twitter為首的社交網路大行其道,而其中的海量數據也是一大寶庫。實驗證明,由於信任的作用,來自好友的推薦往往能獲取更高的點擊率,鑒於此,亞馬遜就利用了Facebook的信息給用戶推薦好友喜歡的商品。此種推薦類似於UserCF,只是尋找用戶之間的關係時除了興趣相似度以外還得考慮熟悉度(如共同好友個數),這樣一來,你的閨蜜們和基友們喜歡的物品很可能就會被推薦給你。
在社交網路內部也有許多推薦演算法的應用。其中最重要的當屬好友推薦,可依據的數據有很多:人口統計學屬性(例如人人的找同學),共同興趣(如Twitter中轉發的信息),好友關係(共同好友數量,N度人脈)。另外還有信息流(Timeline)推薦,這其中以Facebook的EdgeRank為代表,大致思想就是:如果一個會話(Feed)被你熟悉的好友最近產生過重要的行為,它在信息流的排序中就會有比較高的權重。另外,基於社交網路興趣圖譜和社會圖譜的精準廣告投放也是推薦系統的關鍵應用,它決定著社交網站的變現能力。
推薦系統的冷啟動問題
介紹了這麼多類的推薦系統,最後說說推薦系統的一個主要問題:冷啟動問題。具體分三種情況:如何給新用戶做個性化推薦,如何將新物品推薦給用戶,新網站在數據稀少的情況下如何做個性化推薦。
對此也有相應的解決方案。對於新用戶,首先可以根據其註冊信息進行粗粒度的推薦,如年齡,性別,愛好等。另外也可以在新用戶註冊後為其提供一些內容,讓他們反饋對這些內容的興趣,再根據這些數據來進行推薦。這些內容需要同時滿足熱門和多樣的要求。而對於新物品的推薦,可能就要從其內容數據上下功夫了。我們可以通過語義分析對物品抽取關鍵詞並賦予權重,這種內容特徵類似一個向量,通過向量之間的餘弦相似性便可得出物品之間的相似度,從而進行推薦。這種內容過濾演算法在物品(內容)更新較快的服務中得到大量應用,如新聞資訊類的個性化推薦。
而在網站初建,數據不夠多的情況下,可能就要先通過人工的力量來建立早期的推薦系統了。簡單一點的,人工編輯熱門榜單,高級一點的,人工分類標註。國外的個性化音樂電台Pandora就雇了一批懂計算機的音樂人來給大量音樂進行多維度標註,稱之為音樂基因。有了這些初始數據,就可以方便地進行推薦了。國內的Jing.fm初期也是通過對音樂的物理信息,情感信息,社會信息進行人工分類,而後再通過機器學習和推薦演算法不斷完善,打造出了不一樣的個性化電台。
除了這些,利用社交網路平台已有的大量數據也是一個不錯的方法,尤其是那些依託於其他SNS賬號系統的服務。
演算法vs人
有很多人懷疑推薦系統是否會讓一個人關注的東西越來越局限,但看完這些你會覺得並非如此,多樣性,新穎性和驚喜度也都是考察推薦系統的要素。而至於演算法和人究竟哪個更重要的爭論,我很贊同唐茶創始人李如一的一個觀點:
在技術社群的討論里,大家默認覺得讓推薦演算法變得更聰明、讓軟體變得更「智能」一定是好事。但人不能那麼懶的。連「發現自己可能感興趣的內容」這件事都要交給機器做嗎?不要覺得我是Luddite。真正的技術主義者永遠會把人放到第一位。
我想補充的是,演算法雖然不能解決全部問題,但演算法可以變得更人性化。套用某人「網路就是社會」的論斷,其實演算法和人之間早已不那麼涇渭分明了。
推薦閱讀:
※為什麼產品研發團隊要做一套自己的組件庫?
※需求評審會保命指南(答應我要做到好嗎)
※成功產品的門檻
※提取練習:俞軍談產品經理的價值、天賦、能力、成長及未來
※馬化騰說的灰度法則,你怎麼看?