深度长文 | 从FM推演各深度CTR预估模型(附开源代码)
作者丨龍心塵 & 寒小陽
研究方向丨機器學(xué)習(xí),數(shù)據(jù)挖掘
題記:多年以后,當(dāng)資深算法專家們看著無縫對接用戶需求的廣告收入節(jié)節(jié)攀升時,他們可能會想起自己之前痛苦推導(dǎo) FM 與深度學(xué)習(xí)公式的某個夜晚……
本文代碼部分參考了 lambda 等同學(xué)的 TensorFlow 實現(xiàn),在此向原作者表示感謝。
引言?
點擊率(click-through rate, CTR)是互聯(lián)網(wǎng)公司進行流量分配的核心依據(jù)之一。比如互聯(lián)網(wǎng)廣告平臺,為了精細化權(quán)衡和保障用戶、廣告、平臺三方的利益,準(zhǔn)確的 CTR 預(yù)估是不可或缺的。CTR 預(yù)估技術(shù)從傳統(tǒng)的邏輯回歸,到近兩年大火的深度學(xué)習(xí),新的算法層出不窮:DeepFM, NFM, DIN, AFM, DCN……?
然而,相關(guān)的綜述文章不少,但碎片羅列的居多,模型之間內(nèi)在的聯(lián)系和演化思路如何揭示?怎樣才能迅速 get 到新模型的創(chuàng)新點和適用場景,快速提高新論文速度,節(jié)約理解、復(fù)現(xiàn)模型的成本?這些都是亟待解決的問題。?
我們認為,從 FM 及其與神經(jīng)網(wǎng)絡(luò)的結(jié)合出發(fā),能夠迅速貫穿很多深度學(xué)習(xí) CTR 預(yù)估網(wǎng)絡(luò)的思路,從而更好地理解和應(yīng)用模型。
本文的思路與方法
1. 我們試圖從原理上進行推導(dǎo)、理解各個深度 CTR 預(yù)估模型之間的相互關(guān)系,知其然也知其所以然(以下的分析與拆解角度,是一種我們嘗試的理解視角,并不是唯一的理解方式)。
2. 推演的核心思路:“通過設(shè)計網(wǎng)絡(luò)結(jié)構(gòu)進行組合特征的挖掘”。?
3. 具體來說有兩條:其一是從 FM 開始推演其在深度學(xué)習(xí)上的各種推廣(對應(yīng)下圖的紅線),另一條是從 embedding + MLP 自身的演進特點結(jié)合 CTR 預(yù)估本身的業(yè)務(wù)場景進行推演(對應(yīng)下圖黑線部分)。?
4. 為了便于理解,我們簡化了數(shù)據(jù)案例——只考慮離散特征數(shù)據(jù)的建模,以分析不同神經(jīng)網(wǎng)絡(luò)在處理相同業(yè)務(wù)問題時的不同思路。
5. 同時,我們將各典型論文不同風(fēng)格的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖統(tǒng)一按照計算圖來繪制,以便于對比不同模型。
FM:降維版本的特征二階組合
CTR 預(yù)估本質(zhì)是一個二分類問題,以移動端展示廣告推薦為例,依據(jù)日志中的用戶側(cè)的信息(比如年齡,性別,國籍,手機上安裝的 app 列表)、廣告?zhèn)鹊男畔?#xff08;廣告 id,廣告類別,廣告標(biāo)題等)、上下文側(cè)信息(渠道 id 等),去建模預(yù)測用戶是否會點擊該廣告。?
FM 出現(xiàn)之前的傳統(tǒng)的處理方法是人工特征工程加上線性模型(如邏輯回歸 Logistic Regression)。為了提高模型效果,關(guān)鍵技術(shù)是找到到用戶點擊行為背后隱含的特征組合。如男性、大學(xué)生用戶往往會點擊游戲類廣告,因此“男性且是大學(xué)生且是游戲類”的特征組合就是一個關(guān)鍵特征。但這本質(zhì)仍是線性模型,其假設(shè)函數(shù)表示成內(nèi)積形式一般為:
其中為特征向量,為權(quán)重向量,σ() 為 sigmoid 函數(shù)。?
但是人工進行特征組合通常會存在諸多困難,如特征爆炸、特征難以被識別、組合特征難以設(shè)計等。為了讓模型自動地考慮特征之間的二階組合信息,線性模型推廣為二階多項式(2d?Polynomial)模型:
其實就是對特征兩兩相乘(組合)構(gòu)成新特征(離散化之后其實就是“且”操作),并對每個新特征分配獨立的權(quán)重,通過機器學(xué)習(xí)來自動得到這些權(quán)重。將其寫成矩陣形式為:
其中為二階特征組合的權(quán)重矩陣,是對稱矩陣。而這個矩陣參數(shù)非常多,為。為了降低該矩陣的維度,可以將其因子分解(Factorization)為兩個低維(比如 n?k)矩陣的相乘。則此時 W 矩陣的參數(shù)就大幅降低,為O(nk)。公式如下:
這就是 Rendle 等在 2010 年提出因子分解機(Factorization Machines,FM)的名字的由來。FM 的矩陣形式公式如下:
將其寫成內(nèi)積的形式:
利用,可以將上式進一步改寫成求和式的形式:
其中向量是矩陣 W 的第 i 列。為了去除重復(fù)項與特征平方項,上式可以進一步改寫成更為常見的 FM 公式:
對比二階多項式模型,FM 模型中特征兩兩相乘(組合)的權(quán)重是相互不獨立的,它是一種參數(shù)較少但表達力強的模型。
此處附上 FM 的 TensorFlow 代碼實現(xiàn),完整數(shù)據(jù)和代碼請參考網(wǎng)盤。
網(wǎng)盤鏈接:
https://pan.baidu.com/s/1eDwOxweRDPurI2fF51EALQ
注意 FM 通過內(nèi)積進行無重復(fù)項與特征平方項的特征組合過程使用了一個小 trick,就是:
????def?__init__(self,?input_dim=None,?output_dim=1,?factor_order=10,?init_path=None,?opt_algo='gd',?learning_rate=1e-2,
?????????????????l2_w=0,?l2_v=0,?random_seed=None):
????????Model.__init__(self)
????????#?一次、二次交叉、偏置項
????????init_vars?=?[('w',?[input_dim,?output_dim],?'xavier',?dtype),
?????????????????????('v',?[input_dim,?factor_order],?'xavier',?dtype),
?????????????????????('b',?[output_dim],?'zero',?dtype)]
????????self.graph?=?tf.Graph()
????????with?self.graph.as_default():
????????????if?random_seed?is?not?None:
????????????????tf.set_random_seed(random_seed)
????????????self.X?=?tf.sparse_placeholder(dtype)
????????????self.y?=?tf.placeholder(dtype)
????????????self.vars?=?init_var_map(init_vars,?init_path)
????????????w?=?self.vars['w']
????????????v?=?self.vars['v']
????????????b?=?self.vars['b']
????????????#?[(x1+x2+x3)^2?-?(x1^2+x2^2+x3^2)]/2
????????????#?先計算所有的交叉項,再減去平方項(自己和自己相乘)
????????????X_square?=?tf.SparseTensor(self.X.indices,?tf.square(self.X.values),?tf.to_int64(tf.shape(self.X)))
????????????xv?=?tf.square(tf.sparse_tensor_dense_matmul(self.X,?v))
????????????p?=?0.5?*?tf.reshape(
????????????????tf.reduce_sum(xv?-?tf.sparse_tensor_dense_matmul(X_square,?tf.square(v)),?1),
????????????????[-1,?output_dim])
????????????xw?=?tf.sparse_tensor_dense_matmul(self.X,?w)
????????????logits?=?tf.reshape(xw?+?b?+?p,?[-1])
????????????self.y_prob?=?tf.sigmoid(logits)
????????????self.loss?=?tf.reduce_mean(
????????????????tf.nn.sigmoid_cross_entropy_with_logits(logits=logits,?labels=self.y))?+?\
????????????????????????l2_w?*?tf.nn.l2_loss(xw)?+?\
????????????????????????l2_v?*?tf.nn.l2_loss(xv)
????????????self.optimizer?=?get_optimizer(opt_algo,?learning_rate,?self.loss)
????????????#GPU設(shè)定
????????????config?=?tf.ConfigProto()
????????????config.gpu_options.allow_growth?=?True
????????????self.sess?=?tf.Session(config=config)
????????????#?圖中所有variable初始化
????????????tf.global_variables_initializer().run(session=self.sess)
用神經(jīng)網(wǎng)絡(luò)的視角看FM:嵌入后再進行內(nèi)積
我們觀察 FM 公式的矩陣內(nèi)積形式:
發(fā)現(xiàn)部分就是將離散系數(shù)特征通過矩陣乘法降維成一個低維稠密向量。這個過程對神經(jīng)網(wǎng)絡(luò)來說就叫做嵌入(embedding)。所以用神經(jīng)網(wǎng)絡(luò)視角來看:?
1. FM 首先是對離散特征進行嵌入。?
2. 之后通過對嵌入后的稠密向量進行內(nèi)積來進行二階特征組合。?
3. 最后再與線性模型的結(jié)果求和進而得到預(yù)估點擊率。?
其示意圖如下。為了表述清晰,我們繪制的是神經(jīng)網(wǎng)絡(luò)計算圖而不是網(wǎng)絡(luò)結(jié)構(gòu)圖——在網(wǎng)絡(luò)結(jié)構(gòu)圖中增加了權(quán)重 W 的位置。
FM的實際應(yīng)用:考慮領(lǐng)域信息
廣告點擊率預(yù)估模型中的特征以分領(lǐng)域的離散特征為主,如:廣告類別、用戶職業(yè)、手機APP列表等。由于連續(xù)特征比較好處理,為了簡化起見,本文只考慮同時存在不同領(lǐng)域的離散特征的情形。
處理離散特征的常見方法是通過獨熱(one-hot)編碼轉(zhuǎn)換為一系列二值特征向量。然后將這些高維稀疏特征通過嵌入(embedding)轉(zhuǎn)換為低維連續(xù)特征。前面已經(jīng)說明 FM 中間的一個核心步驟就是嵌入,但這個嵌入過程沒有考慮領(lǐng)域信息。這使得同領(lǐng)域內(nèi)的特征也被當(dāng)做不同領(lǐng)域特征進行兩兩組合了。?
其實可以將特征具有領(lǐng)域關(guān)系的特點作為先驗知識加入到神經(jīng)網(wǎng)絡(luò)的設(shè)計中去:同領(lǐng)域的特征嵌入后直接求和作為一個整體嵌入向量,進而與其他領(lǐng)域的整體嵌入向量進行兩兩組合。而這個先嵌入后求和的過程,就是一個單領(lǐng)域的小離散特征向量乘以矩陣的過程。
此時 FM 的過程變?yōu)?#xff1a;對不同領(lǐng)域的離散特征分別進行嵌入,之后再進行二階特征的向量內(nèi)積。其計算圖圖如下所示:
這樣考慮其實是給 FM 增加了一個正則:考慮了領(lǐng)域內(nèi)的信息的相似性。而且還有一個附加的好處,這些嵌入后的同領(lǐng)域特征可以拼接起來作為更深的神經(jīng)網(wǎng)絡(luò)的輸入,達到降維的目的。接下來我們將反復(fù)看到這種處理方式。?
此處需要注意,這與“基于領(lǐng)域的因子分解機”(Field-aware Factorization Machines,FFM)有區(qū)別。FFM 也是 FM 的另一種變體,也考慮了領(lǐng)域信息。但其不同點是同一個特征與不同領(lǐng)域進行特征組合時,其對應(yīng)的嵌入向量是不同的。本文不考慮 FFM 的作用機制。?
經(jīng)過這些改進的 FM 終究還是淺層網(wǎng)絡(luò),它的表現(xiàn)力仍然有限。為了增加模型的表現(xiàn)力(model capacity),一個自然的想法就是將該淺層網(wǎng)絡(luò)不斷“深化”。
embedding+MLP:深度學(xué)習(xí)CTR預(yù)估的通用框架
embedding+MLP 是對于分領(lǐng)域離散特征進行深度學(xué)習(xí) CTR 預(yù)估的通用框架。深度學(xué)習(xí)在特征組合挖掘(特征學(xué)習(xí))方面具有很大的優(yōu)勢。比如以 CNN 為代表的深度網(wǎng)絡(luò)主要用于圖像、語音等稠密特征上的學(xué)習(xí),以 W2V、RNN 為代表的深度網(wǎng)絡(luò)主要用于文本的同質(zhì)化、序列化高維稀疏特征的學(xué)習(xí)。CTR 預(yù)估的主要場景是對離散且有具體領(lǐng)域的特征進行學(xué)習(xí),所以其深度網(wǎng)絡(luò)結(jié)構(gòu)也不同于 CNN 與 RNN。?
具體來說, embedding+MLP 的過程如下:?
1. 對不同領(lǐng)域的 one-hot 特征進行嵌入(embedding),使其降維成低維度稠密特征。?
2. 然后將這些特征向量拼接(concatenate)成一個隱含層。?
3. 之后再不斷堆疊全連接層,也就是多層感知機(Multilayer Perceptron, MLP,有時也叫作前饋神經(jīng)網(wǎng)絡(luò))。?
4. 最終輸出預(yù)測的點擊率。?
其示意圖如下:
embedding+MLP 的缺點是只學(xué)習(xí)高階特征組合,對于低階或者手動的特征組合不夠兼容,而且參數(shù)較多,學(xué)習(xí)較困難。?
FNN:FM與MLP的串聯(lián)結(jié)合
Weinan Zhang 等在 2016 年提出的因子分解機神經(jīng)網(wǎng)絡(luò)(Factorisation Machine supported Neural Network,FNN)將考 FM 與 MLP 進行了結(jié)合。它有著十分顯著的特點:?
1. 采用 FM 預(yù)訓(xùn)練得到的隱含層及其權(quán)重作為神經(jīng)網(wǎng)絡(luò)的第一層的初始值,之后再不斷堆疊全連接層,最終輸出預(yù)測的點擊率。?
2. 可以將 FNN 理解成一種特殊的 embedding+MLP,其要求第一層嵌入后的各領(lǐng)域特征維度一致,并且嵌入權(quán)重的初始化是 FM 預(yù)訓(xùn)練好的。?
3. 這不是一個端到端的訓(xùn)練過程,有貪心訓(xùn)練的思路。而且如果不考慮預(yù)訓(xùn)練過程,模型網(wǎng)絡(luò)結(jié)構(gòu)也沒有考慮低階特征組合。?
其計算圖如下所示:?
通過觀察 FFN 的計算圖可以看出其與 embedding+MLP 確實非常像。不過此處省略了 FNN 的 FM 部分的線性模塊。這種省略為了更好地進行兩個模型的對比。接下來的計算圖我們都會省略線性模塊。
此處附上 FNN 的代碼實現(xiàn),完整數(shù)據(jù)和代碼請參考網(wǎng)盤。?
網(wǎng)盤鏈接:
https://pan.baidu.com/s/1eDwOxweRDPurI2fF51EALQ
????def?__init__(self,?field_sizes=None,?embed_size=10,?layer_sizes=None,?layer_acts=None,?drop_out=None,
?????????????????embed_l2=None,?layer_l2=None,?init_path=None,?opt_algo='gd',?learning_rate=1e-2,?random_seed=None):
????????Model.__init__(self)
????????init_vars?=?[]
????????num_inputs?=?len(field_sizes)
????????for?i?in?range(num_inputs):
????????????init_vars.append(('embed_%d'?%?i,?[field_sizes[i],?embed_size],?'xavier',?dtype))
????????node_in?=?num_inputs?*?embed_size
????????for?i?in?range(len(layer_sizes)):
????????????init_vars.append(('w%d'?%?i,?[node_in,?layer_sizes[i]],?'xavier',?dtype))
????????????init_vars.append(('b%d'?%?i,?[layer_sizes[i]],?'zero',?dtype))
????????????node_in?=?layer_sizes[i]
????????self.graph?=?tf.Graph()
????????with?self.graph.as_default():
????????????if?random_seed?is?not?None:
????????????????tf.set_random_seed(random_seed)
????????????self.X?=?[tf.sparse_placeholder(dtype)?for?i?in?range(num_inputs)]
????????????self.y?=?tf.placeholder(dtype)
????????????self.keep_prob_train?=?1?-?np.array(drop_out)
????????????self.keep_prob_test?=?np.ones_like(drop_out)
????????????self.layer_keeps?=?tf.placeholder(dtype)
????????????self.vars?=?init_var_map(init_vars,?init_path)
????????????w0?=?[self.vars['embed_%d'?%?i]?for?i?in?range(num_inputs)]
????????????xw?=?tf.concat([tf.sparse_tensor_dense_matmul(self.X[i],?w0[i])?for?i?in?range(num_inputs)],?1)
????????????l?=?xw
????????????#全連接部分
????????????for?i?in?range(len(layer_sizes)):
????????????????wi?=?self.vars['w%d'?%?i]
????????????????bi?=?self.vars['b%d'?%?i]
????????????????print(l.shape,?wi.shape,?bi.shape)
????????????????l?=?tf.nn.dropout(
????????????????????activate(
????????????????????????tf.matmul(l,?wi)?+?bi,
????????????????????????layer_acts[i]),
????????????????????self.layer_keeps[i])
????????????l?=?tf.squeeze(l)
????????????self.y_prob?=?tf.sigmoid(l)
????????????self.loss?=?tf.reduce_mean(
????????????????tf.nn.sigmoid_cross_entropy_with_logits(logits=l,?labels=self.y))
????????????if?layer_l2?is?not?None:
????????????????self.loss?+=?embed_l2?*?tf.nn.l2_loss(xw)
????????????????for?i?in?range(len(layer_sizes)):
????????????????????wi?=?self.vars['w%d'?%?i]
????????????????????self.loss?+=?layer_l2[i]?*?tf.nn.l2_loss(wi)
????????????self.optimizer?=?get_optimizer(opt_algo,?learning_rate,?self.loss)
????????????config?=?tf.ConfigProto()
????????????config.gpu_options.allow_growth?=?True
????????????self.sess?=?tf.Session(config=config)
????????????tf.global_variables_initializer().run(session=self.sess)
NFM:通過逐元素乘法延遲FM的實現(xiàn)過程
我們再回到考慮領(lǐng)域信息的 FM,它仍有改進的空間。因為以上這些網(wǎng)絡(luò)的 FM 部分都是只進行嵌入向量的兩兩內(nèi)積后直接求和,沒有充分利用二階特征組合的信息。Xiangnan He 等在 2017 年提出了神經(jīng)網(wǎng)絡(luò)因子分解機(Neural Factorization Machines,NFM)對此作出了改進。其計算圖如下所示:
NFM 的基本特點是:?
1. 利用二階交互池化層(Bi-Interaction Pooling)對 FM 嵌入后的向量兩兩進行元素級別的乘法,形成同維度的向量求和后作為前饋神經(jīng)網(wǎng)絡(luò)的輸入。計算圖中用圈乘 ? 表示逐元素乘法運算。?
2. NFM 與 DeepFM 的區(qū)別是沒有單獨的 FM 的淺層網(wǎng)絡(luò)進行聯(lián)合訓(xùn)練,而是將其整合后直接輸出給前饋神經(jīng)網(wǎng)絡(luò)。?
3. 當(dāng) MLP 的全連接層都是恒等變換且最后一層參數(shù)全為 1 時,NFM 就退化成了 FM。可見,NFM 是 FM 的推廣,它推遲了 FM 的實現(xiàn)過程,并在其中加入了更多非線性運算。?
4. 另一方面,我們觀察計算圖會發(fā)現(xiàn) NFM 與 FNN 非常相似。它們的主要區(qū)別是 NFM 在 embedding 之后對特征進行了兩兩逐元素乘法。因為逐元素相乘的向量維數(shù)不變,之后對這些向量求和的維數(shù)仍然與 embedding 的維數(shù)一致。因此輸入到 MLP 的參數(shù)比起直接 concatenate 的 FNN 更少。?
此處附上 NFM 的代碼實現(xiàn),完整數(shù)據(jù)和代碼請參考網(wǎng)盤:
網(wǎng)盤鏈接:
https://pan.baidu.com/s/1eDwOxweRDPurI2fF51EALQ
????"""Bulid?Model?function?f(x)?for?Estimator."""
????#------hyperparameters----
????field_size?=?params["field_size"]
????feature_size?=?params["feature_size"]
????embedding_size?=?params["embedding_size"]
????l2_reg?=?params["l2_reg"]
????learning_rate?=?params["learning_rate"]
????#optimizer?=?params["optimizer"]
????layers?=?map(int,?params["deep_layers"].split(','))
????dropout?=?map(float,?params["dropout"].split(','))
????#------bulid?weights------
????Global_Bias?=?tf.get_variable(name='bias',?shape=[1],?initializer=tf.constant_initializer(0.0))
????Feat_Bias?=?tf.get_variable(name='linear',?shape=[feature_size],?initializer=tf.glorot_normal_initializer())
????Feat_Emb?=?tf.get_variable(name='emb',?shape=[feature_size,embedding_size],?initializer=tf.glorot_normal_initializer())
????#------build?feaure-------
????feat_ids??=?features['feat_ids']
????feat_ids?=?tf.reshape(feat_ids,shape=[-1,field_size])
????feat_vals?=?features['feat_vals']
????feat_vals?=?tf.reshape(feat_vals,shape=[-1,field_size])
????#------build?f(x)------
????with?tf.variable_scope("Linear-part"):
????????feat_wgts?=?tf.nn.embedding_lookup(Feat_Bias,?feat_ids)?????????#?None?*?F?*?1
????????y_linear?=?tf.reduce_sum(tf.multiply(feat_wgts,?feat_vals),1)
????with?tf.variable_scope("BiInter-part"):
????????embeddings?=?tf.nn.embedding_lookup(Feat_Emb,?feat_ids)?????????#?None?*?F?*?K
????????feat_vals?=?tf.reshape(feat_vals,?shape=[-1,?field_size,?1])
????????embeddings?=?tf.multiply(embeddings,?feat_vals)?????????????????#?vij?*?xi
????????sum_square_emb?=?tf.square(tf.reduce_sum(embeddings,1))
????????square_sum_emb?=?tf.reduce_sum(tf.square(embeddings),1)
????????deep_inputs?=?0.5*tf.subtract(sum_square_emb,?square_sum_emb)???#?None?*?K
????with?tf.variable_scope("Deep-part"):
????????if?mode?==?tf.estimator.ModeKeys.TRAIN:
????????????train_phase?=?True
????????else:
????????????train_phase?=?False
????????if?mode?==?tf.estimator.ModeKeys.TRAIN:
????????????deep_inputs?=?tf.nn.dropout(deep_inputs,?keep_prob=dropout[0])??????????????????????#?None?*?K
????????for?i?in?range(len(layers)):
????????????deep_inputs?=?tf.contrib.layers.fully_connected(inputs=deep_inputs,?num_outputs=layers[i],?\
????????????????weights_regularizer=tf.contrib.layers.l2_regularizer(l2_reg),?scope='mlp%d'?%?i)
????????????if?FLAGS.batch_norm:
????????????????deep_inputs?=?batch_norm_layer(deep_inputs,?train_phase=train_phase,?scope_bn='bn_%d'?%i)???#放在RELU之后?https://github.com/ducha-aiki/caffenet-benchmark/blob/master/batchnorm.md#bn----before-or-after-relu
????????????if?mode?==?tf.estimator.ModeKeys.TRAIN:
????????????????deep_inputs?=?tf.nn.dropout(deep_inputs,?keep_prob=dropout[i])??????????????????????????????#Apply?Dropout?after?all?BN?layers?and?set?dropout=0.8(drop_ratio=0.2)
????????????????#deep_inputs?=?tf.layers.dropout(inputs=deep_inputs,?rate=dropout[i],?training=mode?==?tf.estimator.ModeKeys.TRAIN)
????????y_deep?=?tf.contrib.layers.fully_connected(inputs=deep_inputs,?num_outputs=1,?activation_fn=tf.identity,?\
????????????weights_regularizer=tf.contrib.layers.l2_regularizer(l2_reg),?scope='deep_out')
????????y_d?=?tf.reshape(y_deep,shape=[-1])
????with?tf.variable_scope("NFM-out"):
????????#y_bias?=?Global_Bias?*?tf.ones_like(labels,?dtype=tf.float32)??#?None?*?1??warning;這里不能用label,否則調(diào)用predict/export函數(shù)會出錯,train/evaluate正常;初步判斷estimator做了優(yōu)化,用不到label時不傳
????????y_bias?=?Global_Bias?*?tf.ones_like(y_d,?dtype=tf.float32)??????#?None?*?1
????????y?=?y_bias?+?y_linear?+?y_d
????????pred?=?tf.sigmoid(y)
????predictions={"prob":?pred}
????export_outputs?=?{tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:?tf.estimator.export.PredictOutput(predictions)}
????#?Provide?an?estimator?spec?for?`ModeKeys.PREDICT`
????if?mode?==?tf.estimator.ModeKeys.PREDICT:
????????return?tf.estimator.EstimatorSpec(
????????????????mode=mode,
????????????????predictions=predictions,
????????????????export_outputs=export_outputs)
????#------bulid?loss------
????loss?=?tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=y,?labels=labels))?+?\
????????l2_reg?*?tf.nn.l2_loss(Feat_Bias)?+?l2_reg?*?tf.nn.l2_loss(Feat_Emb)
????#?Provide?an?estimator?spec?for?`ModeKeys.EVAL`
????eval_metric_ops?=?{
????????"auc":?tf.metrics.auc(labels,?pred)
????}
????if?mode?==?tf.estimator.ModeKeys.EVAL:
????????return?tf.estimator.EstimatorSpec(
????????????????mode=mode,
????????????????predictions=predictions,
????????????????loss=loss,
????????????????eval_metric_ops=eval_metric_ops)
????#------bulid?optimizer------
????if?FLAGS.optimizer?==?'Adam':
????????optimizer?=?tf.train.AdamOptimizer(learning_rate=learning_rate,?beta1=0.9,?beta2=0.999,?epsilon=1e-8)
????elif?FLAGS.optimizer?==?'Adagrad':
????????optimizer?=?tf.train.AdagradOptimizer(learning_rate=learning_rate,?initial_accumulator_value=1e-8)
????elif?FLAGS.optimizer?==?'Momentum':
????????optimizer?=?tf.train.MomentumOptimizer(learning_rate=learning_rate,?momentum=0.95)
????elif?FLAGS.optimizer?==?'ftrl':
????????optimizer?=?tf.train.FtrlOptimizer(learning_rate)
????train_op?=?optimizer.minimize(loss,?global_step=tf.train.get_global_step())
????#?Provide?an?estimator?spec?for?`ModeKeys.TRAIN`?modes
????if?mode?==?tf.estimator.ModeKeys.TRAIN:
????????return?tf.estimator.EstimatorSpec(
????????????????mode=mode,
????????????????predictions=predictions,
????????????????loss=loss,
????????????????train_op=train_op)
AFM:對簡化版NFM進行加權(quán)求和
NFM 的主要創(chuàng)新點是在 FM 過程中添加了逐元素相乘的運算來增加模型的復(fù)雜度。但沒有在此基礎(chǔ)上添加更復(fù)雜的運算過程,比如對加權(quán)求和。Jun Xiao 等在 2017 年提出了注意力因子分解模型(Attentional Factorization Machine,AFM)就是在這個方向上的改進。其計算圖如下所示:
AFM 的特點是:?
1. AFM 與 NFM 都是致力于充分利用二階特征組合的信息,對嵌入后的向量兩兩進行逐元素乘法,形成同維度的向量。而且 AFM 沒有 MLP 部分。?
2. AFM 通過在逐元素乘法之后形成的向量進行加權(quán)求和,而且權(quán)重是基于網(wǎng)絡(luò)自身來產(chǎn)生的。其方法是引入一個注意力子網(wǎng)絡(luò)(Attention Net)。?
3. 當(dāng)權(quán)重都相等時,AFM 退化成無全連接層的 NFM。??
4. “注意力子網(wǎng)絡(luò)”的主要操作是進行矩陣乘法,其最終輸出結(jié)果為 softmax,以保證各分量的權(quán)重本身是一個概率分布。
PNN:通過改進向量乘法運算延遲FM的實現(xiàn)過程
再回到 FM。既然 AFM、NFM 可以通過添加逐元素乘法的運算來增加模型的復(fù)雜度,那向量乘法有這么多,可否用其他的方法增加 FM 復(fù)雜度?答案是可以的。Huifeng Guo 等在 2016 年提出了基于向量積的神經(jīng)網(wǎng)絡(luò)(Product-based Neural Networks,PNN)就是一個典型例子。其簡化計算圖如下所示:
對比之前模型的計算圖,我們可以發(fā)現(xiàn) PNN 的基本特點是:?
1. 利用二階向量積層(Pair-wisely Connected Product Layer)對 FM 嵌入后的向量兩兩進行向量積,形成的結(jié)果作為之后 MLP 的輸入。計算圖中用圓點 ? 表示向量積運算。PNN 采用的向量積有內(nèi)積與外積兩種形式。?
3. 需要說明的是,本計算圖中省略了 PNN 中向量與常數(shù) 1 進行的乘法運算。這部分其實與 FNN 類似,不是 PNN 的主要創(chuàng)新點。故在此圖中省略。?
3. 對于內(nèi)積形式的 PNN,因為兩個向量相乘的結(jié)果為標(biāo)量,可以直接把各個標(biāo)量“拼接”成一個大向量,就可以作為 MLP 的輸入了。?
4. 當(dāng) MLP 的全連接層都是恒等變換且最后一層參數(shù)全為 1 時,內(nèi)積形式的 PNN 就退化成了 FM。?
5. 對于外積形式的 PNN,因為兩個向量相乘相當(dāng)于列向量與行向量進行矩陣相乘,得到的結(jié)果為一個矩陣。各個矩陣向之前內(nèi)積形式的操作一樣直接拼接起來維數(shù)太多,論文的簡化方案是直接對各個矩陣進行求和,得到的新矩陣(可以理解成之后對其拉長成向量)就直接作為 MLP 的輸入。?
6. 觀察計算圖發(fā)現(xiàn)外積形式的 PNN 與 NFM 很像,其實就是?PNN 把 NFM 的逐元素乘法換成了外積。?
此處分別附上 PNN 的內(nèi)積與外積形式代碼,完整數(shù)據(jù)和代碼請參考網(wǎng)盤。
網(wǎng)盤鏈接:
https://pan.baidu.com/s/1eDwOxweRDPurI2fF51EALQ
DCN:高階FM的降維實現(xiàn)
以上的 FM 推廣形式,主要是對 FM 進行二階特征組合。高階特征組合是通過 MLP 實現(xiàn)的。但這兩種實現(xiàn)方式是有很大不同的,FM 更多是通過向量 embedding 之間的內(nèi)積來實現(xiàn),而 MLP 則是在向量 embedding 之后一層一層進行權(quán)重矩陣乘法實現(xiàn)。可否直接將 FM 的過程在高階特征組合上進行推廣?答案是可以的。Ruoxi Wang 等在 2017 提出的深度與交叉神經(jīng)網(wǎng)絡(luò)(Deep & Cross Network,DCN)就是在這個方向進行改進的。DCN 的計算圖如下:
DCN 的特點如下:?
1. Deep 部分就是普通的 MLP 網(wǎng)絡(luò),主要是全連接。?
2. 與 DeepFM 類似,DCN 是由 embedding + MLP 部分與 cross 部分進行聯(lián)合訓(xùn)練的。Cross 部分是對 FM 部分的推廣。?
3. Cross 部分的公式如下:
4. 可以證明,cross 網(wǎng)絡(luò)是 FM 的過程在高階特征組合的推廣。完全的證明需要一些公式推導(dǎo),感興趣的同學(xué)可以直接參考原論文的附錄。
5. 而用簡單的公式證明可以得到一個很重要的結(jié)論:只有兩層且第一層與最后一層權(quán)重參數(shù)相等時的 Cross 網(wǎng)絡(luò)與簡化版 FM 等價。
6. 此處對應(yīng)簡化版的 FM 視角是將拼接好的稠密向量作為輸入向量,且不做領(lǐng)域方面的區(qū)分(但產(chǎn)生這些稠密向量的過程是考慮領(lǐng)域信息的,相對全特征維度的全連接層減少了大量參數(shù),可以視作稀疏鏈接思想的體現(xiàn))。而且之后進行 embedding 權(quán)重矩陣 W 只有一列——是退化成列向量的情形。
7. 與 MLP 網(wǎng)絡(luò)相比,Cross 部分在增加高階特征組合的同時減少了參數(shù)的個數(shù),并省去了非線性激活函數(shù)。
Wide&Deep:DeepFM與DCN的基礎(chǔ)框架
開篇已經(jīng)提到,本文思路有兩條主線。到此為止已經(jīng)將基于 FM 的主線介紹基本完畢。接下來將串講從 embedding+MLP 自身的演進特點的 CTR 預(yù)估模型主線,而這條思路與我們之前的 FM 思路同樣有千絲萬縷的聯(lián)系。?
Google 在 2016 年提出的寬度與深度模型(Wide&Deep)在深度學(xué)習(xí) CTR 預(yù)估模型中占有非常重要的位置,它奠定了之后基于深度學(xué)習(xí)的廣告點擊率預(yù)估模型的框架。?
Wide&Deep將深度模型與線性模型進行聯(lián)合訓(xùn)練,二者的結(jié)果求和輸出為最終點擊率。其計算圖如下:?
我們將 Wide&Deep 的計算圖與之前的模型進行對比可知:
1. Wide&Deep 是前面介紹模型 DeepFM 與 DCN 的基礎(chǔ)框架。這些模型均采用神經(jīng)網(wǎng)絡(luò)聯(lián)合訓(xùn)練的思路,對神經(jīng)網(wǎng)絡(luò)進行并聯(lián)。
2. DeepFM、DCN 與 Wide&Deep 的 Deep 部分都是 MLP。
3. Wide&Deep 的 Wide 部分是邏輯回歸,可以手動設(shè)計組合特征。
4. DeepFM 的 Wide 部分是 FM,DCN 的 Wide 部分是 Cross 網(wǎng)絡(luò),二者均不強求手動設(shè)計特征。但此時都與字面意義上的 Wide 有一定差異,因為均共享了降維后的嵌入特征。
此處附上 DeepFM 的代碼實現(xiàn),完整數(shù)據(jù)和代碼請參考網(wǎng)盤:
網(wǎng)盤鏈接:
https://pan.baidu.com/s/1eDwOxweRDPurI2fF51EALQ
????print("Model?directory?=?%s"?%?model_dir)
????#?對checkpoint去做設(shè)定
????runconfig?=?tf.contrib.learn.RunConfig(
????????save_checkpoints_secs=None,
????????save_checkpoints_steps?=?100,
????)
????m?=?None
????#?寬模型
????if?model_type?==?'WIDE':
????????m?=?tf.contrib.learn.LinearClassifier(
????????????model_dir=model_dir,?
????????????feature_columns=wide_columns)
????#?深度模型
????if?model_type?==?'DEEP':
????????m?=?tf.contrib.learn.DNNClassifier(
????????????model_dir=model_dir,
????????????feature_columns=deep_columns,
????????????hidden_units=[100,?50,?25])
????#?寬度深度模型
????if?model_type?==?'WIDE_AND_DEEP':
????????m?=?tf.contrib.learn.DNNLinearCombinedClassifier(
????????????model_dir=model_dir,
????????????linear_feature_columns=wide_columns,
????????????dnn_feature_columns=deep_columns,
????????????dnn_hidden_units=[100,?70,?50,?25],
????????????config=runconfig)
????print('estimator?built')
????return?m
Deep Cross:DCN由其殘差網(wǎng)絡(luò)思想進化
由 K. He 等提出的深度殘差網(wǎng)絡(luò)能夠大大加深神經(jīng)網(wǎng)絡(luò)的深度,同時不會引起退化的問題,顯著提高了模型的精度。Ying Shan 等將該思路應(yīng)用到廣告點擊率預(yù)估模型中,提出深度交叉模型(DeepCross,2016)。Deep Cross 的計算圖如下:
將 Deep Cross 與之前的模型對比,可以發(fā)現(xiàn)其特點是:?
1. 對 embedding+MLP 的改進主要是 MLP 部分增加跳躍連接成為殘差網(wǎng)絡(luò)。?
2. Deep Cross 與傳統(tǒng)的殘差網(wǎng)絡(luò)的區(qū)別主要是沒有采用卷積操作。其中一個原因是在廣告點擊率預(yù)估領(lǐng)域,特征不具備平移不變性。?
3. DCN 其實是從 Deep Cross 進化出來的版本。DCN 相對 Deep Cross 的主要貢獻是解耦了 Deep 與 Cross(特征交叉)部分。?
4. 因此 DCN 中的 Cross 部分可以理解為殘差網(wǎng)絡(luò)的變體:其將 Deep Cross 的跨越鏈接縮短為只有一層,而全連接部分改為與權(quán)重向量和輸入向量的內(nèi)積。
DIN:對同領(lǐng)域歷史信息引入注意力機制的MLP
以上神經(jīng)網(wǎng)絡(luò)對同領(lǐng)域離散特征的處理基本是將其嵌入后直接求和,這在一般情況下沒太大問題。但其實可以做得更加精細。
比如對于歷史統(tǒng)計類特征。以用戶歷史瀏覽的商戶 id 為例,假設(shè)用戶歷史瀏覽了 10 個商戶,這些商戶 id 的常規(guī)處理方法是作為同一個領(lǐng)域的特征嵌入后直接求和得到一個嵌入向量。但這 10 個商戶只有一兩個商戶與當(dāng)前被預(yù)測的廣告所在的商戶相似,其他商戶關(guān)系不大。增加這兩個商戶在求和過程中的權(quán)重,應(yīng)該能夠更好地提高模型的表現(xiàn)力。而增加求和權(quán)重的思路就是典型的注意力機制思路。?
由 Bahdanau et al. (2015) 引入的現(xiàn)代注意力機制,本質(zhì)上是加權(quán)平均(權(quán)重是模型根據(jù)數(shù)據(jù)學(xué)習(xí)出來的),其在機器翻譯上應(yīng)用得非常成功。受注意力機制的啟發(fā),Guorui Zhou 等在 2017 年提出了深度興趣網(wǎng)絡(luò)(Deep Interest Network,DIN)。DIN 主要關(guān)注用戶在同一領(lǐng)域的歷史行為特征,如瀏覽了多個商家、多個商品等。DIN 可以對這些特征分配不同的權(quán)重進行求和。其網(wǎng)絡(luò)結(jié)構(gòu)圖如下:
1. 此處采用原論文的結(jié)構(gòu)圖,表示起來更清晰。
2. DIN 考慮對同一領(lǐng)域的歷史特征進行加權(quán)求和,以加強其感興趣的特征的影響。
3. 用戶的每個領(lǐng)域的歷史特征權(quán)重則由該歷史特征及其對應(yīng)備選廣告特征通過一個子網(wǎng)絡(luò)得到。即用戶歷史瀏覽的商戶特征與當(dāng)前瀏覽商戶特征對應(yīng),歷史瀏覽的商品特征與當(dāng)前瀏覽商品特征對應(yīng)。
4. 權(quán)重子網(wǎng)絡(luò)主要包括特征之間的元素級別的乘法、加法和全連接等操作。
5. AFM 也引入了注意力機制。但是?AFM 是將注意力機制與 FM 同領(lǐng)域特征求和之后進行結(jié)合,DIN 直接是將注意力機制與同領(lǐng)域特征求和之前進行結(jié)合。
多任務(wù)視角:信息的遷移與補充
對于數(shù)據(jù)驅(qū)動的解決方案而言,數(shù)據(jù)和模型同樣重要,數(shù)據(jù)(特征)通常決定了效果的上限,各式各樣的模型會以不同的方式去逼近這個上限。而所有算法應(yīng)用的老司機都知道很多場景下,如果有更多的數(shù)據(jù)進行模型訓(xùn)練,效果一般都能顯著得到提高。
廣告也是一樣的場景,在很多電商的平臺上會有很多不同場景的廣告位,每個場景蘊含了用戶的不同興趣的表達,這些信息的匯總與融合可以帶來最后效果的提升。但是將不同場景的數(shù)據(jù)直接進行合并用來訓(xùn)練(ctr/cvr)模型,結(jié)果很多時候并不是很樂觀,仔細想想也是合理的,不同場景下的樣本分布存在差異,直接對樣本累加會影響分布導(dǎo)致效果負向。
而深度學(xué)習(xí)發(fā)展,使得信息的融合與應(yīng)用有了更好的進展,用 Multi?task learning (MTL)的方式可以很漂亮的解決上面提到的問題。我們不直接對樣本進行累加和訓(xùn)練,而是像上圖所示,把兩個場景分為兩個 task,即分為兩個子網(wǎng)絡(luò)。
對單個網(wǎng)絡(luò)而言,底層的 embedding 層的表達受限于單場景的數(shù)據(jù)量,很可能學(xué)習(xí)不充分。而上圖這樣的網(wǎng)絡(luò)結(jié)合,使得整個訓(xùn)練過程有了表示學(xué)習(xí)的共享(Shared Lookup Table),這種共享有助于大樣本的子任務(wù)幫助小樣本的子任務(wù),使得底層的表達學(xué)習(xí)更加充分。?
DeepFM 和 DCN 也用到了這個思路!只是它們是對同一任務(wù)的不同模型進行結(jié)合,而多任務(wù)學(xué)習(xí)是對不同任務(wù)的不同模型進行結(jié)合。而且,我們可以玩得更加復(fù)雜。?
Multi-task learning (MTL) 整個結(jié)構(gòu)的上層的不同的 task 的子網(wǎng)絡(luò)是不一樣的,這樣每個子網(wǎng)絡(luò)可以各自去擬合自己 task 對應(yīng)的概念分布。并且,取決于問題與場景的相似性和復(fù)雜度,可以把底層的表達學(xué)習(xí),從簡單的共享 embedding 到共享一些層次的表達。極端的情況是我們可以直接共享所有的表達學(xué)習(xí)(representation learning)部分,而只接不同的網(wǎng)絡(luò) head 來完成不一樣的任務(wù)。這樣帶來的另外一個好處是,不同的task 可以共享一部分計算,從而實現(xiàn)計算的加速。?
值得一提的另一篇 paper 是阿里媽媽團隊提出的“完整空間多任務(wù)模型”(Entire Space Multi-Task Model,ESMM),也是很典型的多任務(wù)學(xué)習(xí)和信息補充思路,這篇 paper 解決的問題不是 CTR(點擊率)預(yù)估而是 CVR(轉(zhuǎn)化率)預(yù)估,傳統(tǒng) CVR 預(yù)估模型會有比較明顯的樣本選擇偏差(sample selection bias)和訓(xùn)練數(shù)據(jù)過于稀疏(data sparsity)的問題,而 ESMM 模型利用用戶行為序列數(shù)據(jù),在完整的樣本數(shù)據(jù)空間同時學(xué)習(xí)點擊率和轉(zhuǎn)化率(post-view clickthrough&conversion rate,CTCVR),在一定程度上解決了這個問題。?
在電商的場景下,用戶的決策過程很可能是這樣的,在觀察到系統(tǒng)展現(xiàn)的推薦商品列表后,點擊自己感興趣的商品,進而產(chǎn)生購買行為。所以用戶行為遵循這樣一個決策順序:impression → click → conversion。CVR 模型旨在預(yù)估用戶在觀察到曝光商品進而點擊到商品詳情頁之后購買此商品的概率,即 pCVR = p (conversion|click, impression)。?
預(yù)估點擊率 pCTR,預(yù)估點擊下單率 pCVR 和預(yù)估點擊與下單率 pCTCVR 關(guān)系如下。
傳統(tǒng)的 CVR 預(yù)估任務(wù)通常采用類似于 CTR 預(yù)估的技術(shù)進行建模。但是不同于 CTR 預(yù)估任務(wù)的是,這個場景面臨一些特有的挑戰(zhàn):1) 樣本選擇偏差;2) 訓(xùn)練數(shù)據(jù)稀疏;3) 延遲反饋等。
ESMM 模型提出了下述的網(wǎng)絡(luò)結(jié)構(gòu)進行問題建模:
EMMS 的特點是:?
1. 在整個樣本空間建模。pCVR 可以在先估計出 pCTR 和 pCTCVR 之后計算得出,如下述公式。從原理上看,相當(dāng)于分別單獨訓(xùn)練兩個模型擬合出 pCTR 和 pCTCVR,進而計算得到 pCVR。
注意到 pCTR 和 pCTCVR 是在整個樣本空間上建模得到的,pCVR 只是一個中間變量。因此,ESMM 模型是在整個樣本空間建模,而不像傳統(tǒng) CVR 預(yù)估模型那樣只在點擊樣本空間建模。?
2. 特征表示層共享。ESMM 模型借鑒遷移學(xué)習(xí)和 multi-task learning 的思路,在兩個子網(wǎng)絡(luò)的 embedding 層共享特征表示詞典。embedding 層的表達參數(shù)占了整個網(wǎng)絡(luò)參數(shù)的絕大部分,參數(shù)量大,需要大量的訓(xùn)練樣本才能學(xué)習(xí)充分。顯然 CTR 任務(wù)的訓(xùn)練樣本量要大大超過 CVR 任務(wù)的訓(xùn)練樣本量,ESMM 模型中特征表示共享的機制能夠使得 CVR 子任務(wù)也能夠從只有展現(xiàn)沒有點擊的樣本中學(xué)習(xí),從而在一定程度上緩解訓(xùn)練數(shù)據(jù)稀疏性問題。
各種模型的對比和總結(jié)
前面介紹了各種基于深度學(xué)習(xí)的廣告點擊率預(yù)估算法模型,針對不同的問題、基于不同的思路,不同的模型有各自的特點。各個模型具體關(guān)系比較如下表 1 所示:
▲?表1.?各模型對比
本文從開篇就說明這些模型推演的核心思路是“通過設(shè)計網(wǎng)絡(luò)結(jié)構(gòu)進行組合特征的挖掘”,其在各個模型的實現(xiàn)方式如下:
1. FM 其實是對嵌入特征進行兩兩內(nèi)積實現(xiàn)特征二階組合;FNN 在 FM 基礎(chǔ)上引入了 MLP;?
2. DeepFM 通過聯(lián)合訓(xùn)練、嵌入特征共享來兼顧 FM 部分與 MLP 部分不同的特征組合機制; 3. NFM、PNN 則是通過改造向量積的方式來延遲FM的實現(xiàn)過程,在其中添加非線性成分來提升模型表現(xiàn)力;?
4. AFM 更進一步,直接通過子網(wǎng)絡(luò)來對嵌入向量的兩兩逐元素乘積進行加權(quán)求和,以實現(xiàn)不同組合的差異化,也是一種延遲 FM 實現(xiàn)的方式;?
5. DCN 則是將 FM 進行高階特征組合的方向上進行推廣,并結(jié)合 MLP 的全連接式的高階特征組合機制;?
6. Wide&Deep 是兼容手工特征組合與 MLP 的特征組合方式,是許多模型的基礎(chǔ)框架;?
7. Deep Cross 是引入殘差網(wǎng)絡(luò)機制的前饋神經(jīng)網(wǎng)絡(luò),給高維的 MLP 特征組合增加了低維的特征組合形式,啟發(fā)了 DCN;?
8. DIN 則是對用戶側(cè)的某歷史特征和廣告?zhèn)鹊耐I(lǐng)域特征進行組合,組合成的權(quán)重反過來重新影響用戶側(cè)的該領(lǐng)域各歷史特征的求和過程;?
9. 多任務(wù)視角則是更加宏觀的思路,結(jié)合不同任務(wù)(而不僅是同任務(wù)的不同模型)對特征的組合過程,以提高模型的泛化能力。
當(dāng)然,廣告點擊率預(yù)估深度學(xué)習(xí)模型還有很多,比如 Jie Zhu 提出的基于決策樹的神經(jīng)網(wǎng)絡(luò)(Deep Embedding Forest)將深度學(xué)習(xí)與樹型模型結(jié)合起來。如果數(shù)據(jù)特征存在圖像或者大量文本相關(guān)特征,傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)均可以結(jié)合到廣告點擊率預(yù)估的場景中。各個深度模型都有相應(yīng)的特點,限于篇幅,我們就不再贅述了。
后記
目前深度學(xué)習(xí)的算法層出不窮,看論文確實有些應(yīng)接不暇。我們的經(jīng)驗有兩點:要有充分的生產(chǎn)實踐經(jīng)驗,同時要有扎實的算法理論基礎(chǔ)。很多論文的亮點其實是來自于實際做工程的經(jīng)驗。也幸虧筆者一直都在生產(chǎn)一線并帶領(lǐng)算法團隊進行工程研發(fā),積淀了一些特征工程、模型訓(xùn)練的經(jīng)驗,才勉強跟得上新論文。比如 DIN“對用戶側(cè)的某領(lǐng)域歷史特征基于廣告?zhèn)鹊耐I(lǐng)域特征進行加權(quán)求和”的思想,其實與傳統(tǒng)機器學(xué)習(xí)對強業(yè)務(wù)相關(guān)特征進行針對性特征組合的特征工程思路比較相似。
另一方面,對深度學(xué)習(xí)的經(jīng)典、前沿方法的熟悉也很重要。從前面我們的串講也能夠看出,CTR 預(yù)估作為一個業(yè)務(wù)特點很強的場景,在應(yīng)用深度學(xué)習(xí)的道路上,也充分借鑒了注意力機制、殘差網(wǎng)絡(luò)、聯(lián)合訓(xùn)練、多任務(wù)學(xué)習(xí)等經(jīng)典的深度學(xué)習(xí)方法。了解博主的朋友也知道我們一直推崇理論與實踐相結(jié)合的思路,我們自身對這條經(jīng)驗也非常受用。當(dāng)然,計算廣告是一個很深的領(lǐng)域,自己研究尚淺,串講難免存在紕漏。歡迎大家指出問題,共同交流學(xué)習(xí)。
參考文獻
1. 陳巧紅,余仕敏,賈宇波. 廣告點擊率預(yù)估技術(shù)綜述[J]. 浙江理工大學(xué)學(xué)報. 2015(11).?
2. 紀文迪,王曉玲,周傲英. 廣告點擊率估算技術(shù)綜述[J]. 華東師范大學(xué)學(xué)報(自然科學(xué)版). 2013(03).?
3. Rendle S. Factorization machines. Data Mining (ICDM), 2010 IEEE 10th International Conference on. 2010.?
4. Heng-Tze Cheng and Levent Koc. Wide & deep learning for recommender systems. In Proceedings of the 1st Workshop on Deep Learning for Recommender Systems, pages 7–10. ACM, 2016.?
5. Weinan Zhang, Tianming Du, and Jun Wang. Deep learning over multi-field categorical data - - A case study on user response prediction. In ECIR, 2016.?
6. Huifeng Guo, Ruiming Tang, Yunming Ye, Zhenguo Li, and Xiuqiang He. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction. arXiv preprint arXiv:1703.04247 (2017).?
7. Xiangnan He and Tat-Seng Chua. Neural Factorization Machines for Sparse Predictive Analytics SIGIR. 355–364. 2017.?
8. Guorui Zhou, Chengru Song, Xiaoqiang Zhu, Xiao Ma, Yanghui Yan, Xingya Dai, Han Zhu, Junqi Jin, Han Li, and Kun Gai. 2017. Deep Interest Network for Click-Through Rate Prediction. arXiv preprint arXiv:1706.06978 (2017).?
9. J. Xiao, H. Ye, X. He, H. Zhang, F. Wu, and T.-S. Chua. Attentional factorization machines: Learning the weight of feature interactions via attention networks. In IJCAI, 2017.?
10. Ying Shan, T Ryan Hoens, Jian Jiao, Haijing Wang, Dong Yu, and JC Mao. 2016. Deep Crossing: Web-Scale Modeling without Manually Cra ed Combinatorial Features. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 255–262.?
11. Wang, R., Fu, B., Fu, G., Wang, M.: Deep & cross network for ad click predictions. In: Proceedings of the ADKDD 17. pp. 12:1–12:7 (2017).?
12. Ying Shan, T Ryan Hoens, et al. Deep crossing: Web-scale modeling without manually crafted combinatorial features. KDD ’16. ACM, 2016.?
13. Paul Covington, Jay Adams, and Emre Sargin. Deep neural networks for youtube recommendations. In Proceedings of the 10th ACM Conference on Recommender Systems, pages 191–198. ACM, 2016.?
14. Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. 2015. Deep residual learning for image recognition. arXiv preprint arXiv:1512.03385 (2015).
關(guān)于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學(xué)術(shù)平臺。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 加入社區(qū)刷論文
總結(jié)
以上是生活随笔為你收集整理的深度长文 | 从FM推演各深度CTR预估模型(附开源代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和49支战队瓜分600万奖金,这场史上奖
- 下一篇: 在TensorFlow和PaddleFl