再谈序列化推荐
近年來很多序列化推薦的方法都是通過把用戶歷史行為序列轉化為一個總的向量化表達,來給用戶做下一個item推薦。然而,通過經驗性的分析,我們就會發現用戶序列行為中包含多種多樣完全不同含義的item,這個表示用戶的向量受歷史行為的影響非常大,因此無法推薦出用戶歷史行為中類別占比較小的item。所以應該用不同的embedding去編碼用戶當前的意圖,這篇論文《Sparse-Interest Network for Sequential Recommendation》提出了SINE解決序列化推薦的問題,煉丹筆記前面已經介紹了大部分阿里的序列化推薦算法,所以廢話不多說,直接介紹SINE。
十方@煉丹筆記SINE解決啥問題?
假定 x ( ) =1...N 表示N個用戶與M個item的數據,x ( ) = [x1, x2, ..., xn] 表示用戶點擊序列,考慮到工業級推薦系統包含數十億的item,SINE的目標是挖掘出用戶K個向量表達,能抓住用戶準確的意圖,召回top的item提供給下游(排序模塊)。
最新的用于抓住用戶準確意圖的序列化編碼器可以被總結為兩大類。第一類方法隱式的挖掘用戶多層興趣,例如基于多頭self-attention的方法,另一類顯式的捕捉用戶多層意圖。第一類方法在和單個向量推薦相比較,并沒有明顯的提升。另一類則可以有效的挖掘用戶的多興趣,這些方法都存在一個共同的問題,就是要求用戶在交互過的各個類目都有一個embeding表達,導致該類方法可擴展性特別差。舉個例子,按照專家的標注,阿里天貓所有商品可以分為1w類,所以在推薦系統中一個用戶有類目個向量是不現實的。
因此稀疏興趣網絡就誕生了,該網絡有能力挖掘出用戶興趣最高的幾個意圖。
SINE長啥樣?
大家可以邊看圖,邊閱讀下面各個模塊的介紹:
稀疏興趣模塊(Sparse-interest module)
Concept Activation:先用自注意力方法把輸入的序列聚合,如下公式所示:
W1 ∈ R × 和W2 ∈ R 都是訓練參數,然后按照attention的score a把輸入的向量序列聚合起來z = (a ? X ) ? ,Zu就是用戶的一個D維度的總體向量表達,用這個向量去激活興趣,C ∈ R × 表示L個興趣(類目)向量:
從上公式,我們看到,先要找到和用戶最相關的k個興趣,然后按照相關度縮放k個興趣向量。
Intention assignment:在得到k個興趣向量后,我們可以通過計算行為序列到興趣向量的距離,挖掘出用戶最相關的意圖,參考下公式:
pk|t表示位置t處的item與第k個興趣相關的概率。
Attention weighting:當計算出pk|t后,我們還需要關注pt|k,即位置t的item對于表達用戶第k個興趣的重要程度,通過下公式計算:
Interest embedding generation:有了以上所有向量和attention score后,可以通過下式進行興趣向量集成:
興趣集成模塊(interest aggregation module)
在稀疏興趣模塊中,我們實際上獲得了k個興趣,我們可以像MIND一樣,用下一個item作為目標label,去選擇不同的興趣向量訓練,盡管這樣很簡單,但是缺陷就是實際預估中,是沒有目標label的,導致訓練和線上有著很大的gap,導致效果上有很大損失。
為了解決這個問題,可以先預估用戶下一個意圖的類目,而不是item。我們通過上面計算的pk|t可以得到用戶傾向性矩陣Pu∈ R ×k ,我們用此矩陣對用戶的興趣向量進行聚合,得到最終的興趣向量:
Capt可以理解為用戶目前的意圖,是個D維度的向量,我們通過下式得到用戶的最終表達vu:
通過下式模型優化:
由于上式復雜度較高,所以實際使用了sampled softmax進行優化。同時為了保證興趣向量互相正交,所以還引入了正則化損失:
|| · ||F 表示Frobenius 范數,最終loss為:
實驗效果如何?
從實驗效果,我們可以看出SINE 的HR和NDCG的結果都是比較出眾的:
通過拉出多個興趣向量top k的item,我們也發現模型對商品集合做了很好的聚類:
總結
- 上一篇: 当推荐遇到冷启动
- 下一篇: 负样本修正:既然数据是模型的上限,就不要