一、背景
對於阿里巴巴的用戶行為數據:有兩個指標對廣告CTR預測准確率有重大影響。
1、多樣性(Diversity):一個用戶可以對很多不同品類的東西感興趣;
2、局部興趣(Local activation):對於用戶興趣的多樣性,只有一部分歷史數據會影響到當次推薦的物品是否被點擊,並非所有。
例子:
Diversity體現在年輕的母親的歷史記錄中體現的興趣十分廣泛,涵蓋羊毛衫、手提袋、耳環、童裝、運動裝等等。而愛好游泳的人同樣興趣廣泛,歷史記錄涉及浴裝、旅游手冊、踏水板、馬鈴薯、冰激凌、堅果等等。
Local activation體現在,當我們給愛好游泳的人推薦goggle(護目鏡)時,跟他之前是否購買過薯片、書籍、冰激凌的關系就不大了,而跟他游泳相關的歷史記錄如游泳帽的關系就比較密切。
目前的CTR預估的問題:
1、一般個人的當前興趣是與最近的瀏覽內容有更強的關聯,而不是全部的興趣列表。
2、從用戶瀏覽的內容多樣性中獲取用戶真正興趣。
base模型:常見的MLP
1、對特征進行Embedding操作,得到一系列Embedding向量
2、將不同group的特征concate起來之后得到一個固定長度的向量
3、將此向量喂給后續的全連接網絡,最后輸出
二、DIN模型
1、特征處理
Learning piece-wise linear models from large scale data for ad click prediction
中
common feature trick,目的是降低空間開銷和計算開銷。
多類別數據,如:[weekday=Friday, gender=Female, visited_cate_ids={Bag,Book}, ad_cate_id=Book], 這些特征通過encoding轉為高維稀疏二值特征。
(1)ti ∈ R Ki 表示第 i 個類別的encoding vector,
Ki 表示類別 i 的維度,which means feature group i contains Ki unique ids. K=1表示one-hot,K>1表示multi-hot。
(2)ti[j] is 第j個元素of ti ,ti[j] ∈ {0, 1}.
(3)一個樣本:x = [t1T , t2T , ...tMT] ,M表示類別的數量,即weekday,gender, visited_cate_ids , ad_cate_id四個 。
four groups of features are illustrated as:
全部特征類型如下:
2、Base模型(Embedding & MLP)
(1)Embedding layer:
: 第 i 個類別的embedding。wi j∈ RD表示類別 i 多值中第 j 個值的embedding向量。
(2)Pooling layer and Concat layer:
(3)MLP
(4)loss
3、DIN
與Base模型結構相比主要差別:如何聚合多個用戶行為Embedding向量?
- Base模型中直接對多個Embedding向量進行等權的sum-pooling
- DIN采取weighted-sum pooling,即Attention,讓模型更加關注有用的信息。
(1)用戶表示:采用Attention加權求和pooling
--------------------- Local activation (attention unit)
其中,{e 1 , e 2 , ..., e H }是用戶U的一系列行為embedding,VA表示廣告A的embedding。且放寬了∑w i = 1的約束,這樣更有利於體現不同用戶行為特征之間的差異化程度。。
(2)本文還嘗試用LSTM來建模用戶歷史行為數據,但沒有任何改善。原因可能是:NLP中文本會受到語法約束,但是用戶行為序列可能包含多個共同興趣,這些興趣快速的轉換和突然的結束使得用戶行為的序列數據變得雜亂。
可能的解決方案是設計特殊的結構來建模這樣的序列數據,將此作為未來的研究。
三、訓練技巧
用戶和廣告數量達數億,大規模稀疏輸入訓練過程。兩個解決技術:
1、Mini-batch Aware Regularization:解決在大規模稀疏場景下,采用SGD對引入L2正則的loss進行更新時計算開銷過大的問題。
(1)提出背景:
沒有加正則化會導致嚴重的過擬合行為(增加60萬的細粒度good_id特征):如綠線。
但是,當加l2正則化時,它需要針對每個mini-batch計算每個參數的L2范數,這會導致非常繁重的計算,參數擴展到數億是不可接受的。
用戶數據符合長尾定律long-tail law, 也就是說很多的feature id只出現了幾次,而一小部分feature id出現很多次。這在訓練過程中增加了很多噪聲,並且加重了過擬合。對於這個問題一個簡單的處理辦法就是:直接去掉出現次數比較少的feature id。但是這樣就人為的丟掉了一些信息,導致模型更加容易過擬合,同時閾值的設定作為一個新的超參數,也是需要大量的實驗來選擇的。
因此,阿里提出了自適應正則的做法,即:
1.針對feature id出現的頻率,來自適應的調整他們正則化的強度;
2.對於出現頻率高的,給與較小的正則化強度;
3.對於出現頻率低的,給予較大的正則化強度。
該方法只對每一個mini-batch中參數不為0的進行梯度更新。
(2)推導過程:
mini-batch aware regularizer:
W ∈ R D×K表示:整個embedding dictionary的參數。D as the dimensionality of the embedding vector and K as the dimensionality of feature space.
Expand the l2 regularization on W:
-----------------------(4)
其中, I (xj 不等於 0) denotes if the instance x has the feature id j, and nj denotes the number of occurrence for feature id j in all samples.
(4)式可轉為mini-batch形式(5):
-----------------(5)
where B denotes the number of mini-batches。 Bm denotes the m-th mini-batch.
(5)式可近似為(6),令表示 if there is at least one instance having the feature id j in mini-batch B m .:
-----------------(6)
針對the m-th mini-batch,(梯度)the gradient w.r.t. the embedding weights of feature j is:
經過一系列推到之后得到近似的梯度計算公式如下所示:
2、自適應激活函數Dice
Relu激活函數形式如下:(Relu激活函數在值大於0時原樣輸出,小於0時輸出為0。這樣的話導致了許多網絡節點的更新緩慢。)
PReLU:及時值小於0,網絡的參數也得以更新,加快了收斂速度。
Dice: 盡管對Relu進行了修正得到了PRelu,但是仍然有一個問題,即我們認為分割點都是0,但實際上,分割點應該由數據決定,因此文中提出了Dice激活函數。
文章認為采用PRelu激活函數時,他的rectified point固定為0,這在每一層的輸入分布發生變化時是不適用的,所以文章對該激活函數機型了改進,平滑了rectified point附近曲線的同時,激活函數會根據每層輸入數據的分布來自適應調整rectified point的位置,具體形式如下 :
p(s)的計算主要分為兩步:將si進行標准化和進行sigmoid變換。
另外,期望和方差使用每次訓練的 mini batch data 直接計算,並類似於 Momentum 使用了 指數加權平均:
alpha 是一個超參數,推薦值為 0.99
函數曲線如下所示:
四、評價指標
評價標准是阿里自己提出的 GAUC。並且實踐證明了 GAUC 相比於 AUC 更加穩定、可靠。
AUC 表示正樣本得分比負樣本得分高的概率。在 CTR 實際應用場景中,CTR 預測常被用於對每個用戶候選廣告的排序。但是不同用戶之間存在差異:有些用戶天生就是點擊率高。以往的評價指標對樣本不區分用戶地進行 AUC 的計算。論文采用的 GAUC 實現了用戶級別的 AUC 計算,在單個用戶 AUC 的基礎上,按照點擊次數或展示次數進行加權平均,消除了用戶偏差對模型的影響,更准確的描述了模型的表現效果:
其中權重 w 既可以是展示次數 (impression) 也可以是點擊次數 (clicks)。n 是用戶數量。
五、實現
DIN 在阿里內部的實現,使用了多個 GPU。並行化是基於 模型並行化、數據並行化。命名為 X-Deep Learning(XDL)。
由三部分組成:
-
Distributed Embedding Layer。模型並行化部分,Embedding Layer 的參數分布在多個 GPU 上,完成前向后向傳播計算。
-
Local Backend。單獨的模塊,用來在處理網絡的訓練。使用了開源的 deep learning 框架,比如 tf,mxnet,theano 等。作為一個后端支撐,良好的接口封裝方便集成或切換各個開源框架。
-
Communication Component。基礎模塊,用來幫助 embedding layer 和 backend 來實現並行化。使用 MPI 實現。
分為 模型並行化、數據並行化。
對於一個用戶,一次 pageview 中假設展示了 200 個商品。那么每個商品就對應一條樣本。但是,這 200 條樣本中是有很多Common Feature
的。所以 DIN 的實現中並沒有把用戶都展開,類似於下圖:
對於很多靜態的不變的特征,比如性別、年齡、昨天以前的行為等只計算一次、存儲一次。之后利用索引與其他特征關聯,大幅度的壓縮了樣本的存儲,加快了模型的訓練。最終實驗僅用了 1/3 的資源,獲得了 12 倍的加速。
下圖展示了用戶興趣分布:顏色越暖表示用戶興趣越高,可以看到用戶的興趣分布有多個峰。
利用候選的廣告,反向激活歷史興趣。不同的歷史興趣愛好對於當前候選廣告的權重不同,做到了 local activation,如下圖:
六、 總結
-
用戶有多個興趣愛好,訪問了多個 good_id,shop_id。為了降低緯度並使得商品店鋪間的算術運算有意義,我們先對其進行 Embedding 嵌入。那么我們如何對用戶多種多樣的興趣建模那?使用 Pooling 對 Embedding Vector 求和或者求平均。同時這也解決了不同用戶輸入長度不同的問題,得到了一個固定長度的向量。這個向量就是用戶表示,是用戶興趣的代表。
-
但是,直接求 sum 或 average 損失了很多信息。所以稍加改進,針對不同的 behavior id 賦予不同的權重,這個權重是由當前 behavior id 和候選廣告共同決定的。這就是 Attention 機制,實現了 Local Activation。
-
DIN 使用 activation unit 來捕獲 local activation 的特征,使用 weighted sum pooling 來捕獲 diversity 結構。
-
在模型學習優化上,DIN 提出了 Dice 激活函數、自適應正則 ,顯著的提升了模型性能與收斂速度。
七、代碼
參考文獻:(轉載)
https://blog.csdn.net/livan1234/article/details/85159658
詳細:https://juejin.im/post/6844903645008363527
蓋坤團隊視頻解釋:http://tech.sina.com.cn/roll/2017-07-11/doc-ifyhvyie0999628.shtml、https://www.leiphone.com/news/201707/t0AT4sIgyWS2QWVU.html