全面介紹個性化推薦
初識推薦
每天訪問亞馬遜的時候它不僅會在首頁根據你的名字問候你,同時也會在展示一些推薦你購買的東西。它給小明推薦了《射雕英雄傳》(金庸)和《小李飛刀》(古龍),一番瀏覽之后,小明選擇了《明朝那些事兒》(當年明月)。
現在這些個性化的推薦已經司空見慣了,Netflix推薦視頻;TiVo會記錄一些我們感興趣的東西;Pandora構建了一個個性化音樂流來預測我們接下來可能會聽什么。
這些推薦都來自個性化推薦系統——一堆計算機程序。根據用戶的瀏覽、搜索、購買等行為以及用戶的年齡等屬性,幫助用戶找到他們喜歡或者需要購買的商品。目標是提升銷量,推薦系統是一項規模巨大的成長性業務。與此同時,推薦系統領域的開發者數量也從90年代中期的幾十個人到現在的數十萬人。他們來自大學、大型的電商公司以及其它一些專注于推薦系統的公司。
推薦系統的歷史
時光荏苒,推薦系統得到了長足的發展。最開始的推薦系統相當不給力,經常推薦不準確。隨著網站上用戶的數據可用性的提高和推薦算法上的創新,推薦系統快速成長。今天的推薦系統非常復雜,專業化程序非常高,甚至標榜“比你更懂你”。它們也不僅僅用于電商領域,大學借助它來指導學生的課程;手機廠商依賴它來預測哪些用戶更有可能會轉向競爭對手;大會的主辦單位在為同行評審的時候使用它來分發論文。
我和我的小伙伴很早就開始學習并參與構建推薦系統,最初是以研究員的身份從事GroupLens Project。從1992年開始,GroupLens對Usenet論壇上的信息進行了分類處理,試圖找出用戶可能感興趣但連他們自己都不知道的話題。幾年之后,我們創建了Net Perceptions,它在第一次互聯網浪潮中是推薦系統的領航者。藉由這些經驗,我對亞馬遜及其它一些電商網站背后的邏輯略知一二,甚至包括那些從來沒有公開描述他們的推薦系統是如何工作的那些公司。(在這篇文章中,我們的分析來自于細致的觀察推論,不基于其它任何秘密信息)。下面是一些我們已經知道的東西:
你有沒有想過對亞馬遜那邊是什么樣的?這是冰冷的事實:你是一張非常大的表中的一行長長的數字!這一行數字描述了所有你看過的東西,所有你點過的東西,所有你買過的東西。其余的行則代表亞馬遜上數百萬的購物者。你的那一行數字在你每次訪問網站的時候都會被修改,當你每做一個動作的時候,它會再次被修改。這些數據影響著你在網頁上實際看到的商品以及電商給你發送的購物郵件。
協同過濾
多年以來,推薦系統的開發者嘗試了很多種方式來收集和解析所有數據,那時,主要是個性化協同過濾推薦系統。這種類型的推薦系統是amazon、Netflix、非死book的朋友推薦以及last.fm(英國一家受歡迎的音樂網站)的核心。
-
個性化:通過跟蹤每個用戶的行為——網頁瀏覽、購買、評分等產生推薦,并不是事先準備好的一蘿匡建議
-
協同:根據所有其它用戶的購買或偏好來計算兩個物品之間的相關度,而非通過分析物品所具有的特征或者關鍵字來計算
個性化協同過濾系統最早大概出現在1992年,當時除了GroupLens項目外,另一個比較早期的推薦系統是麻省理工的Ringo,它根據用戶已有的音樂專輯推薦其它的一些用戶可能會喜歡的音樂。
基于用戶的協同過濾推薦系統
GroupLens和Ringo都使用簡單的協同過濾算法——基于用戶的協同過濾。這個算法根據用戶對物品的評分來計算他們之間的相似度。例如:假如小明和小強都給快拿(一款移動app)打5分,那么他們之間的距離就是0(非常近);假如小明對快牙打5分,小強對快牙打3分,那么他們之間的距離就增大一些。用戶的口味與他的“鄰居”相近。
但是基于用戶的方法實際上沒那么好,其中一個問題就是,很多用戶兩兩之間有共同評分的物品很少或者根本就沒有,電影領域更是如此,在這種情況下就無法計算這兩個用戶之間的距離。另外,用戶之間的距離變化很快,每次用戶的點擊或者購買都會導致重新計算,這樣的計算量對于一個有數百萬用戶的網站來說是非常大的。
基于物品的協同過濾推薦系統
現在的一些推薦系統使用了基于物品的協同過濾推薦系統,根據兩個物品得到的評分來計算它們的距離。例如:假如對快拿評價很高的人同時對快牙評分也很高,那么快拿和快牙就是“鄰居”。根據數百萬用戶的評分計算出來的兩個物品的距離通常不會隨時間變化的很快,所以就可以提前計算好任意兩個物品之間的距離,這樣在給出推薦的時候就會非常快。amazon和Netflix都公開表示他們用的是基于物品的協同過濾系統。
協同過濾的缺陷
這兩種方法都有一個共同的問題:不靠譜的評分。受情緒、環境的影響,用戶對同一個物品的評分在不同時期并不總是相同的。麻省理工實驗室曾在20世紀 90年代末期做了一項調查發現,用戶對個物品的評分與一年后的評分平均相差1分(總分7分),研究人員嘗試了不同的方法把這個變化包含到他們的模型中。例如:當系統認為原有的評分已經過時的時候,會要求用戶重新評分。
比評分不靠譜問題更嚴重的是:算法太死板了。它可以發現用戶喜歡的同類的物品,但在非常相似的物品之間就不起作用了。例如:如果你喜歡莫奈的《睡蓮》系列,在他畫的250個睡蓮中,你更喜歡哪一個呢?每個人可能都有自己特別喜歡的那一個,但是這兩個基礎算法卻無能為力。
SVD
大約在十年前,研究人員發現了在這些非常相似的物品之間找出特征的方法,叫做降維。它需要的計算量遠大于協同過濾,也因此被接受的比較慢。隨著計算機變得更快更廉價,它也取得了很大的進展。
為了幫助理解降維是如何工作的,下面以對食物口味以及怎么跟其它人比較來舉例說明。想象有一張很大的矩陣,每一行代表一個用戶,每一列代表一種食物,你的那一行數據表明了你的偏好:烤紅薯(5分)、燉排骨(4.5分)、炸雞腿(2分)、涼拌花生米(1分)、鹽水鴨(5分)等等。推薦系統所用的矩陣不會真的關心你對各種食物的評分。它只是把這種知識應用到各種各樣的食物上,以便了解你的偏好。舉例來說,根據上面的數據,系統可能會認為你喜歡炸的,肉類,那它可能會給你推薦鴨血粉絲湯或者酸菜魚。食物所具有的屬性(偏咸、油炸的等維度)可能高達上百種,通過把食物的屬性與你的偏好(肉類、油炸的等維度)做比較,就可以預測你對于新食物的喜好。這樣推薦系統就可以發現你對那些相似但實際上又是不同的物品的喜好。它大大壓縮了矩陣,使系統更加高效。
這是一個相當給力的辦法。但是怎么找到這些口味維度呢?找個大廚問問?這里我們運用一種叫做奇異值分解的數學技巧來計算出這些維度。把原始的大矩陣分成兩個,一個包含所有的用戶和100個口味維度,另一個包含所有的食物和100個口味維度。這兩個矩陣乘上第三個矩陣就等同于原始矩陣
不同于上面的例子,這些維度即不可描述也不能直觀的感覺到,它們只是數學上的抽象,你找不到一個類似于“偏咸的”維度。不過沒關系,只要用這些值可以得到準確的推薦就行。它主要的缺點就是計算的復雜度隨著用戶數和物品數急劇攀升,一個具有1千萬用戶和1百萬物品的矩陣比只有1萬人和1千種物品的矩陣計算所需的時間可能要多出幾億倍。更要命的是,這個過程需要被頻繁的執行。像amazon這樣的公司,這樣的計算每秒鐘都在發生。幸運的是,即使這個矩陣稍微過時了一點,也能很好了工作。現在研究人員已經開發出了新的算法來逼近奇異值分解的結果,同時大大縮短了計算時間。
推薦系統的商業特征
到目前為止,你對電商公司怎么描述你,怎么嘗試根據你的興趣為你推薦商品已經有了基本的認識。推薦系統還有兩個其它特征:
-
它不僅要計算誰跟你相似,還要計算你真正喜歡什么
-
它包含一些商業規則,推薦出來的商品不僅要讓你感覺不錯,同時也要對賣家有益