秦 婧,張青博,王 斌
(東北大學計算機科學與工程學院,沈陽110169)
從1992 年的第一個郵件推薦系統(tǒng)[1]問世至今20 多年中,推薦系統(tǒng)在電商、醫(yī)療、商品、新聞等各領域都得到了廣泛應用。推薦系統(tǒng)中物品被用戶評分或選擇的次數是一種典型的長尾現(xiàn)象,符合帕累托法則(Pareto’s principle)。從圖1 中可以看出,MovieLens1M[2]數據集中的電影觀看數量即為長尾現(xiàn)象,大多數的電影被觀看的次數少于500 次。此外,用戶僅對3 706 部電影進行了評分,而余下的近200 部電影無人評分。由于用戶對電影的評分次數存在長尾現(xiàn)象,因此,推薦系統(tǒng)在向用戶推薦物品時也隨之出現(xiàn)了長尾現(xiàn)象,即推薦物品的覆蓋率偏低。傳統(tǒng)的推薦方法包括基于近鄰的推薦方法、基于內容的推薦方法、矩陣分解的推薦方法以及混合的推薦方法等,由于數據集中數據稀疏問題嚴重,導致推薦結果會出現(xiàn)推薦物品的總量大多不足30%,甚至低于10%。此外,推薦物品的總量并沒有因為推薦列表的長度變化而使推薦物品數量顯著增加,反而呈現(xiàn)出緩慢增長趨勢。以基于用戶的協(xié)同過濾(User-based Collaborative Filtering,UserCF)算法[1]、基于物品的協(xié)同過濾(Item-based Collaborative Filtering,ItemCF)[3]算法和奇異值分解(Singular Value Decomposition,SVD)推薦算法為例,使用MovieLens1M 實現(xiàn)電影推薦,假設目標用戶數量為100,在推薦列表長度分別為10、15、20 時,推薦結果中不重復電影的數量隨推薦列表長度的變化如圖2所示。
從圖2 中可以看出:ItemCF 算法在推薦列表長度為10 時推薦了188 部不重復的電影,在推薦列表長度為20 時推薦了286 部不重復電影;但推薦列表長度為10 時ItemCF 算法應為100 個用戶推薦的電影總量(包含重復的電影)為1 000 部,推薦列表長度為20 時,則ItemCF 算法應為100 個用戶推薦的電影總量為2 000 部。顯然,推薦列表的長度從10 增長到20,ItemCF 算法推薦的不重復電影數量增長量(1.5 倍)低于向用戶推薦的電影總量的增長量(2 倍)。在圖2 中的3 個算法里,UserCF 算法推薦的不重復電影數量最多,但在推薦列表長度為20 時,它向用戶推薦的不重復電影數量也僅為494,僅占MovieLens數據集中電影總量的10%左右。因此,推薦系統(tǒng)中物品推薦數量的總體覆蓋率是嚴重偏低的,從而導致了推薦系統(tǒng)中推薦物品缺乏多樣性。由此,用戶的觀影、閱讀以及購買物品等行為受到了局限性的引導,影響了用戶的知識擴展和對新事物的適應能力等。
圖1 觀影量的長尾效應Fig.1 Long tail effect of movie viewing
圖2 不重復推薦電影數量隨推薦列表長度(L)的變化Fig.2 Number of non-repeating recommended movies varies with L
為提高推薦結果中物品的總體覆蓋率和多樣性,特別是增加長尾物品的推薦數量,本文提出了一種基于卷積神經網絡(Convolutional Neural Network,CNN)建立的推薦模型以及關注長尾物品的推薦算法FLTI(Focusing on Long Tail Item)。
本文工作如下:1)分析了推薦列表中熱門物品與長尾物品的關系,建立了熱門物品與長尾物品的對應關系;2)基于CNN 建立推薦框架,并基于此框架提出了關注長尾物品的推薦算法FLTI;3)在公開的數據集MovieLens1M 和BookCrossing上進行實驗,并與傳統(tǒng)的UserCF、ItemCF、SVD 推薦算法以及協(xié)同去噪自動編碼(Colloborative Denosing Auto-Encoder,CDAE)[4]方法在召回率、覆蓋率、多樣性等方面進行了比較,結果顯示本文方法在覆蓋率和多樣性方面表現(xiàn)更佳。
推薦系統(tǒng)中的長尾問題研究主要集中在流行度低的物品推薦中,流行度低的物品主要指用戶對物品的評分數量少的物品。長尾推薦包括在線推薦和離線推薦:在線推薦主要是指查詢推薦[5-6],根據用戶的查詢信息并結合用戶的歷史信息為用戶推薦符合其偏好的物品;而離線推薦是在未提供查詢關鍵字以及其他實時信息時,將用戶的歷史信息作為依據為用戶推薦符合其偏好的物品。本文主要研究的是離線推薦算法中的長尾問題。從近年來的研究文獻中可以看出,離線的長尾推薦方法主要有使用多目標函數的優(yōu)化算法[7-9]、二部圖方法[10]、三部圖方法[11-13]、聚類方法[14]等。多目標函數優(yōu)化包括評價模型準確率、覆蓋率、多樣性等目標的函數,如Hamedani 等[7]分別提出了在AICF(Attribute-aware Item-based Collaborative Filtering)方 法 和 AMOSA(Archived Multi-Objective Simulated Annealing)方法基礎上優(yōu)化推薦列表的方法,使得推薦列表的準確度、多樣性方面有所提高,并減少了推薦列表中的流行度;Pang 等[8]提出了基于NSGA-II(Nondominated Sorting Genetic Algorithm II)算法的權重相似度計算方法,并同時將準確率和覆蓋率作為目標函數優(yōu)化推薦算法,實驗表明該推薦算法在保證準確率的同時提高了覆蓋率;Wang 等[9]提出了將準確率和新穎度作為目標函數建立推薦模型,實驗表明該推薦算法相比傳統(tǒng)的推薦算法在準確率、新穎度、多樣性等方面均有所提高。
Yin 等[10]提出了二部圖算法解決長尾推薦問題。Johnson等在文獻[11]中提出了使用三部圖方法用于長尾推薦,即使用user-genre和genre-item的形式來構建三部圖。Luke等[12]在Johnson 提出的三部圖方法[11]的基礎上,優(yōu)化了user-genre 的關聯(lián)關系,在genre-item 關系圖中建立了更多的路徑,將Johnson提出的“full genre”關系轉換為“basic genre”關系,即將由多個類別構成的類別信息轉換為單一的類別分別表示。比如,一部電影的類別是“Action,Adventure,Comedy”,則拆分為“Action”“Adventure”“Comedy”三個基本類別,通過提高圖的聯(lián)通性,從而改善了推薦效果。Johnson 等在文獻[13]中基于三部圖的推薦算法加入了馬爾可夫過程方法用于表示長尾物品的區(qū)域,從而提高了推薦物品的多樣性。Grozin 等[14]使用基于session 距離的商品聚類方法來實現(xiàn)交叉銷售的長尾推薦,與直接使用類型、產品相似度聚類相比在歸一化折損累積增益(Normalized Discounted Cumulative Gain,NDCG)指標評測上效果更優(yōu)。
此外,Takama 等[15]還提出了基于用戶的個人價值觀來建立推薦模型,從而改善長尾物品的推薦;Abdollahpouri 等[16]提出了基于物品流行度權重的方法來解決長尾物品的推薦。
盡管以上方法在覆蓋率、多樣性、準確性等各方面都有不同程度的改善,但很少考慮長尾物品的推薦率,以及針對推薦列表中物品重復率高且頻繁推薦項較多等現(xiàn)象的改善。
目前,深度學習在推薦系統(tǒng)中得到了廣泛的應用[17]。深度學習主要包括循環(huán)神經網絡(Recurrent Neural Network,RNN)[18]和CNN[19]。其中,基于RNN 技術,研究人員提出了長短時記憶網絡(Long Short-Term Memory,LSTM)和門限循環(huán)單元(Gated Recurrent Unit,GRU)。RNN 適用于序列數據的應用,比如用戶的點擊流數據、用戶的實時位置數據等,它可以根據序列中的上一個狀態(tài)預測下一個狀態(tài);CNN 則主要適用于圖像、文本等內容的特征提取和分析。由于本文研究的推薦算法是離線的推薦算法,并且在推薦數據源中包含了大量的文本信息,因此,選用CNN處理文本特征。
為了明確本文中長尾物品的推薦方法,本章將具體化問題描述及相關定義。關注長尾物品的推薦,問題描述如下:
給定數據集D,為給定的目標用戶Users={U1,U2,…,Un}推薦長度為L 的物品集合Recommended_Items={I1,I2,…,In},p為長尾物品數量占推薦列表中總物品數量的比例,使Recommended_Items滿足以下條件:1)在Recommended_Items 中含有指定比例p的長尾物品;2)符合用戶的歷史偏好。
其中,長尾物品是指物品的評分次數低于用戶對物品評分次數中位數的物品。
為了明確后續(xù)算法中所提及的定義,先介紹本文中用到的頻繁推薦項(Frequent Recommended Item,F(xiàn)RItem)、非頻繁推薦項(Infrequent Recommended Item,IRItem)、物品長尾系數(Item Long Tail Coefficient,ILTC)等概念的定義。
定義1FRItem 和IRItem。FRItem 是指為目標用戶Users所推薦的物品集Recommended_Items 中出現(xiàn)的次數高于物品出現(xiàn)次數中位數的項目,低于物品出現(xiàn)次數中位數的項目則為IRItem。
定義2ILTC。由物品的推薦次數和評分次數共同加權得出,第i個物品的物品長尾系數計算公式如下:
其中:i 代表物品集合Items 中一個物品,α 的值代表推薦次數的權重值,rec_times 和rec_total 分別代表物品i 的推薦次數和推薦物品的總次數,rat_times 和rat_total 分別代表物品i 的評分次數和評分總次數。
長尾物品推薦框架主要由數據處理層、推薦算法層、推薦列表生成層構成,如圖3 所示。從圖3 可以看出,長尾物品推薦框架的核心是推薦算法層,輸入是目標用戶群,而輸出則是向目標用戶群推薦的物品列表。
圖3 長尾物品推薦框架Fig.3 Recommend framework for long tail items
數據處理層 首選從數據源中分別選取用戶和物品的特征,然后將用戶和物品的特征作標準化處理,并將用戶和物品的各特征作全連接。其中,將含有文本內容多的特征使用CNN 的方式來處理文本內容以提高相似度計算的準確性,如在MovieLens 數據集中,將電影名稱特征使用CNN 方法得到文本的向量表示。最后,將用戶對物品的評分作為目標,通過設置損失函數Huber 來訓練得到用戶對物品的預測評分值。Huber 損失函數適用于回歸問題,對于離群點不敏感,降低了離群點對于損失函數的權重值,能有效避免模型過擬合,如式(2)所示。
其中:δ 是邊界值,用于判斷數據是否為異常點;y 為預測評分值;f(x)為實際評分值。
數據處理層的評分回歸模型的整體結構如圖4所示。
推薦算法層 在數據處理層得到的回歸模型基礎上實現(xiàn)推薦算法,包括使用模型的正向傳播可以獲得用戶對物品的預測評分,計算物品的相似度和計算用戶的相似度。關注長尾物品的推薦算法FLTI 首先根據目標用戶已評分的物品,找到與其相似的物品產生推薦物品候選集;然后根據物品候選集物品的推薦次數的中位數拆分為頻繁推薦項集和非頻繁推薦項集,并查找非候選集與頻繁推薦項集相似的物品;最后,將符合用戶偏好的非候選集中的物品推薦給選擇過頻繁推薦項中物品的目標用戶,并滿足長尾比例p 的要求。具體的過程如圖5所示。
相似度計算方法根據數據處理層模型的表示,使用矩陣乘法并結合使用向量相似度計算的余弦相似度方法來計算物品的相似度和用戶相似度。
圖4 數據處理層模型Fig.4 Data processing layer model
圖5 FLTI算法的推薦流程Fig.5 Recommendation flow of FLTI algorithm
推薦列表生成層 為了讓目標用戶能更多關注長尾物品,在推薦列表排序中引入了長尾系數。根據用戶對候選列表的預測評分以及長尾系數對由推薦算法模型得到的候選物品列表進行排序,對于預測評分相同的物品,按照長尾系數升序排列。
為了提高FLTI 算法的效率,通過數據處理層得到的模型,將用戶對物品的評分結果保存到文件中,在推薦算法中直接讀取該文件即可獲得用戶對物品的評分。
FLTI 算法主要是通過替換頻繁推薦項的方法實現(xiàn)的,并在替換時選擇在候選項中用戶預測評分最高的項目作為替換項,具體描述如下:
算法1 關注長尾物品的推薦算法FLTI。
輸入 數據集D,長尾比例P,推薦列表長度L,目標用戶Users;
輸出 目標用戶的候選列表項CandidateDict。
for u in Users
獲取與用戶u相似的按照評分值降序排列的前L個物品
將用戶和對應的物品列表添加到推薦列表候選集字典
temp_items中
end for
根據物品推薦次數的中位數,將temp_items 拆分為頻繁推薦項字典(frequent_items)和非頻繁推薦字典(infrequent_items)
for f_item in frequent_items
在非候選集中,獲取與f_item相似的L個物品存放到
temp_frequent_items字典中
end for
獲得用戶推薦列表中不符合長尾比例p的用戶集合
candidate_users_items
for u,i in candidate_users_items
if i是frequent_items中的物品
將i 替換為temp_frequent_items 中用戶評分最高的物品,且用戶u的候選推薦列表中沒有該物品
重新計算用戶推薦列表中物品的長尾比例,若未滿足長尾比例,則繼續(xù)更新候選推薦列表。
若candidate_users_items 中仍有不滿足長尾比例的用戶,則將candidate_users_items 中推薦次數最多的非長尾項目替換為與其相似度最高的長尾項目,且不在用戶的候選推薦列表中。
return CandidateDict
在算法1 中,為了減少內存使用,將數據集中的長尾物品以及運算結果的中間步驟保存到文件中。此外,算法1 中重點關注了長尾項目的推薦比例,長尾比例的高低將直接影響推薦效果,若將長尾比例設置為1,則表示推薦列表中的所有物品均為長尾物品,此時,長尾項目會成為頻繁推薦項,而之前的頻繁推薦項則會成為長尾物品,依然會導致推薦結果中覆蓋率和多樣性下降;若將長尾比例設置為0 或者0.1,則所有的推薦列表均能滿足要求,不能提升長尾物品在推薦列表中的數量。因此,為了避免由于長尾比例設置過大而導致的新的長尾現(xiàn)象,建立統(tǒng)計頻繁推薦項的替換次數以及替換的長尾物品數量的字典,并在加入到候選推薦列表時,選擇替換次數少且與要替換的物品相似度高的物品優(yōu)先替換。
此外,通過算法1 完成推薦候選集的篩選后,為了保證推薦列表中最大限度滿足用戶的偏好并優(yōu)先選擇長尾物品,首先將候選集中用戶對物品的預測評分排序,若評分相同則按照物品的長尾系數排序。
實驗環(huán)境:CPU 為Inter Core i5-4690K@3.5 GHz,內存為16 GB;操作系統(tǒng)為Windows 10;軟件為TensorFlow1.13.1 和Python 3.6.4。
實驗數據集為公開的數據集MovieLens1M(https://grouplens.org/datasets)和BookCrossing。其中,Movielens 1M數據集中存放了6 040 位用戶對3 883 部電影的評分信息,包含了用戶表(users)、評分表(ratings)、電影表(movies);BookCrossing 數據集中存放了278 858 位用戶對271 379 本書的評分信息,包含了用戶表(BX-Users)、評分表(BX-Book-Ratings)以及圖書表(BX-Books)。
為了驗證FLTI 算法的有效性,選擇了三類方法進行對比:一類是基于近鄰的推薦方法,包括基于用戶的協(xié)同過濾(UserCF)算法和基于物品的協(xié)同過濾(ItemCF)算法;一類是基于矩陣分解的推薦方法,即基本的SVD 推薦算法;一類是基于神經網絡的方法CDAE。除了CDAE算法外,其余算法都采用基于Python 語言的surprise(https://surprise.readthedocs.io/en/stable/)庫中所提供的協(xié)同過濾算法(KNNBasic)和SVD算法。在KNNBasic 方法中通過更改“sim_option”中的屬性值切 換UserCF 和ItemCF 兩 種 算 法:當“sim_option”中“user_based”的值為“True”則為基于用戶的協(xié)同過濾算法;當“user_based”的值為“False”則為基于物品的協(xié)同過濾算法。實驗方法說明如表1所示。
評價標準包括召回率(Recall@L)[10]、覆蓋率(Coverage)[5]和多樣性(Diversity)[10]。
召回率用于驗證在推薦列表的準確性,如式(3)所示:
其中:hit@L 表示推薦列表L 中為目標用戶推薦的正確項目個數,N 表示目標用戶在測試數據集中所有正確推薦項目的數量。
覆蓋率指標和多樣性指標用于驗證推薦結果的長尾情況,分別如式(4)和式(5)所示。
其中:R(u)表示為用戶推薦的物品數量,T 表示數據集中物品總量。
其中:R(u)表示為用戶推薦的物品數量,I 表示向用戶推薦物品的總量。比如,向500個用戶推薦10部電影,則推薦物品的總量為5 000。
表1 實驗中用到的方法說明Tab.1 Explanation of methods used in experiment
為了提高模型預測的準確性,所有方法均使用五折交叉法來訓練模型。針對數據集MovieLens1M 和BookCrossing 中數據特征不同的情況,推薦模型的參數設置除了目標函數(即損失函數)和激活函數都設置為Huber 和ReLU 外,初始學習率(Learning_rate)分別設置為0.01 和0.001,初始批處理參數(batch_size)分別設置為256 和100。為了保證驗證結果的一致性,長尾比例p均設置為0.35。
1)召回率。將推薦列表長度分別設置為10、15、20,各方法在Movielens 1M 數據集和BookCrossing 數據集上的召回率測試結果如圖6 所示。從Recall@L 的測試結果可以看出,F(xiàn)LTR 方法的評測值略高于其他對比方法。由于BookCrossing數據集的稀疏程度高于Movielens 數據集,實驗中的方法均用到了用戶對物品的評分表,因此,Recall@L 的結果普遍要低于MovieLens上的評測結果。
圖6 兩個數據集上不同方法的召回率對比Fig.6 Comparison of recall rate of different methods on two datasets
2)覆蓋率和多樣性。在驗證覆蓋率和多樣性時,仍設置推薦列表長度為10、15、20。驗證覆蓋率時,由于對比方法中只考慮了評分數據中的物品,因此,總物品數量的計算是參與推薦的總物品數量。在MovieLens 和BookCrossing 數據集上的覆蓋率結果如圖7所示,多樣性的實驗結果如圖8所示。從圖7、8可以看出,F(xiàn)LTI相比對比方法有明顯的優(yōu)勢,特別是在Movielens 數據集上,當FLTI 方法在推薦列表長度為20 時,覆蓋率到達了40%以上,而ItemCF方法的覆蓋率僅為20%。
綜上所述,F(xiàn)LTI 算法在MovieLens 數據集和BookCrossing數據集上的覆蓋率和多樣性的結果都有所提高,當長尾比例為0.35時,在Movielen 數據集上且推薦列表長度為10時的覆蓋率和多樣性提升比例最多,分別為51%和59%;并且在數據稀疏程度高的BookCrossing 數據集上效果更優(yōu)。在FLTI算法中,隨著長尾比例的提高,覆蓋率和多樣性也將不斷提高,但準確率和召回率會有所降低,因此,在實際應用中,需要根據不同數據集的稀疏情況以及推薦系統(tǒng)的實際需求來調整長尾比例。
圖7 兩個數據集上不同方法的覆蓋率對比Fig.7 Comparison of coverage rate of different methods on two datasets
圖8 兩個數據集上不同方法的多樣性對比Fig.8 Comparison of diversity of different methods on two datasets
本文針對推薦系統(tǒng)中的推薦物品存在的長尾現(xiàn)象,提出了一種關注長尾物品的推薦框架以及推薦算法FLTI。在關注長尾物品的推薦框架中使用三層結構實現(xiàn)了長尾物品推薦:在數據預處理層中使用深度學習的方法全面地將用戶特征、物品特征結合在一起,并將數據特征中的文本內容部分通過CNN 卷積,以便更好地實現(xiàn)對特征的語義分析;在推薦模型層中,關注了長尾物品推薦的比例,并使長尾物品盡可能符合用戶的偏好;在推薦列表生成層中,使用了用戶對物品的預測評分以及長尾系數對推薦列表中的物品排序。在公開數據集MovieLens1M 和BookCrossing 上與推薦系統(tǒng)中的基本算法UserCF、ItemCF、SVD 以及CDAE 進行了對比,結果顯示FLTI算法在覆蓋率和多樣性方面較對比方法占有較大優(yōu)勢。在后續(xù)的研究工作中,將重點研究使用深度學習的方法通過學習長尾物品的特征,使得推薦結果中出現(xiàn)更多的長尾物品,且提高推薦物品的準確率。