ctr預估之DeepMVM

ctr預估之DeepMVM

相比於PNN/FNN/DCN等網路來講,DeepFM從效果和理論上來講都更為穩定。那是否還有提升空間呢?答案是有的,而且可以在複雜度不顯著增加的情況下,增強結果。

還是兩條路:1. 設計新的layer,完成顯式的特徵交叉;2. 藉助LR/FM等線性模型,幫助DNN學習更好的特徵表示。

第一條路我暫時沒想到好的思路,那麼就沿著第二條路進一步思考。

(題目中DeepMVM名字我瞎取的)

問題分析

FM可以說把二階交叉學的比較充分了(FFM不考慮,複雜度過高),再往上就是更高階的交叉了,與FM一樣,我們依然可以通過化簡,將高階FM複雜度變為線性。但每增加一階參數就會增加一倍,另外對稀疏數據來講,高階蘊含的信息比低階要小很多,相同參數量的情況下,更難訓練(下篇文章計劃寫下高階FM的實現)。

我也試著對DeepFM引入了三階信息,結果沒有太大變化。那麼有沒有辦法能夠直接拿到所有階的交叉信息,同時參數量又不會顯著增加呢?

至少對於目前的問題是可以的,廣告數據通常包括多個fields,每個field只有一位是1,也就說是全是one hot信息,不包括bag of words類信息(連續特徵不考慮),這點很重要。

想一想對於 x_1,x_2,cdots,x_f ,我們如何一次性得到其任意階的交叉項信息呢。很簡單:

prod_{d=1}^{f}(1+x_d)=(1+x_1)(1+x_2)dots(1+x_f)

這樣從一階到最高 f 階交叉就都有了,而且還不會出現自交叉。

下面說一下完整的理論。

張量分解(Multi-view machine)

具體可以參考論文:Multi-view machine,我主要介紹下基本原理和實現。

假設數據中包含 m 個field,每個field對應的特徵維度分別為 I_p ,那麼對於全交叉模型,可表示為:

hat{y} = sum_{i_1=1}^{I_1+1}cdotssum_{i_m=1}^{I_m+1} w_{i_1,cdots,i_m} left( prod_{p=1}^m z_{ip}^{(p)} 
ight)

其中,

egin{equation} z_{i_p}^{(p)} = egin{cases} 1 &i_p = I_p+1 \ x_{i_p}^{(p)} &otherwise end{cases} end{equation}

模型包含的參數個數為: prod_{p=1}^m (I_p+1) ,要爆炸的節奏。既然FM通過低秩分解降低了參數量,這裡我們拿到的是m維的張量,同樣可以通過對應的張量分解來降低參數量。

對於這樣的權值張量,由於大部分都是0,實際上我們可以對它進行分解來降低參數量(Tucker分解,聯想矩陣的低秩分解)

mathcal{W} = mathbf{C}	imes_1mathbf{A}^{(1)}	imes_2cdots	imes_mmathbf{A}^{(m)}

其中,

w_{i_1,cdots,i_m} = sum_{f=1}^k prod_{p=1}^m a_{i_p,f}^{(p)}

分解後的模型參數個數: ksum_{i=1}^m (I_p+1) = k* fea\_size + k*field\_size ,(嗯,參數量比FM還要少)。

同樣,通過化簡,複雜度變成線性,代碼實現起來比FM還簡潔一些。

egin{align} hat{y} & = sum_{i_1=1}^{I_1+1}cdotssum_{i_m=1}^{I_m+1} w_{i_1,cdots,i_m} left( prod_{p=1}^m z_{ip}^{(p)} 
ight) \ & = sum_{i_1=1}^{I_1+1}cdotssum_{i_m=1}^{I_m+1} left( prod_{p=1}^m z_{ip}^{(p)} 
ight) left( sum_{f=1}^kprod_{p=1}^m a_{i_p,f}^{(p)} 
ight) \ & = sum_{f=1}^k sum_{i_1=1}^{I_1+1}cdotssum_{i_m=1}^{I_m+1}left( prod_{p=1}^m z_{ip}^{(p)}a_{i_p,f}^{(p)} 
ight) \ &=sum_{f=1}^k left( sum_{i_1=1}^{I_1+1} z_{i_1}^{(1)}a_{i_1,f}^{(1)} 
ight) cdots left( sum_{i_m=1}^{I_m+1} z_{i_m}^{(m)}a_{i_m,f}^{(m)} 
ight) \ &=sum_{f=1}^k left( sum_{i_1=1}^{I_1} z_{i_1}^{(1)}a_{i_1,f}^{(1)} + a_{I_1+1,f}^{(1)} 
ight) cdots left( sum_{i_m=1}^{I_m} z_{i_m}^{(m)}a_{i_m,f}^{(m)} + a_{I_m+1,f}^{(1)} 
ight) end{align}

Tensorflow實現

這裡比較重要的是W和bias的初始化,另外這個bias項實際上幫助MultiView machine獲取了field信息,這也是FM所不具備的。

def mvm_part(self, sparse_id, sparse_value): with tf.variable_scope("mvm"): W = tf.get_variable("core_embedding",(self.feature_size, self.factor_size), initializer=tf.random_normal_initializer(0.5, 0.01)) bias = tf.get_variable("padding_bias", (self.field_size, self.factor_size), initializer=tf.random_normal_initializer(0.5, 0.01)) self.embeddings = tf.nn.embedding_lookup(W, sparse_id) # None * F * K self.embeddings = tf.multiply(self.embeddings, sparse_value) all_order = tf.add(self.embeddings, bias) mvm_func = all_order[:,0,:] # None * 1 * K for i in range(1, self.field_size): mvm_func = tf.multiply(mvm_func, all_order[:,i,:]) # None * K mvm_func = tf.reshape(mvm_func, shape=[-1, self.factor_size]) return mvm_func

MVM我喜歡把它比做思想家,而FM更類似於實幹家。MVM就像我們的高T一樣,各方面都有所涉獵,大局觀比較強,FM呢,剛出道,就想專心把二階交叉做到極致。兩者配合的話,效果就很贊了。

所以我們可以用Deep + FM + MVM,複雜度並沒有咋提升,離線測試,在criteo數據集上相比於DeepFM,auc提升了0.3%,logloss下降了-0.02,這個結果其實相當不錯,DeepFM這個基線已經很高,MVM所提供的高階信息+field信息,進一步提升了模型的表現。

---------------

代碼地址:charleshm/deep-ctr


推薦閱讀:

廣告點擊率預估之FM模型的學習和TF代碼實現
FM模型在LTR類問題中的應用

TAG:深度學習DeepLearning | 機器學習 | 點擊率 |