作者:陳運文 博士,盛大智能推薦團隊負責人
亞馬遜的ceo jeff bezos曾經說過,他的夢想是“如果我有100萬個使用者,我就要為他們做100萬個亞馬遜網站”。智能推薦系統承載的就是這個夢想,即通過資料挖掘技術,為每一個使用者實作個性化的推薦結果,讓每個使用者更便捷的擷取資訊。為了實作這個夢想,過去十餘年間,無數頂尖技術專家和工程師投身于推薦算法和技術的研究與應用中,很多優秀的方法被提出,很多技術難題被攻克。在今天的網際網路應用中,越來越多“聰明”的推薦系統被開發出來,并被廣大使用者信賴和使用。
智能推薦系統充分運用了機器學習、資料挖掘、搜尋引擎、自然語言處理等相關領域的技術。但推薦系統并不神秘,事實上,推薦在我們身邊無處不在。對廣大軟體開發工程師們來說,能夠投身于推薦系統的研發,是一件既有趣又充滿挑戰的工作。想要成功的開發一套效果良好的推薦系統,有一系列值得重視的關鍵點,文本對此進行了總結,具體列舉如下。
1 充分運用顯式\隐式回報資料
資料是一切推薦系統的基礎。良好的推薦效果一定是來自于豐富而準确的資料。這些資料既包括了使用者(user)和待推薦物品(item)相關的基礎資訊(注:item和具體的推薦場景相關,可以是商品、影片、音樂、新聞等,如果是進行好友推薦,那麼item也可以是user本身),另一方面,user和item之間在網站或應用中發生的使用者行為和關系資料也非常重要。因為這些使用者行為和關系資料能真實的反映每個使用者的偏好和習慣。采集這些基礎資料,并做好清洗和預處理,是整個推薦系統的基石。
使用者行為資料,又可細分為兩部分:顯式回報資料(explicit feedbacks)和隐式回報(implicit feedbacks)資料。顯式回報是指能明确表達使用者好惡的行為資料,例如使用者對某商品的購買、收-藏、評分等資料。與之相反,隐式回報資料是指無法直接展現使用者偏好的行為,例如使用者在網站中的點選、浏覽、停留、跳轉、關閉等行為。通過挖掘顯式回報資料能明确把握使用者的偏好,但在很多應用中,顯式回報資料通常很稀疏,導緻對使用者偏好的挖掘無法深入。這個問題在一些剛上線的應用、或者偏冷門的物品或使用者身上反映尤其明顯。在這種情況下,使用者的隐式回報資料就顯得尤為重要。因為雖然使用者在網站中的點選等行為很龐雜,但其中蘊藏了大量資訊。在2006-2008年間進行的國際著名推薦競賽netflix prize中,冠軍隊成員yehuda koren發現将使用者租用影片的記錄,轉換為特征向量注入奇異值分解算法(svd)用于影響使用者興趣向量,能夠很好的提高推薦準确率。
基礎資料的預處理對推薦效果的提升也非常有幫助。以2012年的acm kdd-cup(國際資料挖掘競賽)為例,訓練樣本中,負樣本的數量居然達到了總樣本數量的92.82%,但是通過仔細分析這些負樣本,發現其中有大量樣本存在噪音,通過一系列的session分析和篩選方法,從中保留了11.2%的樣本進行後續推薦挖掘,不僅成功提高了推薦精度,而且大大減少了運算量。是以充分利用各類顯式和隐式資料,并做好資料的預處理,保證輸入資料的品質,是第一個關鍵點。
2 多種方法的融合
經過多年的發展,很多種推薦算法被提出來。常見的推薦方法,從大類上分,有基于曆史行為(memory-based)的方法、基于模型(model-based)的方法、基于内容(content-based)方法等。在memory-based方法這個方向,又可進一步細分為基于物品的協同過濾算法(item-based collaborative filtering)、基于使用者的協同過濾算法(user-based collaborative filtering)、關聯規則(association rule)等;model-based方法常用的包括random walk、plsa、svd、svd++等。每種方法在具體實施時,針對不同的問題又有很多不同的實作方案,例如在基于物品的協同過濾算法(item-based collaborative filtering)中,item之間相似度計算公式(similarity)也可能有很多很多種變化。
在系統推薦的結果以外,還有一類傳統的方式是通過專家進行推薦。這些專家可以是一些有經驗的編輯,也可以是社群中意見領袖等。這些領域專家推薦的結果,在很多實際應用中,可以作為算法推薦結果的有益補充。
事實上,在實踐中并沒有任何一種方法在實踐中始終占據壓倒性的優勢,它們各有千秋,分别有其各自合适的應用場景,是以因地制宜根據不同的場景,挑選不同的方法,并有機的結合起來,能讓推薦效果得到極大的提升。常見的融合方法包括restricted boltzmann machines(rbm), gradient boosted decision trees(gbdt),logistic regression(lr)等,這方面曆次推薦競賽中有很多相關文章,可以看到為了提升推薦效果,将不同算法的結果能夠取長補短,各自發揮價值,是極為有效的。
3 重視時間因素
使用者的行為是存在很強的時間規律的。例如通常人們中午會吃飯、周末會休假、過年會回家團圓等等。使用者在各個應用中的行為也同樣有規律可以挖掘,用好時間這個特征,在很多推薦場景下,會對推薦效果的提升有很大的幫助。
使用者行為日志中,行為發生的時間戳(timestamp)通常都會被記錄。這個時間戳能從user和item兩方面來進行分析。從user的角度來看:user的興趣往往會随着時間不斷變化,幾年前的興趣和目前的興趣可能是不同的;另一方面,user的行為也存在一定的規律,例如工作日的行為是類似的,而在周末裡user的行為也會變化,甚至在同一天中,上午和晚上的user行為和偏好也會有各種不同的規律。
從item的角度來看,流行度随着時間會有規律性的波動,通過持續挖掘user與item之間的行為在一段時間内的記錄,往往能夠發掘出這種規律,并進而用于指導我們預測user在後續某個時刻的行為,提高推薦的準确率。
時間因素的一些常見處理方案包括:1)在協同過濾計算user或者item相似度的公式中,增加時間因子,發揮相近時間的作用;2)将時間離散映射到自然月、周、日、小時等時間片中,并分别進行統計計算,并進而将累積的資料用于特定的回歸模型(regression models)中,指導結果預測;3)将時間作為線性連續變量,用于訓練模型參數等。
4 特定推薦場景需要使用地域特征
有一些推薦場景是和使用者所處地域密切相關的,尤其對一些lbs、o2o的應用來說,一旦離開地域這個特征,那麼智能推薦的效果根本就無從談起。例如當需要推薦一個餐館時,如果不考慮使用者目前所在的位置,那麼即使某餐館和目前使用者的口味比對度非常高,但遠在天邊,這個推薦也是毫無價值的。
目前推薦系統在地域特征的使用還停留在較為原始的狀态,通常需要讓使用者手工篩選推薦結果所在的區域(如省、市、區、縣等),或者指定若幹半徑範圍内的結果。這種方式不僅操作繁瑣,而且缺乏對地域資訊的細緻分析。例如地點a和b的地圖直線距離雖然較遠,但兩點間有地鐵直接往返,而另一地點c雖然地圖直線距離a很近,但兩點間需要繞行交通不便。另外從使用者角度來說,每天活動的地域總是存在規律的,例如工作日白天,往往活動區域在工作地點附近,夜晚的時間會在家附近等。
在基于地理位置資訊的應用中,需要更聰明的挖掘使用者對地域的偏好(而且這種偏好往往和時間緊密聯系),例如在基于使用者的協同過濾中,将類似地域使用者活躍使用者的行為,作為推薦的依據,即認為活動地域相似的使用者,可能存在一定相同的偏好。或者使用基于物品的協同過濾思想,在計算item之間相似度時引入地域特征。在latent factor model中,将使用者的活動地域作為隐式回報來作用于使用者特征向量等,都是可行的方案。
手機是進行基于地域資訊推薦的最好載體,随着移動網際網路應用越來越普及,期待未來有更多基于地域資訊的推薦産品的問世。
5 sns關系的使用
社交網絡近年來得到了突飛猛進的發展,使用者不再是單純的内容接收者,而是能夠主動的建立使用者之間的關系。這些關系,可以劃分為顯式關系(explicit relations)和隐式關系(implicit relations)。顯式關系指的是使用者已明确建立的相關關系,例如在微網誌中關注/被關注某人等,或者在社群中加為好友等。而隐式關系指使用者之間存在一些互動行為,但這些行為不能明确訓示使用者間的關系。例如使用者在微網誌中點選、評論、轉發另一個使用者的文章,如果在網絡遊戲世界中另一個玩家交談,或者pk等。隐式關系雖然并不如顯式關系那樣明确,但比顯式關系要豐富的多。是以在一些對推薦精度要求很高的應用場景下,顯式關系需要發揮主要作用;而對一些需要提高推薦召回率和推薦結果多樣性的場景下,尤其是當顯式關系面臨資料稀疏性的問題時(注:這個問題在推薦應用中普遍存在),充分利用隐式關系能起到非常好的效果。以今年的kdd-cup競賽為例,在騰訊微網誌的好友推薦系統上,我們通過在svd++模型中增加隐式關系,處理資料稀疏性的問題,能夠将推薦準确率提升5.5%
此外,移動網際網路的普及,讓sns關系使用起來更加便捷,而且加上地域資訊,産生了像微信這樣新穎的移動應用,而sns關系和地域特征的結合使用,一定會讓推薦系統也産生出更受歡迎的結果。
6 緩解冷啟動問題
冷啟動是推薦系統最為悠久的一個問題,伴随推薦系統誕生至今。這是因為推薦系統效果提升的關鍵天然在于資料,而當新使用者、或新物品等剛上線時,由于積累的資料極為稀少,大量方法在最初這段時間難以生效。
冷啟動問題又可細分為user冷啟動或者item的冷啟動。user冷啟動在一些場景普遍存在,例如在一些短視訊網站,由于user沒有登入浏覽的習慣,是以大量來訪使用者都是陌生的cookie使用者,如何對這些user進行推薦是至關重要的。常見的思路包括:1)采用熱門推薦(排行榜)結果。雖然排行榜是一個看似簡單的方法,但設計良好、的排行榜并不如想象中簡單,排行榜如何計算,基于哪些統計特征,都是值得深究的。2)充分利用有限的使用者資訊來迅速捕捉偏好。例如使用者的來源ip、通路時間、最初點選的幾個結果的屬性,都需要被充分運用。3)為新使用者設定簡單的口味測試,根據使用者送出的答案主動收集使用者偏好。常見的方案包括為提供一些預先精心設計的選項,通過使用者的選擇迅速建立使用者模型。在設計選項時,一些注意點包括:a)必須要有代表性的選項;b)選項需要相對熱門,或有一定的使用者知名度;c)選項之間要有區分度。
item冷啟動的問題在一些item頻繁更新的應用中普遍存在,例如一些電子商務網站會不斷上架新商品,這些新商品由于缺少點選,很難進行推薦。但基于内容的方法(content-based)往往此時能發揮關鍵作用。根據item的類别、标簽、關鍵詞等初始特征,能計算item之間的關聯度。盡管很多對比評測表明,基于内容的推薦算法往往推薦精度不夠高,但這種方法在處理item冷啟動時有先天的優勢,是以在工程實踐中可以注意使用。
7 推薦結果的展現方式不可忽略
推薦系統絕不僅僅局限于推薦算法和架構,而是一個完整的系統。其中推薦結果的展現方案是這個系統中極為重要的一環,開發一個推薦系統時,這個環節往往被工程師們忽略,但推薦結果最終呈現給使用者的位置、提供哪些資訊,往往起到舉足輕重的作用。
這裡需要注意的關鍵點包括:1)不同item的推薦,由于使用者關注點不同,展現的方案也需要不同,要盡量凸顯出使用者的關注重點。例如推薦一個服飾時,縮略圖對使用者的點選意願起到極為重要的作用;而推薦服務類商品時(例如旅遊線路),天數、價格、是否優惠等資訊,才是使用者關注的重點;2)推薦展示的場景和位置,需要符合使用者的行為習慣。求職社交網站linkedin的對比實驗表明,在使用者申請完一個工作的之前或之後分别展示推薦結果,前者的點選率是後者的10倍。在網頁正中或右側邊欄放置推薦結果,點選率也相差5倍之多。
在展現方式中,另一個極為重要的方面是提供推薦理由。因為通過展現推薦理由,能夠赢得使用者的信任,進而讓使用者更容易接受推薦給他的結果。例如直接為a使用者給出一個猜她喜歡的視訊v,可能很難信任。但如果同時給出推薦理由:“和你口味相似的b和c都收-藏了該視訊”,那麼能很好的提升使用者的信任感。另外,推薦理由本身也是對推薦結果的一個良好的補充描述。例如推薦一本小說,按傳統方案隻提供小說名稱、封面,讀者很難擷取足夠的資訊,但如果提供推薦理由:“本周銷售量最多”或者“起點白金作家xxx最新作品”,對提升推薦成功率有很大的幫助。
合适的推薦結果的展示方案,需要技術、産品、ui、ued等充分結合,對使用者需求和使用者心裡有細緻入微的把握,往往能起到事半功倍的效果。
8 明确優化目标和評估手段
開發一個初步可用的推薦系統并不難,難的是如何在原有推薦效果的基礎上精益求精,更進一步。優化目标和評估手段的确定是解決這個問題的關鍵所在。首先需要确定系統的優化目标。例如有些推薦系統追求推薦結果的點選率;有些則還考慮點選後的實際轉化或成交效果;有些推薦場景更關注推薦結果的新穎性,即希望更多的将本站新收錄的物品展現給使用者;另一些則更重視結果的多樣性。
在推薦系統的目标明确後,随之而來的問題是,如何量化的評價這些推薦目标?傳統的評分預測問題通常使用均方根誤差(rmse)或者平均絕對誤差(mae)等計算方法。但在實際應用中top-n推薦更為常見,這種場景下ndcg(normalized discounted cumulative gain)或map(mean average precision)是普遍使用的衡量方法。
由于推薦系統經常借鑒相關領域的一些技術,如廣告學或搜尋系統,是以計算廣告學中的pctr或者搜尋系統的precision-recall曲線等也經常用于評估推薦效果的優劣。有些系統甚至直接将推薦系統轉化為一個機器學習問題,評估手段也随之轉化為對應問題的方法。
實際系統中,往往是多個名額(點選率、準确率、覆寫率、多樣性、新穎性等)共同作用,并且按照産品的實際需求,權重折衷後進行結果評測。測試方法也有線上a/b testing以及人工評測等。無論采用何種方法,一個成熟的推薦系統一定要建立在明确的優化目标和評測系統之上,它們像一把尺子,丈量着推薦系統每次前進的腳步。
9 時效性問題
正所謂“天下武功,唯快不破”,推薦系統要能及時捕捉使用者需求的變化,回報到模型中,并及時響應使用者請求,實時提供線上服務。因為使用者是挑剔的、也是缺乏耐心的,新使用者尤其如此,如果一個推薦系統無法在較短的時間内調整結果以迎合使用者,那麼使用者會迅速流失。
推薦系統的時效性首先展現在能靈敏捕捉使用者回報,這些回報既包括正回報(使用者喜愛),也需要收集負回報(使用者不感興趣的)。很多推薦系統往往忽略了負回報樣本的收集,而事實上,有效的收集使用者的正負回報,并進行對比訓練,能夠更全面準确的掌握使用者偏好。
在使用者回報收集的基礎上,還需要能夠及時更新背景的推薦模型。很多推薦系統後端的使用者模型和物品模型,都需要通過大量使用者日志來進行挖掘運算,計算開銷大,是以一個設計良好的推薦系統,需要将離線挖掘和線上服務系統進行有機的結合。離線系統可以設計得比較“厚”,即算法複雜,模型龐大,更新緩慢。而線上系統則傾向于設計得輕巧靈活,能及時将捕獲的正負回報資訊傳遞進來,修改線上模型,捕獲使用者短期興趣變化,進而快速修正推薦結果。
10 大資料挖掘和性能優化
大資料挖掘是近年來的研究熱點,得益于分布式計算技術的廣泛使用,系統吞吐的資料規模越來越大,離線資料挖掘的能力也越來越強,處理大量使用者行為資料變得越來越便捷。但在推薦挖掘中,系統能夠提供的運算能力和實際的運算需求之間,始終存在沖突,是以如果有效合理的配置設定運算資源十分重要。這裡需要在挖掘深度上進行合理的配置設定。對重點的使用者或者item,可以配置設定更多的資源,進行更深入的挖掘。對基礎資料也是如此,高品質的資料可以用于更詳細的分析,而低價值的資料可能隻需要簡化處理流程。
後端的離線系統往往還需要定期更新模型,這裡模型的全量或增量更新方式也是一個值得關注的點。以使用者模型為例,并非所有使用者的個性化模型都需要頻繁更新,活躍的、高貢獻值的使用者,應該需要更頻繁的予以更新。對item也類似,熱門item和冷門item更新技術的周期可以不同。
在大資料推薦系統的性能優化方面,還有一些常用的技巧,例如反向索引的使用,cache機制的充分運用等。
總結
智能推薦系統是一個系統工程,依賴資料、架構、算法、人機互動等環節的有機結合,形成合力。本文列舉的十個關鍵點,是作者在開發推薦系統中積累的一些經驗與心得,希望能抛磚引玉,與大家共同探讨。我們開發推薦系統的目标,是通過個性化資料挖掘技術,将“千人一面”變為“千人千面”,因為大千世界、芸芸衆生,原本就是多姿多彩的,希望智能推薦系統能讓這個世界變得更人性化、更豐富、更美好。
<b></b>
<b>原文釋出時間為:2013-07-31</b>
<b>本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号</b>