0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

DeepFM并行結(jié)構(gòu)中的一種典型代表

lviY_AI_shequ ? 來源:未知 ? 作者:李倩 ? 2018-07-25 17:55 ? 次閱讀

1、背景

特征組合的挑戰(zhàn)

對(duì)于一個(gè)基于CTR預(yù)估的推薦系統(tǒng),最重要的是學(xué)習(xí)到用戶點(diǎn)擊行為背后隱含的特征組合。在不同的推薦場景中,低階組合特征或者高階組合特征可能都會(huì)對(duì)最終的CTR產(chǎn)生影響。

之前介紹的因子分解機(jī)(Factorization Machines, FM)通過對(duì)于每一維特征的隱變量內(nèi)積來提取特征組合。最終的結(jié)果也非常好。但是,雖然理論上來講FM可以對(duì)高階特征組合進(jìn)行建模,但實(shí)際上因?yàn)橛?jì)算復(fù)雜度的原因一般都只用到了二階特征組合。

那么對(duì)于高階的特征組合來說,我們很自然的想法,通過多層的神經(jīng)網(wǎng)絡(luò)即DNN去解決。

DNN的局限

下面的圖片來自于張俊林教授在AI大會(huì)上所使用的PPT。

我們之前也介紹過了,對(duì)于離散特征的處理,我們使用的是將特征轉(zhuǎn)換成為one-hot的形式,但是將One-hot類型的特征輸入到DNN中,會(huì)導(dǎo)致網(wǎng)絡(luò)參數(shù)太多:

如何解決這個(gè)問題呢,類似于FFM中的思想,將特征分為不同的field:

再加兩層的全鏈接層,讓Dense Vector進(jìn)行組合,那么高階特征的組合就出來了

但是低階和高階特征組合隱含地體現(xiàn)在隱藏層中,如果我們希望把低階特征組合單獨(dú)建模,然后融合高階特征組合。

即將DNN與FM進(jìn)行一個(gè)合理的融合:

二者的融合總的來說有兩種形式,一是串行結(jié)構(gòu),二是并行結(jié)構(gòu)

而我們今天要講到的DeepFM,就是并行結(jié)構(gòu)中的一種典型代表。

2、DeepFM模型

我們先來看一下DeepFM的模型結(jié)構(gòu):

DeepFM包含兩部分:神經(jīng)網(wǎng)絡(luò)部分與因子分解機(jī)部分,分別負(fù)責(zé)低階特征的提取和高階特征的提取。這兩部分共享同樣的輸入。DeepFM的預(yù)測(cè)結(jié)果可以寫為:

FM部分

FM部分的詳細(xì)結(jié)構(gòu)如下:

FM部分是一個(gè)因子分解機(jī)。關(guān)于因子分解機(jī)可以參閱文章[Rendle, 2010] Steffen Rendle. Factorization machines. In ICDM, 2010.。因?yàn)橐肓穗[變量的原因,對(duì)于幾乎不出現(xiàn)或者很少出現(xiàn)的隱變量,F(xiàn)M也可以很好的學(xué)習(xí)。

FM的輸出公式為:

深度部分

深度部分是一個(gè)前饋神經(jīng)網(wǎng)絡(luò)。與圖像或者語音這類輸入不同,圖像語音的輸入一般是連續(xù)而且密集的,然而用于CTR的輸入一般是及其稀疏的。因此需要重新設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)。具體實(shí)現(xiàn)中為,在第一層隱含層之前,引入一個(gè)嵌入層來完成將輸入向量壓縮到低維稠密向量。

嵌入層(embedding layer)的結(jié)構(gòu)如上圖所示。當(dāng)前網(wǎng)絡(luò)結(jié)構(gòu)有兩個(gè)有趣的特性,1)盡管不同field的輸入長度不同,但是embedding之后向量的長度均為K。2)在FM里得到的隱變量Vik現(xiàn)在作為了嵌入層網(wǎng)絡(luò)的權(quán)重。

這里的第二點(diǎn)如何理解呢,假設(shè)我們的k=5,首先,對(duì)于輸入的一條記錄,同一個(gè)field 只有一個(gè)位置是1,那么在由輸入得到dense vector的過程中,輸入層只有一個(gè)神經(jīng)元起作用,得到的dense vector其實(shí)就是輸入層到embedding層該神經(jīng)元相連的五條線的權(quán)重,即vi1,vi2,vi3,vi4,vi5。這五個(gè)值組合起來就是我們?cè)贔M中所提到的Vi。在FM部分和DNN部分,這一塊是共享權(quán)重的,對(duì)同一個(gè)特征來說,得到的Vi是相同的。

有關(guān)模型具體如何操作,我們可以通過代碼來進(jìn)一步加深認(rèn)識(shí)。

3、相關(guān)知識(shí)

我們先來講兩個(gè)代碼中會(huì)用到的相關(guān)知識(shí)吧,代碼是參考的github上星數(shù)最多的DeepFM實(shí)現(xiàn)代碼。

Gini Normalization

代碼中將CTR預(yù)估問題設(shè)定為一個(gè)二分類問題,繪制了Gini Normalization來評(píng)價(jià)不同模型的效果。這個(gè)是什么東西,不太懂,百度了很多,發(fā)現(xiàn)了一個(gè)比較通俗易懂的介紹。

假設(shè)我們有下面兩組結(jié)果,分別表示預(yù)測(cè)值和實(shí)際值:

predictions = [0.9, 0.3, 0.8, 0.75, 0.65, 0.6, 0.78, 0.7, 0.05, 0.4, 0.4, 0.05, 0.5, 0.1, 0.1]actual = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

然后我們將預(yù)測(cè)值按照從小到大排列,并根據(jù)索引序?qū)?shí)際值進(jìn)行排序:

Sorted Actual Values [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1]

然后,我們可以畫出如下的圖片:

接下來我們將數(shù)據(jù)Normalization到0,1之間。并畫出45度線。

橙色區(qū)域的面積,就是我們得到的Normalization的Gini系數(shù)。

這里,由于我們是將預(yù)測(cè)概率從小到大排的,所以我們希望實(shí)際值中的0盡可能出現(xiàn)在前面,因此Normalization的Gini系數(shù)越大,分類效果越好。

embedding_lookup

tensorflow中有個(gè)embedding_lookup函數(shù),我們可以直接根據(jù)一個(gè)序號(hào)來得到一個(gè)詞或者一個(gè)特征的embedding值,那么他內(nèi)部其實(shí)是包含一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的,如下圖所示:

假設(shè)我們想要找到2的embedding值,這個(gè)值其實(shí)是輸入層第二個(gè)神經(jīng)元與embedding層連線的權(quán)重值。

之前有大佬跟我探討word2vec輸入的問題,現(xiàn)在也算是有個(gè)比較明確的答案,輸入其實(shí)就是one-hot Embedding,而word2vec要學(xué)習(xí)的是new Embedding。

4、代碼解析

好,一貫的風(fēng)格,先來介紹幾個(gè)地址:原代碼地址:https://github.com/ChenglongChen/tensorflow-DeepFM本文代碼地址:https://github.com/princewen/tensorflow_practice/tree/master/Basic-DeepFM-model數(shù)據(jù)下載地址:https://www.kaggle.com/c/porto-seguro-safe-driver-prediction

好了,話不多說,我們來看看代碼目錄吧,接下來,我們將主要對(duì)網(wǎng)絡(luò)的構(gòu)建進(jìn)行介紹,而對(duì)數(shù)據(jù)的處理,流程的控制部分,相信大家根據(jù)代碼就可以看懂。

項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu)如下:

其實(shí)還應(yīng)該有一個(gè)存放data的路徑。config.py保存了我們模型的一些配置。DataReader對(duì)數(shù)據(jù)進(jìn)行處理,得到模型可以使用的輸入。DeepFM是我們構(gòu)建的模型。main是項(xiàng)目的入口。metrics是計(jì)算normalized gini系數(shù)的代碼。

模型輸入

模型的輸入主要有下面幾個(gè)部分:

self.feat_index = tf.placeholder(tf.int32, shape=[None,None], name='feat_index')self.feat_value = tf.placeholder(tf.float32, shape=[None,None], name='feat_value')self.label = tf.placeholder(tf.float32,shape=[None,1],name='label')self.dropout_keep_fm = tf.placeholder(tf.float32,shape=[None],name='dropout_keep_fm')self.dropout_keep_deep = tf.placeholder(tf.float32,shape=[None],name='dropout_deep_deep')

feat_index是特征的一個(gè)序號(hào),主要用于通過embedding_lookup選擇我們的embedding。feat_value是對(duì)應(yīng)的特征值,如果是離散特征的話,就是1,如果不是離散特征的話,就保留原來的特征值。label是實(shí)際值。還定義了兩個(gè)dropout來防止過擬合。

權(quán)重構(gòu)建

權(quán)重的設(shè)定主要有兩部分,第一部分是從輸入到embedding中的權(quán)重,其實(shí)也就是我們的dense vector。另一部分就是深度神經(jīng)網(wǎng)絡(luò)每一層的權(quán)重。第二部分很好理解,我們主要來看看第一部分:

#embeddingsweights['feature_embeddings'] = tf.Variable( tf.random_normal([self.feature_size,self.embedding_size],0.0,0.01), name='feature_embeddings')weights['feature_bias'] = tf.Variable(tf.random_normal([self.feature_size,1],0.0,1.0),name='feature_bias')

weights['feature_embeddings'] 存放的每一個(gè)值其實(shí)就是FM中的vik,所以它是N * F * K的。其中N代表數(shù)據(jù)量的大小,F(xiàn)代表feture的大小(將離散特征轉(zhuǎn)換成one-hot之后的特征總量),K代表dense vector的大小。

weights['feature_bias']是FM中的一次項(xiàng)的權(quán)重。

Embedding part

這個(gè)部分很簡單啦,是根據(jù)feat_index選擇對(duì)應(yīng)的weights['feature_embeddings']中的embedding值,然后再與對(duì)應(yīng)的feat_value相乘就可以了:

# modelself.embeddings = tf.nn.embedding_lookup(self.weights['feature_embeddings'],self.feat_index) # N * F * Kfeat_value = tf.reshape(self.feat_value,shape=[-1,self.field_size,1])self.embeddings = tf.multiply(self.embeddings,feat_value)

FM part

首先來回顧一下我們之前對(duì)FM的化簡公式,之前去今日頭條面試還問到過公式的推導(dǎo)。

所以我們的二次項(xiàng)可以根據(jù)化簡公式輕松的得到,再加上我們的一次項(xiàng),F(xiàn)M的part就算完了。同時(shí)更為方便的是,由于權(quán)重共享,我們這里可以直接用Embedding part計(jì)算出的embeddings來得到我們的二次項(xiàng):

# first order termself.y_first_order = tf.nn.embedding_lookup(self.weights['feature_bias'],self.feat_index)self.y_first_order = tf.reduce_sum(tf.multiply(self.y_first_order,feat_value),2)self.y_first_order = tf.nn.dropout(self.y_first_order,self.dropout_keep_fm[0])# second order term# sum-square-partself.summed_features_emb = tf.reduce_sum(self.embeddings,1) # None * kself.summed_features_emb_square = tf.square(self.summed_features_emb) # None * K# squre-sum-partself.squared_features_emb = tf.square(self.embeddings)self.squared_sum_features_emb = tf.reduce_sum(self.squared_features_emb, 1) # None * K#second orderself.y_second_order = 0.5 * tf.subtract(self.summed_features_emb_square,self.squared_sum_features_emb)self.y_second_order = tf.nn.dropout(self.y_second_order,self.dropout_keep_fm[1])

DNN part

DNNpart的話,就是將Embedding part的輸出再經(jīng)過幾層全鏈接層:

# Deep componentself.y_deep = tf.reshape(self.embeddings,shape=[-1,self.field_size * self.embedding_size])self.y_deep = tf.nn.dropout(self.y_deep,self.dropout_keep_deep[0])for i in range(0,len(self.deep_layers)): self.y_deep = tf.add(tf.matmul(self.y_deep,self.weights["layer_%d" %i]), self.weights["bias_%d"%I]) self.y_deep = self.deep_layers_activation(self.y_deep) self.y_deep = tf.nn.dropout(self.y_deep,self.dropout_keep_deep[i+1])

最后,我們要將DNN和FM兩部分的輸出進(jìn)行結(jié)合:

concat_input = tf.concat([self.y_first_order, self.y_second_order, self.y_deep], axis=1)

損失及優(yōu)化器

我們可以使用logloss(如果定義為分類問題),或者mse(如果定義為預(yù)測(cè)問題),以及多種的優(yōu)化器去進(jìn)行嘗試,這些根據(jù)不同的參數(shù)設(shè)定得到:

# lossif self.loss_type == "logloss": self.out = tf.nn.sigmoid(self.out) self.loss = tf.losses.log_loss(self.label, self.out)elif self.loss_type == "mse": self.loss = tf.nn.l2_loss(tf.subtract(self.label, self.out))# l2 regularization on weightsif self.l2_reg > 0: self.loss += tf.contrib.layers.l2_regularizer( self.l2_reg)(self.weights["concat_projection"]) if self.use_deep: for i in range(len(self.deep_layers)): self.loss += tf.contrib.layers.l2_regularizer( self.l2_reg)(self.weights["layer_%d" % I])if self.optimizer_type == "adam": self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate, beta1=0.9, beta2=0.999, epsilon=1e-8).minimize(self.loss)elif self.optimizer_type == "adagrad": self.optimizer = tf.train.AdagradOptimizer(learning_rate=self.learning_rate, initial_accumulator_value=1e-8).minimize(self.loss)elif self.optimizer_type == "gd": self.optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.learning_rate).minimize(self.loss)elif self.optimizer_type == "momentum": self.optimizer = tf.train.MomentumOptimizer(learning_rate=self.learning_rate, momentum=0.95).minimize( self.loss)

模型效果

前面提到了,我們用logloss作為損失函數(shù)去進(jìn)行模型的參數(shù)更新,但是代碼中輸出了模型的 Normalization 的 Gini值來進(jìn)行模型評(píng)價(jià),我們可以對(duì)比一下(記住,Gini值越大越好呦):

好啦,本文只是提供一個(gè)引子,有關(guān)DeepFM更多的知識(shí)大家可以更多的進(jìn)行學(xué)習(xí)呦。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:推薦系統(tǒng)遇上深度學(xué)習(xí)(三)--DeepFM模型理論和實(shí)踐

文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一種高速并行FFT處理器的VLSI結(jié)構(gòu)設(shè)計(jì)

    一種高速并行FFT處理器的VLSI結(jié)構(gòu)設(shè)計(jì)摘要:在OFDM系統(tǒng)的實(shí)現(xiàn),高速FFT處理器是關(guān)鍵。在分析了基4按時(shí)域抽取快速傅立葉變換(FFT)算法特別的基礎(chǔ)上,研究了
    發(fā)表于 10-15 22:41

    一種柔性圖像并行處理機(jī)

    一種柔性圖像并行處理機(jī)摘 要:探討了多指令流多數(shù)據(jù)流圖像并行處理拓?fù)?b class='flag-5'>結(jié)構(gòu),設(shè)計(jì)了一種具有柔性結(jié)構(gòu)
    發(fā)表于 10-06 08:57

    一種寬禁帶圓環(huán)形PBG結(jié)構(gòu)設(shè)計(jì)

    計(jì)算的瓶頸。此外當(dāng)PBG結(jié)構(gòu)為圓環(huán)形時(shí),般的階梯近似不足以滿足計(jì)算精度。針對(duì)以上兩個(gè)問題,本文采用本課題組帶有共形網(wǎng)格建模的MPI并行FDTD程序?qū)A環(huán)形PBG
    發(fā)表于 06-27 07:01

    一種采用分段量化和比特滑動(dòng)技術(shù)的流水并行式模數(shù)轉(zhuǎn)換電路?

    本文提出了一種采用分段量化和比特滑動(dòng)技術(shù)的流水并行式模數(shù)轉(zhuǎn)換電路,較好地結(jié)合了并行式和逐次逼近比較式兩模數(shù)轉(zhuǎn)換各自的長處,在保證高速工作的同時(shí),可實(shí)現(xiàn)
    發(fā)表于 04-08 06:34

    介紹一種適合大規(guī)模數(shù)字信號(hào)處理的并行處理結(jié)構(gòu)

    本文提出了一種基于FPGA的適合大規(guī)模數(shù)字信號(hào)處理的并行處理結(jié)構(gòu)。
    發(fā)表于 04-30 07:16

    為什么要提出一種并行通信方法?并行通信方法有什么特點(diǎn)?

    為什么要提出一種并行通信方法?并行通信方法有什么特點(diǎn)?
    發(fā)表于 05-27 06:16

    一種基于FPGA實(shí)現(xiàn)的FFT結(jié)構(gòu)

    本文討論了一種可在FPGA 上實(shí)現(xiàn)的FFT 結(jié)構(gòu)。該結(jié)構(gòu)采用基于流水線結(jié)構(gòu)和快速并行乘法器的蝶形處理器。乘法器采用改進(jìn)的Booth 算法,簡
    發(fā)表于 09-11 15:46 ?16次下載

    一種新型多DSP并行處理結(jié)構(gòu)

    提出了一種由6片ADSP-21161構(gòu)成的新型的多DSP并行處理結(jié)構(gòu),它具有運(yùn)算能力強(qiáng)、I/O帶寬寬、通信手段多樣、能靈活地改變拓?fù)?b class='flag-5'>結(jié)構(gòu)、可擴(kuò)展性和通用性強(qiáng)等特點(diǎn),并且以此
    發(fā)表于 11-26 15:18 ?6次下載

    一種高速并行FFT處理器的VLSI結(jié)構(gòu)設(shè)計(jì)

     在OFDM系統(tǒng)的實(shí)現(xiàn),高速FFT處理器是關(guān)鍵。在分析了基4按時(shí)域抽取快速傅立葉變換(FFT)算法特點(diǎn)的基礎(chǔ)上,研究了一種高性能FFT處理器的硬件結(jié)構(gòu)。此結(jié)構(gòu)能同時(shí)從四個(gè)
    發(fā)表于 07-02 16:51 ?11次下載

    并行除法器 ,并行除法器結(jié)構(gòu)原理是什么?

    并行除法器 ,并行除法器結(jié)構(gòu)原理是什么?   1.可控加法/減法(CAS)單元    和陣列乘法器非常相似,陣列式除法器也是一種并行運(yùn)算
    發(fā)表于 04-13 10:46 ?1.5w次閱讀

    一種高可靠并行環(huán)網(wǎng)的研究與實(shí)現(xiàn)

    設(shè)計(jì)了一種高可靠并行環(huán)網(wǎng)和冗余處理算法,并可在Linux平臺(tái)下實(shí)現(xiàn)。實(shí)驗(yàn)表明,單網(wǎng)故障時(shí),并行環(huán)網(wǎng)可無縫切換,收發(fā)終端間的丟包率為0。
    發(fā)表于 12-26 11:12 ?9次下載
    <b class='flag-5'>一種</b>高可靠<b class='flag-5'>并行</b>環(huán)網(wǎng)的研究與實(shí)現(xiàn)

    一種并行AES加密方案

    針對(duì)云計(jì)算環(huán)境的隱私保護(hù)問題,采用加密數(shù)據(jù)存儲(chǔ)是個(gè)可行的選擇。為了提高數(shù)據(jù)加密解密的速度,結(jié)合云環(huán)境的并行計(jì)算特點(diǎn)和AES加密算法,設(shè)計(jì)了一種并行AES加密方案,給出了具體的
    發(fā)表于 12-28 10:40 ?0次下載
    <b class='flag-5'>一種</b><b class='flag-5'>并行</b>AES加密方案

    一種并行數(shù)據(jù)流方法

    算法性能提高的一種有效途徑.目前,針對(duì)基于流抽樣的超點(diǎn)檢測(cè)方法存在計(jì)算負(fù)荷重、檢測(cè)精度低、實(shí)時(shí)性差等問題,提出了一種并行數(shù)據(jù)流方法(parallel data streaming,簡稱PDS)。該方法構(gòu)造
    發(fā)表于 01-13 11:15 ?0次下載
    <b class='flag-5'>一種</b><b class='flag-5'>并行</b>數(shù)據(jù)流方法

    如何使用FPGA實(shí)現(xiàn)一種圖像預(yù)處理結(jié)構(gòu)典型算法

    圖像濾波和邊緣檢測(cè)等預(yù)處理算法是視覺導(dǎo)航系統(tǒng)中道路檢測(cè)和車輛檢測(cè)等復(fù)雜視覺處理的前提,其性能和處理時(shí)間直接影響了后續(xù)圖像處理的性能及視覺系統(tǒng)的整體響應(yīng)時(shí)間。本文給出了一種基于FPGA的流水線
    發(fā)表于 12-13 17:56 ?37次下載
    如何使用FPGA實(shí)現(xiàn)<b class='flag-5'>一種</b>圖像預(yù)處理<b class='flag-5'>結(jié)構(gòu)</b>及<b class='flag-5'>典型</b>算法

    一種基于DeepFM的深度興趣因子分解機(jī)網(wǎng)絡(luò)

    推薦系統(tǒng)能夠根據(jù)用戶的喜妤從海量信息篩選岀其可能感興趣的信息并進(jìn)行排序展示。隨著深度學(xué)習(xí)在多個(gè)研究領(lǐng)域取得了良好的效果,其也開始應(yīng)用于推薦系統(tǒng)。目前基于深度學(xué)習(xí)的推薦排序算法常采用E
    發(fā)表于 04-20 14:00 ?10次下載
    <b class='flag-5'>一種</b>基于<b class='flag-5'>DeepFM</b>的深度興趣因子分解機(jī)網(wǎng)絡(luò)