Wide & Deep模型介绍

  • 目标:
  • 内容:
    • 一. 模型介绍
    • 二. 推荐系统架构
    • 三. Wide部分
    • 四. Deep部分
    • 五. Wide和Deep一起训练
    • 六. 系统实现
      • (1)数据生成阶段
      • (2)模型训练阶段
      • (3)模型服务阶段
    • 七. 总结
    • 八. 代码:
      • deep部分
      • wide部分
      • wide+deep
      • 程序运行情况:
    • 九、完整代码GitHub:

目标:

经典推荐深度模型 Wide & Deep。完整的paper名称是《Wide & Deep Learning for Recommender Systems》
Goggle在2016年提出的Wide & Deep模型


内容:

这篇知乎小哥写的挺简单明了的,直接摘抄过来,原文:知乎原文

本文介绍一个经典推荐深度模型 Wide & Deep。完整的paper名称是《Wide & Deep Learning for Recommender Systems》

一. 模型介绍

wide & deep的模型架构如下图所示


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

  • wide部分就是一个简单的线性模型,当然不仅仅是单特征的线性模型,实际中更多的利用特征进行交叉。比如用户经常买了书A又买书B,那么书A和书B两个特征具有很强的相关性,可以作为一个交叉特征进行训练。
  • deep部分是一个前馈神经网络模型。
  • 将线性模型和前馈神经网络模型合并在一起训练。
    • wide部分可以理解为线性的记忆模型,
    • deep部分擅长推理过程。
    • 两者结合,就具有了推理和记忆功能,推荐结果更准确。

二. 推荐系统架构

当一个用户请求过来的时候,推荐系统首先会从海量的item里面挑选出O(100) 个用户可能感兴趣的item(召回阶段)。然后这 O(100)个item将会输入到模型里面进行排序。根据模型的排序结果再选择出topN个item返回给用户。同时,用户会对展示的item进行点击,购买等等。最终,用户的feature,上下文feature,item的feature和user action会以log的信息保存起来,经过处理后生成新的训练数据,提供给模型进行训练。paper的重点放在使用wide & deep架构为基础的排序模型。

三. Wide部分

wide部分其实就是一个简单的线性模型 y = wx + b。y是我们的预测目标, x = [ x1, x2, … , xd] 是d个feature的向量,w = [w1, w2, … , wd]是模型的参数,b是bias。这里的d个feature包括原始的输入feature和经过转换的feature。

其中一种很重要的转换feature叫做cross-product转换。假如x1是性别,x1=0表示男性,x1=1表示女性。x2是爱好,x2=0表示不喜欢吃西瓜,x2=1表示喜欢吃西瓜。那么我们就可以利用x1和x2构造出新的feature,令x3=(x1 && x2),则x3=1表示是女生并且喜欢吃西瓜,如果不是女生或者不喜欢吃西瓜,则x3=0。这样经过转换的来的x3就是cross-product转化。这样转换的目的是为了获取交叉特征对预测目标的影响,给线性模型增加非线性。

这个步骤相当于人为提取了一些重要的两个特征的关系。tensorflow中使用函数tf.feature_column.crossed_column

四. Deep部分

deep部分就是前馈神经网络模型。对于高维稀疏的分类特征,首先会转化成低维的稠密的向量,比如embeding操作。然后作为神经网hidden layers的输入进行训练。Hidden layers的计算公式如下

f是激活函数(例如ReLu),a是上一个hidden layer的输出, W是要训练的参数,b是bias

五. Wide和Deep一起训练

通过weight sum的方式将wide和deep的输出组合起来,然后通过logistic loss函数联合起来一起训练。对于wide的部分,一般采用FTRL进行训练。对于deep的部分则采用AdaGrad进行训练。

对于一个逻辑回归问题,预测公式如下所示

六. 系统实现

推荐系统的实现一共分成了三个阶段:数据生成,模型训练和模型服务。如下图所示

(1)数据生成阶段

在这个阶段,最近N天的用户和item将会用来生成训练数据。每条展示过的item将会对应有一个目标label。例如1表示用用户点击过,0表示用户没点击过。

图中的Vocabulary Generation主要用来做数据转换。例如需要把分类特征转换成对应的整数Id,连续的实数特征将会按照累积概率分布映射到[0, 1]等等。

(2)模型训练阶段

在数据生成阶段我们产生了包含稀疏特征,稠密特征和label的训练样本,这些样本将作为输入放入到模型里面训练。如下图所示

wide的部分包含了经过Cross Product转换的特征。对于deep的部分,分类特征首先会经过一层embedding,然后和稠密的特征concatenate起来后,经过3层的hidden layers,最后和wide部分联合起来通过sigmoid输出。

paper中还提到,因为google在训练的时候训练样本数超过5000亿,每次所有样本重新训练的成本和延迟非常大。为了解决这个问题,在初始化一个新的模型的时候,将会使用老模型的embedding参数和线性模型的weight参数初始化新模型。

(3)模型服务阶段

确认训练没问题以后,模型就可以上线。对于用户的请求,服务器首先会选出用户感兴趣的候选集,然后这些候选集将会放入到模型里面进行预测。将预测结果的分数从高到低排序,然后取排序结果的topN返回给用户。

  • 从这里可以看到,实际上,Wide & Deep模型被用在了排序层,并没有用到召回层?为啥呢?因为Wide & Deep模型的训练和预测,运算还是比较多,比较费时,用在大规模物品的召回阶段,性能开销有点吃不消。
  • 只有当召回层的数据,已经从几百万到几百以后,可以通过为Wide & Deep模型对召回的百级别的物品进行排序,得到前top N(N=20)。

七. 总结

Wide & Deep模型被用在了排序层。成wide和deep两部分。
* wide部分可以理解为线性的记忆模型,
* deep部分擅长推理过程。
* 两者结合,就具有了推理和记忆功能,推荐结果更准确。


八. 代码:

先实现deep,再实现wide,然后两者的数据结果进行拼接,在进行最终的SIGMOD激活。

deep部分

1、 相对类别特征(feature)进行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向量在和常规的数值型特征进行拼接,送进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、 人为提取一些重要的,有关联关系的特征进行交叉。使用tensorflow中的函数:

tf.feature_column.crossed_column([movie_col, rated_movie]

2、然后对交叉后的特征进行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

两个模型的输出,拼接起来然后进行一个神经元的线性激活(或者神经元激活应该都行吧)。最终的到预测评分结果。

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

程序运行情况:

提示:和前3篇文章相同的数据,预测结果:

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

可以看到,训练时模型准确度更高,也更耗时。
但是在test训练集上的准确度没有很明显的提升。可能是test中新用户比较多。没有之前的行为数据,或者大量数据来训练,模型准确率不算太高。

九、完整代码GitHub:

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

经典Wide Deep模型介绍及tensorflow 2代码实现相关推荐

  1. Wide Deep模型的理解及实战(Tensorflow)

    目录 一.背景 二.概述 三.模型原理 3.1.Wide模型 3.2.Deep模型 3.3.Wide和Deep模型的协同训练 四.系统介绍 4.1.系统简介 4.2.系统流程 五.tensorflow ...

  2. 构建并用 TensorFlow Serving 部署 Wide Deep 模型

    Wide & Deep 模型是谷歌在 2016 年发表的论文中所提到的模型.在论文中,谷歌将 LR 模型与 深度神经网络 结合在一起作为 Google Play 的推荐获得了一定的效果.在这篇 ...

  3. TensorFlow2.0(五)--Keras构建Wide Deep模型

    Keras构建Wide & Deep模型 1. Wide & Deep模型简介 2. Keras实现Wide & Deep模型 2.1 导入相应的库 2.2 数据集加载与处理 ...

  4. 5.Wide Deep Learning for Recommender Systems论文详细解读和代码实现

    一.总述 Wide & Deep作为一篇推荐领域的经典论文,不仅具有很高的研读价值,而且在推荐和广告领域得到了极大的推广和应用.该论文的思想归结起来就是两个词:Wide & Deep. ...

  5. 推荐系统经典模型 Wide Deep 论文剖析

    作者 |  梁唐 来源 | TechFlow(id:TechFlow) 今天我们剖析的也是推荐领域的经典论文,叫做Wide & Deep Learning for Recommender Sy ...

  6. TensorFlow搭建简易Wide and Deep 模型

    Wide & Deep 模型是谷歌在2016年发表的论文中所提到的模型.在论文中,谷歌将 LR 模型与 深度神经网络 结合在一起作为 Google Play 的推荐获得了一定的效果. 官方提供 ...

  7. 深度学习推荐系统之wide deep介绍和代码实现

    阅读前思考 在你的应用场景中,哪些特征适合放在Wide侧,哪些特征适合放在Deep侧,为什么呢? 为什么Wide部分要用L1 FTRL训练? 为什么Deep部分不特别考虑稀疏性的问题? 系列导读 深度 ...

  8. 基于Wide Deep Learning的推荐系统

    我们先来看下Google Inc的paper:Wide & Deep Learning for Recommender Systems. 一.介绍 推荐系统可以看成是一个搜索排序系统,其中输入 ...

  9. 【翻译】Wide Deep Learning for Recommender Systems--推荐系统的广泛深度学习

    摘要 通过将稀疏数据的非线性转化特征应用在广义线性模型中被广泛应用于大规模的回归和分类问题.通过广泛的使用交叉特征转化,使得特征交互的记忆性是有效的,并且具有可解释性,而然不得不做许多的特征工作.相对 ...

最新文章

  1. PyTorch框架:(5)使用PyTorch框架构建卷积神经网络
  2. android 三维动画效果,9款令人惊叹的HTML5 3D动画应用
  3. 20172303 2017-2018-2 《程序设计与数据结构》第4周学习总结
  4. Python-OpenCV 处理视频(四): 运动检测
  5. Dataset之MapillaryVistas:MapillaryVistas数据集的简介、下载、使用方法之详细攻略
  6. java中queue排序_Java中常见的排序算法有哪些?---选择排序
  7. 90后80后70后60后和50后的无奈
  8. SAP external long material id的奥妙
  9. 搜狐视频如何上传原创视频
  10. ffmpeg转码_音视频处理神器FFmpeg
  11. vue watch 经常监听不到_Vue.js中 watch(深度监听)的最易懂的解释
  12. matplotlib plot 分组_Python数据分析模块二:Matplotlib
  13. Android 设置背景透明度
  14. Google搜索网址
  15. 读文献、写论文时,有什么好用的软件或网站推荐?
  16. 【缓存】J2Cache —— 基于内存和 Redis 的两级 Java 缓存框架的使用方法
  17. Flutter使用fluwx实现微信分享
  18. php加图片源码_php给现有的图片加文字水印代码
  19. 为什么外包公司这么不受欢迎 ?
  20. python数据分析与展示--图像的手绘效果

热门文章

  1. python中da_Python中字符的编码与解码
  2. mysql union 出错_ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL)...
  3. 如何保证进程间同步工作_冬季建房如何保证混凝土浇筑效果好,做好养护工作...
  4. 如何解决用伪元素点击下拉列表触发不了事件的问题
  5. python一年收入_你的年收入过5万了吗?数据科学家的Python模块和包
  6. Connect to dl.google.com:443 [dl.google.com/142.250.66.142] failed: Connection timed out:
  7. Swift--数组和字典(二)
  8. linux java获取文件创建时间_Linux查看文件的最初创建时间
  9. 深度思考的能力,决定了你能走多远
  10. ViewRoot,DecorView,MeasureSpec和View的工作原理——Android开发艺术探索笔记