《triple2vec》論文筆記

《Representing and Recommending Shopping Baskets with Complementarity, Compatibility, and Loyalty》論文筆記

摘要

本文研究了雜貨店商品的表示學習和推薦問題。通過仔細調查了雜貨交易數據,並觀察到三種重要的模式:一是同一購物籃子內的產品在功能(互補性:Complementarity)方面相互補充;二是用戶傾向於購買與其偏好(兼容性:Compatibility)相匹配的產品;三是相當一部分用戶隨着時間的推移反覆購買相同的產品(忠誠度:Loyalty)。與傳統的電子商務環境不同,互補性和忠誠度在雜貨購物領域尤爲突出。這將可以全面地利用互補性和兼容性挖掘一種新的表示學習方法,以及一種新的個性化推薦系統,除了用戶的總體偏好和需求之外,還推薦“必須購買”的購買。做這些研究不僅提高了公共和私人交易數據的產品分類和推薦性能,涵蓋了各種雜貨店類型,而且還揭示了消費者購買偏好、必要性和忠誠度之間關係。

簡介

從在線雜貨購物平臺(如Amazon Fresh、Instacart)再到自動結帳的實體雜貨店(如Amazon Go),最年來的技術創新使人們的雜貨購物體驗發生了巨大變化。作爲最頻繁的購物活動之一,大量的雜貨交易數據可以從多個來源收集。由於這方面的技術創新積累和大量數據收集,促使了包括個性化產品推薦、零售銷售預測、零售庫存優化和個性化促銷策略在內的各種預測任務成爲研究者們的關注熱點。爲了理解這些任務,作者試圖探索用戶購物籃中的語義,並開發有效的產品表示和購買預測技術。
在這裏插入圖片描述

許多現代和傳統的推薦系統技術依賴於從交互數據中學習項目的潛在表示。一個例子是一個協同過濾算法、因子分解機等潛在因素模型,其中用戶-產品(user-item)交互矩陣由低維用戶和項目因子分解而來。這些方法通常試圖全局恢復原始交互信息,但可能無法捕獲項的微妙和細粒度語義。受自然語言處理(nlp)任務中提出的單詞嵌入技術的啓發,電子商務中最新的項目表示技術得到了發展。一般來說,這些方法旨在學習表示法,該表示法可以有效地從同一用戶的購物籃子內或購物籃子之間恢復產品共現。在前面手工製作的特性設計中,這些方法會自動發現產品的有用(在推薦方面)表示。這些技術在現實世界的電子商務應用中都得到了廣泛的採用。
作者研究了並將上述技術應用於雜貨交易數據。文中指出,雜貨店購物與傳統的電子商務應用不同,主要是在於雜貨店購物的規律性和必要性問題。這種雜貨店的購物行爲與電子商城的細微差別,需要獨立研究並構建領域特定的表示和推薦算法。特別考慮用戶購物籃中的以下模式:
•互補性。用戶在同一籃子中購買多個相關產品以滿足特定需求。這些產品在功能上是相輔相成的。例如,購物者可以一起爲聚會購買塑料杯/叉/刀/盤和啤酒(圖1)。這種產品之間的互補性是至關重要的,因爲它不僅捕捉到產品的潛在功能,而且還揭示了用戶在每個購物籃子中的意圖。
•兼容性。與大多數電子商務類別一樣,在雜貨店購物中,用戶偏好和產品屬性之間的兼容性至關重要。此外,上述潛在的互補性功能可能也需要符合用戶的偏好(例如,塑料杯和餐具更可能出現在派對愛好者的購物籃子裏)。這種產品相互凝聚的關係激勵作者在購物表徵學習模型中全面考慮產品間的互補性和用戶與產品間的兼容性。
•忠誠度。雜貨交易中一個明顯的模式是,用戶往往對某些產品表現出“忠誠”,即重複購買同一產品,而很少在不同的替代品之間切換品牌。這種行爲通常與傳統推薦模型中隱含的假設相反:通常,如果兩個產品具有相似的表示,並且與用戶的偏好(或需求)相匹配,則可以推薦其中一個。
然而,如果一個用戶對一個產品忠誠,那麼它的替代品被購買的可能性就很低。事實上,簡單的以用戶爲中心的產品購買頻率成爲推薦食品雜貨產品的競爭基準,因爲用戶最忠誠的產品可以根據這些統計數據“記憶”。
當然,這樣的基線缺乏泛化能力,因爲它無法捕獲產品語義。因此,一個合適的雜貨店推薦算法應該平衡商品與商品的互補性、用戶與商品的兼容性和用戶對商品的忠誠度。這項研究中的主要目標是在雜貨購物領域利用上述屬性,並開發一個框架來理解用戶購買的語義。其中所學習到的表示是可概括解釋的,並且支持像自動產品分類和大規模購物的個性化推薦這樣的任務。

本文貢獻如下:

•受互補性和兼容性混淆的啓發,專注於雜貨交易數據中的核心組件(產品、產品、用戶)同一購物籃子的三元組,即同一籃子中從用戶處購買的兩個產品,並提出了一個表示學習模型triple2vec,從整體上恢復上述互補性和相容性。

•在這些產品和用戶表示的基礎上,提出了一種新的個性化購物推薦算法adaLoyal
。該方法能夠自適應地平衡用戶的“必須購買”產品與從低維表示中推斷出的偏好。

•對兩個公共和兩個專有數據集進行了廣泛的實驗,這些數據集涵蓋各種雜貨店類型,包括傳統的實體超市、便利店和在線雜貨購物平臺。

•基於實驗的定量結果,證明了所提出的triple2vec模型能夠生成有意義(就產品分類任務而言)和有用(就推薦任務而言)的產品表示。特別是,通過應用adaLoyal,可以顯著提高各種嵌入學習方法的性能。由adaLoyal估計的產品忠誠的有效性也可以在定性分析中得到驗證。
•通過對提出的方法進行定量和定性分析,揭示了關於用戶購物行爲的重要和有趣的見解。主要的見解包括:1)與跨購物籃關係相比,購物籃內的商品對商品的互補性對於學習有意義的產品表示更爲有用;2)建模用戶的產品忠誠度和重複購買在雜貨店產品推薦任務中至關重要,並且這種忠誠度在不同用戶、商店類型和產品類別的情況下是不同的。

前提背景

在這裏插入圖片描述
目前很多種先進的產品表示學習方法都是基於skip-gram框架的。本質上,它們通過區分不同的“上下文窗口”來尋找有助於預測上下文(相關)產品或用戶的項表示形式。在雜貨店購物籃的場景下,不同的算法的實現方式,如圖2所示,將它們作爲異構圖(圖2)上統一的於skip-gram框架的不同實例。該圖的節點由不同的產品、用戶、用戶和還有籃子構成。這裏有兩種不同類型的鏈接:1)item to basket,表示一個產品包含在一個購物籃子中;2)user to basket,表示一個購物籃子是由用戶購買的。在該圖上,可以將幾個現有的表示學習目標作爲學習節點表示,其最大化最大似然估計(log likelihood)利用目標節點vv來預測上下文節點 CvC_v 即,
在這裏插入圖片描述
P(vv)P(v'|v)表示爲P(vv)=exp(fvTgv)vexp(fvTgv)P(v'|v)=\frac{exp(f_v^Tg_{v'})}{\sum_{v''}exp(f_v^Tg_{v''})},其中fvf_vgvg_v是圖中某個節點vv的K維向量表示。
下面簡單介紹一下其他三種基準算法:
item2vec.skip-gram框架可以直接應用到購物籃級別的這個圖上,在這個圖中,將一個特定的產品作爲目標節點,而將同一購物籃中的其他產品作爲上下文節點。這有一個前提假設:在同一購物籃子中購買的產品具有相似的語義,這直觀地支持籃子內/捆綁包內的產品推薦。然而,這種共同購買關係可能不足以捕捉到用戶對產品的個性化偏好。
prod2vec.在prod2vec中,給定一個目標產品,上下文節點被定義爲同一用戶最近購買的購物籃子中的產品,而不是直接對購物籃子應用等式(1)。與item2vec不同,item2vec方法關注的是購物籃子內的共同購買關係,不考慮用戶,而這種方法強調每個用戶的跨購物籃子產品到產品的關係。
metapath2vec.如前所述,交易日誌可以轉換爲異構網絡。因此,可以在這裏應用最先進的網絡嵌入學習方法,例如metapath2vec。在這個場景中,需要定義一個對稱的元路徑方案:item→basket→user→basket→item,並基於該方案生成不同的隨機步行者(random-walker)。具體地說,從一個隨機積開始,採樣一系列節點組成一個隨機遊走器,其中每個節點連續鏈接到這個元路徑上的前一個節點。然後我們選擇一個給定的節點,並在公式(1)中將其周圍的節點定義爲“上下文”CvC_v。一個具體的例子如圖2c所示;這裏我們對一個random-walker(i2,b11,u1,b12,i4,b21,u2,b21,i5,…)進行採樣,用紅色突出顯示隨機選擇的目標節點i4,用藍色突出顯示其周圍的節點。請注意,此item→basket→user→basket→item meta-path通常捕獲同一用戶購買的產品的語義,但不顯式地反映產品共購關係。

triple2vec: Representations from Triples

不同於現有的基於skip_gram的產品表示,這個工作專注於每個項目(item,item,user)的密切關係,以不同的角度表示在同一購物籃中的兩個產品。用於訓練的交易數據由一系列這類三元組(triples)組成訓練樣本:
在這裏插入圖片描述
然後定義每個三元組的表示商品之間的內聚關係得分:
在這裏插入圖片描述
其中,fif_i,gig_i是產品的兩個向量表示集合,huh_u是用戶的向量表示集合。等式3中的第一項對同一籃子中兩個產品之間的互補性進行建模,即兩個產品是否在共現方面表現出相似的語義;第二和第三項用於捕獲產品和用戶之間的兼容性,即產品(潛在)屬性與用戶偏好的匹配程度。較高的內聚性得分表示三個節點之間的連接更緊密。最後,通過最大似然訓練優化三元組的嵌入向量表示τ\tau
在這裏插入圖片描述
其中P(ij,u)=exp(si,j,u)iexp(si,j,u)P(i|j,u)=\frac{exp(s_{i,j,u})}{\sum_{i'}exp(s_{i',j,u})}P(ui,j)=exp(si,j,u)uexp(si,j,u)P(u|i,j)=\frac{exp(s_{i,j,u})}{\sum_{u'}exp(s_{i,j,u'})},本質上,對於τ\tau中的每一個三元組,我們迭代“剔除”一個節點,並使用其他兩個節點來預測它。圖2顯示了一個說明性的示例,突出顯示了本文提出的triple2vec模型和基於skip-gram模型之間的差異。
Negative Sampling.與基於skip-gram模型一樣,噪聲對比估計(NCE)可以應用於方程(4)中的softmax函數的近似和加速訓練。如,在等式(4)中logp(ij,u)logp(i|j,u)可以用下邊的式子代替:
在這裏插入圖片描述
也就是從一個預定義好的分佈p(i)p(i)中,採樣出N個負樣本,其中在這裏插入圖片描述
在TensorFlow中採用log-均勻分佈(log-uniform),要求商品按受歡迎程度排序,每種商品被採樣到的概率爲
在這裏插入圖片描述
,其中表示i商品的排序。在本實驗中,所有的表示學習方法都使用了這種負採樣技術,與均勻採樣策略相比,實驗效果來看,它在加速了模型的收斂,並提高了量化性能。
商品表示與個性化推薦:注意到上邊的triple2vec算法找中學習訓練中能學習出商品的兩個向量表示集fif_igig_i。這兩個嵌入表示從不同的角度描述產品的功能和屬性,但這兩者之間的內積捕獲了產品之間的交叉產品關係項到項的互補性。
因此,對於獨立評估產品語義的任務(如產品分類、競品搜索),使用加法合成fi+gif_i+g_i作爲每個產品i的最終表示,實驗表明,對大多數任務都有輕微的促進作用。然而,對於需要考慮跨項目關係的預測性任務(如產品間推薦、互補性產品搜索),我們考慮兩個產品i、j的內積得分fiTgif_i^Tg_i
可以考慮兩種不同的推薦場景:個性化的下一個購物籃子產品推薦和購物籃子內產品推薦.
代碼

def model_constructor(self, opt='sgd'):
        
        n_user = self.n_user
        n_item = self.n_item
        HIDDEN_DIM = self.HIDDEN_DIM
        LEARNING_RATE = self.LEARNING_RATE
        N_NEG = self.N_NEG
            
        u = tf.placeholder(tf.int32, [None])
        i = tf.placeholder(tf.int32, [None])
        j = tf.placeholder(tf.int32, [None])
    
        user_emb = tf.get_variable("user_emb", [n_user, HIDDEN_DIM], 
                                     initializer=tf.random_uniform_initializer(-0.01, 0.01))
        item_emb1 = tf.get_variable("item_emb1", [n_item, HIDDEN_DIM], 
                                     initializer=tf.random_uniform_initializer(-0.01, 0.01))
        item_emb2 = tf.get_variable("item_emb2", [n_item, HIDDEN_DIM], 
                                     initializer=tf.random_uniform_initializer(-0.01, 0.01))        
        b_item = tf.get_variable("item_bias", [n_item, 1], 
                                initializer=tf.constant_initializer(0))
        b_user = tf.get_variable("user_bias", [n_user, 1], 
                                initializer=tf.constant_initializer(0))
        
        i_emb = tf.nn.embedding_lookup(item_emb1, i)
        j_emb = tf.nn.embedding_lookup(item_emb2, j)
        u_emb = tf.nn.embedding_lookup(user_emb, u)
        
        input_emb_i = j_emb + u_emb
        loss_i = tf.reduce_mean(tf.nn.nce_loss(weights=item_emb1, biases=b_item[:,0],
                         labels=tf.reshape(i, (tf.shape(i)[0], 1)), inputs=input_emb_i, 
                         num_sampled=N_NEG, num_classes=n_item))
        input_emb_j = i_emb + u_emb
        loss_j = tf.reduce_mean(tf.nn.nce_loss(weights=item_emb2, biases=b_item[:,0],
                         labels=tf.reshape(j, (tf.shape(j)[0], 1)), inputs=input_emb_j, 
                         num_sampled=N_NEG, num_classes=n_item))
        input_emb_u = i_emb + j_emb
        loss_u = tf.reduce_mean(tf.nn.nce_loss(weights=user_emb, biases=b_user[:,0],
                         labels=tf.reshape(u, (tf.shape(u)[0], 1)), inputs=input_emb_u, 
                         num_sampled=N_NEG, num_classes=n_user))     
        trainloss = tf.reduce_mean([loss_i, loss_j, loss_u])
        
        if opt == 'sgd':
            myOpt = tf.train.GradientDescentOptimizer(LEARNING_RATE)
        elif opt == 'adaGrad':
            myOpt = tf.train.AdagradOptimizer(LEARNING_RATE)
        elif opt == 'adam':
            myOpt = tf.train.AdamOptimizer(LEARNING_RATE)
        elif opt == 'lazyAdam':
            myOpt = tf.contrib.opt.LazyAdamOptimizer(LEARNING_RATE)
        elif opt == 'momentum':
            myOpt = tf.train.MomentumOptimizer(LEARNING_RATE, 0.9)
        else:
            print('optimizer is not recognized, use SGD instead.')
            sys.stdout.flush()
            myOpt = tf.train.GradientDescentOptimizer(LEARNING_RATE)
        optimizer = myOpt.minimize(trainloss)

模型源碼非常簡節,咋一看跟論文上講到的公式(3)並不匹配,甚至不出現任何公式計算,巧妙之處就在於這裏,結合噪聲對比估計(NCE)以及加分結合律就能完美的實現公式(3)的功能,不復贅述。

還有一個忠誠度模塊就不翻譯了(不是我關注的重點,關鍵是懶)。

實驗

數據集的基本情況
在這裏插入圖片描述
在分類任務上的對比效果
在這裏插入圖片描述
在個性化推薦系統中的表現:
在這裏插入圖片描述

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