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

 wide&deep原理

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

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

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

【推荐系统】wide&deep模型、NeuralCF模型 笔记_第1张图片

【推荐系统】wide&deep模型、NeuralCF模型 笔记_第2张图片

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

Tensorflow代码

wide部分 

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

deep部分 

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

连接 wide和deep

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

模型改进 

【推荐系统】wide&deep模型、NeuralCF模型 笔记_第3张图片

 Wide & Deep模型

tf.feature_column实用特征工程总结

tf.feature_column详解及避坑攻略

NeuralCF模型

  NeuralCF-神经协同过滤网络

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

【推荐系统】wide&deep模型、NeuralCF模型 笔记_第4张图片

 NeuralCF混合模型(双塔模型)

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

【推荐系统】wide&deep模型、NeuralCF模型 笔记_第5张图片

 NeuralCF模型tensorflow代码

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)
    # sigmoid单神经元输出层
    output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(interact_layer)
    # keras模型
    neural_cf_model = tf.keras.Model(feature_inputs, output_layer)
    return neural_cf_model

双塔模型tensorflow代码

#hidden_units 可以定义多层神经网络的层数和神经元
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])
    
    # keras模型
    neural_cf_model = tf.keras.Model(feature_inputs, output)
    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塔),最好不要选择双塔模型,会失去双塔模型易于线上服务的优势。

你可能感兴趣的:(深度学习,推荐算法,神经网络,机器学习,tensorflow)