湊單做爲購物券導購鏈路的一個重要環節,旨在幫助用戶找到商品,達成某個滿減門檻(好比滿400減50),完成跨店湊單,完善購物券整個鏈路的體驗。滿減購物券做爲大促中使用最普遍的一種營銷手段,優點遠大於紅包、商品打折等優惠活動,它不只能給用戶帶來切實的優惠,並且能讓用戶買的更多,提高客單價。湊單做爲用券的重要鏈路,旨在幫助消費者找到能使用同門檻優惠券的商品。node
今年湊單相比往年,有兩個重大突破,首先是產品形態上的改變,往年,湊單只是一個商品推薦頁,今年,湊單可以支持搜索、價格篩選、類目篩選、銷量排序、價格排序等搜索功能。其次,算法上作了重大突破,基於Graph Embedding的bundle mining,bundle是打包購的意思,咱們認爲湊單的重要場景是當用戶已經加購了商品A,還想找一個能一塊兒打包買的商品B,而不是想找跟A類似的商品C,傳統的u2i、類似i2i並不能知足湊單場景的需求,爲了突破找類似等常常被人詬病的體驗,咱們甚至不能有u2i、類似i2i等邏輯,因此bundle mining變成湊單算法優化的重點,不只能提高豐富性的體驗,還能提高轉化效率。算法
購物車的湊單入口 湊單頁swift
圖是一種抽象程度高、表達能力強的數據結構,它經過對節點和邊的定義來描述實體和實體之間的關聯關係。經常使用的圖有社交關係網絡、商品網絡、知識圖譜等等。網絡
用戶行爲是一個自然的網絡圖,邊和節點每每有着各類豐富的信息,graph embedding是學習節點隱表示向量,在一個連續向量空間中對節點的關聯關係進行編碼,便於計算節點之間的關聯關係,同時,graph具備傳播能力,經過random walk能夠挖掘多度關係,能有效的提高覆蓋度,擴大召回。數據結構
Graph Embedding是學術界一個重要研究方向,好比deep walk,是語言模型和無監督學習從單詞序列擴展到圖結構上的一個典型方法,該方法將截斷遊走的序列當成句子進行學習,以後採用word2vec中Skip-Gram模型進行訓練,獲得每一個節點的embedding向量。Line只針對邊進行採樣,Node2vec能夠調節參數來進行BFS或者DFS的抽樣。框架
因此Graph Embedding的基本思路是,對graph進行採樣(Sampling),採出來的序構建模型(Embedding)。dom
結合咱們的場景,要挖掘共同購買的關係,直接經過item-item的關係挖掘也能夠作到,傳統的協同過濾,也能夠作到,爲何咱們還須要構建graph?由於graph具備傳播能力,它不只能有效的提取出來直接關聯,並且能夠經過遊走策略,挖掘出來二度、三度的關係。咱們認爲,朋友的朋友,也是朋友,也存在必定的弱關聯,有效的利用這種傳播能力,能解決購買數據的稀疏性,大大的提高覆蓋。分佈式
咱們主要有三方面的工做,一是,基於用戶購買行爲構建graph,節點:商品,邊:商品間同時購買的行爲,權重:同時購買的比重,能夠是購買次數、購買時間、金額等feature;二是,基於權重Sampling(weighted walk)做爲正樣本的候選,負樣本從用戶非購買行爲中隨機抽樣;三是,embedding部分將無監督模型升級成有監督模型,將基於weighted walk採出來的序,構形成item-item的pair對,送給有監督模型(DNN)訓練。下圖是算法框架圖。
算法框架圖學習
上文提到,咱們要挖掘商品間共同購買的關係(bundle mining),相似買了又買的問題,因此,咱們構建的graph是帶權重的商品網絡,節點:商品,邊:商品間共同購買的關係,權重:共同購買次數、購買時間。優化
爲何須要帶權重的Graph?由於random walk等傳統方法不適用商品網絡,商品節點動輒上千萬,其中大部分節點的關聯性是很弱的,也就是冷門商品居多,只有少部分商品構建的graph是熱點,若是採用random walk去採樣,會採出不少冷門節點的序列,因此咱們基於邊的權重去採樣(weighted walk),使採樣儘可能往熱門節點方向遊走,這樣採樣出來的樣本置信度才更高。
所以,咱們的輸入是一個帶weight的graph ,Graph定義:G = (V,E,W),V = vertex (頂點或者節點,在bundle的問題中,特指商品),E = edge(邊,在bundle的問題中,特指共同購買) ,W = weight(邊的權重,共同購買的次數、時間),以下圖,接下來就要進行sampling。
商品graph
傳統的方法,好比deep walk,它的Sampling本質上是有兩部分,首先,經過random walk的方式進行遊走截斷,其次,在仍給word2vec中Skip-Gram模型進行embedding以前,用negative sampling的方式去構造樣本;這種隨機採樣的方法會大機率的將熱門節點採集爲負樣本,這種方式適用於語言模型,由於在天然語言中,熱門的單詞均爲無用單詞(好比he、she、it、is、the)。對於咱們的商品網絡,恰好相反,熱門商品每每是最重要的樣本,若是採用negative sampling的方式去構造樣本,模型確定是學不出來。所以,咱們基於邊的權重去採樣(weighted walk),使採樣儘可能往熱門節點方向遊走,如下圖爲例:
帶權重的商品graph
舉個例子來講,假設遊走2步,從節點A出發,隨機取下一個鄰居節點時,若是是random walk算法,它會等機率的遊走到B或C節點,可是咱們的算法會以7/8的機率取節點C,再會以8/12的機率遊走到節點D,最終很大機率上會採出來一條序walk=(A,C,D)walk=(A,C,D),對於原始graph,A和D是沒有關聯的,可是經過weighted walk,可以有效的挖掘出A和D的關係,算法詳見:
Algorithm 1 Weigted Walk(G,n,WalksG,n,Walks)
Input: Graph G(V,E,W)G(V,E,W)
Step nn
Output: walkwalk
Initialization: walkwalk to empty
For each vivi ∈∈ VV do
Append vivi to walkwalk
For j=1...nj=1...n do
vj=GetNeighbor(G,vi)vj=GetNeighbor(G,vi)
Append vjvj to walkwalk
Return walkwalk
Algorithm 2 GetNeighbor(G,vi)GetNeighbor(G,vi)
Input: Graph G(V,E,W)G(V,E,W)
Node vivi
Output: next node vjvj
vj=WeightedSample(vi,w)vj=WeightedSample(vi,w)
算法實現是在odps graph平臺實現的,一個分佈式的圖計算平臺,離線graph有2億條邊,3千萬節點,10分鐘跑完全部的數據,實時部分,咱們實現了每分鐘最高可更新10w的Graph邊的結構,如何在分佈式odps graph平臺實現這套算法詳見另外一篇ata,盡請期待
上一部分介紹瞭如何構建了帶權重的機率圖,基於帶權重的採樣(weighted walk)做爲正樣本的候選,負樣本從用戶非購買行爲中隨機抽樣;這一部分主要介紹embedding的部分,將基於weighted walk採出來的序,構形成item-item的pair對,送給embedding模型,咱們構造了一個有監督embedding模型(DNN),規避無監督模型沒法離線評估模型效果的問題。模型結構以下圖。
有監督的embedding模型(DNN)
有監督的embedding環節作了許多迭代優化,詳見另外一篇ata:基於DNN的多目標、多通道的bundle算法。
a)訓練:離線模型在PAI平臺上用tensorflow框架實現,抽取了歷史50天的全網成交數據,大概抽取3000萬節點,構建的graph,在odps graph平臺作完weighted walk,產出2億條樣本,也就是item-item的pair對,訓練至收斂須要2小時的時間
b)預測:從全網全部行爲中,隨機抽取幾十億條pair對,去作預測,給每對item pair預測一個score
c)上線:對每一個種子商品取topN的bundle商品,打到搜索引擎的倒排和正排字段,從qp中取出每一個用戶的種子商品,基於倒排字段召回bundle商品,基於正排字段作bundle排序
用戶購買行爲,平常和大促差別很大,爲了可以實時的捕獲用戶實時行爲,咱們在porsche上建了一套實時計算bundle mining的流程:
a)數據預處理:在porsche上對用戶實時日誌進行收集,按離線的數據格式處理成實時的數據流
b)Sampling:發送給odps graph實時計算平臺,構建graph,作weighted walk,生成序,再經過swift消息發出
c)Embedding:在porsche上作DNN模型訓練和實時預測
d)數據後處理:計算item的topN的bundle item list,實時寫到dump和引擎
雙十一預熱期間,咱們將bundle算法上線對比基準桶,提高很明顯
一、點擊:離線版bundle算法對比基準桶,ipv提高13%,實時版bundle算法在此基礎上又提高4%,以下圖:
二、豐富性:bundle算法對比基準桶,人均曝光葉子類目提高88%,人均曝光一級類目提高43%,以下圖。
graph的核心優點,具備傳播能力,朋友的朋友,也是朋友,傳統i2i(統計版i2i),只統計直接關係,而咱們構建的共同購買的graph,能夠經過遊走挖掘多度關係,彌補購買行爲稀疏的問題,有效的提高了覆蓋率,咱們離線實驗發現,對比統計版本auc提高很是明顯。
咱們實現了實時大規模graph更新,每分鐘最高可更新10萬條邊,雙11這麼大的qps可以平穩運行。
湊單在將來還要繼續努力,咱們還有不完善的地方,在產品形態上,第一,價格preview沒有作出來,用戶不知道本身已經加購了多少,還差多少,能用多少優惠券,咱們但願下次能在湊單頁幫用戶實時的算出湊單進度,第二,咱們此次沒有實時捕捉到入口種子商品,下次咱們指望能作到,不一樣入口點進去,湊單的商品能和入口種子商品強相關;在算法優化上,把新穎性作強,嘗試用graph bandit的方法,給用戶投放一些沒看過的但又相關的品類,根據投放的收益,設計一個合理的機制去explore。