個性化推薦已經成為現代人們生活的一部分, “猜你喜歡”、“相關閱讀”你一定並不陌生。計算機如何做到對使用者投其所好?企業在做個性化推薦時要如何精準把握使用者興趣?如何解決冷啟動問題?如何避免推薦結果的單調與重複?近日,達觀資料聯合創始人於敬進行了《個性化推薦系統實踐》的主題分享,深入淺出的講解了個性化推薦的過程、難點及解決方法。
一、推薦系統概述
二、搭建推薦系統的關鍵演算法
三、推薦系統難點分析和解決方法
四、深度學習在推薦系統中的應用
五、進階資源推薦
一、推薦系統概述
常見的推薦系統主要有以下三種場景:
1.個性化推薦 例如開啟今日頭條時最先看到一個推薦頁面,這是一個FEED流,還有像電商網站有猜你喜歡的推薦位置。
2.相關推薦 通常文章或影片的下方會出現一個相關推薦,有的也叫“看了還看”、“買了還買”等。
3.熱門推薦 很多會出現在首頁的熱點位置。
推薦系統其實對於使用者來說有其核心的價值。比如:
幫使用者便捷的篩選出感興趣的內容
在使用者面對陌生領域時提供參考意見
當使用者需求不明確時,作使用者的“貼心助手”
滿足使用者的好奇心,比如很多短影片的APP
當使用者有這麼多訴求時候,推薦系統做的事情是什麼?
首先它基於使用者的興趣,根據使用者的歷史行為做興趣的挖掘,把物品和使用者的個性化偏好進行匹配。
然後透過推薦演算法或者技術把資訊進行過濾,解決使用者的過載問題。
當使用者有新的行為發生時,比如點選或者搜尋之後,能及時進一步捕捉使用者的興趣。
選擇合適的場景,個性化或者相關,或者熱門,來給使用者進行推薦。
對於企業來說,個性化帶來的效果也非常顯著。電商巨頭亞馬遜每年30%的收入來自個性化推薦;自2008 年起,推薦演算法為 YouTube 每天增加了數十萬小時的觀看時長,每年影片點選量增幅都達到50% ;Linkedin透過propensitymodel提供機器學習,最終為公司帶來了數十倍的持續穩定的增長;我們進入京東、淘寶app或者網頁端,每個使用者的首頁展示都是依據行為偏好進行精準推薦。
什麼是個性化推薦系統?
個性化推薦系統解決的是使用者和內容中間的關聯關係,它是二者之間的橋樑。基於使用者的興趣偏好,把使用者感興趣的物品或者影片、資訊等推薦給使用者,給使用者帶來沉浸式的體驗,讓使用者感到一定的滿足感,最佳化使用者的體驗。
推薦系統從它的初始來說主要是解決兩大問題:資訊過載和長尾問題。
資訊過載是當使用者面對大量資訊時並不明確自己喜歡什麼,但又確實有需求想看到喜歡的東西。從紛繁複雜的商品和內容中如何發現自己感興趣的東西?對於使用者來說是一種選擇的困難。
另一方面來說,企業有新物品上線時,如何展示給喜歡它的使用者?
根據達觀資料服務的客戶經驗,我們發現物品沒有曝光並不代表沒有人喜歡它,而是沒有在合適的時機曝光給對物品感興趣的使用者,推薦系統剛好能解決這方面的問題。
一方面系統基於大量的使用者行為資料來分析挖掘使用者的偏好;另外一方面,基於物品資料及物品自身的特點,把商品和使用者的興趣進行匹配,從而達到個性化推薦。使用者可以找到自己感興趣的東西,商家的一些商品或內容也能有更多曝光的機會。
推薦系統設計的目標主要有下面三個部分:
首先,功能要儘可能全面,剛才提到推薦個性化推薦、相關推薦和熱門推薦,有些商家也包括一些混合推薦,一般在詳情頁裡面下叫關聯推薦,但有的產品會在關聯推薦中放一個無限下拉的功能,這時候就要夾雜一部分個性化推薦在其中。
其次是效果要精準,即推薦的東西一定是使用者感興趣的。另外推薦的結果要儘可能豐富,內容或物品有更多的曝光機會。
第三是效能,當重新整理一個頁面的推薦結果,如果沒有很快返回會帶來很差的使用者體驗。從另一方面來說,我們的結果不一定是非常好的,但它絕對不能留白,就是無論怎麼樣推薦結果一定有返回,這是最基礎的要求。
在實際的推薦場景裡,功能、效果、效能三者相輔相成、也彼此互相影響,很多時候要進行折中的考慮。
二、搭建推薦系統的關鍵演算法
1.達觀資料推薦系統架構
上圖是達觀推薦的是總體架構。
達觀資料有自己的運算平臺、儲存平臺和傳輸平臺。在此之上是元件層,很多推薦依賴於NLP做了進一步的分析挖掘。在此之上是模型層,模型有很多,比如使用者畫像就是對一個使用者有全方位的刻畫,同時也有物品畫像,包括收益、點選、收藏,預估的收益,增長趨勢等。
模型之上是演算法層,包括矩陣分解、協同過濾,深度學習演算法也是達觀的一部分,同時還有基於統計的模型,包括點選反饋、關聯規則挖掘等,還有比較重要的是基於內容的推薦。
演算法層上面是組合層,單一的推薦演算法有二三十種,基於單一的推薦演算法會有機器學習的融合排序,基於不同業務場景會自適應選擇一部分模型進行效果最佳化。
組合層上面是應用層,主要提供四種服務:
1. 個性化推薦,這是千人千面的推薦結果;
2. 相關推薦是以物推物,當看到商品、影片或文章會有一個關聯的推薦;
3. 熱門推薦,其實是熱點分析;
4. 推薦理由,是推薦結果的解釋。對於推薦理由的使用在PC中用得比較多。
2.推薦流程
推薦流程分為三部分:離線、近線和線上。
離線一般說召回,要從很多推薦的物品裡進行召回。大的推薦客戶每天會新增物品可能幾十萬,在推薦候選集中有幾千萬時並不是所有的每次都要重新計算一遍。離線模組的處理就是先做一個推薦結果的召回,這種召回一般叫重量級的演算法,比如說做協同過濾、決策分解、深度學習等,這些會依賴於大資料的叢集。由於資料量比較大,一般我們使用最近半年或者幾個月的資料,跑一次的時間一般在幾個小時,快的話是半小時。從幾十萬、幾百萬、幾千萬的候選集裡面得到的候選集在幾千這個維度。
經過離線模組的召回之後是近線的處理,也叫粗排,粗排是一些輕量級演算法,比如剛剛提到在組合層達觀有各種各樣組合的模型,基於單一的推薦演算法進行融合,一般使用的方式是記憶體+RDB。這部分處理時間非常快,一般在秒級,就是說當一個使用者的行為發生改變後,他的推薦結果會做到實時更新。經過粗排之後,這個推薦結果一般是在百的量級。
最後一步線上主要做精排。當新的請求過來,透過這個使用者的ID,根據離線找到近線模組處理的結果。拿到基於粗排之後的結果後做一些業務規則的處理,比如在一次推薦裡要求多樣性和時效性等。這裡很多處理方式是基於載入記憶體的方式,處理時間是在毫秒級,返回的結果一般在10這個量級。
3.如何做熱門推薦?
就熱門推薦簡單的方式可生成多維度的熱門資料,熱門資料有各種排行榜,比如點選的排行榜,購買排行榜等。當客戶需要熱門推薦的場景時可把熱門推薦生成的結果直接返回給客戶。另一方面,熱門推薦也可以捕捉一些場景,比如處理冷啟動和做一些基於問題探索時。
熱門推薦的結果通常有一定理論依據,比如按購買、銷量排序其實也是很多人容易接受的方式,在這部分也可以夾雜人工編輯的分析。所以首先基於使用者行為(包括物品資料,使用者本身的資料)生成不同維度的排行榜,在不同的時機推薦給使用者。
4.如何做基於內容的推薦?
一個物品一般會有各種維度的使用資訊,比如商品有標題、品牌、價格、折扣等,基於使用資訊可以推薦標題上語意相似的商品。處理基於內容推薦時不僅是基於簡單使用方面的匹配,會考慮到其他組合條件。比如服裝類的商品加上不同的價格會得到不同的結果,這種找物方式是單純拿到物品屬性時的處理,但在實際場景下還有各種擴充套件,比如會做做類別和語義的擴充套件。
類別擴充套件:比如男生關注的是科技,是否可以推薦一下體育或軍事等相關內容?類別擴充套件也是避免內容推薦過於單一的方式。
語義擴充套件:當你關注一個標籤時,我們會把它相應的標籤也拿到,基於你相關的標籤也可以做其他方面的召回。比如當看歐冠時,是不是可以推薦西甲相關的新聞?一個使用者關注梅西,但梅西的新聞有時比較有限,是不是可以給他推薦C羅的內容?語義擴充套件也可以解決推薦內容太過單一的問題。
5.基於主題模型的推薦
主題模型的推薦可以充分利用一個物品的文字特徵,比如標題、描述或內容等。一篇文章拿到標題後,基於主題模型,基於LDA或者LSI可以把它生成一個向量。
基於這個向量得到關於主題的分佈,計算它的相似度,基於這個相似度我們取topN可以得到一個推薦結果。
這種推薦結果比單純基於文字和字面匹配的效果更好。
6. 協同過濾
協同過濾有兩種,基於使用者的協同過濾和基於物品的。基於使用者的協同過濾首先計算使用者之間的相似度,把相似的使用者感興趣的物品推薦給當前這個使用者。基於物品的協同過濾先計算物品的相似度,基於相似度進行排序,最終得到當前這個物品比較相似的其他物品。
一個熱門的商品會很容易影響到使用者或者物品之間的相似度。比如今天有一社會熱點事件,很多媒體跟蹤除了爆款新聞,即使我平時是一個關注體育或科技領域的讀者,也會點選看一下。這種情景下如果基於物品的相似度來處理得到的結果往往不好。所以在計算相似度時要做很多變形,比如對熱門進行特別處理,對冷門的物品也需要做特殊處理和過濾等。
也要考慮使用者有一些作弊行為,比如使用者刷了某一領域很多東西,其他使用者只是刷了部分,很多的使用者和其他使用者計算相似度時,可能都會在其他使用者計算的候選集中,這也不符合實際場景。所以在實際處理時要對這部分做一些特殊的控制。
7. 潛在因子模型
基於潛在因子分析是完全由數學的方式、更好的模型來處理。他的輸入是一個使用者的行為矩陣,透過矩陣分解得到兩個矩陣,基於這兩個矩陣進一步復原,透過矩陣相乘的方式,就可以把原來使用者沒有操作過的物品的得分給預測出來。
單純依賴使用者行為資料進行預測有很多不足,給物品的打分和使用者本身的打分差異可能很大。在上面的實驗模型中可以充分考慮使用者的bias資訊。比如在電影場景中,由一個大牌明星主演,因為它的市場預期好所以容易得到好評。但當是小眾電影或者很多新人主演,大家接受度不高,得分可能會相對低。也許它得到了3分,可能已經相當於大牌明星主演電影的5分。這就會導致物品和使用者之間有各種bias資訊。在做潛在因子模型時,可以把使用者的bias資訊和物品的bias資訊加進來。
同時還要考慮很多特徵要進行組合,男生加上體育和女生加上娛樂,往往是一個更好的特徵。對這塊來說,透過潛在因子模型可以把這些資訊充分考慮進來。
8.使用者模型構建
使用者模型構建也是使用者畫像。在實際場景中如果精準挖掘使用者興趣偏好,個性化推薦能做得更好。使用者畫像有多種資訊,基於註冊資訊有年齡、性別、地域等,還有另一種資料——使用者的偏好,同時還有各種分類的場景,比如在電商裡會判斷一個使用者他對價格是否敏感,是否喜歡小眾的東西等。
這個分析牽涉到各種技術,比如基於機率統計可以得到一部分資料,另一部分,很多使用者之間的興趣有一定的關聯性,可以做使用者群體的聚類。預測使用者對價值的喜好可藉助一些常見的分類模型來處理。對於使用者模型構建,我們一方面給推薦系統來使用,另外一部分也提供使用者畫像這種服務,當企業拿到使用者畫像後,可以做老使用者的關懷、流失使用者的召回等。
9.多演算法融合
上面提到的都是單一推薦演算法,比如基於內容的,基於熱門的,包括基於協同過濾、矩陣分解、深度學習等,單一演算法會得到一些推薦候選集,拿到推薦候選集後要做一個融合,將最後結果返回給使用者。我們會將單一推薦候選集輸入到融合模型裡,讓模型預測,按照使用者偏好的高低排序,然後取得TOPN返回給使用者。
推薦的整體流程有以上這幾點,首先是各種單一演算法召回,召回完進行融合,單一演算法裡又分了不同維度,比如協同過濾、矩陣分解,包括使用者畫像等。
三、推薦系統難點分析和解決方法
構建推薦系統有下面四個難點:
使用者興趣不僅存在多樣性,而且會隨著時間的變化而變化;其次對使用者興趣的挖掘需要海量資料,如何合理建模?以及不同演算法模型對使用者興趣的刻畫結果不同,如何最佳化模型?
冷啟動包括新使用者的冷啟動和物品的冷啟動。新使用者是當一個使用者沒有任何行為資料和輔助資訊的情況下,如何給他做好推薦?物品的冷啟動即長尾問題——如何將新的物品快速推薦給可能對它感興趣的使用者?
3.如何解決實際應用中的效能問題?
4.如何解決推薦結果單調性和重複性?
基於這四點,和大家分享一下達觀推薦系統對上述問題的解決方案(重點來了)
透過引入時間因子,基於不同的時間週期做使用者畫像。比如基於最近半年的或更久的資料做長期使用者畫像,基於近一個月或三個月做短期使用者畫像,同時還會有實時使用者畫像,基於這三種型別使用者畫像之間的差異化,能夠感知使用者的興趣變更。
基於使用者畫像後做一個過濾機制,把推薦過或者質量不佳先過濾。這樣做排序時會引入一個時間因子做一個衰減,另外也會做機器學習的預測,可以方便地調整推薦順序。
接下來做最佳化,隨著時間的推移,對於使用者的刻畫會更清晰準確。
對於物品的冷啟動,達觀資料使用CLUB演算法。先給它合適的探索機會,初期時讓物品有一定的曝光,曝光後我們會有一個更快的預期收益機制,加快模型的迭代。當在一段時間內觀察預期的收益沒有達到要求時,會把這部分的曝光逐漸降低。如果預期收益比較好,會增大一部分曝光。透過這種自學的機制來調整物品之間的曝光問題,新的物品便總是有曝光的機會。
對於使用者的冷啟動,即使使用者沒有任何數字資訊,使用者手機登陸APP時是否有其他可以採集的資訊?比如地域,手機型號,基於這些東西可以做一些離線的挖掘。比如一線城市或四線城市,很大程度上會有一個偏好的差異。用Iphone手機和用其他品牌手機,基於歷史的資料也會分析出差異點,然後進行針對性的調整。
有一種極端情況,拿不到上述資料時如何做推薦?當拿到使用者的ID,基於一些歷史行為經驗挖掘一些高質量的物品,同時在生成推薦結果時儘量考慮到多樣性。相當於當一個使用者進入一個飯館,雖然不知道他喜歡什麼,但我們提供了種類豐富的選單讓使用者選擇。當使用者選擇自己感興趣的內容,和推薦系統有互動時,無論是點選、收藏、點贊,藉助我們的秒級反饋機制,推薦的結果就可以實時更新,我們會對實時的畫像把握得越來越準。
此外達觀資料藉助自然語言處理技術,當新的物品進來,基於它的標題、類別等語義資訊可以做預估,透過深度挖掘構建新物品的畫像,輔助接下來是增加推薦還是減少曝光。
離線使用的是大量的叢集方式,比如說Spark、Kafka跑一些重量級的演算法,矩陣分解、協同過濾,包括深度學習等都屬於離線模組來做的,這部分運算時間比較久。
在最上面叫線上模組,當使用者有一次推薦請求他希望反饋推薦結果時,要保證快速毫秒級地返回推薦結果,不能做更多重量級演算法。這部分往往是一些業務規則處理,可以基於記憶體或記憶體的資料庫Redis的方式,實時返回給使用者推薦結果。
在離線和線上模組之間,它們從小時級到毫秒級中間有很大的gap,使用者行為發生變化後如何感知?接下來交給近線模組處理。近線模組可以做到當使用者每一次行為變化後,系統都可以感知這種變化,然後把使用者的推薦結果重新計算一遍,這時候結果往往是一些融合演算法。融合排序輸入的就是離線的各種挖掘,包括使用者畫像資訊、他的場景畫像和實質畫像等。基於近線來說,它對各種單一推薦演算法進行融合排序,最終存到記憶體資料庫中。當線上模組接到新請求時,可以從這裡面讀取對使用者近線計算好的結果,然後做業務規則返回給使用者。
這就是“三層火箭”架構,它主要借鑑了搜尋引擎的部分機制,包括佇列、實時計算等。我們可以滿足使用者的興趣和變化,同時也在高併發的情況下毫秒級返回給使用者推薦結果,目前達觀服務了上百家客戶,三層火箭架構是一個有效的方式。
另外一個是重要性排序,可以基於物品本身的標題、標籤、描述等資訊做語義方面重要性的排序。基於文字處理可以有效解決推薦系統的冷啟動問題。
四、深度學習在推薦系統中的應用
Embedding主要有兩種方式。首先會做詞Embedding,來完善內容多樣性。當拿到item標籤時,業界一般使用Word2vec方式進行專項的擴充套件。比如當使用者關注歐冠這個標籤時,是否可以找到西甲、意甲進行詞粒度的擴充套件。這樣在實際推薦中可以避免推薦結果太過單一。
另一個itemEmbedding主要應用於召回階段。對於item Embedding,相當於我們把一個使用者行為資料作為一個詞粒度,然後輸入到Word2vec得到itemEmbedding,基於item Embedding進行相似度計算方式可以得到相似的物品。然後作為一個結果的召回進入融合排序。
在第三種是做Embedding中做特徵工程,得到一個物品或者一個使用者的Embedding後,做featurevector的方式來使用,基於feature vector做machine learning。
2.基於DNN的推薦
在YouTube釋出這篇論文的時候分了兩個階段來實現推薦結果,第一層是上面圖片列的候選集生成的階段。這個階段DNN的處理方式它可以從百萬量級直接降到百的量級。第二層是Ranking階段,做一些重排序的方式。DNN把我們的推薦問題轉化成分類問題,相當於對每一個觀看的影片做一個分類。
另外一方面,論文中也提到DNN模型並沒有用到原始的使用者日誌,而是對每個使用者提取了等量的訓練樣本,這種方式主要有好處是可以減少高度活躍使用者對loss函式的影響。
3.基於DKN的推薦
DKN主要是基於知識圖譜,應用在Feed流推薦中。DKN是基於內容的深度推薦的框架下進行點選率的預測。比如每條新聞透過KCNN對標題進行處理,最終產生一個向量。同時我們引用注意力機制機做使用者的Embedding,最終再結合深度神經網路做點選的預估。
2016年穀歌在一篇論文提出了Wide&Deep模型,這個模型裡主要同時學習低階和高階的特徵。
Wide模型是線性模型+特徵組合,記憶性好、可解釋性強。Deep是Deeplearning,這塊特徵工程較少,往往可以學習到更高層次的隱藏特徵。但它需要較專業的領域知識來做特徵工程,所以進一步產生了Deep FM。
對於達觀來說,模型排序有下述這些方式。
(1)線性模型,依賴於人工特徵工程,
(2)FM/GBDT+LR或Xgboost+LR,它主要是非線性的,達觀做了特徵融合。在很多場景下推薦效果會更好。
(3)模型的進一步演進,使用到DeepFM和Wide&Deep藉助於深度學習,減少很多人工的特徵工程。這部分的工作主要在調參上。
在達觀服務的眾多行業裡,從線性、非線性,包括深度學習模型都在使用。每個行業自己的特點,不同的客戶有自己的資料量和使用者群體,達觀會基於客戶的推薦效果來選擇對應比較好的模型。
2018年微軟釋出了一個模型XDeepFM,它其實是對DCN的改進,主要由linear、DNN、CIN組成。引入的CIN機制可以自動學習顯式的高階特徵互動,該模型在幾個資料集上都取得了超過DeepFM模型的效果。這部分達觀推薦也正在探索和嘗試中。