蓝月亮四肖中特

about云開發

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

打印 上一主題 下一主題

[推薦系統] 美團推薦算法實踐

[復制鏈接]
跳轉到指定樓層
樓主
徐超 發表于 2015-1-23 22:50:54 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 pig2 于 2015-6-9 12:48 編輯
問題導讀
1、什么是推薦系統?
2、如何理解子策略融合?

3、simrank的計算使用什么方式?




前言
推薦系統并不是新鮮的事物,在很久之前就存在,但是推薦系統真正進入人們的視野,并且作為一個重要的模塊存在于各個互聯網公司,還是近幾年的事情。

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

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

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

框架


從框架的角度看,推薦系統基本可以分為數據層、觸發層、融合過濾層和排序層。數據層包括數據生成和數據存儲,主要是利用各種數據處理工具對原始日志進行清洗,處理成格式化的數據,落地到不同類型的存儲系統中,供下游的算法和模型使用。候選集觸發層主要是從用戶的歷史行為、實時行為、地理位置等角度利用各種觸發策略產生推薦的候選集。候選集融合和過濾層有兩個功能,一是對出發層產生的不同候選集進行融合,提高推薦策略的覆蓋度和精度;另外還要承擔一定的過濾職責,從產品、運營的角度確定一些人工規則,過濾掉不符合條件的item。排序層主要是利用機器學習的模型對觸發層篩選出來的候選集進行重排序。

同時,對與候選集觸發和重排序兩層而言,為了效果迭代是需要頻繁修改的兩層,因此需要支持ABtest。為了支持高效率的迭代,我們對候選集觸發和重排序兩層進行了解耦,這兩層的結果是正交的,因此可以分別進行對比試驗,不會相互影響。同時在每一層的內部,我們會根據用戶將流量劃分為多份,支持多個策略同時在線對比。

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


用戶主動行為數據記錄了用戶在美團平臺上不同的環節的各種行為,這些行為一方面用于候選集觸發算法(在下一部分介紹)中的離線計算(主要是瀏覽、下單),另外一方面,這些行為代表的意圖的強弱不同,因此在訓練重排序模型時可以針對不同的行為設定不同的回歸目標值,以更細地刻畫用戶的行為強弱程度。此外,用戶對deal的這些行為還可以作為重排序模型的交叉特征,用于模型的離線訓練和在線預測。

  • 負反饋數據反映了當前的結果可能在某些方面不能滿足用戶的需求,因此在后續的候選集觸發過程中需要考慮對特定的因素進行過濾或者降權,降低負面因素再次出現的幾率,提高用戶體驗;同時在重排序的模型訓練中,負反饋數據可以作為不可多得的負例參與模型訓練,這些負例要比那些展示后未點擊、未下單的樣本顯著的多。
  • 用戶畫像是刻畫用戶屬性的基礎數據,其中有些是直接獲取的原始數據,有些是經過挖掘的二次加工數據,這些屬性一方面可以用于候選集觸發過程中對deal進行加權或降權,另外一方面可以作為重排序模型中的用戶維度特征。
  • 通過對UGC數據的挖掘可以提取出一些關鍵詞,然后使用這些關鍵詞給deal打標簽,用于deal的個性化展示。



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

1. 協同過濾

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

  • 清除作弊、刷單、代購等噪聲數據。這些數據的存在會嚴重影響算法的效果,因此要在第一步的數據清洗中就將這些數據剔除。
  • 合理選取訓練數據。選取的訓練數據的時間窗口不宜過長,當然也不能過短。具體的窗口期數值需要經過多次的實驗來確定。同時可以考慮引入時間衰減,因為近期的用戶行為更能反映用戶接下來的行為動作。
  • 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都不發生的次數


則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(c),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!



本文轉載自:36大數據


本帖被以下淘專輯推薦:

沙發
stark_summer 發表于 2015-1-24 09:57:08 | 只看該作者
板凳
zxy67648875 發表于 2015-1-24 11:51:04 | 只看該作者
學習了 謝謝樓主了
地板
hb1984 發表于 2015-1-25 12:01:28 | 只看該作者
謝謝樓主分享
5#
xingoo 發表于 2017-5-5 15:30:34 | 只看該作者
mark mark mark
6#
hxinhua 發表于 2017-9-21 13:49:24 | 只看該作者
謝謝樓主分享
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關閉

推薦上一條 /4 下一條

QQ|小黑屋|about云開發-學問論壇|社區 ( 京ICP備12023829號 )

GMT+8, 2020-2-20 07:11 , Processed in 1.140625 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2018 Comsenz Inc.Designed by u179

快速回復 返回頂部 返回列表
蓝月亮四肖中特 天津11选5 快乐8官网登录 河南快赢481 内蒙古快3走势图爱乐彩 天天乐棋牌游戏外挂 十一运夺金预测软 黑龙江体彩61开奖时间 腾讯欢乐升级游戏安卓 哈尔滨本地麻将 陕西快乐十分前三直