我們如何顯著提高線下零售的推薦質量

大家好! 我叫 Sasha,是 LoyaltyLab 的首席技術官兼聯合創始人。 兩年前,我和我的朋友們,像所有貧困學生一樣,晚上去離家最近的商店買啤酒。 我們非常沮喪的是,零售商知道我們會來喝啤酒,卻沒有提供薯條或餅乾的折扣,儘管這是很合乎邏輯的! 我們不明白為什麼會發生這種情況,並決定創建我們自己的公司。 好吧,作為獎勵,每週五為自己寫出這些相同籌碼的折扣。

我們如何顯著提高線下零售的推薦質量

這一切都到了我在以下網址展示產品技術方面的材料的地步: 英偉達 GTC。 我們很高興與社區分享我們的工作,因此我以文章的形式發布我的報告。

介紹

與旅程開始時的其他人一樣,我們首先概述了推薦系統的製作方式。 最流行的架構是以下類型:
我們如何顯著提高線下零售的推薦質量

它由兩部分組成:

  1. 通過簡單而快速的模型(通常是協作的)對候選者進行採樣以進行推薦。
  2. 考慮到數據中所有可能的特徵,使用更複雜和更慢的內容模型對候選者進行排名。

在這里和下面我將使用以下術語:

  • 候選人/推薦候選人 - 一對用戶產品,可能會進入生產推薦。
  • 候選提取/提取器/候選提取方法 ——從可用數據中提取“推薦候選者”的過程或方法。

第一步,通常使用協同過濾的不同變體。 最受歡迎 - ALS。 令人驚訝的是,大多數關於推薦系統的文章只揭示了第一階段協作模型的各種改進,而沒有人過多談論其他採樣方法。 對於我們來說,僅使用協作模型和對其進行各種優化的方法並不能達到我們預期的質量,因此我們專門針對這一部分進行了研究。 在文章的最後,我將展示我們能夠在多大程度上改善 ALS,這是我們的基線。

在我繼續描述我們的方法之前,需要注意的是,對於實時推薦,當我們考慮 30 分鐘前發生的數據很重要時,實際上沒有多少方法可以在正確的時間發揮作用。 但是,在我們的例子中,我們每天收集的建議不得超過一次,並且在大多數情況下 - 每週一次,這使我們有機會使用複雜的模型並提高質量。

讓我們以 ALS 在提取候選人任務中僅顯示的指標作為基線。 我們監控的關鍵指標是:

  • 精確度——從樣本中正確選擇候選人的比例。
  • 召回率 - 發生在目標區間內的候選者中實際發生的候選者的比例。
  • F1-score - 根據前兩點計算的 F-score。

我們還將在使用附加內容特徵訓練梯度提升後查看最終模型的指標。 還有3個主要指標:

  • precision@5 — 每個客戶的前 5 名點擊概率的平均百分比。
  • response-rate@5 — 將買家從訪問商店轉化為購買至少一項個人優惠(一項優惠包含 5 種產品)。
  • 每個用戶的平均 roc-auc - 中 羅克奧克 對於每個買家。

值得注意的是,所有這些指標都是根據 時間序列交叉驗證,即前k週進行訓練,k+1周作為測試數據。 因此,季節性漲/跌對模型質量的解釋影響很小。 此外,在所有圖表上,橫坐標軸將指示交叉驗證中的周數,縱坐標軸將指示指定指標的值。 所有圖表均基於一位客戶的交易數據,因此它們之間的比較是正確的。

在開始描述我們的方法之前,我們首先看一下基線,它是經過 ALS 訓練的模型。
候選提取指標:
我們如何顯著提高線下零售的推薦質量

最終指標:
我們如何顯著提高線下零售的推薦質量

我將算法的所有實現視為某種業務假設。 因此,非常粗略地說,任何協作模型都可以被視為“人們傾向於購買喜歡他們的人購買的東西”的假設。 正如我所說,我們並沒有將自己局限於這樣的語義,以下是一些對於線下零售數據仍然有效的假設:

  1. 之前買過什麼。
  2. 和我之前買的差不多。
  3. 很久以前購買的時期。
  4. 按類別/品牌受歡迎。
  5. 每週交替購買不同的商品(馬爾可夫鏈)。
  6. 向買家提供類似的產品,根據特性構建不同的模型(Word2Vec、DSSM等)。

你之前買了什麼?

最明顯的啟發式方法在雜貨零售中非常有效。 這裡我們取會員卡持卡人最近K天內(通常是1-3週),或者一年前K天內購買的所有商品。 僅應用此方法,我們獲得以下指標:
我們如何顯著提高線下零售的推薦質量

很明顯,我們使用的句號越多,召回率就越高,精確度就越低,反之亦然。 客戶平均獲得更好的結果是“過去兩週”。

和我之前買的差不多

毫不奇怪,“以前買過的東西”對於雜貨零售來說效果很好,但僅從用戶已經購買過的東西中提取候選者並不是很酷,因為不太可能用一些新產品給買家帶來驚喜。 因此,我們建議使用相同的協作模型稍微改進這種啟發式。 從我們在 ALS 培訓期間收到的向量中,您可以獲得與用戶已購買的產品類似的產品。 這個想法與視頻內容觀看服務中的“相似視頻”非常相似,但由於我們不知道用戶在特定時刻正在吃/買什麼,所以我們只能尋找與他已經購買過的東西相似的東西,特別是因為我們已經知道它的效果如何。 將此方法應用於過去兩週的用戶交易,我們得到以下指標:
我們如何顯著提高線下零售的推薦質量

這裡 k - 買家在過去 14 天內購買的每件產品檢索到的類似產品的數量。
對於我們這樣的客戶來說,這種方法尤其有效,因為我們的客戶要求根本不推薦用戶購買歷史記錄中已有的商品。

購買期已過很久

正如我們已經發現的,由於購買商品的頻率很高,第一種方法非常適合我們的具體情況。 但是洗衣粉/洗髮水等商品呢? 也就是說,這些產品不太可能每週或兩週都需要,並且以前的方法無法提取。 這隱含著以下的想法——建議對購買該產品次數較多的買家計算該產品的平均購買時長 k 一次。 然後提取買家最有可能已經用完的東西。 可以親眼檢查計算出的貨物期限是否充足:
我們如何顯著提高線下零售的推薦質量

然後我們將查看產品週期的結束是否落在建議投入生產的時間間隔內,並對落在的時間間隔進行採樣。 該方法可以這樣說明:
我們如何顯著提高線下零售的推薦質量

這裡我們有兩種可以考慮的主要情況:

  1. 是否為購買次數少於K次的客戶提供樣品。
  2. 如果週期結束時間早於目標間隔開始時間,是否對產品進行採樣。

下圖顯示了該方法在不同超參數下取得的結果:
我們如何顯著提高線下零售的推薦質量
ft — 僅選取購買該產品至少 K 次(此處 K=5)次的客戶
tm — 只選取屬於目標區間的候選人

不出意外,能夠 (0,0) 最大的 記得 和最小的 精確,因為在這種情況下,提取了最多的候選者。 然而,當我們不為購買特定產品少於 k 次並提取期末在目標間隔之前的貨物等。

按類別熱門

另一個相當明顯的想法是對不同類別或品牌的流行產品進行採樣。 這裡我們為每個客戶計算 前k個 “最喜歡的”類別/品牌並從此類別/品牌中提取“流行”。 在我們的例子中,我們將根據產品的購買次數來確定“最喜歡”和“受歡迎”。 這種方法的另一個優點是它在冷啟動情況下的適用性。 也就是說,對於那些購買次數很少,或者很長時間沒有去過商店,或者剛剛發行會員卡的顧客。 對他們來說,庫存受顧客歡迎且有歷史的商品更容易、更好。 得出的指標是:
我們如何顯著提高線下零售的推薦質量
這裡,“類別”一詞後面的數字表示該類別的嵌套級別。

一般來說,更窄的類別取得更好的結果也就不足為奇了,因為它們為買家提取了更準確的“最喜歡”的產品。

每週交替購買不同的商品

我在有關推薦系統的文章中沒有看到的一個有趣的方法是一種相當簡單且同時有效的馬爾可夫鏈統計方法。 在這裡,我們需要 2 週的時間,然後為每個客戶構建成對的產品 [第 i 週購買]-[第 j 週購買],其中 j > i,從這裡我們計算每個產品下週切換到另一個產品的概率。 也就是說,對於每對商品 產品-產品j 計算找到的對中它們的數量,然後除以對的數量,其中 生產 是在第一周。 為了提取候選人,我們對買家進行最後一次檢查並得到 前k個 我們得到的轉移矩陣中最有可能的下一個產品。 構建轉移矩陣的過程如下所示:
我們如何顯著提高線下零售的推薦質量

從轉移概率矩陣的真實例子中我們看到以下有趣的現象:
我們如何顯著提高線下零售的推薦質量
在這裡,您可以注意到消費者行為中揭示的有趣依賴性:例如,柑橘類水果或牛奶品牌的愛好者可能會轉向另一種品牌。 黃油等重複購買頻率較高的產品也出現在這裡也就不足為奇了。

馬爾可夫鏈方法中的度量如下:
我們如何顯著提高線下零售的推薦質量
k - 為買家上次交易中購買的每件商品檢索到的產品數量。
正如我們所看到的,k=4 的配置顯示了最好的結果。 第 4 週的峰值可以用假期前後的季節性行為來解釋。 

同類產品買家,根據不同車型特點打造

所以我們來到了最困難和最有趣的部分 - 在根據各種模型構建的買家和產品向量中搜索最近的鄰居。 在我們的工作中,我們使用 3 個這樣的模型:

  • ALS
  • Word2Vec(用於此類任務的 Item2Vec)
  • DSSM

我們已經討論過 ALS,您可以閱讀有關它如何學習的內容 這裡。 對於 Word2Vec,我們使用眾所周知的模型實現 Gensim。 通過與文本類比,我們將報價定義為購買收據。 因此,在構建產品向量時,模型學習預測收據中的產品的“上下文”(收據中的其餘產品)。 在電子商務數據中,最好使用買家會話而不是收據;來自 臭氧。 而DSSM拆解起來更有趣。 它最初是由微軟的人作為搜索模型編寫的, 你可以在這裡閱讀原始研究論文。 該模型的架構如下所示:
我們如何顯著提高線下零售的推薦質量

這裡 Q - 查詢,用戶的搜索查詢, D[i] - 文檔、網頁。 模型的輸入分別接收請求和頁面的標誌。 每個輸入層後面都有許多完全連接的層(多層感知器)。 接下來,模型學習最小化模型最後幾層獲得的向量之間的餘弦。
推薦任務使用完全相同的架構,但不是請求,而是用戶,而不是頁面,而是產品。 在我們的例子中,該架構被轉換為以下內容:
我們如何顯著提高線下零售的推薦質量

現在,為了檢查結果,仍然需要涵蓋最後一點 - 如果在 ALS 和 DSSM 的情況下我們明確定義了用戶向量,那麼在 Word2Vec 的情況下我們只有產品向量。 在這裡,為了構建用戶向量,我們確定了 3 種主要方法:

  1. 只需添加向量,然後對於餘弦距離,結果表明我們只是對購物歷史中的產品進行平均。
  2. 具有一定時間權重的向量求和。
  3. 用TF-IDF係數對貨物進行稱重。

在購買者向量線性加權的情況下,我們假設用戶昨天購買的產品比他六個月前購買的產品對其行為的影響更大。 因此,我們以賠率 1 考慮買家前一周的情況,並以賠率 ½、⅓ 等考慮接下來發生的情況:
我們如何顯著提高線下零售的推薦質量

對於 TF-IDF 係數,我們所做的與文本的 TF-IDF 完全相同,只是我們分別將買家視為文件,將收據視為要約,單詞是產品。 因此,用戶向量將更多地轉向稀有商品,而買家經常使用和熟悉的商品不會有太大變化。 該方法可以這樣說明:
我們如何顯著提高線下零售的推薦質量

現在讓我們看看指標。 ALS 結果如下所示:
我們如何顯著提高線下零售的推薦質量
Item2Vec 的指標,具有構建買家向量的不同變體:
我們如何顯著提高線下零售的推薦質量
在這種情況下,使用與我們的基線完全相同的模型。 唯一的區別是我們將使用哪個 k。 為了僅使用協作模型,您必須為每個客戶選取大約 50-70 個最接近的產品。

以及根據 DSSM 的指標:
我們如何顯著提高線下零售的推薦質量

如何將所有方法結合起來?

你說很酷,但是如何使用如此大的候選提取工具集呢? 如何為您的數據選擇最佳配置? 這裡我們有幾個問題:

  1. 有必要以某種方式限制每種方法中超參數的搜索空間。 當然,它到處都是離散的,但可能的點數量非常多。
  2. 使用具有特定超參數的特定方法的有限樣本,如何為您的指標選擇最佳配置?

我們還沒有找到第一個問題的明確正確答案,因此我們從以下內容出發:對於每種方法,根據我們擁有的數據的一些統計數據編寫超參數搜索空間限制器。 因此,知道了人們購買的平均間隔時間,我們就可以猜測在什麼時間段內使用“已經購買過的東西”和“很久以前購買的時間段”方法。

在我們經歷了足夠數量的不同方法的變體之後,我們注意到以下幾點:每個實現都會提取一定數量的候選者,並具有對我們來說至關重要的一定的度量值(召回率) 。 我們希望根據我們允許的計算能力,以盡可能高的指標獲得一定數量的候選者。 這裡問題很好地分解為背包問題。
我們如何顯著提高線下零售的推薦質量

這裡候選數就是元寶的重量,召回方法就是它的值。 然而,在實現該算法時還有兩點需要考慮:

  • 方法在檢索到的候選者中可能有重疊。
  • 在某些情況下,使用不同參數兩次採用同一個方法是正確的,並且第一個方法的候選輸出不會是第二個方法的子集。

例如,如果我們採用“已購買的商品”方法以不同的間隔進行提取,那麼它們的候選集將相互嵌套。 同時,出口處“定期購買”中的不同參數並沒有給出完整的交集。 因此,我們將具有不同參數的採樣方法劃分為塊,以便從每個塊中我們最多采取一種具有特定超參數的提取方法。 為此,您需要在背包問題的實現中進行一些欺騙,但漸近性和結果不會因此而改變。

與簡單的協作模型相比,這種巧妙的組合使我們能夠獲得以下指標:
我們如何顯著提高線下零售的推薦質量
在最終的指標上我們看到下圖:
我們如何顯著提高線下零售的推薦質量

然而,在這裡您可以看到,對於對業務有用的推薦,有一個未被發現的點。 現在我們剛剛學會瞭如何冷靜地預測用戶會購買什麼,例如下週。 但僅僅因為他無論如何都會購買這一事實而給予折扣並不是很酷。 但最大化期望是很酷的,例如,以下指標:

  1. 保證金/營業額基於個人建議。
  2. 平均客戶檢查。
  3. 訪問頻率。

因此,我們將獲得的概率乘以不同的係數,並對它們重新排序,以便影響上述指標的乘積位於頂部。 對於哪種方法最好使用,沒有現成的解決方案。 我們甚至直接在生產中試驗這些係數。 但這裡有一些有趣的技術,通常可以給我們帶來最好的結果:

  1. 乘以商品的價格/利潤。
  2. 乘以該產品出現的平均檢查次數。 因此,他們通常會拿走其他東西的貨物就會出來。
  3. 乘以該產品的買家的平均訪問頻率,基於該產品會引起更頻繁的退貨的假設。

在對係數進行實驗後,我們在生產中獲得了以下指標:
我們如何顯著提高線下零售的推薦質量
這裡 整體產品轉化 - 我們生成的推薦中所有產品中購買的產品所佔的比例。

細心的讀者會注意到離線和在線指標之間的顯著差異。 這種行為的解釋是,在訓練模型時,並非可以考慮所有可推薦產品的動態過濾器。 對於我們來說,提取的候選者中有一半可以被過濾掉是很正常的,這種特殊性在我們的行業中是典型的。

在收入方面,得到以下故事,很明顯,推薦推出後,測試組的收入增長強勁,現在我們的推薦收入平均增長為3-4%:
我們如何顯著提高線下零售的推薦質量

總之,我想說,如果您需要非實時推薦,那麼在提取推薦候選者的實驗中會發現質量有很大的提高。 生成它們的大量時間使得可以結合許多好的方法,這總共將為業務帶來很酷的結果。

我很樂意在評論中與所有對這些材料感興趣的人聊天。 您可以親自向我提問 電報。 我也在我的文章中分享了我對人工智能/初創公司的看法 電報頻道 - 歡迎 :)

來源: www.habr.com

添加評論