DeepFM理論與其應(yīng)用

DeepFM[1]是哈工大Guo博士在華為諾亞實(shí)驗(yàn)室實(shí)習(xí)期間题山,提出的一種深度學(xué)習(xí)方法煌妈,它基于Google的經(jīng)典論文Wide&Deep learning 基礎(chǔ)上配猫,通過將原論文的wide部分--LR部分替換成FM[4]匆瓜,從而改進(jìn)了原模型依然需要人工特征工程的缺點(diǎn)锐锣,得到一個end to end 的深度學(xué)習(xí)模型。DeepFM在企業(yè)數(shù)據(jù)集(華為應(yīng)用商店)和公開數(shù)據(jù)集(criteo)上都取得不錯的效果著洼,目前該方法在不少互聯(lián)網(wǎng)公司的推薦晌柬、廣告系統(tǒng)中得到了較為廣泛的應(yīng)用姥份。

1. CTR預(yù)估中的特征分析

在CTR預(yù)測中,挖掘用戶行為中的隱藏特征以及它們之間的交叉特征已經(jīng)成為推薦算法中最核心的一部分年碘。華為通過對自己應(yīng)用市場的用戶進(jìn)行行為分析,得到以下兩個重要的結(jié)論展鸡。

  1. 用戶喜歡在等待外賣送達(dá)的時段下載APP屿衅。它說明時間和APP類別的二維特征交叉是一個有效的特征輸入信號。
  2. 青少年的男性用戶喜歡下載射擊或者RPG游戲APP莹弊。它則說明年齡涤久、性別、APP類別的三維特征交叉也是一個有效的輸入信號忍弛。

我們可以看到响迂,CTR預(yù)估中主要挑戰(zhàn)是有效對特征交互建模,有些特征交互可以很容易理解细疚,因此特征工程的專家可以人工設(shè)計(jì)出來蔗彤。然而,絕大部分特征都是隱藏在數(shù)據(jù)背后疯兼,難以形成專家的先驗(yàn)知識然遏,只能通過機(jī)器學(xué)習(xí)自動生成。由于實(shí)際應(yīng)用中使用到的特征非常多(原始特征經(jīng)常有幾十到上百維)吧彪,就算是簡單的特征交互待侵,專家其實(shí)也無法對全部特征交叉進(jìn)行有效建模。

廣義線性模型實(shí)現(xiàn)簡單姨裸、性能好秧倾,但是缺乏學(xué)習(xí)特征交叉的能力,通常在工業(yè)實(shí)踐中會人工做特征工程來解決這個問題傀缩。FM采用隱向量(latent vector)的內(nèi)積作為對特征交叉的建模方法那先,具有很好的效果,F(xiàn)M在深度學(xué)習(xí)時代之前是CTR預(yù)估最為廣泛應(yīng)用的一種算法扑毡,它在實(shí)踐中通常只會利用二維的特征交叉胃榕。

總而言之,用戶行為的特征維度是高度復(fù)雜的瞄摊,無論是低維還是高維的特征交叉都會起到重要的作用勋又。根據(jù)Google wide&deep model,它在建模過程中同時考慮了低維和高維的特征交叉换帜,以提升模型的效果楔壤。

2.深度學(xué)習(xí)在CTR預(yù)估的進(jìn)展

Google的Wide & Deep Learning for Recommender Systems[2]是深度學(xué)習(xí)應(yīng)用于推薦、廣告等CTR領(lǐng)域的重要論文惯驼。過去幾年蹲嚣,神經(jīng)網(wǎng)絡(luò)已經(jīng)在圖像递瑰、音頻等領(lǐng)域得到廣泛應(yīng)用,而由于推薦隙畜、廣告等領(lǐng)域由于數(shù)據(jù)的稀疏性抖部、離散性,無法直接套用傳統(tǒng)的深度學(xué)習(xí)模型议惰。

基于深度學(xué)習(xí)的思想慎颗,Google 提出一種深度模塊和廣度模塊結(jié)合的神經(jīng)網(wǎng)絡(luò)模型。Wide端使用常見的LR(FTRL[5]實(shí)現(xiàn))模型言询,將常見的離散特征俯萎、低維特征組合作為輸入,實(shí)現(xiàn)了模型的記憶能力运杭。換句話說夫啊,模型能夠很好記住用戶的喜好,給用戶推薦 常見喜好 的內(nèi)容辆憔。Deep端將離散特征通過embedding方法轉(zhuǎn)化成稠密特征向量輸入撇眯,實(shí)際上實(shí)現(xiàn)了tag向量的模糊查詢,擴(kuò)充了模型的泛化能力躁愿。換句話說叛本,模型能夠更好理解用戶-物品之間內(nèi)在的高維關(guān)系,給用戶推薦 罕見但是可能喜好 的內(nèi)容彤钟,破解“信息繭房”的問題来候。

Wide&Deep

2.1 稀疏特征的優(yōu)點(diǎn):

  • LR, DNN在底層還是一個線性模型,但是現(xiàn)實(shí)生活中逸雹,標(biāo)簽y與特征x之間較少存在線性關(guān)系营搅,而往往是分段的。以"點(diǎn)擊率 ~ 歷史曝光次數(shù)" 之間的關(guān)系為例梆砸,之前曝光過1转质、2次的時候,“點(diǎn)擊率 ~ 歷史曝光次數(shù)”之間一般是正相關(guān)的帖世,再多曝光1休蟹、2次,用戶由于好奇日矫,沒準(zhǔn)就點(diǎn)擊了赂弓;但是,如果已經(jīng)曝光過8哪轿、9次了盈魁,由于用戶已經(jīng)失去了新鮮感,越多曝光窃诉,用戶越不可能再點(diǎn)杨耙,這時“點(diǎn)擊率 ~ 歷史曝光次數(shù)”就表現(xiàn)出負(fù)相關(guān)性赤套。因此,categorical特征相比于numeric特征珊膜,更加符合現(xiàn)實(shí)場景容握。
  • 推薦、搜索一般都是基于用戶辅搬、商品的標(biāo)簽畫像系統(tǒng)唯沮,而標(biāo)簽天生就是categorical的
  • 稀疏的類別/ID類特征,可以稀疏地存儲堪遂、傳輸、運(yùn)算萌庆,提升運(yùn)算效率溶褪。

2.2 稀疏特征的缺點(diǎn):

  • 稀疏的categorical/ID類特征,也有著單個特征表達(dá)能力弱践险、特征組合爆炸猿妈、分布不均勻?qū)е率苡?xùn)程度不均勻的缺點(diǎn)。
  • FTRL 充分輸入的稀疏性在線更新模型巍虫,訓(xùn)練出的模型也是稀疏的彭则,便于快速預(yù)測。
  • Parameter Server占遥,充分利用特征的稀疏性俯抖,不必在各機(jī)器之間同步全部模型,而讓每臺機(jī)器“按需”同步自己所需要的部分模型權(quán)重瓦胎,“按需”上傳這一部分權(quán)重的梯度芬萍。
  • TensorFlow Feature Column類,除了一個numeric_column是處理實(shí)數(shù)特征的搔啊,其實(shí)的都是圍繞處理categorical特征的柬祠,封裝了常見的分桶、交叉负芋、哈希等操作漫蛔。

總而言之:

  • Wide for Memorization,wide側(cè)記住的是歷史數(shù)據(jù)中那些常見旧蛾、高頻的模式莽龟。根據(jù)人工經(jīng)驗(yàn)、業(yè)務(wù)背景蚜点,將有價值的轧房、顯而易見的特征及特征組合輸入wide側(cè)。

  • Deep for Generation绍绘,deep側(cè)通過embedding將tag向量化奶镶,變tag的精確匹配迟赃,為tag向量的模糊查詢,因而模型具備良好的“擴(kuò)展”能力厂镇。

Wide & Deep模型應(yīng)用Google Play的數(shù)據(jù)纤壁,它包含超過10億活躍用戶以及上百萬的app行為。在線實(shí)驗(yàn)顯示W(wǎng)ide& Deep model 有效提升了App的購買率捺信。代碼開源集成到了TensorFlow內(nèi)酌媒,調(diào)用DNNLinearCombinedClassifier 這個estimator就可以。

estimator = DNNLinearCombinedClassifier(
    # wide側(cè)設(shè)置
    linear_feature_columns=[categorical_feature_a_x_categorical_feature_b],
    linear_optimizer=tf.train.FtrlOptimizer(...),
    # deep側(cè)設(shè)置
    dnn_feature_columns=[
        categorical_feature_a_emb, categorical_feature_b_emb,
        numeric_feature],
    dnn_hidden_units=[1000, 500, 100],
    dnn_optimizer=tf.train.ProximalAdagradOptimizer(...),
    # warm-start 設(shè)置
    warm_start_from="/path/to/checkpoint/dir")

除了Wide and Deep 以外還有數(shù)篇文章探索深度學(xué)習(xí)在CTR預(yù)估領(lǐng)域的應(yīng)用迄靠,其中包括采用FM對特征做初始化處理的FNN[3]秒咨。FNN通過
它的模型如下圖所示:


FNN

它主要缺點(diǎn)在于,embedding 后的特征可能會被FM模型過度影響掌挚。使用FM對特征做預(yù)處理的做法雨席,可能影響了模型的性能和效率。它只能刻畫高維的特征交互吠式,而不像Wide & Deep那樣高維和低維特征交叉都能刻畫到陡厘。

3.DeepFM核心思想

DeepFM將Wide and Deep 模型中的Wide側(cè)的LR替換成FM,克服了原有模型依然需要對低維特征做特征工程的缺點(diǎn)特占,實(shí)現(xiàn)了一個無需任何人工特征工程的end to end 模型糙置。DeepFM在wide側(cè)和deep側(cè)共享了embedding的特征向量。

DeepFM架構(gòu)

可以看到DeepFM的數(shù)學(xué)形式化:
y=sigmod(yFM +yDNN)

yFM 是FM組件的輸出是目,yDNN是深度組件的輸出結(jié)果谤饭。FM組件能夠捕獲一維特征的同時,還能很好捕獲二維稀疏組合特征胖笛。如下圖所示:

FM數(shù)學(xué)公式

yDNN旨在學(xué)習(xí)高維特征組合网持,和圖像、音頻的稠密數(shù)值張量不同的是长踊,在推薦系統(tǒng)中DNN模型的數(shù)據(jù)輸入通常都是非常稀疏的張量功舀,所以在技術(shù)上一般會采用embedding層來壓縮數(shù)據(jù)空間維度。

DeepFM 在企業(yè)數(shù)據(jù)集(華為應(yīng)用商店)和公開數(shù)據(jù)集(criteo)進(jìn)行多次實(shí)驗(yàn)身弊,采用AUC和LogLoss來評估效果辟汰。具體效果如下圖所示:

評估結(jié)果

DeepFM在公開數(shù)據(jù)上,比LR&DNN AUC提升了一百多個基點(diǎn)阱佛,是一個非常好的改進(jìn)帖汞。

4. DeepFM重要參數(shù)

這篇文章有趣的部分是探索與分享整個模型的多個超參,從而分析如何得到一個更好效果的模型凑术。

4.1 激活函數(shù)

relu 函數(shù)和 tanh 函數(shù)比sigmod函數(shù)效果更好翩蘸。

4.2 Dropout

下圖效果顯示:采用適合的隨機(jī)性能夠加強(qiáng)模型的魯棒性,建議采用dropout比率在0.6~0.9之間淮逊。

Dropout

4.3 每層神經(jīng)元個數(shù)

建議采用200~400個神經(jīng)元能夠給模型更好效果催首。

神經(jīng)元個數(shù)

4.4 隱含層數(shù)量

增加隱含層的數(shù)量能夠一定程度提升模型效果扶踊,但是要注意過擬合的情況。建議3~5個隱藏層為妙郎任。

隱藏層數(shù)量

4.5 網(wǎng)絡(luò)結(jié)構(gòu)

文章中測試了四種深度網(wǎng)絡(luò)結(jié)構(gòu)秧耗,不變型(constant),增長型(increasing),衰減型(decreasing),鉆石型(diamond)。文章保證四種網(wǎng)絡(luò)結(jié)構(gòu)神經(jīng)元總量一致舶治,采用三層隱藏層分井,從而四種形狀具體為:constant (200-200-200), increasing (100- 200-300), decreasing (300-200-100), and diamond (150-300- 150).
如下圖所示,constant型效果更好霉猛。這點(diǎn)比較有意思尺锚,因?yàn)樵赪ide & Deep Model中,采用的是decreasing型惜浅。網(wǎng)絡(luò)結(jié)構(gòu)的效果也取決于實(shí)驗(yàn)數(shù)據(jù)本身缩麸。

網(wǎng)絡(luò)結(jié)構(gòu)

5. DeepFM的實(shí)現(xiàn)

DeepCTR[6]是一個實(shí)現(xiàn)了多種深度CTR預(yù)估模型的python庫,下面引用它基于criteo數(shù)據(jù)赡矢,所實(shí)現(xiàn)的DeepFM樣例代碼

import pandas as pd
from sklearn.metrics import log_loss, roc_auc_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, MinMaxScaler

from deepctr.models import DeepFM
from deepctr.utils import SingleFeat

if __name__ == "__main__":
    data = pd.read_csv('./criteo_sample.txt')

    #拆分稀疏和稠密特征
    sparse_features = ['C' + str(i) for i in range(1, 27)]
    dense_features = ['I' + str(i) for i in range(1, 14)]

    data[sparse_features] = data[sparse_features].fillna('-1', )
    data[dense_features] = data[dense_features].fillna(0, )
    target = ['label']

    # 1.類別特征的編碼與稠密特征做歸一化
    for feat in sparse_features:
        lbe = LabelEncoder()
        data[feat] = lbe.fit_transform(data[feat])
    mms = MinMaxScaler(feature_range=(0, 1))
    data[dense_features] = mms.fit_transform(data[dense_features])

    # 2.統(tǒng)計(jì)稀疏特征類別特征個數(shù),記錄稠密特征類目
    sparse_feature_list = [SingleFeat(feat, data[feat].nunique())
                           for feat in sparse_features]
    dense_feature_list = [SingleFeat(feat, 0,)
                          for feat in dense_features]

    # 3.生成模型輸入特征

    train, test = train_test_split(data, test_size=0.2)
    train_model_input = [train[feat.name].values for feat in sparse_feature_list] + \
                        [train[feat.name].values for feat in dense_feature_list]
    test_model_input = [test[feat.name].values for feat in sparse_feature_list] + \
                       [test[feat.name].values for feat in dense_feature_list]

    # 4.定義模型阅仔、預(yù)測吹散、評估模型
    model = DeepFM({"sparse": sparse_feature_list,
                    "dense": dense_feature_list}, task='binary')
    model.compile("adam", "binary_crossentropy",
                  metrics=['binary_crossentropy'], )

    history = model.fit(train_model_input, train[target].values,
                        batch_size=256, epochs=10, verbose=2, validation_split=0.2, )
    pred_ans = model.predict(test_model_input, batch_size=256)
    print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4))
    print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4))

引用

[1] Guo, Huifeng, et al. "DeepFM: a factorization-machine based neural network for CTR prediction." arXiv preprint arXiv:1703.04247 (2017).
[2] Cheng, Heng-Tze, et al. "Wide & deep learning for recommender systems." Proceedings of the 1st workshop on deep learning for recommender systems. ACM, 2016.
[3] Zhang, Weinan, Tianming Du, and Jun Wang. "Deep learning over multi-field categorical data." European conference on information retrieval. Springer, Cham, 2016.
[4] Rendle, Steffen. "Factorization machines." 2010 IEEE International Conference on Data Mining. IEEE, 2010.
[5] McMahan, H. Brendan. "Follow-the-regularized-leader and mirror descent: Equivalence theorems and l1 regularization." (2011).
[6] DeepCTR https://github.com/shenweichen/DeepCTR

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市八酒,隨后出現(xiàn)的幾起案子空民,更是在濱河造成了極大的恐慌,老刑警劉巖羞迷,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界轩,死亡現(xiàn)場離奇詭異,居然都是意外死亡衔瓮,警方通過查閱死者的電腦和手機(jī)浊猾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來热鞍,“玉大人葫慎,你說我怎么就攤上這事∞背瑁” “怎么了偷办?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澄港。 經(jīng)常有香客問我椒涯,道長,這世上最難降的妖魔是什么回梧? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任废岂,我火速辦了婚禮祖搓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泪喊。我一直安慰自己棕硫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布袒啼。 她就那樣靜靜地躺著哈扮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚓再。 梳的紋絲不亂的頭發(fā)上滑肉,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音摘仅,去河邊找鬼靶庙。 笑死,一個胖子當(dāng)著我的面吹牛娃属,可吹牛的內(nèi)容都是我干的六荒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矾端,長吁一口氣:“原來是場噩夢啊……” “哼掏击!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秩铆,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤砚亭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后殴玛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捅膘,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年滚粟,在試婚紗的時候發(fā)現(xiàn)自己被綠了寻仗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坦刀,死狀恐怖愧沟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲤遥,我是刑警寧澤沐寺,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站盖奈,受9級特大地震影響混坞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一究孕、第九天 我趴在偏房一處隱蔽的房頂上張望啥酱。 院中可真熱鬧,春花似錦厨诸、人聲如沸镶殷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绘趋。三九已至,卻和暖如春颗管,著一層夾襖步出監(jiān)牢的瞬間陷遮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工垦江, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帽馋,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓比吭,卻偏偏與公主長得像绽族,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衩藤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容