1. 程式人生 > >《推薦系統實踐》第七章 推薦系統例項

《推薦系統實踐》第七章 推薦系統例項

如何設計一個真實的推薦系統處理不同的資料,根據不同的資料設計演算法,並將這些演算法融合到一個系統當中是本章討論的主要問題。

7.1 外圍架構

一般來說,每個網站都會有一個UI系統,UI系統負責給使用者展示網頁並和使用者互動。網站會通過日誌系統將使用者在UI上的各種各樣的行為記錄到使用者行為日誌中。日誌可能儲存在記憶體快取裡,也可能儲存在資料庫中,也可能儲存在檔案系統中。而推薦系統通過分析使用者的行為日誌,給使用者生成推薦列表,最終展示到網站的介面上。

推薦系統要發揮強大的作用,除了推薦系統本身,主要還依賴於兩個條件——介面展示和使用者行為資料。

如果我們看看目前流行的推薦系統介面,可以看到這些介面都有一些共性。
 通過一定方式展示物品,主要包括物品的標題、縮圖和介紹等。
 很多推薦介面都提供了推薦理由,理由可以增加使用者對推薦結果的信任度。
 推薦介面還需要提供一些按鈕讓使用者對推薦結果進行反饋,這樣才能讓推薦演算法不斷改善使用者的個性化推薦體驗。

資料收集和儲存

個性化推薦演算法依賴於使用者行為資料,而在任何一個網站中都存在著各種各樣的使用者行為資料。那麼如何存取這些資料就是推薦系統需要解決的首要問題。

按照前面資料的規模和是否需要實時存取,不同的行為資料將被儲存在不同的媒介中。一般來說,需要實時存取的資料儲存在資料庫和快取中,而大規模的非實時地存取資料儲存在分散式檔案系統(如HDFS)中。

7.2 推薦系統架構

推薦系統聯絡使用者和物品的方式主要有3種方式,如果將這3種方式都抽象一下就可以發現,如果認為使用者喜歡的物品也是一種使用者特徵,或者和使用者興趣相似的其他使用者也是一種使用者特徵,那麼使用者就和物品通過特徵相聯絡。

根據上面的抽象,可以設計一種基於特徵的推薦系統架構。當用戶到來之後,推薦系統需要為使用者生成特徵,然後對每個特徵找到和特徵相關的物品,從而最終生成使用者的推薦列表。因而,推薦系統的核心任務就被拆解成兩部分,一個是如何為給定使用者生成特徵,另一個是如何根據特徵找到物品。

使用者的特徵種類主要包括如下幾類。
 人口統計學特徵,包括使用者的年齡、性別、國籍和民族等使用者在註冊時提供的資訊。
 使用者的行為特徵,包括使用者瀏覽過什麼物品、收藏過什麼物品、給什麼物品打過什麼樣的分數等使用者行為相關的特徵。同時,使用者行為從時間上也可以分為使用者近期的行為和長期的行為。
 使用者的話題特徵,可以根據使用者的歷史行為利用話題模型(topic model)將電視劇和電影聚合成不同的話題,並且計算出每個使用者對什麼話題感興趣。

推薦系統的推薦任務也有很多種,如下所示。
 將最新加入的物品推薦給使用者。
 將商業上需要宣傳的物品推薦給使用者。
 給使用者推薦不同種類的物品。
 給使用者混合推薦,有時需要將圖書和音像製品放到一個推薦列表中展示給使用者。
 對於不同的產品推薦不同新穎度的物品。比如在首頁給使用者展示比較熱門的推薦結果,在推薦系統頁面給使用者展示長尾中的物品。
 考慮到使用者訪問推薦系統的上下文。

推薦系統需要由多個推薦引擎組成,每個推薦引擎負責一類特徵和一種任務,而推薦系統的任務只是將推薦引擎的結果按照一定
權重或者優先順序合併、排序然後返回。

這樣做還有兩個好處。
 可以方便地增加/刪除引擎,控制不同引擎對推薦結果的影響。對於絕大多數需求,只需要通過不同的引擎組合實現。
 可以實現推薦引擎級別的使用者反饋。每一個推薦引擎其實代表了一種推薦策略,而不同的使用者可能喜歡不同的推薦策略。我們可以將每一種策略都設計成一個推薦引擎,然後通過分析使用者對推薦結果的反饋瞭解使用者比較喜歡哪些引擎推薦出來的結果,從而對不同的使用者給出不同的引擎組合權重。

7.3 推薦引擎的架構

推薦引擎使用一種或幾種使用者特徵,按照一種推薦策略生成一種型別物品的推薦列表。

推薦引擎架構主要包括3部分。
 該部分負責從資料庫或者快取中拿到使用者行為資料,通過分析不同行為,生成當前使用者的特徵向量。不過如果是使用非行為特徵,就不需要使用行為提取和分析模組了。該模組的輸出是使用者特徵向量。
 該部分負責將使用者的特徵向量通過特徵-物品相關矩陣轉化為初始推薦物品列表。
 該部分負責對初始的推薦列表進行過濾、排名等處理,從而生成最終的推薦結果。

7.3.1 生成使用者特徵向量

一個特徵向量由特徵以及特徵的權重組成,在利用使用者行為計算特徵向量時需要考慮以下因素。

 使用者行為的種類:在一個網站中,使用者可以對物品產生很多不同種類的行為。這些行為都會對物品特徵的權重產生影響,但不同行為的影響不同,大多時候很難確定什麼行為更加重要,一般的標準就是使用者付出代價越大的行為權重越高。
 使用者行為產生的時間:一般來說,使用者近期的行為比較重要,而使用者很久之前的行為相對比較次要。
 使用者行為的次數:有時使用者對一個物品會產生很多次行為。因此使用者對同一個物品的同一種行為發生的次數也反映了使用者對物品的興趣,行為次數多的物品對應的特徵權重越高。
 物品的熱門程度:如果使用者對一個很熱門的物品產生了行為,往往不能代表使用者的個性,因為使用者可能是在跟風,可能對該物品並沒有太大興趣。反之,如果使用者對一個不熱門的物品產生了行為,就說明了使用者的個性需求。因此,推薦引擎在生成使用者特徵時會加重不熱門物品對應的特徵的權重。

7.3.2 特徵—物品相關推薦

對於每個特徵,我們可以在相關表中儲存和它最相關的N個物品的ID。

線上使用的特徵-物品相關表一般都不止一張。對於一個推薦引擎可以在配置檔案中配置很多相關表以及它們的權重,而線上服務在啟動時會將這些相關表按照配置的權重相加,然後將最終的相關表儲存在記憶體中,而在給使用者進行推薦時,用的已經是加權後的相關表了。

特徵—物品相關推薦模組還可以接受一個候選物品集合。候選物品集合的目的是保證推薦結果只包含候選物品集合中的物品。如果是要在一個很大的候選物品集合中給使用者推薦物品,那麼可以考慮直接在初始推薦列表中過濾掉不在候選物品集合中物品的方法。

特徵—物品相關推薦模組除了給使用者返回物品推薦列表,還需要給推薦列表中的每個推薦結果產生一個解釋列表,表明這個物品是因為哪些特徵推薦出來的。

7.3.3 過濾模組

一般來說,過濾模組會過濾掉以下物品。
 使用者已經產生過行為物品:因為推薦系統的目的是幫助使用者發現物品,因此沒必要給使用者推薦他已經知道的物品,這樣可以保證推薦結果的新穎性。
 候選物品以外的物品:候選物品集合一般有兩個來源,一個是產品需求。另一個來源是使用者自己的選擇,那麼過濾模組需要過濾掉不滿足使用者需求的物品。
 某些質量很差的物品:為了提高使用者的體驗,推薦系統需要給使用者推薦質量好的物品,那麼對於一些絕大多數使用者評論都很差的物品,推薦系統需要過濾掉。這種過濾一般以使用者的歷史評分為依據,比如過濾掉平均分在2分以下的物品。

7.3.4 排名模組

一般排名模組需要包括很多不同的子模組。

1. 新穎性排名

新穎性排名模組的目的是給使用者儘量推薦他們不知道的、長尾中的物品。

要準確瞭解使用者是否已經知道某個物品是非常困難的,因此我們只能通過某種近似的方式知道,比如對推薦結果中熱門的物品進行降權,比如使用如下公式:

不過,要實現推薦結果的新穎性,僅僅在最後對熱門物品進行降權是不夠的,而應在推薦引擎的各個部分考慮新穎性問題。

基於物品的推薦演算法的基本公式:

r_{uj}在通過使用者行為生成使用者特徵向量時計算,而w_{ji}是離線計算的物品相似度。

如果使用ItemCF演算法,根據前面的討論可知計算出的相似度矩陣中,熱門物品傾向於和熱門物品相似。如果使用者對一個熱門物品j產生了很多行為,有很大的r_{uj},那麼和這個熱門物品相似的其他熱門物品都會在使用者的推薦列表中排在靠前的位置。因此,如果要提高推薦結果的新穎度,就需要對r_{uj}進行降權,比如使用如下公式:

對於相似度部分,熱門物品傾向於和熱門物品相似,冷門物品傾向於和冷門物品相似。首先,考慮到推薦系統是為了給使用者介紹他們不熟悉的物品,那麼可以假設如果使用者知道了物品j,對物品j產生過行為,那麼和j相似的且比j熱門的物品使用者應該也有比較大的概率知道,因此可以降低這種物品的權重,比如:

此外,也可以引入內容相似度矩陣,因為內容相似度矩陣中和每個物品相似的物品都不是很熱門,所以引入內容相似度矩陣也能夠提高最終推薦結果的新穎度。

2. 多樣性

增加多樣性可以讓推薦結果覆蓋儘可能多的使用者興趣。當然,這裡需要指出的是提高多樣性並不是時時刻刻都很好。

第一種提高多樣性的方法是將推薦結果按照某種物品的內容屬性分成幾類,然後在每個類中都選擇該類中排名最高的物品組合成最終的推薦列表。

這種方法的好處是比較簡單直觀,但這種方法也有嚴重的缺點。首先,選擇什麼樣的內容屬性進行分類對結果的影響很大。其次,就算選擇了某種類別,但物品是否屬於某個類別是編輯確定的,並不一定能夠得到使用者的公認。

第二種提高推薦結果多樣性的方法是控制不同推薦結果的推薦理由出現的次數。要提高推薦結果的多樣性,就需要讓推薦結果儘量來自不同的特徵,具有不同的推薦理由,而不是所有的推薦結果都對應一個理由。

3. 時間多樣性

時間多樣性主要是為了保證使用者不要每天來推薦系統都看到同樣的推薦結果。

提高推薦系統的時間多樣性要從兩個地方著手。首先要保證推薦系統的實時性,在使用者有新行為時實時調整推薦結果以滿足使用者最近的需求。第二個方面是要在使用者沒有新的行為時,也要保證推薦結果每天都有變化。要實現這一點,只能通過如下方式。

 記錄使用者每次登陸推薦系統看到的推薦結果。
 將這些結果發回日誌系統。
 在使用者登入時拿到使用者昨天及之前看過的推薦結果列表,從當前推薦結果中將使用者已經看到的推薦結果降權。

4. 使用者反饋

使用者反饋模組主要通過分析使用者之前和推薦結果的互動日誌,預測使用者會對什麼樣的推薦結果比較感興趣。

如果推薦系統的目標是提高使用者對推薦結果的點選率,那麼可以利用點選模型(click model)預測使用者是否會點選推薦結果。點選預測的主要問題是預測使用者看到某個推薦結果時是否會點選。那麼要進行點選率預測,首先需要提取特徵。在推薦系統的點選率預測中可以用如下特徵預測使用者u會不會點選物品i:

 使用者u相關的特徵,比如年齡、性別、活躍程度、之前有沒有點選行為;
 物品i相關的特徵,比如流行度,平均分,內容屬性;
 物品i在推薦列表中的位置。使用者的點選和使用者介面的設計有很高的相關性,因此物品i在推薦列表中的位置對預測使用者是否點選很重要;
 使用者之前是否點選過和推薦物品i具有同樣推薦解釋的其他推薦結果;
 使用者之前是否點選過和推薦物品i來自同樣推薦引擎的其他推薦結果。

點選模型需要離線計算好,線上將模型載入到記憶體中。為了提高線上預測的效率,一般只可以使用線性模型。

7.4 擴充套件閱讀

對Hulu推薦系統架構感興趣的讀者可以參考Hulu的技術部落格(http://tech.hulu.com/blog/2011/09/19/recommendation-system/)。

MyMedia是一個比較著名的開源推薦系統架構。該框架同時支援評分預測和TopN推薦,全面支援各種資料和各種演算法,對該專案感興趣的使用者可以訪問該專案的網站http://www.mymediaproject.org/default.aspx。

本章提出的推薦系統架構基本上是從基於物品的推薦演算法衍生出來的,因此本章的架構並不適合用來解決社會化推薦問題。如果要了解社會化推薦方面的架構,可以參考Twitter公開的一些文件。