解構推薦系統:“猜你喜歡”是怎麼猜中你的心思

guokr發表於2012-11-22

英文原文:Deconstructing Recommender Systems,編譯:ccyou@guokr

如今,到網上購物的人已經習慣了收到系統為他們做出的個性化推薦。Netflix 會推薦你可能會喜歡看的視訊。TiVo 會自動把節目錄下來,如果你感興趣就可以看。Pandora 會通過預測我們想要聽什麼歌曲從而生成個性化的音樂流。

所有這些推薦結果都來自於各式各樣的推薦系統。它們依靠計算機演算法執行,根據顧客的瀏覽、搜尋、下單和喜好,為顧客選擇他們可能會喜歡、有可能會購買的商品,從而為消費者服務。推薦系統的設計初衷是幫助線上零售商提高銷售額,現在這是一塊兒規模巨大且不斷增長的業務。與此同時,推薦系統的開發也已經從上世紀 90 年代中期只有幾十個人研究,發展到了今天擁有數百名研究人員,分別供職於各高校、大型線上零售商和數十家專注於這類系統的其他企業。

這些年來,推薦系統有了相當的進展。開始時它們還相對較為粗糙,往往對行為做出不準確的預測;但隨著更多的和不同型別的網站使用者資料變得可用,推薦系統得以將創新演算法應用於這些資料之上,它們迅速得到了改善。今天,推薦系統都是些極其複雜和精專的系統,常常看起來比你自己還要了解你。同時,推薦系統正在向零售網站以外的領域擴充:大學用它們來引導學生選課,行動電話公司靠它們來預測哪些使用者有可能轉投另一家供應商,會議主辦方也測試過用它們來分配論文給審稿專家。

解構推薦系統:“猜你喜歡”是怎麼猜中你的心思

我們兩人從推薦系統的早期開始便一直在開發和研究它們,最初是以學術研究者的身份,參與 GroupLens 計劃(GroupLens Project)。1992 年起,GroupLens 通過對美國興趣論壇網站 Usenet 討論區裡的訊息進行排序,將使用者指向他們可能會感興趣、但自己尚未發現的話題線索。幾年以後,我們成立了 Net Perceptions,這是一家推薦演算法公司,在網際網路第一次熱潮期間(1997 年 – 2000 年),一直處於業界領先地位。有鑑於此,雖然這些公司極少公開談論他們的推薦系統是如何運作的,我們的經驗使我們能夠深入瞭解亞馬遜和其他線上零售商幕後的情景。(在本文中,我們的分析是在觀察和推理的基礎上得出的,不包含任何內部訊息)。

下面就是我們所看到的。

推薦演算法是怎麼“猜你喜歡”的?

解構推薦系統:“猜你喜歡”是怎麼猜中你的心思
來源:recommenderapi.com

你有沒有想過自己在亞馬遜眼中是什麼樣子?答案是:你是一個很大、很大的表格裡一串很長的數字。這串數字描述了你所看過的每一樣東西,你點選的每一個連結以及你在亞馬遜網站上買的每一件商品;表格裡的其餘部分則代表了其他數百萬到亞馬遜購物的人。你每次登陸網站,你的數字就會發生改變;在此期間,你在網站上每動一下,這個數字就會跟著改變。這個資訊又會反過來影響你在訪問的每個頁面上會看到什麼,還有你會從亞馬遜公司收到什麼郵件和優惠資訊。

許多年來,推薦系統的開發者試過用各種各樣的方法來採集和解析所有這些資料。最近這段時間,多數人都選擇使用被稱為個性化協同推薦(Personalized Collaborative Recommender)的演算法。這也是亞馬遜、Netflix、Facebook 的好友推薦,以及一家英國流行音樂網站 Last.fm 的核心演算法。說它 “個性化”,是因為這種演算法會追蹤使用者的每一個行為(如瀏覽過的頁面、訂單記錄和商品評分),以此進行推薦;它們可不是瞎貓碰上死耗子——全憑運氣。說它 “協同”,則是因為這種演算法會根據許多其他的顧客也購買了這些商品或者對其顯示出好感,而將兩樣物品視為彼此關聯,它不是通過分析商品特徵或者關鍵詞來進行判斷的。

不同型別的個性化協同推薦系統最晚從 1992 年開始便已經出現。除了 GroupLens 計劃,另一項早期的推薦系統是 MIT 的 Ringo,它會根據使用者的音樂播放列表從而給使用者推薦其他他們有可能會喜歡的音樂。

User-User 演算法:計算使用者之間的相似度

GroupLens 和 Ringo 都使用了一種簡單的協同演算法,被稱為 “使用者關聯”(user-user)的演算法。這種型別的演算法會計算一對使用者之間的 “距離”,根據的是他們對同一物品打分的相似程度。舉例來說,如果吉姆和簡都給《電子世界爭霸戰》(Tron)這部電影打了 5 分,那麼他們之間的距離就是 0。如果吉姆給它的續集《創:戰紀》(Tron: Legacy )這部電影打了 5 分,而簡只打了 3 分,那麼他們之間的距離就變大了。按照這樣的計算得出來品味相對 “靠近” 的使用者,我們把他們稱之為共有一個 “鄰集”(neighborhood)。

但是,這種使用者關聯的策略效果並不是很好。首先,形成有意義的鄰集很難:很多使用者兩兩之間只有很少幾個共同評分,有的就完全沒有;而僅有的那幾個都打了分的專案呢,往往是票房大片,基本上人人都喜歡的那種。再來,由於使用者之間的距離可以變得很快,演算法必須當場就進行大部分的計算;而這可能會比一個在網站上這兒點點那兒戳戳的人下一個動作發出之前需要更久的時間。

Item-Item 演算法:計算物品之間的關聯

因此,大部分的推薦系統如今都依靠一種“物-物關聯”(item-item)的演算法,這種演算法計算的是兩本書、兩部電影或者兩個其他什麼東西之間的距離,依據的是給它們打過分的使用者的相似度。喜歡 Tom Clancy 書的人很可能會給 Clive Cussler 的作品打高分,因此 Clancy 和 Cussler 的書就共處一個鄰集。一對物品之間的距離可能是根據成百上千萬的使用者的評分計算得出,在一段時間裡往往保持相對穩定,因此推薦系統可以預先計算距離,並更快的生成推薦結果。亞馬遜和 Netflix 都曾公開表示過他們使用的是物-物關聯演算法的變種,但對細節都絕口不提。

使用者關聯演算法和物-物關聯演算法都有的一個問題,是使用者評分的不一致性。當給他們機會再評一次分時,使用者往往會對同一件物品給出不同的得分。品味在變、心情在變,印象也在變。MIT 在上世紀 90 年代進行的一項研究表明,在最初打分一年以後,使用者的評分會發生平均 1 分(滿分 7 分)的變動。研究人員們也在一直在嘗試不同的方法在模型中納入這一變數;比如說,如果使用者給某個商品了打一個分,但這個評分與推薦演算法所瞭解的關於這個人和這個商品的所有其他資訊不相符,有的推薦演算法就會邀請使用者再次對這個商品進行評價。

降維演算法:把事物特徵一般化

不過,使用者關聯演算法和物-物關聯演算法還存在一個比一致性更大的問題:它們太死了。就是說,它們能發現都喜歡同一樣東西的人,但卻忽略了愛好非常相似的潛在使用者組合。比如說你喜歡莫奈的睡蓮。那麼,在這個法國印象派大師畫的 250 幅睡蓮中,你最喜歡哪一幅?在一群喜歡莫奈的人當中,完全可能每個人喜歡的睡蓮都不相同,而基本的演算法就有可能識別不出這些人都有著共同的愛好。

大約十年前,研究者們想出了一個辦法,通過一個叫降維(Dimensionality Reduction)的過程,把事物更一般化的表現出來。這種方法在計算量上比使用者關聯和物-物關聯演算法要密集得多,因此也就沒有那麼快的得到採用。但隨著計算機變更快更便宜,降維演算法也逐步取得了一些進展。

為了弄清降維演算法是怎麼工作的,我們來看看你愛吃的東西,以及如何把它跟其他一百萬人愛吃的東西做比較。你可以把這些資訊用一個巨型矩陣表示出來,每一條豎線代表一樣食物,每個人愛吃什麼東西就自然形成了一行。在你的這一行上面或許會顯示你給了烤牛排 5 顆星、紅燒小排 4 星半、烤雞翅 2 顆星、凍豆腐卷 1 顆星、乳酪烤蘑菇 5 顆星、鹽水毛豆 4 顆星,等等。

然而,使用這個矩陣的推薦演算法並不關心你給哪種食物評了多少顆星。它想要了解的是你一般而言的喜好,這樣它可以將這個資訊應用到更豐富多樣的食物上。比如說,基於你上面給出的資訊,演算法可能會認為你喜歡牛肉、鹹的東西和烤制菜品,不喜歡雞肉和任何油炸的東西,不喜歡也不討厭蔬菜,依此類推。你愛吃的食物所擁有的特點或者說維度,它的數量和符合你要求的食物的數量比起來要小得多——至多可能 50 或 100。通過查對這些維度,推薦演算法可以迅速決定你是否會喜歡一種新的食物(比方說鹽焗排骨),方法就是把這種食物的各項維度(鹹的、牛肉做的、不是雞肉、不是炒的、不是蔬菜、不是烤的)同你的資料進行比對。這種更為一般性的呈現使得推薦演算法能準確的發現有著相似但不同喜好的使用者。而且,它大幅壓縮了矩陣的規模,使演算法變得更加高效。

這是一個很酷的解決方案。不過,你愛吃的食物的維度該上哪兒去找呢?肯定不是去問廚師。推薦系統會使用一種稱為奇異值分解的數學方法來計算維度。這種方法涉及到把最初的一個巨型矩陣分解為兩個 “口味矩陣”——其中一個包含了所有的使用者和 100 項口味維度,另一個則包含了所有的食物和 100 項口味維度——再加上第三個矩陣,當乘以前面兩個矩陣中的任意一個時,會得到最初的那個矩陣(※此處已更改)。

不像上面例子中說的那樣,計算用的維度既不是描述性的,也一點兒都不直觀;它們是純抽象的值。這並沒有什麼,只要這些值最終生成準確的推薦結果就行了。這種方法的主要缺點是,建立矩陣所需要的時間會隨著客戶和產品數量的增多而飛速增長——建立一個擁有 2.5 億名客戶和 1000 萬種產品的矩陣,需要花上建立一個 25 萬名客戶和 1 萬種產品的矩陣 10 億倍那麼多的時間。而且這一過程還需要經常重複。一旦收到新的評分,矩陣就已經過時;在像亞馬遜這樣的公司,每一秒鐘都會收到新的評論。幸運的是,就算略微過時,矩陣仍然能以一個挺不錯的水平運作。研究人員們也已經在設計新的演算法,為奇異值分解提供可用的近似值並顯著縮短計算時間。

 

 講完了推薦演算法是如何“猜你喜歡”的 ,現在,你對於每回上網購物時線上零售商是如何打量你,並努力把你的喜好和其他人的相匹配有了一個基本的概念。

推薦系統還有另外兩大特點,也對你最終看到的推薦結果有著顯著的影響:第一,在弄清楚你和其他購物者的相似度有多高之前,推薦系統必須先弄明白你真正喜歡什麼;第二,推薦系統依照一組商業規則執行,以確保推薦結果既讓你覺得有用,也使商家有利可圖。

推薦演算法是如何贏得你的信任,又讓商家有錢可賺的?

採集你的上網資料

舉個例子,來看亞馬遜的藝術品商店,上次我們去看的時候那裡有 900 多萬冊印刷品和海報在降價促銷。亞馬遜的藝術品商店有這樣幾個方法來評估你的喜好。它會讓你在 1 到 5 顆星的等級上給某一件藝術作品打分,它也會記錄下你把哪些畫點選放大了來看、哪些畫你反反覆覆看了好多次,你把哪些放進了心願單,還有你最終實際下單買了什麼。它還會追蹤在你瀏覽過的每一個頁面上都顯示了哪些畫作。線上零售商會使用你在其網站行進的路徑(你瀏覽過的頁面和點選商品的連結) 來向你推薦相關聯的商品。此外,它還把你的購買記錄和打分資訊結合起來,建立一個你長期購買偏好的檔案。

像亞馬遜這樣的公司會收集大量此類有關客戶的資料。在你登入期間,你在它網站上的幾乎每一個動作都會被記下來,留作將來使用。多虧有了瀏覽器 cookie,連匿名購物者的上網記錄商家也能維持,最終這些資料將在匿名購物者建立賬戶或者登陸時,連結到顧客的個人資料。這種爆炸式的資料採集並非為線上商家所獨有,沃爾瑪便以其對現金收據資料的深入挖掘而著稱於業界。但是,網上商店處在一個更有利的位置去檢視和記錄,不止是消費者買了些什麼,還包括你曾考慮過、瀏覽過和決定不買哪些商品。在全世界大部分地區,所有這類活動都是任人監視和記錄的;只有在歐洲,資料隱私法在一定程度上限制了這種操作。

當然,不論法律如何,顧客發現自己的資料被人濫用後,都會產生強烈的牴觸情緒。早在 2000 年 9 月,亞馬遜吃過一次苦頭:有一部分顧客發現他們收到的報價更高,因為網站將他們識別為老顧客,而不是匿名進入或是從某個比價網站轉接進來的顧客。亞馬遜聲稱這只是一項隨機的價格測試,其呈現出來的結果與老顧客身份之間的關聯純屬巧合。話是這樣說,它還是叫停了這項操作。

在商業規則下執行

加在推薦演算法之上的種種商業規則,旨在防止演算法給出愚蠢的推薦,並幫助線上零售商在不失去你信任的前提下實現營業額的最大化。最起碼,推薦系統應該避免人們說的超市悖論(Supermarket Paradox)。例如,差不多每個去超市的人都喜歡吃香蕉,也經常會買一些。那麼,推薦系統該不該向每一位顧客都推薦香蕉呢?答案是否定的——這樣做既幫不上顧客,也提高不了香蕉的銷量。所以,智慧的超市推薦系統始終會包括有一條規則,明確地將香蕉排除在推薦結果之外。

這個例子可能聽起來沒什麼,但在我們早期經手的一個專案中,我們的推薦系統就曾經向幾乎每一個到訪我們網站的人推薦披頭士的《白色專輯》(White Album)。從統計學的意義上講,這是個很棒的推薦:顧客此前都沒有從這個電子商務網點購買過這張專輯,而大多數顧客對《白色專輯》的評價都很高。儘管如此,這個推薦仍然是無效的——任何一個對《白色專輯》感興趣的人都已經有了一張了。

當然,大部分的推薦規則都是更加微妙的。比如說,當約翰在 9 月份在 Netflix 索動作影片時,結果中不會出現《復仇者聯盟》(The Avengers),因為這部大片在當時還沒有租借版,這樣的推薦結果不會讓 Netflix 有錢賺。因此,約翰被導向了《鋼鐵俠 2》(Iron Man 2),這部片已經可以用流媒體播放了。

其他的規則還包括禁止推薦為招徠顧客而虧本銷售的商品(loss leader);反過來,鼓勵推薦滯銷品。在經營Net Perceptions期間,我們就曾與一位客戶合作,他利用推薦系統來識別庫存積壓商品的潛在客戶,取得了相當大的成功。

贏取你的信任

然而,這種事情很快就會變得棘手起來。一個只會推銷高利潤商品的推薦演算法是不會贏得顧客的信任的。這就像是去餐館,那兒的服務生極力向你推薦某道魚一樣。這個魚真的是他覺得最好吃的嗎?還是大廚催著底下的人趕在魚變質前把它給賣出去?

為了建立信任感,更復雜的推薦演算法會盡力保持一定的透明度,讓顧客對系統為什麼會向自己推薦這件商品有一個大致的概念,並且在不喜歡收到的推薦結果時,可以更改他們的個人資料。比如說,你可以刪除你在亞馬遜上買來送禮的購物記錄;畢竟,那些東西反映的不是你個人的喜好。你還可以知道系統為什麼會向你推薦某些產品。當亞馬遜為約翰挑選了 Jonathan Franzen 的小說《自由》之後,約翰點選標籤上的連結“為什麼推薦給我?”。隨即顯示出一份簡要的說明,原來是他放在心願單裡的幾本書觸發了這一推薦。不過,由於他還沒有讀過心願單上的那幾本書,約翰就不去管《自由》這個推薦結果了。像這樣的解釋說明會讓使用者明白推薦結果是否有用。

但是,完善個人資料和解釋推薦結果往往不足以保證系統不出錯。最近,亞馬遜用高清大螢幕電視機(HDTV)的促銷電子郵件對喬進行了轟炸——每週 3 封,連續扔了一個月。除了給喬寄了過多的電子郵件,這家零售商還沒有意識到,喬已經用他妻子的賬戶買了一臺電視機。此外,這些電子郵件並沒有提供一種很明顯的方法,讓喬可以說“謝謝,但我不感興趣”。最終,喬取消了他在亞馬遜的一些郵件訂閱;他並不在意收不到各種資訊,而且他有了更多的時間來真的看他的電視。

推薦演算法的作用究竟有多大?

解構推薦系統:“猜你喜歡”是怎麼猜中你的心思
alumni.berkeley.edu

那好,推薦演算法究竟起了多大作用呢?它們當然一直都在增加線上銷售額;據阿倫森集團(Aaronson Group)的分析師傑克•阿倫森(Jack Aaronson)估計,由於推薦演算法帶動銷售額的增長,對推薦演算法的投資能獲得 10%-30% 的收益。而且,它們還只是剛剛起步。現在,對我們這些研究推薦系統的人來說,最大的挑戰在於弄清楚如何去判斷新的方法和演算法才最好。這可不像基準化分析微處理器那麼簡單,因為不同的推薦系統有著非常不同的目標。

評價一個演算法最簡單的方法,是看它的預測和使用者的實際評價之間差異有多大。舉例來說,假如約翰給青春浪漫小說《暮光之城》(Twilight )一顆星,亞馬遜或許會注意到演算法根據其他相似使用者的評價曾預計約翰會給兩顆星,也即出現了一顆星的偏差。但是,賣家更加關心演算法在使用者評價高的商品上出的錯,因為好評多的物品是顧客更有可能購買的;約翰反正也不會買《暮光之城》。所以,把這個評價計入考慮對理解推薦演算法起了多大作用沒什麼幫助。

另一個常見方法是看演算法給出的推薦結果和顧客實際購買的商品,之間匹配度有多高。不過,這種方法也可能起到誤導作用,因為這樣分析會將使用者自己設法找到的商品錯誤地算在推薦演算法的頭上,而使用者自己找得到東西恰恰是最不應該被推薦的!鑑於這些方法的缺點,研究人員一直在研究新的評判指標,不只看精度,也會關注像發現意外驚喜和多樣性等其他屬性。

發現意外驚喜(Serendipity)會加權不尋常的推薦結果,尤其是那些對某一個使用者極具價值,但對其他同類使用者而言沒什麼用的推薦結果。調整為發現意外驚喜的演算法會注意到《白色相簿》似乎是一個對幾乎每個人來說都不錯的推薦,因此會改為尋找一個不太常見的選擇——也許是 Joan Armatrading 的《愛和情感》。這個不那麼熱門的推薦結果不太可能擊中目標,但一旦它遇上了,則將給使用者帶來一個大得多的驚喜。

看推薦結果的多樣性同樣也很能說明問題。比方說,一個超愛看 Dick Francis 神祕類小說的使用者,在看到推薦表單裡全都是 Dick Francis 的作品時,仍有可能會感到失望。一個真正多樣化的推薦表單會包括不同作者和不同型別的書,還有電影、遊戲和其他的產品。

推薦系統研究則需要突破各種各樣的阻礙,遠不止是在現有的系統上進行微調。研究者們眼下正在考慮的是,推薦演算法應該在怎樣一個程度上幫助使用者發掘一個網站的內容集合中他們未曾瞭解的部分。比方說,把買書的人送去亞馬遜的服裝部門,而不是給一些安全的、顧客更有可能接受的推薦結果。在零售世界之外,推薦演算法可以幫助人們接觸到新的想法;就算我們不同意其中的一些,但整體作用大概會是積極的,因為這將有助於減少社會的巴爾幹化(Balkanization,即碎片化)。推薦演算法能不能做到這一點,還要不讓人感到厭煩或者不信任,仍需拭目以待。

但有一點是明確的:推薦系統只會變得越來越好,收集越來越多關於你的資料,並在別的、意想不到的地方展示出來。如果你喜歡這篇文章,亞馬遜會很樂意向你推薦其他所有你可能會喜歡的關於推薦系統的書。

 

相關文章