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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

协同过滤进化版本NeuralCF及tensorflow2实现

發(fā)布時間:2023/12/15 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 协同过滤进化版本NeuralCF及tensorflow2实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目標(biāo):

掌握NeuralCF比傳統(tǒng)基于矩陣分解的協(xié)同過濾算法的改進點,以及算法的優(yōu)點和缺點。


內(nèi)容:

上篇學(xué)習(xí)了最經(jīng)典的推薦算法:協(xié)同過濾,并基于矩陣分解得到了用戶和物品的embeding向量。通過點積可以得到兩者的相似度,可進行排序推薦。但傳統(tǒng)協(xié)同過濾通過直接利用非常稀疏的共現(xiàn)矩陣進行預(yù)測的,所以模型的泛化能力非常弱,遇到歷史行為非常少的用戶,就沒法產(chǎn)生準(zhǔn)確的推薦結(jié)果了。矩陣分解是利用非常簡單的內(nèi)積方式來處理用戶向量和物品向量的交叉問題的,所以,它的擬合能力也比較弱。

  • 改進點
    1、 能不能利用深度學(xué)習(xí)來改進協(xié)同過濾算法呢?包括計算embeding向量,和最后計算物品與用戶相似度的點積。
    2、 新加坡國立的研究者就使用深度學(xué)習(xí)網(wǎng)絡(luò)來改進了傳統(tǒng)的協(xié)同過濾算法,取名 NeuralCF(神經(jīng)網(wǎng)絡(luò)協(xié)同過濾)

算法思想:

對比幾種算法思想

  • 1、矩陣分解算法的原理

    就是把共線矩陣分解成兩個小矩陣相乘,小矩陣就是embeding向量。
  • 2、傳統(tǒng)的點積求相似度
  • 3、 NeuralCF基本思想

    改進點,就是用MLP替代原來的點積操作。
  • 4、改進版本-雙塔模型
    • 用戶側(cè)的Layer的輸出就當(dāng)做用戶側(cè)embeding。
    • 物品側(cè)的Layer的輸出就當(dāng)做物品側(cè)embeding。
    • 優(yōu)點:可以緩存物品、用戶側(cè)embeding,在線上推薦時。直接用物品、用戶側(cè)embeding計算點積得到相似度。
  • 5、改進版本2-雙塔模型+MLP
    點積操作還是過于簡單,不便于發(fā)現(xiàn)。采用MLP替換點積操作。
  • 6、改進版本6-雙塔模型+多特征組合+MLP
    embeding只用了用戶的id或者共線矩陣產(chǎn)生,忽略了物品和用戶的其他固有屬性,使用的特征過少,因此,可以加入更多特征一起輸入到用戶側(cè)和物品側(cè)的多層神經(jīng)網(wǎng)絡(luò)。這樣可以充分利用特征。

模型代碼:

GitHub地址:github源碼

例如:
1、 NeuralCF基本模型

# neural cf model arch two. only embedding in each tower, then MLP as the interaction layers def neural_cf_model_1(feature_inputs, item_feature_columns, user_feature_columns, hidden_units):item_tower = tf.keras.layers.DenseFeatures(item_feature_columns)(feature_inputs)user_tower = tf.keras.layers.DenseFeatures(user_feature_columns)(feature_inputs)interact_layer = tf.keras.layers.concatenate([item_tower, user_tower])for num_nodes in hidden_units:interact_layer = tf.keras.layers.Dense(num_nodes, activation='relu')(interact_layer)output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(interact_layer)neural_cf_model = tf.keras.Model(feature_inputs, output_layer)return neural_cf_model

2、改進版本-雙塔模型

# neural cf model arch one. embedding+MLP in each tower, then dot product layer as the output def neural_cf_model_2(feature_inputs, item_feature_columns, user_feature_columns, hidden_units):item_tower = tf.keras.layers.DenseFeatures(item_feature_columns)(feature_inputs)for num_nodes in hidden_units:item_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(item_tower)user_tower = tf.keras.layers.DenseFeatures(user_feature_columns)(feature_inputs)for num_nodes in hidden_units:user_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(user_tower)output = tf.keras.layers.Dot(axes=1)([item_tower, user_tower])output = tf.keras.layers.Dense(1, activation='sigmoid')(output)# output = tf.keras.layers.Dense(1)(output)neural_cf_model = tf.keras.Model(feature_inputs, output)return neural_cf_model


從結(jié)果可以看出,accuracy不是很高,模型欠擬合較嚴(yán)重。
3、 改進版本2-雙塔模型+MLP

# neural cf model arch one. embedding+MLP in each tower, then MLP layer as the output def neural_cf_model_3(feature_inputs, item_feature_columns, user_feature_columns, hidden_units):item_tower = tf.keras.layers.DenseFeatures(item_feature_columns)(feature_inputs)for num_nodes in hidden_units:item_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(item_tower)user_tower = tf.keras.layers.DenseFeatures(user_feature_columns)(feature_inputs)for num_nodes in hidden_units:user_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(user_tower)output = tf.keras.layers.concatenate([item_tower, user_tower])# output = tf.keras.layers.Dot(axes=1)([item_tower, user_tower])for num_nodes in hidden_units:output = tf.keras.layers.Dense(num_nodes,activation='relu')(output)output = tf.keras.layers.Dense(1, activation='sigmoid')(output)# output = tf.keras.layers.Dense(1)(output)neural_cf_model = tf.keras.Model(feature_inputs, output)return neural_cf_model


從運行結(jié)果看,這個模型的loss減小,準(zhǔn)確度有提升。

Test Loss 0.19877538084983826, Test Accuracy 0.6881847977638245, Test ROC AUC 0.7592607140541077, Test PR AUC 0.7094590663909912

4、 改進版本6-雙塔模型+多特征組合+MLP
終極版本:

# neural cf model arch one. embedding+MLP in each tower, then MLP layer as the output def neural_cf_model_4(feature_inputs, item_feature_columns, user_feature_columns, hidden_units):item_tower = tf.keras.layers.DenseFeatures(item_feature_columns)(feature_inputs)item_tower = tf.keras.layers.concatenate([item_tower,iterm_f])for num_nodes in hidden_units:item_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(item_tower)user_tower = tf.keras.layers.DenseFeatures(user_feature_columns)(feature_inputs)user_tower = tf.keras.layers.concatenate([user_tower,user_f])for num_nodes in hidden_units:user_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(user_tower)output = tf.keras.layers.concatenate([item_tower, user_tower])# output = tf.keras.layers.Dot(axes=1)([item_tower, user_tower])for num_nodes in hidden_units:output = tf.keras.layers.Dense(num_nodes,activation='relu')(output)output = tf.keras.layers.Dense(1, activation='sigmoid')(output)# output = tf.keras.layers.Dense(1)(output)neural_cf_model = tf.keras.Model(feature_inputs, output)return neural_cf_model

最終運行結(jié)果:

Test Loss 0.6841861605644226, Test Accuracy 0.6669825315475464, Test ROC AUC 0.715860903263092, Test PR AUC 0.6257403492927551

效果和第三種相差不大,但是當(dāng)數(shù)據(jù)量多的時候,理論上,第4種效果最好。

總結(jié)

以上是生活随笔為你收集整理的协同过滤进化版本NeuralCF及tensorflow2实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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