搜索推荐系统实战:进化篇
搜索推薦系統實戰篇-中篇
一切源于煉丹筆記,我只是敲了敲代碼。搜索推薦系統實戰:起始篇
搜索推薦系統實戰:進化篇
搜索推薦系統實戰:終極奧秘
此處我們假設模型訓練的大的框架已經固定,同時數據采樣的方式也基本已經確定,接下來就是對模型結構進行深入的優化。關于模型結構的優化這塊幾乎是做不完的做不完的,從最新諸多論文結構來看,也可以劃分為非常多塊,此處僅僅列舉下面三大模塊的優化;
大部分內容摘自煉丹筆記之前的匯總.....實在是太懶了。
交叉模塊是非常重要的模塊,在早期序列化探索還沒有那么強的時候,Poly2,FM,FFM這些模型都是在探索特征之間的交叉信息的,而這些統計信息是可以帶來非常大提升的,
1. 特征Embedding(LR,Poly2,FM,FFM,ONN/NFFM)
1. LR -> Poly2(特征交叉,基于點)
早期最早我們最為熟知的模型是LR,它的數學形式為:
我們知道LR其實是線性模型,所以很多非線性關系我們的LR模型是沒法捕捉的,最典型的就是XOR,單條直線是沒法直接分割的。
如果不做任何處理,LR是沒法做到很好的區分的。那么怎么做呢?做些交叉特征。
這么看之前(0,0),(0,1),(1,0),(1,1)就被分配到了四個不同的bin中,對應位置的bin設置高的權重就可以解決上面的問題了。
2. Poly2 -> FM(升級特征交叉)
下面我們看一個特殊的場景,假設在我們的訓練數據集中只有一個負樣本(ESPN,Adidas),那么對于Poly2,(ESPN,Adidas)的組合特征對應的權重就會非常大,因為我們只能從該組合中學習它們的關系,這可能不是非常理想,那么如何緩解這樣的問題呢?
我們將wij表示為兩個向量的內積,每個向量的維度,這樣做有什么好處呢?
最明顯的一點就是:我們可以只通過一個特征的出現去更新另外一個向量了,對應到上面的例子,我們可能還會有其他的組合(ESPN, Nike), (NBC, Adidas),而這些組合都可以用來更新我們的向量,所以我們的預測將會更加精確。
我們再看一個看電影的例子,
對于Poly2算法,如果出現了某個用戶A沒有看過的電影B,那么對應的(UserA,MovieB)的組合就是0,但是如果使用FM的話,結果就不一樣了,因為UserA和MovieB的向量可以從其他的特征對中進行學習,所以(UserA,MovieB)的組合可能會非常有意義。
2. 隱式&顯示特征交叉
不管是Poly2,FM和FFM本質還是只學習了一階和二階的特征,那么高階的特征怎么辦?隨著Deep模型的發展,我們嘗試使用Deep模型去挖掘高階交互特征,
1.傳統 -> WDL
我們將Deep模型加入到原先的模型中來學習高階的交叉,
2.WDS -> DeepFM(顯示FM+隱式)
起初我們人為把特征embedding之后扔到MLP之中就可以很好地學習到高階的交叉信息,但其實不然, MLP在特征組合的時候學習的并不是非常好,這個時候我們就需要找到之前我們的一些組合方法。將第一部分的內容加入進來。
3.WDS -> NFM(顯示二階+隱式)
做二階特征,除了內積的形式外,我們還可以做element-wise的乘法, NFM提出了Bi-Interaction pooling,
在Bi-Interaction pooling之后連接上一層MLP學習高階的特征交叉就可以得到:
- NFM:
NFM算另外一種結合兩種將MLP與顯示交叉結合的方式(之前是分兩個分支),而實驗中,我們發現后者可能效果更好一些。在模型的早期,加入Bi-interaction pooling并且拼接在之前的模型中一般是可以提升模型的效果的。
4.DeepFM/NFM -> TFNET(顯示高級二階+隱式)
之前的顯示二階特征交叉的形式都相對簡單, 例如:
5.DeepFM -> ONN/NFFM(顯示二階+隱式)
在FM和FFM中,我們發現了FFM的表示相較于FM的幾種好處,而且早期實驗中也顯示了FFM比FM卻是要好很多。
所以類似的,既然FM和FFM都可以認為是Embedding,一個映射為單個dense向量,一個映射為多個dense向量,所以ONN就是將Embedding部分的特征修改,從FM的形式轉化為FFM,后面仍然是一樣的做cross的內積。
其中:
ONN是第一屆騰訊賽冠軍提出來的,在后兩屆的騰訊賽中,第一名也都有用到該模型,所以FFM的embedding是非常值得借鑒的。
此處還有一個小細節就是作者將embedding的特征和cross的特征進行concat輸入MLP。
6.DeepFM -> xDeepFM(顯示高階+ 隱式)
上面所有的模型要么是直接用embedding之后用MLP模型進行隱式高階特征在于顯示的二階交叉相加,要么就是二階顯示交叉之后再與一階的embedding進行concat后加入MLP進行隱式學習。卻還沒有一個是顯式學習高階特征交叉的,那么這么做會有提升嗎?xDeepFM告訴我們是的!!!
7. ONN/NFFM VS xDeepFM
ONN和xDeepFM是目前在數據競賽中經常用到的模型(據本人所知,2020年之前的CTR競賽最多的處理categorical的特征還是這兩類模型),19年的騰訊賽冠軍也是用的NFFM模型,二者的對比如下(18年的騰訊數據),整體來看,NFFM的效果要略好于xDeepFM,但二者融合效果還是極棒的!
3. 無效特征&冗余特征篩選
1. FM -> AFM(噪音信息處理)
枚舉式特征交叉的問題1:從上面所有模型的構建我們可以看到,所有的模型都是枚舉式的二階交叉,枚舉的話毫無疑問就會帶來非常大的問題,特征冗余,會帶出非常多的無用的特征(Noise),這在實踐中也是類似的,隨機加入多個高斯噪音,模型的效果可能會下降(雖然很多時候下降不是非常多,但基本都是下降的),那怎么辦呢?
- 解法1: 降低不重要特征的權重。
所以我們就看到了最早的AFM模型。
AFM的數學表示形式為:
2. FM/DeepFM/PNN -> AutoFIS
- 解法2: 先找到不重要的特征交叉(權重直接置為0),然后固定重新訓練。
3. AFM/FFM -> AoAFFM(噪音+冗余信息處理)
枚舉式特征交叉的問題2:除了枚舉帶來的噪音數據會導致我們的模型的效果下降之外,還有一類信息,就是冗余信息也會帶來模型效果的下降,此處的冗余我們指:比如有一個交叉特征A非常重要,是非常強的特征,但是又有一個交叉特征B也非常重要,但是A特征和B特征的相關性幾乎為1,也就是說A特征基本上已經包含了B特征的信息,其實只保留一個特征就好了,保留兩個不僅會帶來內存的消耗,還會導致我們的模型效果下降。實踐中,最為常見,而且很多時候冗余信息帶來的模型性能下降的程度比噪音數據會大。
- 解法: 降低不重要特征的權重 & 希望將冗余信息的特征的權重調低。
所以我們就看到了最早的AoAFFM模型中的AoA希望處理的事情,當然此處作者不是基于FM做的,是基于FFM做的。
于是我們有:
如果忽略embedding層的操作,我們發現相較于AFM,AoAFFM多了一層Interaction-Level的Attention。而它的作用就是希望降低冗余特征的影響 :
在Feature-level的Attention網絡中,我們可以學習每個特征的權重,但是卻沒法降低我們冗余特征帶來的影響。所以兩個類似的特征最終會有類似的attention,為了判別這種冗余的交互特征,我們使用interaction-level的attenion來處理,$Q \in R^|\mathcal{F||} 從上面的網絡框架圖中,我們發現因為我們的Q$是不依賴于前面的信息,所以即使對于相似的embedding向量,我們也有可能會有不同的權重,所以這個方法可以緩解特征冗余的問題。首先為了驗證特征交叉是有價值的,我們在模型中刪去了特征交叉的模塊,發現在早期的版本中模型的預估,不管是CTR還是CVR的預估效果都會有較大幅度的下降,這也驗證了網絡層進行特征交叉的價值。那么問題來了,究竟哪種類型的交叉效果是最好的呢?
1. FM + NFM + TFNET特征交叉思路的組合嘗試
這里希望驗證的內容主要是:
- 特征交叉哪種類型(簡單的乘積,還是Bilinear形式的?)效果最佳?
- 特征冗余是否會影響我們的效果,在早期的kaggle的方案中,很多FM/FFM都是枚舉形式的,但是在雙塔的結構中,我們發現User側和Item側的交叉效果更好。
當然如果是搜索任務可能還需要考慮Query的情況,我們默認將Query當做User側的embedding加入。而在大量的實驗結果中,我們基本可以得到下面的結論:我們將UI的所有emebdding信息進行拼接, 我們將拼接之后的信息用UI表示,
這一塊的實驗結論大致可以歸納為:
簡單總結就是,U和I分開進行Bilinear的操作可以為我們的CTR帶來些許幫助,但是對最終我們期望的曝光到轉化的預估沒能帶來太大的正向收益。
2.模仿ONN思路
在大量的數據競賽中,19年及之前有較大優勢的是ONN以及xDeepFM兩種,考慮到xDeepFM時間計算代價較大,我們嘗試往ONN的思路遷移。因為目前我們線上的Embedding維度不能太大,但是又希望有類似于FFM這種的效果怎么辦?
此處偷個懶,不細分field,而是每個Item的特征都對應一個field,同樣的每個User的特征也都對應一個,等價于暴力轉換
得到上面的形式之后,再用下面的方式做cross:
Tensor因為是自行設計的,中間的*也可以自定義為其他操作,最終我們就得到一個形式上類似的新的"embedding"....
這么做的話,我們發現實驗在CTR和曝光到轉化的預估上可以帶來一些收益,不過非常小。受限于資源等的問題,我們沒法直接和ONN以及FFM中,直接在初始的過程中就執行轉化,相信后面資源擴充了這么做肯定還是能有幫助的。
3.模仿TFNET細化embedding內積操作
這個思路在論文中也存在。
- FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction
該思路在實驗中效果還不錯,基本在CTR和曝光到轉化的預估中基本都能帶來一定幅度的提升。
關于序列模塊數據的使用是近幾年才開始探索的,能更好地挖掘當前商品和用戶歷史點擊商品之間的關系,這也是用戶的近期和長期的興趣愛好,充分挖掘各個階段的i2i信息,關于序列化建模因為涉及到數據的構建,所以這塊要做好,需要至少做到兩點:
- 構建更好更多的序列:盡可能保證多的信息能被保留;
- 采用更好地序列挖掘框架:例如基于Transformer之類的框架。
在電商搜索推薦的問題中,因為問題的不同,所以構建的序列也就不再僅限于簡單的用戶點擊序列,例如在DMT中,使用到的序列就有:
- 用戶的商品點擊序列;
- 用戶的商品加購序列;
- 用戶的商品下單序列;
這些序列反映了用戶的不同的實時興趣,當前大量的研究都會優化點擊序列,但是卻會忽略用戶的其他行為,例如購買等;而從作者的實驗結果來看,
- 增加加購序列相較于只使用點擊序列可以提升模型的效果;
- 加入訂單序列后,點擊預測和訂單預測的效果沒有進一步提高。(經驗發現,對于一個有很長的回購期的產品(如電腦),用戶會傾向于點擊但在購買后的短時間內不會再次購買。對于回購期較短的產品(如牛奶),用戶可以在短時間內點擊并再次購買。訂單序列可能導致點擊預測與訂單預測發生沖突,干擾點擊或購物車序列中的信息)。
而序列的設計也是有非常多種形式的,最簡單的例子就是下面的這種形式,
1.基于用戶/查詢的XX序列
基礎的商品序列:
- 用戶的商品點擊序列;
- 用戶的商品加購序列;
- 用戶的商品支付序列;
- 某個查詢下的商品支付序列;
- 某個查詢下商品的點擊序列;
- 某個查詢下商品的加購序列;
- 用戶在某個查詢下商品的點擊序列;
- 用戶在某個查詢下商品的加購序列;
- 用戶在某個查詢下商品的支付序列;
- ......
當然商品僅僅只是一種表示,還可以更加的泛化,于是我們又可以得到下面的一列序列;
2. 基于商品的屬性序列
關于商品類型的序列:
- 用戶的商品類型點擊序列;
- 用戶的商品類型加購序列;
- 用戶的商品類型支付序列;
- 某個查詢下的商品類型支付序列;
- 某個查詢下商品類型的點擊序列;
- 某個查詢下商品類型的加購序列;
- 用戶在某個查詢下商品類型的點擊序列;
- 用戶在某個查詢下商品類型的加購序列;
- 用戶在某個查詢下商品類型的支付序列;
- ......
關于商品品牌的序列:
- 用戶的商品品牌點擊序列;
- 用戶的商品品牌加購序列;
- 用戶的商品品牌支付序列;
- 某個查詢下的商品品牌支付序列;
- 某個查詢下商品品牌的點擊序列;
- 某個查詢下商品品牌的加購序列;
- 用戶在某個查詢下商品品牌的點擊序列;
- 用戶在某個查詢下商品品牌的加購序列;
- 用戶在某個查詢下商品品牌的支付序列;
- ......
關于商品店鋪的序列:
- 用戶的商品店鋪點擊序列;
- 用戶的商品店鋪加購序列;
- 用戶的商品店鋪支付序列;
- 某個查詢下的商品店鋪支付序列;
- 某個查詢下商品店鋪的點擊序列;
- 某個查詢下商品店鋪的加購序列;
- 用戶在某個查詢下商品店鋪的點擊序列;
- 用戶在某個查詢下商品店鋪的加購序列;
- 用戶在某個查詢下商品店鋪的支付序列;
- ......
商品其它屬性,例如城市等等信息。
當然除了上面的信息的序列,還有一類序列,我把其稱之為:
3. 基于上下文的序列
- 用戶在詳情頁的點擊序列;
- 用戶在曝光頁的點擊序列;
- 用戶在某個時間段的購買序列;
- ......
按照上面的三種序列構建的策略來看,我們大概可以構建幾十幾百條不同的序列。而在實踐中,我們也會發現序列帶來的提升是非常巨大的。至于哪些序列能帶來的提升是比較大的,我不能給出直接的答案,但是用戶/Query和商品的點擊序列等都是可以帶來不錯提升的,這在最近搜索相關的論文中也都是有提到的,所以不再做過多的闡述。
序列按照結構使用的核心模塊不一樣,又可以分為下面幾種:
1.基于CNN模塊的序列模型
典型的例如CosRec,CosRec是第一篇用于下一個商品推薦的基于二維CNN的方法, CosRec用于處理序列化的數據, CosRec將歷史的商品進行枚舉式的concat然后組成pair,最終使用二維的CNN提取序列特征。CosRec在數據集上的表現都明顯優于最近的序列方法,表現了它作為順序推薦任務的通用模型的有效性。
2.基于RNN模塊的序列模型
典型的如DIEN,DIEN是DIN的改進,因為用戶興趣會隨著時間的推移而動態演化。之前的模型缺乏對具體行為背后潛在興趣的專門建模。此外,很少有研究考慮興趣的變化趨勢。DIEN設計了興趣提取層來從歷史行為序列中捕捉時間興趣。DIEN引入一個輔助損失來抽取每一步的時間興趣信息。針對用戶興趣的多樣性,特別是在電子商務系統中,我們提出了興趣演化層來捕捉與目標商品相關的興趣演化過程。
使用的序列輔助Loss如下:
3.基于Attention模塊的序列模型
基于Attention系列的序列網絡非常多,典型的有DIN,SASRec,DMT,DMIN,SSE-PT等等。
DIN是最早一批對用戶序列進行挖掘的工作。它通過設計一個局部激活單元來自適應地學習用戶對某個廣告的歷史行為的興趣表示。這種表示向量在不同的廣告中是不同的,大大提高了模型的表達能力。此外,我們還開發了兩種技術:min-batch感知的正則以及數據自適應激活函數,它可以幫助訓練具有數億個參數的工業深層網絡。
SASRec是最早將自我注意機制用于序列的模型, SASRec對整個用戶序列進行建模(沒有任何遞歸或卷積操作),并自適應地考慮消耗的項目進行預測,相較于之前的RNN/CNN的網絡,不僅快,而且效果更好,算是最早基于Self-Attention的模型。
DMT加入了多條的序列,不再是簡單的點擊序列,還有加購/下單等序列,使用多條序列來多方面捕捉用戶的歷史興趣愛好,最后使用Bias深度網絡來減少隱式反饋的選擇偏差。
用戶經常在某個時間點擁有大量的興趣, 與此同時, 潛在的主導興趣是通過行為表現出來的。潛在主導興趣的切換會導致最終的行為變化。因此,建模和跟蹤潛在的多重興趣將是有益的。
本文最大的一個特色還在于加入了輔助Loss來幫助我們獲得更好的表示,
$$L_{aux} = - \frac{1}{N}(\sum_{i=1}^N \sum_{t} log \sigma()) + log( 1- \sigma()) $$
和很多工作不一樣,本文在序列中加入了用戶的emebdding來獲得個性化,以及位置編碼,最后使用隨機emebdding的正則策略。
關于序列的實驗相信很多朋友不說也都知道了。目前效果相對最好的都是基于Attention系列的那一套,有的時候為了捕捉時間信息會在Attention之后加入LSTM等模塊,用來彌補Attention模塊忽略位置信息的缺點等等。
更多干貨,請關注公眾號:煉丹筆記總結
以上是生活随笔為你收集整理的搜索推荐系统实战:进化篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搜索推荐系统实战:终极奥秘
- 下一篇: 搜索推荐系统实战:起始篇