美團推薦算法實踐

原文:https://cloud.tencent.com/developer/article/1342796
前言
推薦系統並不是新鮮的事物,在很久之前就存在,但是推薦系統真正進入人們的視野,並且作爲一個重要的模塊存在於各個互聯網公司,還是近幾年的事情。

隨着互聯網的深入發展,越來越多的信息在互聯網上傳播,產生了嚴重的信息過載。如果不採用一定的手段,用戶很難從如此多的信息流中找到對自己有價值的信息。

解決信息過載有幾種手段:一種是搜索,當用戶有了明確的信息需求意圖後,將意圖轉換爲幾個簡短的詞或者短語的組合(即query),然後將這些詞或短語組合提交到相應的搜索引擎,再由搜索引擎在海量的信息庫中檢索出與query相關的信息返回給用戶;另外一種是推薦,很多時候用戶的意圖並不是很明確,或者很難用清晰的語義表達,有時甚至連用戶自己都不清楚自己的需求,這種情況下搜索就顯得捉襟見肘了。尤其是近些年來,隨着電子商務的興起,用戶並非一定是帶着明確的購買意圖去瀏覽,很多時候是去“逛”的,這種情景下解決信息過載,理解用戶意圖,爲用戶推送個性化的結果,推薦系統便是一種比較好的選擇。

美團作爲國內發展較快的o2o網站,有着大量的用戶和豐富的用戶行爲,這些爲推薦系統的應用和優化提供了不可或缺的條件,接下來介紹我們在推薦系統的構建和優化過程中的一些做法,與大家共享。

框架

從框架的角度看,推薦系統基本可以分爲數據層、觸發層、融合過濾層和排序層。數據層包括數據生成和數據存儲,主要是利用各種數據處理工具對原始日誌進行清洗,處理成格式化的數據,落地到不同類型的存儲系統中,供下游的算法和模型使用。候選集觸發層主要是從用戶的歷史行爲、實時行爲、地理位置等角度利用各種觸發策略產生推薦的候選集。候選集融合和過濾層有兩個功能,一是對出發層產生的不同候選集進行融合,提高推薦策略的覆蓋度和精度;另外還要承擔一定的過濾職責,從產品、運營的角度確定一些人工規則,過濾掉不符合條件的item。排序層主要是利用機器學習的模型對觸發層篩選出來的候選集進行重排序。
同時,對與候選集觸發和重排序兩層而言,爲了效果迭代是需要頻繁修改的兩層,因此需要支持ABtest。爲了支持高效率的迭代,我們對候選集觸發和重排序兩層進行了解耦,這兩層的結果是正交的,因此可以分別進行對比試驗,不會相互影響。同時在每一層的內部,我們會根據用戶將流量劃分爲多份,支持多個策略同時在線對比。

數據應用
數據乃算法、模型之本。美團作爲一個交易平臺,同時具有快速增長的用戶量,因此產生了海量豐富的用戶行爲數據。當然,不同類型的數據的價值和反映的用戶意圖的強弱也有所不同。

行爲類別

行爲詳情

主動行爲數據

搜索、篩選、點擊、收藏、下單、支付、評分

UGC

文本評價、上傳圖片

負反饋數據

左滑刪除、取消收藏、取消訂單、退款、負評、低評

用戶畫像

用戶人口屬性、美團DNA、品類偏好、消費水平、工作地與居住地

用戶主動行爲數據記錄了用戶在美團平臺上不同的環節的各種行爲,這些行爲一方面用於候選集觸發算法(在下一部分介紹)中的離線計算(主要是瀏覽、下單),另外一方面,這些行爲代表的意圖的強弱不同,因此在訓練重排序模型時可以針對不同的行爲設定不同的迴歸目標值,以更細地刻畫用戶的行爲強弱程度。此外,用戶對deal的這些行爲還可以作爲重排序模型的交叉特徵,用於模型的離線訓練和在線預測。
負反饋數據反映了當前的結果可能在某些方面不能滿足用戶的需求,因此在後續的候選集觸發過程中需要考慮對特定的因素進行過濾或者降權,降低負面因素再次出現的機率,提高用戶體驗;同時在重排序的模型訓練中,負反饋數據可以作爲不可多得的負例參與模型訓練,這些負例要比那些展示後未點擊、未下單的樣本顯著的多。
用戶畫像是刻畫用戶屬性的基礎數據,其中有些是直接獲取的原始數據,有些是經過挖掘的二次加工數據,這些屬性一方面可以用於候選集觸發過程中對deal進行加權或降權,另外一方面可以作爲重排序模型中的用戶維度特徵。
通過對UGC數據的挖掘可以提取出一些關鍵詞,然後使用這些關鍵詞給deal打標籤,用於deal的個性化展示。

策略觸發
上文中我們提到了數據的重要性,但是數據的落腳點還是算法和模型。單純的數據只是一些字節的堆積,我們必須通過對數據的清洗去除數據中的噪聲,然後通過算法和模型學習其中的規律,才能將數據的價值最大化。在本節中,將介紹推薦候選集觸發過程中用到的相關算法。

##1. 協同過濾

提到推薦,就不得不說協同過濾,它幾乎在每一個推薦系統中都會用到。基本的算法非常簡單,但是要獲得更好的效果,往往需要根據具體的業務做一些差異化的處理。

清除作弊、刷單、代購等噪聲數據。這些數據的存在會嚴重影響算法的效果,因此要在第一步的數據清洗中就將這些數據剔除。

合理選取訓練數據。選取的訓練數據的時間窗口不宜過長,當然也不能過短。具體的窗口期數值需要經過多次的實驗來確定。同時可以考慮引入時間衰減,因爲近期的用戶行爲更能反映用戶接下來的行爲動作。

user-based與item-based相結合。

羣體/個體

計算代價

適用場景

冷啓動

可解釋性

實時性

user-based

更依賴於當前用戶相近的用戶羣體的社會化行爲

適用於用戶數較少的場合

時效性強,用戶個性化興趣不太顯著的場合

新加入的物品能很快進入推薦列表

用戶新的行爲不一定導致推薦結果的變化

item-based

更側重用戶自身的個體行爲

適用於物品數較少的場合

長尾物品豐富,用戶個性化需求強烈的場合

新加入的用戶能很快得到推薦

用戶新的行爲一定導致推薦結果的變化

嘗試不同的相似度計算方法。在實踐中,我們採用了一種稱作loglikelihood ratio[1]的相似度計算方法。在mahout中,loglikelihood ratio也作爲一種相似度計算方法被採用。
下表表示了Event A和Event B之間的相互關係,其中:
k11 :Event A和Event B共現的次數
k12 :Event B發生,Event A未發生的次數
k21 :Event A發生,Event B未發生的次數
k22 :Event A和Event B都不發生的次數
Event A

Everything but A

Event B

A and B together (k_11)

B, but not A (k_12)

Everything but B

A without B (k_21)

Neither A nor B (k_22)

則logLikelihoodRatio=2 * (matrixEntropy - rowEntropy - columnEntropy)

其中
rowEntropy = entropy(k11, k12) + entropy(k21, k22)
columnEntropy = entropy(k11, k21) + entropy(k12, k22)
matrixEntropy = entropy(k11, k12, k21, k22)
(entropy爲幾個元素組成的系統的香農熵)

##2. location-based

對於移動設備而言,與PC端最大的區別之一是移動設備的位置是經常發生變化的。不同的地理位置反映了不同的用戶場景,在具體的業務中可以充分利用用戶所處的地理位置。在推薦的候選集觸發中,我們也會根據用戶的實時地理位置、工作地、居住地等地理位置觸發相應的策略。

根據用戶的歷史消費、歷史瀏覽等,挖掘出某一粒度的區域(比如商圈)內的區域消費熱單和區域購買熱單

區域消費熱單

區域購買熱單

當新的線上用戶請求到達時,根據用戶的幾個地理位置對相應地理位置的區域消費熱單和區域購買熱單進行加權,最終得到一個推薦列表。

此外,還可以根據用戶出現的地理位置,採用協同過濾的方式計算用戶的相似度。

##3. query-based
搜索是一種強用戶意圖,比較明確的反應了用戶的意願,但是在很多情況下,因爲各種各樣的原因,沒有形成最終的轉換。儘管如此,我們認爲,這種情景還是代表了一定的用戶意願,可以加以利用。具體做法如下:

對用戶過去一段時間的搜索無轉換行爲進行挖掘,計算每一個用戶對不同query的權重。

計算每個query下不同deal的權重。

當用戶再次請求時,根據用戶對不同query的權重及query下不同deal的權重進行加權,取出權重最大的TopN進行推薦。

##4. graph-based
對於協同過濾而言,user之間或者deal之間的圖距離是兩跳,對於更遠距離的關係則不能考慮在內。而圖算法可以打破這一限制,將user與deal的關係視作一個二部圖,相互間的關係可以在圖上傳播。Simrank[2]是一種衡量對等實體相似度的圖算法。它的基本思想是,如果兩個實體與另外的相似實體有相關關係,那它們也是相似的,即相似性是可以傳播的。

Let s(A,B) denote the similarity between persons A and B, for A != B

Let s(c,d) denote the similarity between items c and d, for c != d

O(A),O(B): the set of out-neighbors for node A or node B
I©,I(d): the set of in-neighbors for node c or node d

simrank的計算(採用矩陣迭代的方式)

計算得出相似度矩陣後,可以類似協同過濾用於線上推薦。

##5. 實時用戶行爲
目前我們的業務會產生包括搜索、篩選、收藏、瀏覽、下單等豐富的用戶行爲,這些是我們進行效果優化的重要基礎。我們當然希望每一個用戶行爲流都能到達轉化的環節,但是事實上遠非這樣。

當用戶產生了下單行爲上游的某些行爲時,會有相當一部分因爲各種原因使行爲流沒有形成轉化。但是,用戶的這些上游行爲對我們而言是非常重要的先驗知識。很多情況下,用戶當時沒有轉化並不代表用戶對當前的item不感興趣。當用戶再次到達我們的推薦展位時,我們根據用戶之前產生的先驗行爲理解並識別用戶的真正意圖,將符合用戶意圖的相關deal再次展現給用戶,引導用戶沿着行爲流向下游行進,最終達到下單這個終極目標。

目前引入的實時用戶行爲包括:實時瀏覽、實時收藏。

##6. 替補策略
雖然我們有一系列基於用戶歷史行爲的候選集觸發算法,但對於部分新用戶或者歷史行爲不太豐富的用戶,上述算法觸發的候選集太小,因此需要使用一些替補策略進行填充。

熱銷單:在一定時間內銷量最多的item,可以考慮時間衰減的影響等。
好評單:用戶產生的評價中,評分較高的item。
城市單:滿足基本的限定條件,在用戶的請求城市內的。

子策略融合
爲了結合不同觸發算法的優點,同時提高候選集的多樣性和覆蓋率,需要將不同的觸發算法融合在一起。常見的融合的方法有以下幾種[3]:

加權型:最簡單的融合方法就是根據經驗值對不同算法賦給不同的權重,對各個算法產生的候選集按照給定的權重進行加權,然後再按照權重排序。
分級型:優先採用效果好的算法,當產生的候選集大小不足以滿足目標值時,再使用效果次好的算法,依此類推。
調製型:不同的算法按照不同的比例產生一定量的候選集,然後疊加產生最終總的候選集。
過濾型:當前的算法對前一級算法產生的候選集進行過濾,依此類推,候選集被逐級過濾,最終產生一個小而精的候選集合。
目前我們使用的方法集成了調製和分級兩種融合方法,不同的算法根據歷史效果表現給定不同的候選集構成比例,同時優先採用效果好的算法觸發,如果候選集不夠大,再採用效果次之的算法觸發,依此類推。

候選集重排序
如上所述,對於不同算法觸發出來的候選集,只是根據算法的歷史效果決定算法產生的item的位置顯得有些簡單粗暴,同時,在每個算法的內部,不同item的順序也只是簡單的由一個或者幾個因素決定,這些排序的方法只能用於第一步的初選過程,最終的排序結果需要藉助機器學習的方法,使用相關的排序模型,綜合多方面的因素來確定。

##1. 模型
非線性模型能較好的捕捉特徵中的非線性關係,但訓練和預測的代價相對線性模型要高一些,這也導致了非線性模型的更新週期相對要長。反之,線性模型對特徵的處理要求比較高,需要憑藉領域知識和經驗人工對特徵做一些先期處理,但因爲線性模型簡單,在訓練和預測時效率較高。因此在更新週期上也可以做的更短,還可以結合業務做一些在線學習的嘗試。在我們的實踐中,非線性模型和線性模型都有應用。

非線性模型
目前我們主要採用了非線性的樹模型Additive Groves[4](簡稱AG),相對於線性模型,非線性模型可以更好的處理特徵中的非線性關係,不必像線性模型那樣在特徵處理和特徵組合上花費比較大的精力。AG是一個加性模型,由很多個Grove組成,不同的Grove之間進行bagging得出最後的預測結果,由此可以減小過擬合的影響。

每一個Grove有多棵樹組成,在訓練時每棵樹的擬合目標爲真實值與其他樹預測結果之和之間的殘差。當達到給定數目的樹時,重新訓練的樹會逐棵替代以前的樹。經過多次迭代後,達到收斂。

線性模型
目前應用比較多的線性模型非Logistic Regression莫屬了。爲了能實時捕捉數據分佈的變化,我們引入了online learning,接入實時數據流,使用google提出的FTRL[5]方法對模型進行在線更新。

主要的步驟如下:

在線寫特徵向量到HBase
Storm解析實時點擊和下單日誌流,改寫HBase中對應特徵向量的label
通過FTRL更新模型權重
將新的模型參數應用於線上
##2. 數據

採樣:對於點擊率預估而言,正負樣本嚴重不均衡,所以需要對負例做一些採樣。
負例:正例一般是用戶產生點擊、下單等轉換行爲的樣本,但是用戶沒有轉換行爲的樣本是否就一定是負例呢?其實不然,很多展現其實用戶根本沒有看到,所以把這樣樣本視爲負例是不合理的,也會影響模型的效果。比較常用的方法是skip-above,即用戶點擊的item位置以上的展現纔可能視作負例。當然,上面的負例都是隱式的負反饋數據,除此之外,我們還有用戶主動刪除的顯示負反饋數據,這些數據是高質量的負例。
去噪:對於數據中混雜的刷單等類作弊行爲的數據,要將其排除出訓練數據,否則會直接影響模型的效果。
##3. 特徵
在我們目前的重排序模型中,大概分爲以下幾類特徵:

deal(即團購單,下同)維度的特徵:主要是deal本身的一些屬性,包括價格、折扣、銷量、評分、類別、點擊率等
user維度的特徵:包括用戶等級、用戶的人口屬性、用戶的客戶端類型等
user、deal的交叉特徵:包括用戶對deal的點擊、收藏、購買等
距離特徵:包括用戶的實時地理位置、常去地理位置、工作地、居住地等與poi的距離
對於非線性模型,上述特徵可以直接使用;而對於線性模型,則需要對特徵值做一些分桶、歸一化等處理,使特徵值成爲0~1之間的連續值或01二值。

總結
以數據爲基礎,用算法去雕琢,只有將二者有機結合,纔會帶來效果的提升。對我們而言,以下兩個節點是我們優化過程中的里程碑:

將候選集進行融合:提高了推薦的覆蓋度、多樣性和精度
引入重排序模型:解決了候選集增加以後deal之間排列順序的問題

以上是我們在實踐中的一點總結,當然我們還有還多事情要做。we are still on the way!

注:
本文爲美團推薦與個性化團隊集體智慧的結晶,感謝爲此辛苦付出的每一個成員。同時,團隊長期招聘算法工程師與平臺研發工程師,感興趣的同學請聯繫[email protected],郵件標題註明“應聘推薦系統工程師”。

#Reference

http://en.wikipedia.org/wiki/Likelihood-ratio_test
SimRank: a measure of structural-context similarity
http://www.52ml.net/318.html
http://additivegroves.net/
Ad Click Prediction: a View from the Trenches

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章