日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

经典Wide Deep模型介绍及tensorflow 2代码实现

發(fā)布時(shí)間:2023/12/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典Wide Deep模型介绍及tensorflow 2代码实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Wide & Deep模型介紹

  • 目標(biāo):
  • 內(nèi)容:
    • 一. 模型介紹
    • 二. 推薦系統(tǒng)架構(gòu)
    • 三. Wide部分
    • 四. Deep部分
    • 五. Wide和Deep一起訓(xùn)練
    • 六. 系統(tǒng)實(shí)現(xiàn)
      • (1)數(shù)據(jù)生成階段
      • (2)模型訓(xùn)練階段
      • (3)模型服務(wù)階段
    • 七. 總結(jié)
    • 八. 代碼:
      • deep部分
      • wide部分
      • wide+deep
      • 程序運(yùn)行情況:
    • 九、完整代碼GitHub:

目標(biāo):

經(jīng)典推薦深度模型 Wide & Deep。完整的paper名稱是《Wide & Deep Learning for Recommender Systems》
Goggle在2016年提出的Wide & Deep模型


內(nèi)容:

這篇知乎小哥寫的挺簡(jiǎn)單明了的,直接摘抄過來,原文:知乎原文

本文介紹一個(gè)經(jīng)典推薦深度模型 Wide & Deep。完整的paper名稱是《Wide & Deep Learning for Recommender Systems》

一. 模型介紹

wide & deep的模型架構(gòu)如下圖所示


可以看到wide & deep模型分成wide和deep兩部分。

  • wide部分就是一個(gè)簡(jiǎn)單的線性模型,當(dāng)然不僅僅是單特征的線性模型,實(shí)際中更多的利用特征進(jìn)行交叉。比如用戶經(jīng)常買了書A又買書B,那么書A和書B兩個(gè)特征具有很強(qiáng)的相關(guān)性,可以作為一個(gè)交叉特征進(jìn)行訓(xùn)練。
  • deep部分是一個(gè)前饋神經(jīng)網(wǎng)絡(luò)模型。
  • 將線性模型和前饋神經(jīng)網(wǎng)絡(luò)模型合并在一起訓(xùn)練。
    • wide部分可以理解為線性的記憶模型,
    • deep部分擅長(zhǎng)推理過程。
    • 兩者結(jié)合,就具有了推理和記憶功能,推薦結(jié)果更準(zhǔn)確。

二. 推薦系統(tǒng)架構(gòu)

當(dāng)一個(gè)用戶請(qǐng)求過來的時(shí)候,推薦系統(tǒng)首先會(huì)從海量的item里面挑選出O(100) 個(gè)用戶可能感興趣的item(召回階段)。然后這 O(100)個(gè)item將會(huì)輸入到模型里面進(jìn)行排序。根據(jù)模型的排序結(jié)果再選擇出topN個(gè)item返回給用戶。同時(shí),用戶會(huì)對(duì)展示的item進(jìn)行點(diǎn)擊,購(gòu)買等等。最終,用戶的feature,上下文feature,item的feature和user action會(huì)以log的信息保存起來,經(jīng)過處理后生成新的訓(xùn)練數(shù)據(jù),提供給模型進(jìn)行訓(xùn)練。paper的重點(diǎn)放在使用wide & deep架構(gòu)為基礎(chǔ)的排序模型。

三. Wide部分

wide部分其實(shí)就是一個(gè)簡(jiǎn)單的線性模型 y = wx + b。y是我們的預(yù)測(cè)目標(biāo), x = [ x1, x2, … , xd] 是d個(gè)feature的向量,w = [w1, w2, … , wd]是模型的參數(shù),b是bias。這里的d個(gè)feature包括原始的輸入feature和經(jīng)過轉(zhuǎn)換的feature。

其中一種很重要的轉(zhuǎn)換feature叫做cross-product轉(zhuǎn)換。假如x1是性別,x1=0表示男性,x1=1表示女性。x2是愛好,x2=0表示不喜歡吃西瓜,x2=1表示喜歡吃西瓜。那么我們就可以利用x1和x2構(gòu)造出新的feature,令x3=(x1 && x2),則x3=1表示是女生并且喜歡吃西瓜,如果不是女生或者不喜歡吃西瓜,則x3=0。這樣經(jīng)過轉(zhuǎn)換的來的x3就是cross-product轉(zhuǎn)化。這樣轉(zhuǎn)換的目的是為了獲取交叉特征對(duì)預(yù)測(cè)目標(biāo)的影響,給線性模型增加非線性。

這個(gè)步驟相當(dāng)于人為提取了一些重要的兩個(gè)特征的關(guān)系。tensorflow中使用函數(shù)tf.feature_column.crossed_column

四. Deep部分

deep部分就是前饋神經(jīng)網(wǎng)絡(luò)模型。對(duì)于高維稀疏的分類特征,首先會(huì)轉(zhuǎn)化成低維的稠密的向量,比如embeding操作。然后作為神經(jīng)網(wǎng)hidden layers的輸入進(jìn)行訓(xùn)練。Hidden layers的計(jì)算公式如下

f是激活函數(shù)(例如ReLu),a是上一個(gè)hidden layer的輸出, W是要訓(xùn)練的參數(shù),b是bias

五. Wide和Deep一起訓(xùn)練

通過weight sum的方式將wide和deep的輸出組合起來,然后通過logistic loss函數(shù)聯(lián)合起來一起訓(xùn)練。對(duì)于wide的部分,一般采用FTRL進(jìn)行訓(xùn)練。對(duì)于deep的部分則采用AdaGrad進(jìn)行訓(xùn)練。

對(duì)于一個(gè)邏輯回歸問題,預(yù)測(cè)公式如下所示

六. 系統(tǒng)實(shí)現(xiàn)

推薦系統(tǒng)的實(shí)現(xiàn)一共分成了三個(gè)階段:數(shù)據(jù)生成,模型訓(xùn)練和模型服務(wù)。如下圖所示

(1)數(shù)據(jù)生成階段

在這個(gè)階段,最近N天的用戶和item將會(huì)用來生成訓(xùn)練數(shù)據(jù)。每條展示過的item將會(huì)對(duì)應(yīng)有一個(gè)目標(biāo)label。例如1表示用用戶點(diǎn)擊過,0表示用戶沒點(diǎn)擊過。

圖中的Vocabulary Generation主要用來做數(shù)據(jù)轉(zhuǎn)換。例如需要把分類特征轉(zhuǎn)換成對(duì)應(yīng)的整數(shù)Id,連續(xù)的實(shí)數(shù)特征將會(huì)按照累積概率分布映射到[0, 1]等等。

(2)模型訓(xùn)練階段

在數(shù)據(jù)生成階段我們產(chǎn)生了包含稀疏特征,稠密特征和label的訓(xùn)練樣本,這些樣本將作為輸入放入到模型里面訓(xùn)練。如下圖所示

wide的部分包含了經(jīng)過Cross Product轉(zhuǎn)換的特征。對(duì)于deep的部分,分類特征首先會(huì)經(jīng)過一層embedding,然后和稠密的特征concatenate起來后,經(jīng)過3層的hidden layers,最后和wide部分聯(lián)合起來通過sigmoid輸出。

paper中還提到,因?yàn)間oogle在訓(xùn)練的時(shí)候訓(xùn)練樣本數(shù)超過5000億,每次所有樣本重新訓(xùn)練的成本和延遲非常大。為了解決這個(gè)問題,在初始化一個(gè)新的模型的時(shí)候,將會(huì)使用老模型的embedding參數(shù)和線性模型的weight參數(shù)初始化新模型。

(3)模型服務(wù)階段

確認(rèn)訓(xùn)練沒問題以后,模型就可以上線。對(duì)于用戶的請(qǐng)求,服務(wù)器首先會(huì)選出用戶感興趣的候選集,然后這些候選集將會(huì)放入到模型里面進(jìn)行預(yù)測(cè)。將預(yù)測(cè)結(jié)果的分?jǐn)?shù)從高到低排序,然后取排序結(jié)果的topN返回給用戶。

  • 從這里可以看到,實(shí)際上,Wide & Deep模型被用在了排序?qū)?#xff0c;并沒有用到召回層?為啥呢?因?yàn)閃ide & Deep模型的訓(xùn)練和預(yù)測(cè),運(yùn)算還是比較多,比較費(fèi)時(shí),用在大規(guī)模物品的召回階段,性能開銷有點(diǎn)吃不消。
  • 只有當(dāng)召回層的數(shù)據(jù),已經(jīng)從幾百萬(wàn)到幾百以后,可以通過為Wide & Deep模型對(duì)召回的百級(jí)別的物品進(jìn)行排序,得到前top N(N=20)。

七. 總結(jié)

Wide & Deep模型被用在了排序?qū)印3蓋ide和deep兩部分。
* wide部分可以理解為線性的記憶模型,
* deep部分擅長(zhǎng)推理過程。
* 兩者結(jié)合,就具有了推理和記憶功能,推薦結(jié)果更準(zhǔn)確。


八. 代碼:

先實(shí)現(xiàn)deep,再實(shí)現(xiàn)wide,然后兩者的數(shù)據(jù)結(jié)果進(jìn)行拼接,在進(jìn)行最終的SIGMOD激活。

deep部分

1、 相對(duì)類別特征(feature)進(jìn)行embeding

# genre features vocabulary genre_vocab = ['beijin', 'shanghai', 'shenzhen', 'chengdu', 'xian', 'suzhou', 'guangzhou']GENRE_FEATURES = {'city': genre_vocab }# all categorical features categorical_columns = [] for feature, vocab in GENRE_FEATURES.items():cat_col = tf.feature_column.categorical_column_with_vocabulary_list(key=feature, vocabulary_list=vocab)emb_col = tf.feature_column.embedding_column(cat_col, 10)categorical_columns.append(emb_col)

2、 embeding向量在和常規(guī)的數(shù)值型特征進(jìn)行拼接,送進(jìn)MLP

# deep part for all input features deep = tf.keras.layers.DenseFeatures(user_numerical_columns + categorical_columns)(inputs) deep = tf.keras.layers.Dense(128, activation='relu')(deep) deep = tf.keras.layers.Dense(128, activation='relu')(deep)

wide部分

1、 人為提取一些重要的,有關(guān)聯(lián)關(guān)系的特征進(jìn)行交叉。使用tensorflow中的函數(shù):

tf.feature_column.crossed_column([movie_col, rated_movie]

2、然后對(duì)交叉后的特征進(jìn)行multi-hot編碼。

def indicator_column(categorical_column):"""Represents multi-hot representation of given categorical column. crossed_feature = tf.feature_column.indicator_column(tf.feature_column.crossed_column([movie_col, rated_movie], 10000))

3、 把稀疏矩陣變成稠密向量。

# wide part for cross feature wide = tf.keras.layers.DenseFeatures(crossed_feature)(inputs)

wide+deep

兩個(gè)模型的輸出,拼接起來然后進(jìn)行一個(gè)神經(jīng)元的線性激活(或者神經(jīng)元激活應(yīng)該都行吧)。最終的到預(yù)測(cè)評(píng)分結(jié)果。

both = tf.keras.layers.concatenate([deep, wide]) output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(both) model = tf.keras.Model(inputs, output_layer)

程序運(yùn)行情況:

提示:和前3篇文章相同的數(shù)據(jù),預(yù)測(cè)結(jié)果:

5319/5319 [==============================] - 115s 21ms/step - loss: 67599.8828 - accuracy: 0.5150 - auc: 0.5041 - auc_1: 0.4693 Epoch 2/5 5319/5319 [==============================] - 114s 21ms/step - loss: 0.6549 - accuracy: 0.6526 - auc: 0.7150 - auc_1: 0.6806 Epoch 3/5 5319/5319 [==============================] - 118s 22ms/step - loss: 0.6326 - accuracy: 0.6722 - auc: 0.7363 - auc_1: 0.7065 Epoch 4/5 5319/5319 [==============================] - 116s 22ms/step - loss: 0.6173 - accuracy: 0.6792 - auc: 0.7410 - auc_1: 0.7133 Epoch 5/5 5319/5319 [==============================] - 113s 21ms/step - loss: 0.6067 - accuracy: 0.6840 - auc: 0.7435 - auc_1: 0.7176 1320/1320 [==============================] - 21s 15ms/step - loss: 0.6998 - accuracy: 0.5645 - auc: 0.5718 - auc_1: 0.5391Test Loss 0.6997529864311218, Test Accuracy 0.5645247101783752, Test ROC AUC 0.5717922449111938, Test PR AUC 0.539068877696991

可以看到,訓(xùn)練時(shí)模型準(zhǔn)確度更高,也更耗時(shí)。
但是在test訓(xùn)練集上的準(zhǔn)確度沒有很明顯的提升。可能是test中新用戶比較多。沒有之前的行為數(shù)據(jù),或者大量數(shù)據(jù)來訓(xùn)練,模型準(zhǔn)確率不算太高。

九、完整代碼GitHub:

地址:https://github.com/jiluojiluo/recommenderSystemForFlowerShop

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的经典Wide Deep模型介绍及tensorflow 2代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。