推薦算法入門
推薦算法概覽(一)
為推薦系統選擇正確的推薦算法非常重要,而可用的算法很多,想要找到最適合所處理問題的算法還是很有難度的。這些算法每種都各有優劣,也各有局限,因此在作出決策前我們應當對其做以衡量。在實踐中,我們很可能需要測試多種算法,以便找出最適合用戶的那種;了解這些算法的概念以及工作原理,對它們有個直觀印象將會很有幫助。
推薦算法通常是在推薦模型中實現的,而推薦模型會負責收集諸如用戶偏好、物品描述這些可用作推薦憑借的數據,據此預測特定用戶組可能感興趣的物品。
主要的推薦算法系列有四個(表格1-4):
- 協同過濾(Collaborative Filtering)的推薦算法
- 基於內容過濾(Content-based Filtering)的推薦算法
- 混合型推薦算法
- 流行度推薦算法
此外,還有很多高級或非傳統的方式,可參見表格5。
本文是系列文中的第一篇,將會以表格形式來介紹推薦算法的主要分類,包括算法簡介、典型的輸入內容、常見的形式及其優劣。在系列文的第二與第三篇中,我們將會更詳細地介紹各種算法的不同,以便讓大家更深入地理解其工作原理。本文的某些內容是基於一篇2014年的推薦算法2014教程《推薦問題再探(Recommender Problem Revisited)》來撰寫的,該文的作者是Xavier Amatriain。
表格一:協同過濾推薦算法概覽
表格二:基於內容過濾的推薦算法概覽
表格三:混合方式的推薦算法概覽
表格四:流行度推薦算法概覽
表格五:高級或“非傳統”推薦算法概覽
第一部分原文:Overview of Recommender Algorithms – Part 1
推薦算法概覽(二)
本文是系列文中的第二篇,將會列出推薦算法的備忘列表,介紹推薦算法的主要分類。在本文中,我們會更詳細地介紹協同過濾推薦算法,並討論其優劣,以便大家更深刻地理解其工作原理。
協同過濾(CF)推薦算法會尋找用戶的行為模式,並據此創建用戶專屬的推薦內容。這種算法會根據系統中的用戶使用數據——比如用戶對讀過書籍的評論來確定用戶對其喜愛程度。關鍵概念在於:如果兩名用戶對於某件物品的評分方式類似,那麽他們對於某個新物品的評分很可能也是相似的。值得註意的是:這種算法無需再額外依賴於物品信息(比如描述、元數據等)或者用戶信息(比如感興趣的物品、統計數據等)。協同過濾推薦算法可分為兩類:基於鄰域的與基於模型的。在前一種算法(也就是基於內存的協同過濾推薦算法)中,用戶-物品評分可直接用以預測新物品的評分。而基於模型的算法則通過評分來研究預測性的模型,再根據模型對新物品作出預測。大致理念就是通過機器學習算法,在數據中找出模式,並將用戶與物品間的互動方式模式化。
基於鄰域的協同過濾則著眼於物品之間的關系(即基於物品的協同過濾)或者用戶之間的關系(基於用戶的協同過濾)。
-
基於用戶的協同過濾是探索對物品擁有相似品味的用戶,並基於彼此喜愛的物品來進行互推。
-
基於物品的協同過濾是用戶喜愛的物品,推薦類似的東西。而這種相似性建立在物品同時出現的基礎上,比如購買了x物品的用戶也購買了y物品。
首先,在執行基於物品的協同過濾前,我們先看一個基於用戶的協同過濾案例。
假設我們有一些用戶已經表達了他們對某些書籍的偏好,他們越喜歡某本書,對這本書的評分也越高(評分範圍是1分到5分)。我們可以在一個矩陣中重現他們的這種偏好,用行代表用戶,用列代表書籍。
在基於用戶的協同過濾算法中,我們要做的第一件事就是根據用戶對書籍的偏好,計算出他們彼此間的相似度。我們從某個單獨用戶的角度來看一下這個問題,以圖一中第一行的用戶為例。通常我們會將每個用戶都作為向量(或者數組),其中包含了用戶對物品的偏好。通過多種類似的指標對用戶進行對比是相當直接的。在本例中,我們會使用余弦相似點。我們將第一位用戶與其他五位相對比,可以發現第一位與其他用戶的相似度有多少(圖二)。就像大多相似度指標一樣,向量之間的相似度越高,彼此也就越相似。在本例中,第一位用戶與其中兩位有兩本相同的書籍,相似度較高;與另兩位只有一本相同書籍,相似度較低;與最後一位沒有相同書籍,相似度為零。
圖二:第一位用戶與其他用戶的相似性。可以在一個單獨的維度中繪制用戶間的余弦相似性。更常見的情況下,我們可以計算出每名用戶與所有用戶的相似程度,並在相似性矩陣中表現出來(圖三)。這是一個對稱矩陣,也就是說其中一些有用的屬性是可以執行數學函數運算的。單元格的背景色表明了用戶彼此間的相似程度,紅色越深則相似度越高。
圖三:用戶間的相似矩陣,每個用戶的相似度是基於用戶閱讀書籍間的相似性。現在,我們準備使用基於用戶的協同過濾來生成給用戶的推薦。對於特定的用戶來說,這代表著找出與其相似性最高的用戶,並根據這些類似用戶喜愛的物品進行推薦,具體要參照用戶相似程度來加權。我們先以第一個用戶為例,為其生成一些推薦。首先我們找到與這名用戶相似程度最高的n名用戶,刪除這名用戶已經喜歡過的書籍,再對最相似用戶閱讀過的書籍進行加權,之後將所有結果加在一起。在本例中,我們假設n=2,也就是說取兩名與第一位用戶最相似的用戶,以生成推薦結果,這兩名用戶分別是用戶2及用戶3(圖四)。由於第一名用戶已經對書籍1和書籍5做出了評分,推薦結果生成書籍3(分數4.5)及書籍4(分數3)。
圖四:為一名用戶生成推薦。我們取這兩名最相似的用戶所閱讀的書籍,進行加權,然後對這名用戶尚未評分的書籍進行推薦。現在我們對基於用戶的協同過濾有了更深刻的理解,之後來看一個基於物品的協同過濾的案例。我們還是用同一組用戶(圖一)為例。
在基於物品的協同過濾中,與基於用戶的協同過濾類似,我們要做的第一件事就是計算相似度矩陣。但這一回,我們想要針對物品而非用戶來看看它們之間的相似性。與之前類似,我們以書籍作為喜愛者的向量(或數組),將其與余弦相似度函數相對比,從而揭示出某本書籍與其他書籍之間的相似程度。由於同一組用戶給出的評分大致類似,位於列1的第一本書與位於列5的第五本書相似度是最高的(圖五)。其次是相似度排名第三的書籍,有兩位相同的用戶喜愛;排名第四和第二的書籍只有一位共同讀者;而排名最後的書籍由於沒有共同讀者,相似度為零。
圖五:第一本書與其他書籍的對比。書籍通過所閱讀用戶的評價來表現。通過余弦相似度指標(0-1)來進行對比,相似度越高,兩本書就越相似。我們還可以在相似矩陣中展示出所有書籍彼此間的相似程度(圖六)。同樣以背景顏色區分了兩本書彼此間的相似程度,紅色越深相似程度也越高。
圖六:書籍的相似矩陣現在我們知道每本書彼此間的相似程度了,可以為用戶生成推薦結果。在基於物品的協同過濾中,我們根據用戶此前曾評過分的物品,推薦與其最為相似的物品。在案例中,第一位用戶獲得的推薦結果為第三本書籍,然後是第六本(圖七)。同樣地,我們只取與用戶之前評論過的書籍最相似的兩本書。
圖七:為某位用戶生成推薦結果。我們取到他們之前評論過的書籍目錄,找出與每本書籍最相似的兩本,再對用戶尚未評論過的書籍進行推薦。根據上述描述,基於用戶與基於物品的協同過濾似乎非常類似,因此能得出不同的結果這一點確實很有意思。即便在上例中,這兩種方式都能為同一名用戶得出不同的推薦結果,盡管兩者的輸入內容是相同的。在構建推薦時,這兩種形式的協同過濾方式都是值得考慮的。盡管在向外行描述時,這兩種方法看起來非常類似,但實際上它們能得出非常不同的推薦結果,從而為用戶帶來完全不同的體驗。
由於簡單高效,且生成的推薦結果準確、個性化,鄰域方法也是相當受歡迎的。但由於要計算(用戶或物品間的)相似度,隨著用戶或物品數量的增長,也會出現一些伸縮性方面的局限。在最糟的情況下,需要計算O(m*n),但在現實中情況略好一些,只要計算O(m+n)即可,部分原因在於利用了數據的稀疏度。盡管稀疏度有助於擴展實現,但同時也為基於鄰域的方法提出了挑戰,因為在海量的物品中,僅有少量是有用戶評論過的。例如,Mendeley系統中有數百萬篇文章,而一名用戶也許只讀過其中幾百篇。兩名各讀過100篇文章的用戶具有相似度的可能性僅為0.0002(在5000萬篇文章的目錄中)。
基於模型的協同過濾方式可以克服基於鄰域方法的限制。與使用用戶-物品評分直接預測新物品評分的鄰域方式不同,基於模型的方法則使用評分來研究預測性模型,並根據模型來預測新物品。大致理念就是通過機器學習算法,在數據中找出模式,並將用戶與物品間的互動方式模式化。總體來講,基於模型的協同過濾方式是構建協同過濾更高級的算法。很多不同的算法都能用來構建模型,以進行預測;例如貝葉斯網絡、集群、分類、回歸、矩陣因式分解、受限波爾茲曼機等,這些技術其中有些在獲得Netflix Prize獎項時起到了關鍵性作用。Netflix在2006年到2009年間舉辦競賽,當時還為能夠生成準確度超過其系統10%的推薦系統制作團隊提供100萬美元的大獎。勝出的解決方案是一套綜合了逾100種不同算法模型,並在生產環境中采用了矩陣因式分解與受限玻爾茲曼機的方法。
矩陣因式分解(比如奇異值分解、SVD++)將物品與用戶都轉化為同一個隱空間,表現了用戶與物品間的底層互動(圖八)。矩陣因式分解背後的原理在於:其潛在特性代表了用戶如何對物品進行評分。根據用戶與物品的潛在表現,我們就可以預測用戶對未評分的物品的喜愛程度。
圖八:矩陣分解算法的演示,用戶偏好矩陣可以分解為用戶主題矩陣乘以物品主題矩陣。在表一中,我們列出了鄰域算法與基於模型的協同過濾算法的關鍵優劣點。由於協同過濾算法只依賴於用戶的使用數據,想要生成足夠優秀的推薦結果無需對技術工作有太多了解,但這種算法也有其局限。例如,CF更容易推薦流行物品,因此為品味獨特的用戶推薦物品時就會比較困難(即對其感興趣的物品可能不具有太多的使用數據),也就是流行度偏好的問題,這一點通常可以通過基於內容的過濾算法解決。CF算法更重要的一個限制就是所謂的“冷啟動問題”——系統無法為沒有或使用行為很少的用戶提供推薦(也就是新用戶的問題),也無法為沒有或使用行為很少的物品提供推薦(也就是新物品的問題)。新用戶的“冷啟動問題”可以通過流行度和混合算法來解決,而新物品問題可以通過基於內容過濾或multi-armed bandit推薦算法(即探索-利用)來解決。在下篇文章中我們會詳細討論其中一些算法。
本文中,我們介紹了三種基本的協同過濾算法實現。基於物品、基於用戶的協同過濾算法,以及矩陣分解算法之間的區別都很細微,通常很難簡單地解釋其差異。理解這些算法間的差異有助於我們選擇推薦系統最適合的算法。在下篇文章中,我們會繼續深入探討推薦系統的流行算法。
第二部分原文:Overview of Recommender Algorithms – Part 2
推薦算法概覽(三)
本文是系列文中的第三篇。第一篇文章通過列表形式介紹了推薦算法的主要分類,第二篇文章介紹了不同類型的協同過濾算法,強調了其間的一些細微差別。在本文中,我們將會更加詳細地介紹基於內容的過濾算法並討論其優缺點,以更好地理解其工作原理。
基於內容的過濾算法會推薦與用戶最喜歡的物品類似的那些。但是,與協同過濾算法不同,這種算法是根據內容(比如標題、年份、描述),而不是人們使用物品的方式來總結其類似程度的。例如,如果某個用戶喜歡電影《魔戒》的第一部和第二部,那麽推薦系統會通過標題關鍵字向用戶推薦《魔戒》的第三部。在基於內容的過濾算法中,會假設每個物品都有足夠的描述信息可作為特征向量(y)(比如標題、年代、描述),而這些特征向量會被用來創建用戶偏好模型。各種信息檢索(比如tf-idf)以及機器學習技術(比如樸素貝葉斯算法、支持向量機、決策樹等)都可用於生成用戶模型,之後再根據模型來進行推薦。
假設我們有一些用戶已經表達了他們對某些書籍的偏好,他們越喜歡某本書,對這本書的評分也越高(評分範圍是1分到5分)。我們可以在一個矩陣中重現他們的這種偏好,用行代表用戶,用列代表書籍。
圖一:用戶書籍偏好所有偏好的範圍都是1分到5分,5分是最高的(也就是最喜歡的)。第一個用戶(行1)給第一本書(列1)的評分為4分,如果某個單元格為空,代表著用戶並未對這本書作出評價。在基於內容的協同過濾算法中,我們要做的第一件事就是根據內容,計算出書籍之間的相似度。在本例中,我們使用了書籍標題中的關鍵字(圖二),這只是為了簡化而已。在實際中我們還可以使用更多的屬性。
圖二:用戶已經評論過的書籍標題首先,通常我們要從內容中刪除停止詞(比如語法詞、過於常見的詞),然後用代表出現哪些詞匯的向量(或數組)對書籍進行表示(圖三),這就是所謂的向量空間表示。
圖三:使用標題的詞匯如果在標題中有這個詞,我們以1為標記,否則為空。有了這個表格,我們就可以使用各種相似指標直接對比各本書籍。在本例中,我們會使用余弦相似點。當我們使用第一本書籍,將其與其他五本書籍對比時,就能看到第一本書籍與其他書籍的相似程度(圖四)。就像大多相似度指標一樣,向量之間的相似度越高,彼此也就越相似。在本例中,第一本書與其他三本書都很類似,都有兩個共同的詞匯(推薦和系統)。而標題越短,兩本書的相似程度越高,這也在情理之中,因為這樣一來,不相同的詞匯也就越少。鑒於完全沒有共同詞匯,第一本書與其他書籍中的兩本完全沒有類似的地方。
圖四:第一本書與其他書籍間的相似性在單個維度中通過兩本書之間的余弦相似度就能繪制出來。我們還可以在相似矩陣中展示出所有書籍彼此間的相似程度(圖五)。單元格的背景色表明了用戶彼此間的相似程度,紅色越深相似度越高。
圖五:書籍間的相似矩陣,每個相似點都是基於書籍向量表示之間的余弦相似度。現在我們知道每本書彼此間的相似程度了,可以為用戶生成推薦結果。與基於物品的協同過濾方式類似,我們在之前的文章中也介紹過,推薦系統會根據用戶之前評價過的書籍,來推薦其他書籍中相似度最高的。區別在於:相似度是基於書籍內容的,準確來說是標題,而不是根據使用數據。在本例中,系統會給第一個用戶推薦第六本書,之後是第四本書(圖六)。同樣地,我們只取與用戶之前評論過的書籍最相似的兩本書。
圖六:為某個用戶生成推薦結果。我們取到他們之前評論過的書籍目錄,找出與每本書籍最相似的兩本,再對用戶尚未評論過的書籍進行推薦。基於內容的算法解決了協同過濾算法的某些限制,尤其能協助我們克服流行度偏見,以及新物品的冷啟動問題,而這些我們已經在協同過濾的部分中討論過了。然而,值得註意的是:純粹基於內容的推薦系統通常在執行時效果不如那些基於使用數據的系統(比如協同過濾算法)。基於內容過濾的算法也會有過度專業化的問題,系統可能會向用戶推薦過多相同類型的物品(比如獲得所有《魔戒》電影的推薦),而不會推薦那些雖然類型不同,但是用戶也感興趣的物品。最後,基於內容的算法在實現時只會使用物品元數據中所含的詞匯(比如標題、描述年份),更容易推薦更多相同的內容,限制了用戶探索發現這些詞匯之外的內容。關於基於內容過濾的優劣總結見表二。
第三部分原文:Overview of Recommender Algorithms – Part 3
推薦算法概覽(四)
本文是系列文中的第四篇。第一篇文章通過列表形式介紹了推薦算法的主要分類,第二篇文章介紹了不同類型的協同過濾算法,強調了其間的一些細微差別,在第三篇中我們詳細介紹了基於內容的過濾算法。本文將會討論基於之前提過算法而形成的混合型推薦系統,也會簡單討論如何利用流行度來解決一些協同過濾算法與基於內容過濾算法的限制。
混合算法結合了用戶及物品的內容特性以及使用數據,以利用這兩類數據的優點。結合了A算法與B算法的某個混合型推薦系統會嘗試利用A算法的優點以解決B算法的缺點。例如,協同過濾算法存在新物品的問題,也就是說這種算法無法推薦用戶未評價或使用過的物品。因為是基於內容(特性)預測的,這一點並不會對基於內容的算法產生限制。而結合了協同過濾與基於內容過濾算法的混合型推薦系統能夠解決單個算法中的一些限制,比如冷啟動的問題與流行度偏好的問題。表一列出了一些不同的方法,包括如何結合兩種甚至更多基礎推薦系統技術,以創建新的混合型系統。
表一:結合兩種甚至更多的基礎推薦算法,以創建新混合算法的不同方式。假設我們有一些用戶已經表達了他們對某些書籍的偏好,他們越喜歡某本書,對這本書的評分也越高(評分級別分別為1-5)。我們可以在一個矩陣中重現他們的這種偏好,用行代表用戶,用列代表書籍。
圖一:用戶書籍偏好所有偏好的範圍都是1分到5分,5分是最高的(也就是最喜歡的)。第一名用戶(行1)對第一本書(列1)的評分為4分,如果某個單元格為空,代表著用戶並未對這本書作出評價。在本文所屬系列的第二篇中,我們給出了兩個案例,包括如何使用基於物品及基於用戶的協同過濾算法來計算推薦結果;在本文所屬系列的第三篇中,我們演示了如何使用基於內容的過濾算法來生成推薦結果。現在我們將這三種不同的算法結合起來,生成一種全新的混合型推薦結果。我們會使用加權法(表一)結合多種技術得出的結果,之後這三種算法便可按照不同的權值(根據重要性不同)結合得出一組新的推薦結果。
我們先以第一個用戶為例,為其生成一些推薦。首先我們會根據第二篇中的基於用戶的協同過濾算法,基於物品的協同過濾算法,以及第三篇中基於內容過濾的算法,各自生成推薦結果。值得註意的是,在這個小案例中,這三種方法為同一名用戶生成的推薦結果有著輕微的差異,盡管輸入的內容是完全相同的。
圖二:為某個用戶生成的推薦結果——分別使用基於用戶的協同過濾算法,基於物品的協同過濾算法,以及基於內容的過濾算法。下一步,我們使用加權混合推薦算法為指定用戶生成推薦結果,加權值分別為:基於用戶的協同過濾算法40%,基於物品的協同過濾算法30%,基於內容過濾的算法30%(圖三)。在這個案例中,系統會向用戶推薦他們從未看過的所有三本書,而使用單個算法只會推薦其中兩本。
圖三:使用加權混合推薦系統為某個用戶生成推薦結果,具體權值參見上文。盡管混合型算法解決了CF與CB算法的一些重大挑戰與限制(見圖三),但在系統中平衡不同的算法也需要很多工作量。另一種結合單個推薦算法的方式是使用集成方法,關於如何結合不同算法得出的結果,我們研究得出了一個函數。值得註意的是:通常集成算法不僅結合了不同的算法,還結合了根據同一種算法得出的不同變體與模型。例如:獲得Netflix Prize獎項的解決方案包含了從10多種算法(流行度、鄰域算法、矩陣分解算法、受限波爾茲曼機、回歸等等)得出的100多種不同的模型,並通過叠代決策樹(GBDT)將這些算法與模型結合在一起。
另外,基於流行度的算法對於新用戶的冷啟動問題來說也是一個優秀的解決方案。這些算法通過某些流行度的測量標準,比如下載最多的或者購買最多的,來對物品進行排名,並將這些流行度最高的物品推薦給新用戶。當擁有合適的流行度衡量指標時,這個辦法雖然基礎卻很有效,通常可以為其他算法提供很好的基線標準。流行度算法也可以單獨作為算法使用,以引導推薦系統在換到其他更切合用戶興趣點的算法(比如協同過濾算法以及基於內容過濾的算法)前獲得足夠的活躍度與使用量。流行度模型也可以引入混合算法中,從而解決新用戶的冷啟動問題。
第四部分原文:Overview of Recommender Algorithms – Part 4
推薦算法概覽(五)
本文是推薦算法系列文中的第五篇。第一篇文章通過列表形式介紹了推薦算法的主要分類,第二篇文章介紹了不同類型的協同過濾算法,強調了其間的一些細微差別,在第三篇中我們詳細介紹了基於內容的過濾算法,在第四篇中我們講解了混合型推薦系統以及基於流行度的算法。在本篇中,我們會對簡單了解一下如何對一些高級的推薦算法做以選擇,再回顧一下基礎算法得出的推薦結果差異有多大,以便本系列完美收官。
除了我們截至目前提到的一些更為傳統的推薦系統算法之外(比如流行度算法、協同過濾算法、基於內容過濾的算法、混合型算法),還有許多其他算法也可用於加強推薦系統的功能,包括有:
- 深度學習算法
- 社會化推薦
- 基於機器學習的排序方法
- Multi-armed bandits推薦算法(探索/利用)
- 情景感知推薦(張量分解&分解機)
這些更為高級的非傳統算法對於將現有推薦系統的質量推向更高層次很有好處,但理解起來也更困難,推薦工具的支持上也不夠。在實踐中,我們總要權衡實現高級算法的代價與對基礎算法的增益相比較是否值得。根據經驗來看,基礎算法還能使用很久,為一些很優秀的產品提供服務。
在本系列文中,我們希望介紹一些常見的推薦模塊算法,包括基於用戶的協同過濾算法,基於物品的協同過濾算法,基於內容的過濾算法,以及混合型算法。我們使用了一個案例,說明了這四種不同算法在輸入數據相同時,應用於同一個案例時,為同一個用戶生成的不同推薦結果(圖一)。當應用於真實世界的大型數據時,這樣的效應依然存在,因此決定使用哪種算法時,需要考慮相關的優缺點以及執行效果。
圖一:四種推薦系統算法全部使用同一組數據,卻得出了不同的結果。左側我們給出了一個矩陣,標明了用戶對大量物品的不同偏好,並列出了可以推薦的物品名稱。在中間,我們展示了這四種不同算法如何為第一名用戶生成推薦結果(也就是用戶偏好矩陣中第一行的用戶)。就像相似矩陣中展示的那樣,這些算法對相似度有不同的定義。右側則是每種推薦算法生成的一些物品,從上到下分別按照四種算法的介紹順序來排序。在實踐中,一般如果在推薦模型中使用協同過濾算法,就不會犯太大錯誤。協同過濾算法似乎比其他算法更優秀,但在冷啟動用戶及物品方面會有問題,因此通常會使用基於內容的算法作為輔助。如果有時間的話,使用混合型算法就可以結合協同過濾及基於內容過濾算法優勢了。將這些基礎算法放在一起當然是個好辦法,甚至比高級算法還要更好。
最後這一點值得牢記:推薦模型只是五個推薦系統組件中的一個。與所有組件類似,正確設置並努力建立模型非常重要,不過選擇數據集、處理、後處理、在線模塊及用戶界面也同樣重要。正如我們再三強調的那樣,算法只是推薦系統的一部分,整個產品應當將你的決策納入考量。
推薦算法入門