【Graph Embedding】:Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba

本文是阿里在kdd2018發表的關於使用graph embedding作爲淘寶首頁推薦召回策略的算法實現。現在利用圖embedding來做召回算是業界最前沿的技術,下面我們來看看淘寶是如何來用戶行爲轉化爲圖,以及從圖中學習出item的embdding。

論文下載地址:https://arxiv.org/abs/1803.02349

介紹

淘寶應該是國內最大的C2C平臺,平臺上承載着10億的用戶量和20億的商品量,這麼大的用戶量和商品就會出現問題,主要有三點

1.可擴展性(Scalability):很多算法在面對海量數據的時候都會失效,不管是計算量還是算法本身。

2.稀疏性(Sparsity):  想象一下,這麼大的商品量,用戶不可能看過所有的商品,別說所有,看過其中萬分之一商品的可能性都沒有,所有數據會存在嚴重的稀疏性問題,而且這麼大的用戶量,很多用戶本身的交互也很少,所有很難訓練一個精確的推薦模型出來。

3.冷啓動(Cold Start): 淘寶每小時都會有數百萬的新商品被上傳上去,而這些用戶沒有任何的與用戶的交互,這些冷啓動數據將很難處理。

現在業界針對海量數據的推薦框架都是分爲兩層,阿里也一樣,分別是召回層(matching)和排序層(ranking)。在召回層從海量的數據中,根據用戶的交互行爲過濾出一個較小的數據子集,然後再根據召回的數據集進一步對其排序,選出topn用戶可能最喜歡的商品進行推薦。

本文的主要目的是爲了解決matching階段的問題,核心的任務是爲了學習出item之間的相似性。像傳統的方法一般是基於協同過濾(CF)來比較item之間的相似性,但是這樣的相似性都是基於item之間的共現關係計算出來的,並沒有考慮到時序之間的關聯。

爲了達到這個目的,文章提出使用用戶的歷史交互行爲來構建item graph,然後利用現在前沿的graph embedding算法訓練item 的embdding。文章針對具體的業務由簡到繁設計來三個graph embedding的算法。第一個就是直接利用item構建graph的方法,叫做BGE(Base Graph Embedding),但是前面也說了,對於那些冷啓動的數據,其交互行爲很少,甚至沒有,這樣就很難學習出有效的embedding向量。爲了能讓這部分數據也可以學習出有效的embdding向量,文章進一步對BGE進行改進,嘗試引入side information來增強embedding過程,這個方法被稱爲GES(Graph Embedding with Side information)。這些side information就是如item的類目,品牌,價格等item的基礎信息,比如同一家店鋪的同一種款式的衣服我們可以認爲它們之間是很相似的。像airbnb在處理類似冷啓動問題的時候,也採用來類似的方法,不過它們是直接利用多個類似的其他item embedding的均值來代替。進一步的既然要合併多種邊界信息,BGE的話直接將多種信息進行合併,沒有考慮到不同邊界信息之間的差異,所以進一步提出了一個方法EGES(Enhanced Graph Embedding with Side information),該方法是針對BGE的改進,在邊界信息合併的時候對不同邊界信息做加權再合併。

所以本文主要貢獻有以下三點:

1.基於多年的實踐經驗,設計來一個啓發式的方法,在淘寶10多億用戶的行爲歷史上構建來item graph。

2.提出來三種embdding方法,BGE,GES,EGES用於學習淘寶平臺上20億商品的embdding值。並離線驗證EGES和GES相比BGE和其他embedding方法帶來的效果優勢。

3.第三點工業實現,將該方法部署上線,構建了graph embedding 系統。

框架

本文提出的graph embedding方法是在DeepWalk進行優化的。給定一個圖:G = (V,E),其中V和E分別代表圖中的節點集合和邊的集合。graph embedding的目的就是爲了學習出在空間R^{d}能代表每個節點v \epsilon V的一個低緯表示。簡單的說,我們要做的就是把graph中的每個節點從V維映射到d維度,就是要學習一個映射函數:\Phi :V \rightarrow R^{d}

DeepWalk的思想來自word2vec,先用隨機遊走(random walk)從graph中生成節點序列,有了序列後再用skip-gram(word2vec的一種實現)來實現graph中的每個節點的embedding,所以問題就轉化爲優化如下問題:

                                 minimize_{\Phi } \sum _{v \epsilon V } \sum _{c \epsilon N(v) } -log Pr(c|\Phi (v))

其中,N(v)是節點v的鄰節點,可以理解爲圖中節點鄰近n跳的節點,這個n是指定的數值。Pr(c|\Phi (v))就是在節點v的前提下,上下文爲c的概率。

根據用戶行爲構建item graph

前面大概獎了算法的思路,現在來講一下具體怎麼通過用戶行爲來構建這個item graph。

                

實際中用戶按時間訪問item是個序列,如圖2(a)所示。一般同一個用戶的訪問記錄會按時間間隔對其進行劃分,形成session。

文章就是將session按有向邊的方式連接起來,比如將圖2(a)的session全部連接起來就形成來圖2(b)的graph。並且根據所有session的共現關係,給graph中每條邊附上一個權重,這個權重就是在所有用戶交互行爲中,邊連接的item i向item j轉移的次數。

當然在實際使用中,數據肯定存在噪聲,需要對做一些處理,來消除噪聲,比如如下噪聲:

1.在點擊後停留的時間少於1秒,可以認爲是誤點,需要移除。

2.還有一些過度活躍用戶,三月內購買商品數超過1000,或者點擊數超過3500,就可以認爲是一個無效用戶,需要去除。

3.還有一些商品頻繁的修改商品內容的,造成前後同一id的商品信息不對應,需要移除。

基本圖embedding(BGE)

前面的一系列操作後,就可以獲得商品的加權有向圖了,表示爲G = (V,E),就可以利用DeepWalk來學習圖G中的節點embedding。先講一下隨機遊走(random walk)的思想,如何利用隨機遊走在圖(graph)中生成序列。假設M是G的鄰接矩陣,M_{ij}表示從節點i指向節點j的加權邊,那麼隨機遊走的轉移概率定義爲:

                                               

其中N_+(v_i)表示的是所有節點v_i的下一一跳節點集合,可以看出隨機遊走是按邊的權重分配的概率值。通過這個概率值就可以從圖中獲取到大量的序列。

再接着就利用skip-gram來學習embedding的值,這裏的思想就和item2vec相似了,把每個item id看成是詞,整個序列看成句子,然後做word2vec。優化目標如下:

                                                

這裏的w就是再做skip-gram是選擇的窗口大小,假設節點v_i到各個窗口內節點的概率獨立,就可以得到記一步的優化函數:

                                                   

然後就是加入負採樣,這個爲了減少計算量,做的近似,神經網絡優化裏一個常見的trick:

                                                

其中,V(vi)′是對於vivi的負採樣,σ()是sigmoid函數。經驗上,∣N(vi)′∣越大,獲得的結果越好。

基於邊界信息的圖 embedding(Graph Embedding with Side Information)

上面的基本圖模型存在一個問題,那就是對於那些新的商品由於缺少交互行爲,所以和這些商品交互的邊會很少,這樣的話這些商品學習出來的embedding也不會有效。針對這些冷啓動的問題,文章對BGE做了修改,加入side information來對基於id的embedding做補充。比如優衣庫的兩款衛衣很可以是很相似的,一個喜歡尼康鏡頭的用戶,也很可以對尼康的相機感興趣。所以進一步提出來如下圖所示的GES方法 :

                                       

圖表示的是從graph中獲取到序列後的框架圖,圖中SI是side information的縮寫,SI 0表示的是item自身,可以理解爲item id,後面的SI 1,SI 2...這些都是不同的邊界信息。看圖從下往上看,最下面的SI 0,SI 1,... 都是稀疏特徵,所以先做one-hot,然後將one-hot值映射到第二層的embedding空間,再進一步利用skip-gram學習出中間層的hidden representation。

清晰點說,如果使用W來表示SI的embedding矩陣,那麼W_{v}^{0}表示的是item v自身的embedding向量,可以把這個看成一個表,根據v的id去取它對應的embedding向量,並且這個向量是可以訓練的。同理W_{v}^{s}是item v的第s個side information的embedding。具體怎麼把這些矩陣合併起來呢?GES的方法是保證每個side information矩陣的embedding長度一致,然後把他們都按位加起來求平均。

如這樣:

                                                                          

這裏的H_v就被用來表示最終的item embedding。

增強式的GES(Enhanced Graph Embedding with Side Information)

上面的GES中有個問題是,針對每個item,它把所有的side information embedding求和後做了平均,那麼就存在一個問題,不同類型的商品,不同價格的商品,到底哪個維度的信息權重大,這個是沒有被考慮進去的,所以最好能對每個邊界信息在進行embedding聚合的時候能做個加權,EGES做的就是這個事。

整體的框架一樣,爲了讓不同類型的side information具有不同的權重,提出來一個加權平均的方法來聚集這些邊界embedding。

因爲每個item對其不同邊界信息的權重都不一樣,所以就需要額外大小爲v*(n+1)的一個矩陣來表示每個item對邊界信息的權值,v是item的個數,n是邊界信息的個數,加1是還要考慮item自身的權重。假設A\epsilon R^{|V|*(n+1)}是權重矩陣,那麼裏面的項Aij就是第i個item、第j個類型的side information的權重。矩陣第一列還是用來表示自身的權重。這樣就可以獲得加權平均的方法:

                                                              

這裏對權重項a_{v}^{i}做了指數變換,目的是爲了保證每個邊界信息的貢獻都能大於0

其他的和前面的方法都一直,整體的算法邏輯如下圖:

                                      

                                  

                                      

 

結果

結果不用說,效果肯定好,這裏主要說兩個東西

一個是離線評估。因爲是圖,所以離線評估用的是link prediction的方法,將圖中1/3的邊隨機移除,作爲測試集,然後訓練模型去預測這些這些邊出現的概率。測試的負樣本選擇是隨機選擇沒有連接的節點對作爲負樣本。然後使用auc評價整體的模型。

第二個是它們整體的框架圖

                    

可以稍微瞭解以下。

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