這個博客的目的是串一下阿里的一篇利用神經網絡進行點擊率預估的文章。作者提出了DIN (Deep Interest Network) 網絡, 對點擊的提升較大。
特征工程
工業界的數據一般長成categorial的形式,例如,我們有下面的數據:
[weekday=Friday, gender=Female, visited_cate_ids={Bag,Book}, ad_cate_id=Book]
這個數據表示用戶的性別、歷史點擊行為,以及一則目標廣告的類別。
我們可以將這一條數據表示成數值向量的形式:
這個向量的每一個維度都是要么取0要么取1的。
阿里廣告系統中用到的特征
包括
- 用戶畫像的特征,如性別、年齡
- 用戶的行為特征,主要是歷史瀏覽的特征
- 廣告的特征
- 以及Context Features
基線模型
就是作者在上線自己提出的模型之前,阿里線上全量的點擊率預估模型。
這個基線模型的結構長成下面的樣子:
這個網絡的輸入是高維的binary vectors, 緊接着就是embedding layer, 將輸入轉換成一個個低維稠密的向量。這是提高模型的泛化能力所必須的,因為原始的輸入太稀疏了。接下來就是Pooling layer和Concat layer. 注意,如下圖所示,不同的用戶歷史上瀏覽過的商品數量是不一樣的,行為的種類也是不一樣的。因此導致embedding層中embedding的個數也是不一樣的,由於接下來要走一個全連接的MLP,而對於全連接MLP的輸入一定是一個固定長度的向量,因此必須要將不同個數的embedding轉換成一個固定長度的向量。這就需要Pooling。
兩個比較常用的pooling layer是sum pooling和average pooling. 對應於對所有的輸入embeding進行element-wise的求和或者平均。
Deep Interest Network的網絡結構
既然作者提出了DIN網絡,那么肯定是原來的網絡存在缺陷。那么原來的網絡存在什么樣的缺陷呢?從上面我們知道,基線模型為了得到一個固定長度的向量對所有的embedding向量進行了pooling操作,不管候選的廣告是什么,這個pooling操作得到的向量對一個固定的用戶來講都是相同的。因為我們要估計用戶點擊候選廣告的概率,那么如果pooling操作得到的向量都相同,顯然有點不太合理。因此DIN網絡做的一點處理是什么呢?見下圖:
也就是,相比於基線模型,DIN引入了一個local activation unit. 這個local activation unit的作用是得到一些權重,是的原來的pooling是直接對embedding求和變成了對embedding進行加權求和:
當然權重是與候選廣告A有關的。Local activation unit和NMT任務重的attention方法是類似的。不同的地方在於作者這里並沒有要求 \( \sum_i w_i = 1 \)。作者說,也嘗試過LSTM對用戶的歷史數據進行建模,但是並沒有什么卵用。為什么沒有用呢?NLP任務中文本都是基於語法生成的,用戶的歷史行為可能同時包含多種興趣,不同的興趣點之間可能產生rapid jumping以及sudden ending over these interests,所以導致用戶行為序列的數據比較noisy。
訓練技巧
mini-batch aware正則
過擬合是訓練工業級神經網絡的一個挑戰。例如,visited_goods_ids、goods_id的維度可能有6億的規模,如果沒有正則的話,在訓練過程,預測精度會在第一個epoch之后迅速衰減。用傳統的L1或L2正則又不太現實,因為參數太多。Only parameters of non-zero sparse features appearing in each mini-batch needs to be updated in the scenario of SGD based optimization methods without regularization.
因此,在文章中,作者引入一種mini-batch aware的正則,只計算出現在每個mini-batch中非零的sparse features對應的參數的L2-norm就可以了。這樣就大大減小了計算量。
其中
- \( \bm{w}_j \) 是第 \( j \) 個embedding vector.
- \( I( \bm{x}_j \neq 0 ) \) 表示是否 \( \bm{x}\) 有feature id \( j \),
- \( n_j \) 表示feature id \( j \) 在所有的樣本中出現的次數。
- \( \mathcal{S} \) 表示所有的樣本。
上面的表達式寫成mini-batch的形式為:
Data Adaptive激活函數
PReLU激活函數可以表示為:
作者在此基礎上提出了Dice激活函數,可以隨數據進行調整的激活函數。
實驗
實驗指標
不用整體的AUC,而是每個用戶算一個AUC,然后加權平均起來。有文章已經說明這是一個更加合理的評價指標。
如何比較不同模型得到的AUC指標呢? 也就是相對於基線模型,不同的模型的AUC提升或是降低了多少?
在MovieLens和Amazon數據集上的表現
圖中AUC的指標一目了然,不需要過多的解釋。
不同的正則方法的表現
由於Amazon和MovieLens數據集的特征維度並不是很高,因此神經網絡模型過擬合的問題並不是很嚴重,但是阿里巴巴的數據集contains higher dimensional sparse features. 此時,過擬合就是一個非常大的挑戰。作者比較了很多常見的正則方法,例如:
我們看一下Train Loss, Test Loss, Test AUC的變化,來體會一個對於超高維sparse輸入如果不加正則的話會有什么后果。
在阿里巴巴數據集上不同正則化方法的AUC指標
不同模型的比較
在線的AB test的實驗效果
CTR提升10%
RPM提升3.8%
DIN的可視化
由於神經網絡比較難以解釋,一般都會將中間結果進行可視化展示,在這里,作者展示了兩個方面:
- 對adaptive activation weight進行了可視化展示,看一下是不是相似的商品之間的weight比較高。
- 對goods的embedding進行了可視化展示,當然已經降到二維空間進行的展示。同時用不同的顏色表示了不同商品的ctr預測值。顏色越紅CTR越高,顏色越藍,CTR越低。
神經網絡的工作意會即可,不要太較真。都是啟發式的方法。