《推薦系統》-DIN模型

演算法手記發表於2020-10-22

1、背景

深度學習在CTR預估領域已經有了廣泛的應用,常見的演算法比如Wide&Deep,DeepFM等。這些方法一般的思路是:通過Embedding層,將高維離散特徵轉換為固定長度的連續特徵,然後通過多個全聯接層,最後通過一個sigmoid函式轉化為0-1值,代表點選的概率。即Sparse Features -> Embedding Vector -> MLPs -> Sigmoid -> Output.

這種方法的優點在於:通過神經網路可以擬合高階的非線性關係,同時減少了人工特徵的工作量。

不過,阿里的研究者們通過觀察收集到的線上資料,發現了使用者行為資料中有兩個很重要的特性:

Diversity:使用者在瀏覽電商網站的過程中顯示出的興趣是十分多樣性的。

Local activation: 由於使用者興趣的多樣性,只有部分歷史資料會影響到當次推薦的物品是否被點選,而不是所有的歷史記錄。

這兩種特性是密不可分的。

舉個簡單的例子:

Diversity體現在年輕的母親的歷史記錄中體現的興趣十分廣泛,涵蓋羊毛衫、手提袋、耳環、童裝、運動裝等等。而愛好游泳的人同樣興趣廣泛,歷史記錄涉及浴裝、旅遊手冊、踏水板、馬鈴薯、冰激凌、堅果等等。

Local activation體現在,當我們給愛好游泳的人推薦goggle(護目鏡)時,跟他之前是否購買過薯片、書籍、冰激凌的關係就不大了,而跟他游泳相關的歷史記錄如游泳帽的關係就比較密切。

針對上面提到的使用者行為中存在的兩種特性,阿里將其運用於自身的推薦系統中,推出了深度興趣網路DIN,接下來,我們就一起來看一下模型的一些實現細節,然後我們會給出一個簡化版的tensorflow實現。

2、模型設計

整體框架

我們先來看一下推薦系統的整體框架:
在這裡插入圖片描述
圖1、架構

整個流程可以描述為:

1.檢查使用者歷史行為資料

2.使用matching module產生候選ads。

3.通過ranking module做point-wise的排序,即得到每個候選ads的點選概率,並根據概率排序得到推薦列表。

4.記錄下使用者在當前展示廣告下的反應(點選與否),作為label。

特徵設計

本文將所涉及到的特徵分為四個部分:使用者特徵、使用者行為特徵、廣告特徵、上下文特徵,具體如下:
在這裡插入圖片描述
圖2、特徵

其中,使用者行為特徵是multi-hot的,即多值離散特徵。針對這種特徵,由於每個涉及到的非0值個數是不一樣的,常見的做法就是將id轉換成embedding之後,加一層pooling層,比如average-pooling,sum-pooling,max-pooling。DIN中使用的是weighted-sum,其實就是加權的sum-pooling,權重經過一個activation unit計算得到。這裡我們後面還會再介紹到。

BaseModel

在介紹DIN之前,我們先來看一下一個基準模型,結構如下:
在這裡插入圖片描述
圖3、基準模型

這裡element-wise的意思其實就是元素級別的加減,同時,可不要忽略廣播的存在喲。一個元素和一個向量相乘,也可以看作element-wise的,因為這個元素會廣播成和向量一樣的長度嘛,嘻嘻。

可以看到,Base Model首先吧one-hot或multi-hot特徵轉換為特定長度的embedding,作為模型的輸入,然後經過一個DNN的part,得到最終的預估值。特別地,針對multi-hot的特徵,做了一次element-wise+的操作,這裡其實就是sum-pooling,這樣,不管特徵中有多少個非0值,經過轉換之後的長度都是一樣的!

Deep Interest Network

Base Model有一個很大的問題,它對使用者的歷史行為是同等對待的,沒有做任何處理,這顯然是不合理的。一個很顯然的例子,離現在越近的行為,越能反映你當前的興趣。因此,對使用者歷史行為基於Attention機制進行一個加權,阿里提出了深度興趣網路(Deep Interest Network),先來看一下模型結構:
在這裡插入圖片描述
圖4、DIN模型

Attention機制簡單的理解就是,針對不同的廣告,使用者歷史行為與該廣告的權重是不同的。假設使用者有ABC三個歷史行為,對於廣告D,那麼ABC的權重可能是0.8、0.1、0.1;對於廣告E,那麼ABC的權重可能是0.3、0.6、0.1。這裡的權重,就是Attention機制即上圖中的Activation Unit所需要學習的。

為什麼要引入這一個機制呢?難道僅僅是通過觀察歷史資料拍腦袋決定的麼?當然不是,如果不用Local activation的話,將會出現下面的情況:假設使用者的興趣的Embedding是 V u V_u Vu,候選廣告的Embedding是 V a V_a Va,使用者興趣和候選的廣告的相關性可以寫作 F ( u , a ) = V u ∗ V a F(u,a)=V_u *V_a F(u,a)=VuVa。如果沒有Local activation機制的話,那麼同一個使用者對於不同的廣告, V u V_u Vu都是相同的。舉例來說,如果有兩個廣告A和B,使用者興趣和A,B的相似性都很高,那麼在 V a V_a Va V b V_b Vb連線上的廣告都會有很高的相似性。這樣的限制使得模型非常難學習到有效的使用者和廣告的embedidng表示。

在加入Activation Unit之後,使用者的興趣表示計算如下:
V u = f ( V a ) = ∑ i = 1 N w i ∗ V i = ∑ i = 1 N g ( V i , V a ) ∗ V i V_u = f(V_a) = \sum_{i=1}^N w_i * V_i = \sum_{i=1}^N g(V_i, V_a)* V_i Vu=f(Va)=i=1NwiVi=i=1Ng(Vi,Va)Vi

其中,V_i表示behaviorI_id i的嵌入向量,比如good_id,shop_id等。V_u是所有behavior_ids的加權和,表示的是使用者興趣; V a V_a Va是候選廣告的嵌入向量; W i W_i Wi是候選廣告影響著每個behavior_id的權重,也就是Local Activation。 w i w_i wi通過Activation Unit計算得出,這一塊用函式去擬合,表示為 g ( V i , V a ) g(V_i, V_a) g(Vi,Va)

3、模型細節

3.1 評價指標GAUC

模型使用的評價指標是GAUC,我們先來看一下GAUC的計算公式:
G A U C = ∑ i = 1 n w i ∗ A U C i ∑ i = 1 n w i = ∑ i = 1 n i m p r e s s i o n i ∗ A U C i ∑ i = 1 n i m p r e s s i o n i GAUC = \frac{\sum\nolimits_{i=1}^n w_i*AUC_i }{\sum\nolimits_{i=1}^n w_i} = \frac{\sum\nolimits_{i=1}^n impression_i * AUC_i }{\sum\nolimits_{i=1}^n impression_i} GAUC=i=1nwii=1nwiAUCi=i=1nimpressionii=1nimpressioniAUCi

我們首先要肯定的是,AUC是要分使用者看的,我們的模型的預測結果,只要能夠保證對每個使用者來說,他想要的結果排在前面就好了。

假設有兩個使用者A和B,每個使用者都有10個商品,10個商品中有5個是正樣本,我們分別用TA,TB,FA,FB來表示兩個使用者的正樣本和負樣本。也就是說,20個商品中有10個是正樣本。假設模型預測的結果大小排序依次為TA,FA,TB,FB。如果把兩個使用者的結果混起來看,AUC並不是很高,因為有5個正樣本排在了後面,但是分開看的話,每個使用者的正樣本都排在了負樣本之前,AUC應該是1。顯然,分開看更容易體現模型的效果,這樣消除了使用者本身的差異。

但是上文中所說的差異是在使用者點選數即樣本數相同的情況下說的。還有一種差異是使用者的展示次數或者點選數,如果一個使用者有1個正樣本,10個負樣本,另一個使用者有5個正樣本,50個負樣本,這種差異同樣需要消除。那麼GAUC的計算,不僅將每個使用者的AUC分開計算,同時根據使用者的展示數或者點選數來對每個使用者的AUC進行加權處理。進一步消除了使用者偏差對模型的影響。通過實驗證明,GAUC確實是一個更加合理的評價指標。

3.2 Dice啟用函式

從Relu到PRelu

Relu啟用函式在值大於0時原樣輸出,小於0時輸出為0。這樣的話導致了許多網路節點的更新緩慢。因此又了PRelu,也叫Leaky Relu,形式如下:
在這裡插入圖片描述
圖5、PRelu

這樣,及時值小於0,網路的引數也得以更新,加快了收斂速度。

從PReLU到Dice

儘管對Relu進行了修正得到了PRelu,但是仍然有一個問題,即我們認為分割點都是0,但實際上,分割點應該由資料決定,因此文中提出了Dice啟用函式

Dice啟用函式的全稱是Data Dependent Activation Function,形式如下:
y i = a i ( 1 − p i ) y i + p i y i y_i = a_i(1-p_i)y_i + p_iy_i yi=ai(1pi)yi+piyi
p i = 1 1 + e − y i − E [ y i ] v α τ [ y i ] + ε p_i = \frac{1}{1+e^{-\frac{y_i - E[y_i]}{\sqrt{v \alpha \tau [y_i]} +\varepsilon } }} pi=1+evατ[yi] +εyiE[yi]1

其中,期望和方差的計算如下:
E [ y i ] t + 1 ′ = E [ y i ] t ′ + α E [ y i ] t + 1 {E[y_i]_{t+1}}^ {\prime} ={E[y_i]_t}^{\prime} + \alpha {E[y_i]}_{t+1} E[yi]t+1=E[yi]t+αE[yi]t+1
V α τ [ y i ] t + 1 ′ = V α τ [ y i ] t ′ + α V α τ [ y i ] t + 1 {V\alpha \tau [y_i]_{t+1}}^ {\prime} ={V\alpha \tau [y_i]_t}^{\prime} + \alpha {V\alpha \tau [y_i]}_{t+1} Vατ[yi]t+1=Vατ[yi]t+αVατ[yi]t+1
可也看到,每一個yi對應了一個概率值pi。pi的計算主要分為兩步:將yi進行標準化和進行sigmoid變換。

3.3 自適應正則 Adaptive Regularization

CTR中輸入稀疏而且維度高,通常的做法是加入L1、L2、Dropout等防止過擬合。但是論文中嘗試後效果都不是很好。使用者資料符合長尾定律long-tail law,也就是說很多的feature id只出現了幾次,而一小部分feature id出現很多次。這在訓練過程中增加了很多噪聲,並且加重了過擬合。

對於這個問題一個簡單的處理辦法就是:直接去掉出現次數比較少的feature id。但是這樣就人為的丟掉了一些資訊,導致模型更加容易過擬合,同時閾值的設定作為一個新的超引數,也是需要大量的實驗來選擇的。

因此,阿里提出了自適應正則的做法,即:

1.針對feature id出現的頻率,來自適應的調整他們正則化的強度;

2.對於出現頻率高的,給與較小的正則化強度;

3.對於出現頻率低的,給予較大的正則化強度。

計算公式如下:
I i = { 1 , ∃ ( x j , y j ) ∈ B , s . t . [ x j ] i ≠ 0 0 , o t h e r   v a l u e s I_i = \left\{\begin{array}{cc} 1, \exists (x_j,y_j)\in B,s.t.[x_j]_i \neq 0\\0, other\ values \end{array}\right. Ii={1,(xj,yj)B,s.t.[xj]i=00,other values
w i ← w i − η [ 1 b ∑ ( x j , y j ) ∈ B ∂ L ( f ( x j ) , y j ) ∂ w i + λ 1 n i w i I i ] w_i \leftarrow w_i - \eta [\frac{1}{b} \sum_{(x_j,y_j)\in B} \frac{\partial L(f(x_j),y_j)}{\partial w_i} +\lambda \frac{1}{n_i}w_iI_i ] wiwiη[b1(xj,yj)BwiL(f(xj),yj)+λni1wiIi]

4、效果展示

下圖是對Local Activation效果的一個展示,可以看到,對於候選的廣告是一件衣服的時候,使用者歷史行為中跟衣服相關的權重較高,而非衣服的部分,權重較低。
在這裡插入圖片描述
圖6、Local activation

下圖是對使用不同正則項的結果進行的展示,可以發現,使用自適應正則的情況下,模型的驗證集誤差和驗證集GAUC均是最好的。
在這裡插入圖片描述
圖7、驗證自適應正則

下圖對比了Base Model和DIN的實驗結果,可以看到,DIN模型在加入Dice啟用函式以及自適應正則之後,模型的效果有了一定的提升:
在這裡插入圖片描述
圖8、DIN與基準模型比較

參考文獻:
論文:Deep Interest Network for Click-Through Rate Prediction

推薦系統遇上深度學習(十八)–探祕阿里之深度興趣網路(DIN)淺析及實現

推薦好文: 深度學習在CTR預估中的應用

相關文章