推荐系统Wide&Deep模型

Wide&Deep模型的结构

Wide&Deep模型结构图

  • Wide&Deep是Google提出的在业界有着巨大影响力的推荐模型。
  • 模型结构图如下:
    在这里插入图片描述
  • 上图的左侧为Wide部分,它的结构简单,就是把输入层直接连接到输出层,中间没有做任何处理。上图右侧为Deep部分,它的结构稍复杂,其实也就是Embedding+MLP的模型结构。
  • Wide部分主要是体现模型具有较强的记忆能力(Memorization),而Deep部分主要体现模型具有泛化能力(Generalization),因为只有这样的结构特点,才能让模型兼具逻辑回归和深度神经网络的优点,也就是既能快速处理和记忆大量历史行为特征,又具有强大的表达能力。

模型的记忆能力

  • 记忆能力就是可以被宽泛地理解为模型直接学习历史数据中物品或者特征的共现频率,并且把它们直接作为推荐依据的能力。
  • 特点:
    • 数量非常多,一个记性不好的推荐模型很难把它们都记住。
    • 无法推广,因为这类规则非常具体,没办法或者说也没必要跟其他特征做进一步的组合。
  • 为什么模型要有Wide部分?
  • 答:Wide部分可以增强模型的记忆能力,让模型记住大量的直接且重要的规则,这正是单层的线性模型所擅长的。

模型的泛化能力

  • 泛化能力指的是模型对于新鲜样本、以及从未出现过的特征组合的预测能力。如果模型具有很强的泛化能力,才能够对一些非常稀疏的,甚至从未出现过的情况作出尽量靠谱的预测。
  • 之前的矩阵分解算法,就是为了解决协同过滤泛化能力不强而诞生的。因为协同过滤只会死板地使用用户的原始行为特征,而矩阵分解因为生成了用户和物品的隐向量,所以就可以计算任意两个用户和物品之间的相似度了,这也是泛化能力强的一种体现。

Wide&Deep模型的应用场景

  • Wide&Deep模型是由Google的应用商店团队Google Play提出的,在Google Play为用户推荐APP这样的应用场景下,Wide&Deep模型的推荐目标就显而易见了,就是应该尽量推荐那些用户可能喜欢,愿意安装的应用。
  • Wide&Deep模型内部细节
    在这里插入图片描述
  • Wide部分所选用的特征是已安装应用和曝光应用,利用交叉积变换更为简单直接,在Google Play的应用就是记住规则“用户已安装应用A是否会安装应用B?”
  • Deep部分就很直接了,就是典型的Embedding+MLP的模型架构了,输入的特征有:用户年龄、已安装应用量、参与会话数量、用户人口属性特征、设备类型等等。把这些全放进多层神经网络里面去学习之后,它们互相之间会发生多重的交叉组合,这最终会让模型具备很强的泛化能力。

Wide&Deep模型的TensorFlow实现

  • 使用TensorFlow的Keras接口来构建Wide&Deep模型:
# deep部分(与之前Embedding+MLP相似)
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)
# 使用concatenate layer把两部分连接起来,形成一个完整的特征向量,输入到最终的 sigmoid 神经元中,产生推荐分数。
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部分所用的特征crossed_feature:在生成crossed_feature的过程中,仿照了Google Play的应用方式,生成了一个由“用户已好评电影”和“当前评价电影”组成的一个交叉特征,就是代码中的crossed_feature,设置这个特征的目的在于让模型记住好评电影之间的相关规则。相关代码如下:
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)

  • 此章节的代码只是部分代码,因为与上一次写的Embedding+MLP的代码基本一样,完整的可以参考一下之前的章节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值