• 【推荐系统】wide&deep模型、NeuralCF模型 笔记


     wide&deep原理

    推荐系统之Wide&Deep模型原理

    Deep:DNN模型,提高模型的泛化能力。

    Wide:简单的广义线性模型,其特征组合需要人去设计,依赖人工特征工程。注重模型的记忆能力。

    在这里插入图片描述

    在这里插入图片描述

    • wide部分负责学习记忆“已经安装了某种应用,是否还会安装新曝光的应用”这条规则 。
    • deep负责多种特征的交叉组合,以便具有强大的泛化能力。

    Tensorflow代码

    wide部分 

    • tf.feature_column.crossed_column(),返回用于执行分类特征交叉的列 ,输出为交叉后的的one-hot结果。
    1. movie_feature = tf.feature_column.categorical_column_with_identity(key='movieId', num_buckets=1001)
    2. rated_movie_feature = tf.feature_column.categorical_column_with_identity(key='userRatedMovie1', num_buckets=1001)
    3. crossed_feature = tf.feature_column.crossed_column([movie_feature, rated_movie_feature], 10000)

    deep部分 

    •  deep部分数据的特征处理详见这里,处理方式和神经网络部分的结构相同 。
    1. #deep部分
    2. deep = tf.keras.layers.DenseFeatures(numerical_columns + categorical_columns)(inputs)
    3. deep = tf.keras.layers.Dense(128, activation='relu')(deep)
    4. deep = tf.keras.layers.Dense(128, activation='relu')(deep)
    5. # wide部分
    6. wide = tf.keras.layers.DenseFeatures(crossed_feature)(inputs)

    连接 wide和deep

    • 连接两部分形成一个新的特征向量,输入带有sigmoid函数的神经元中。
    1. # 拼接wide和deep
    2. both = tf.keras.layers.concatenate([deep, wide])
    3. output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(both)
    4. model = tf.keras.Model(inputs, output_layer)
    • 其余部分可以用这里的流程走一下拟合结果。

    模型改进 

     Wide & Deep模型

    tf.feature_column实用特征工程总结

    tf.feature_column详解及避坑攻略

    NeuralCF模型

      NeuralCF-神经协同过滤网络

    • NeuralCF基于矩阵分解,是CF与深度学习的结合。它解决了矩阵分解中对特征进行简单交叉的方式,用深度学习来进行更深度的特征融合,得到更多有价值的特征组合信息,引入更多的非线性特征。进行特征的充分交叉,避免模型欠拟合,使模型的拟合能力更强。
    •  NeuralCF用神经网络替换掉了矩阵分解中的点积操作(将矩阵分解得到的物品隐向量和用户隐向量做内积得到预测得分,再与真实得分做对比,进行反向传播梯度下降更新整个网络的参数)。

    在这里插入图片描述

    在这里插入图片描述

     NeuralCF混合模型(双塔模型)

    • 将多层神经网络放入物品塔和用户塔内部,让塔内特征充分交叉,最终用内积层实现用户塔和物品塔的交互融合。

     NeuralCF模型tensorflow代码

    1. def neural_cf_model_1(feature_inputs, item_feature_columns, user_feature_columns, hidden_units):
    2. # 物品侧特征层
    3. item_tower = tf.keras.layers.DenseFeatures(item_feature_columns)(feature_inputs)
    4. # 用户侧特征层
    5. user_tower = tf.keras.layers.DenseFeatures(user_feature_columns)(feature_inputs)
    6. # 连接层
    7. interact_layer = tf.keras.layers.concatenate([item_tower, user_tower])
    8. #多层神经网络
    9. for num_nodes in hidden_units:
    10. interact_layer = tf.keras.layers.Dense(num_nodes, activation='relu')(interact_layer)
    11. # sigmoid单神经元输出层
    12. output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(interact_layer)
    13. # keras模型
    14. neural_cf_model = tf.keras.Model(feature_inputs, output_layer)
    15. return neural_cf_model

    双塔模型tensorflow代码

    1. #hidden_units 可以定义多层神经网络的层数和神经元
    2. def neural_cf_model_2(feature_inputs, item_feature_columns, user_feature_columns, hidden_units):
    3. # 物品侧输入特征层
    4. item_tower = tf.keras.layers.DenseFeatures(item_feature_columns)(feature_inputs)
    5. # 物品塔结构
    6. for num_nodes in hidden_units:
    7. item_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(item_tower)
    8. # 用户侧输入特征层
    9. user_tower = tf.keras.layers.DenseFeatures(user_feature_columns)(feature_inputs)
    10. # 用户塔结构
    11. for num_nodes in hidden_units:
    12. user_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(user_tower)
    13. # 内积操作交互物品塔和用户塔,最后输出
    14. output = tf.keras.layers.Dot(axes=1)([item_tower, user_tower])
    15. # keras模型
    16. neural_cf_model = tf.keras.Model(feature_inputs, output)
    17. return neural_cf_model

    双塔模型的优势

    • 双塔模型相比Embedding MLP和 Wide&Deep,在实际工作中,双塔模型最重要的优势:易上线、易服务。物品塔和用户塔分别生成各自的embedding(这里说是u(x)和v(y)表示),可以将这两个embedding存入特征数据库(即不用将整个模型都部署线上),线上服务时,只需要将它们取出来做[互操作层]得到最后的模型预估结果。 

    Tips

    • 如果把一些场景特征,比如当前时间、当前地点加到用户侧或者物品侧,从model serving的角度考虑,场景特征是在线上不断变化的。 一些地点和时间波动这种波动较大的特征不能通过预存embedding来表示当前的用户或者当前的物品,如新闻推荐,在一天中的不同时段发生的新闻事件会变化。
    • embedding之后,如果使用点积,那么这两个embedding是在同一个向量空间;如果使用的MLP则不在同一个向量空间。因为点积不影响向量空间,线性变换矩阵会影响。
    • 双塔模型对于新闻场景不太适用,新闻时效性很强,新闻id类的特征用处不大,对于这类时效性很强的场景,推荐基于一些与id无关的feature来构建模型,比如新闻的类型、人物、地点、关键词等等。在一些公司的数据里,大部分新闻曝光在2个小时内,双塔的训练数据有足够的曝光时,新闻的价值也失去了很多了。 
    • 如果想要引入context特征(再建立context塔),最好不要选择双塔模型,会失去双塔模型易于线上服务的优势。

  • 相关阅读:
    自然语言处理学习路线(1)——NLP的基本流程
    汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto
    算法每日一题(反转单链表)C语言版
    【题解】洛谷 P9658 Laser Trap
    【云原生】-Docker部署及使用压测神器sysbench
    java项目之咖啡馆管理系统ssm+jsp
    CUDA编程入门系列(十一)CUDA程序优化技巧
    2023年8月京东牛奶乳品行业品牌销售排行榜(京东数据产品)
    ASEMI肖特基二极管MBR20200CT参数及代换
    pNA修饰肽:Z-FLE-pNA,Z-Phe-Leu-Glu-pNA,CAS号: 104634-10-8
  • 原文地址:https://blog.csdn.net/m0_51933492/article/details/126875435