深度学习推荐系统实战
王喆
Roku 推荐系统架构负责人,前 hulu 高级研究员,《深度学习推荐系统》作者
33298 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
深度学习推荐系统实战
15
15
1.0x
00:00/00:00
登录|注册

17 | Embedding+MLP:如何用TensorFlow实现经典的深度学习模型?

TensorFlow实践部分
Embedding+MLP模型的结构
模型的训练和评估
定义模型训练相关的参数
定义模型结构
数值型特征的处理
载入类别型特征
载入训练数据
导入TensorFlow包
设计三层MLP结构
选择类别型特征和数值型特征
输出层
全连接
多层神经网络层
将不同的Embedding特征和数值型特征拼接在一起
堆叠层
内部结构类似Word2vec模型中的全连接网络
将稀疏的One-hot向量转换成稠密的Embedding向量
输入特征层
课后思考
小结
Embedding+MLP模型的TensorFlow实现
特征选择和模型设计
Scoring层
MLP层
Stacking层
Embedding层
Feature层
Embedding+MLP模型的实战
Embedding+MLP模型的结构
如何用TensorFlow实现 Embedding+MLP模型?

该思维导图由 AI 生成,仅供参考

你好,我是王喆。
今天我们正式进入深度学习模型的实践环节,来一起学习并实现一种最经典的模型结构,Embedding+MLP。它不仅经典,还是我们后续实现其他深度学习模型的基础,所以你一定要掌握好。
这里面的 Embedding 我们已经很熟悉了,那什么叫做 MLP 呢?它其实是 Multilayer perceptron,多层感知机的缩写。感知机是神经元的另外一种叫法,所以多层感知机就是多层神经网络。
讲到这里啊,我想你脑海中已经有这个模型结构的大致图像了。今天,我就以微软著名的深度学习模型 Deep Crossing 为例,来给你详细讲一讲 Embedding+MLP 模型的结构和实现方法。

Embedding+MLP 模型的结构

图 1 展示的就是微软在 2016 年提出的深度学习模型 Deep Crossing,微软把它用于广告推荐这个业务场景上。它是一个经典的 Embedding+MLP 模型结构,我们可以看到,Deep Crossing 从下到上可以分为 5 层,分别是 Feature 层、Embedding 层、Stacking 层、MLP 层和 Scoring 层。
接下来,我就从下到上来给你讲讲每一层的功能是什么,以及它们的技术细节分别是什么样的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用TensorFlow实现Embedding+MLP模型。首先,文章介绍了Embedding+MLP模型的结构和实战步骤,包括特征选择、模型设计和TensorFlow实现。在特征选择和模型设计中,作者选择了movieId、userId、movieGenre、userGenre作为Embedding化的特征,并设计了一个三层的MLP结构。接着,文章详细介绍了Embedding+MLP模型的TensorFlow实现步骤,包括导入TensorFlow包、载入训练数据和定义训练数据的路径等。最后,文章强调了模型训练和评估的重要性,并提出了课后思考问题,引发读者思考。整体而言,本文通过实例详细介绍了Embedding+MLP模型的结构和实现方法,为读者提供了一手的实践经验。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深度学习推荐系统实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(47)

  • 最新
  • 精选
  • 范闲
    无法直接计算相似度. user embedding 和 item embedding 虽然输入数据来源自同一个数据集,但是本身并不在一个向量空间内.

    作者回复: 是的

    2020-12-02
    4
    26
  • Geek_f9ea8a
    请问老师: 1.看了您实现的MLPRecModel, 由于对tf2.x 版本不是很熟悉,没有看出来 是否 针对 发布时间、电影阅读数等等统计字段 进行了 标准化, 我当时用keras 实现了一下,没有对统计特征进行标准化,效果很差,只有56%左右,损失一直不降,然后最那些统计指标进行标准化话,训练完第一轮,测试集就能达到73%。 2. 您这次实现的MLPRecModel,针对用户、电影,先直接给出的初始化Embedding,然后训练对应的Embedding 权重, 在训练集中,假如 一个用户 有10条样本数据集,那么模型训练该用户Embedding 是根据这10条数据最终训练成能表示该用户Embedding吗? 数据集特征中, 针对一条样本,没有特征表示: 用户历史观看电影 【电影1,电影2 电影3。。。】(按照时间排序) 这样一条特征,对训练Embedding有影响吗,我总感觉好像丢了这部分信息。

    作者回复: 1. 确实没有加normalization,当然可以在tensorflow预处理时候加上normalization,或者在spark中生成训练样本的时候加上特征预处理的一些操作,没问题。而且也确实推荐在实际工作中尝试用normalization,bucketize,maxminscaling去做不同的预处理查看效果,这一点我们之前在特征工程部分介绍过。 2.是个好问题,如果embedidng层是在模型中,通过e2e训练的,那么你如果细致的理解梯度下降的过程就知道,某个用户的embedding确实是只用TA自己的历史数据生成的。 这样的弊端当然有,就是收敛慢,而且在用户历史行为过少的时候,这个用户的embedding不稳定。所以也可以采用embedding预训练的方式,就像我们之前embedding部分讲解的。 推荐其他同学也思考这两个问题,非常好的实践问题。

    2020-11-20
    4
    19
  • 月臻
    老师,您好,我使用Pytorch实现了项目中用到的模型:https://github.com/hillup/recommend

    作者回复: 赞,推荐其他同学参考。

    2021-06-29
    3
    18
  • 科西嘉的怪物
    如果这个模型的结构变一下,把拼接操作变成user emb点乘item emb直接得到预测评分,那训练出来user emb和item emb就在一个向量空间了吧

    作者回复: 是这样

    2021-03-08
    2
    17
  • 浣熊当家
    想请教下老师,关于embedding训练的原理, 比如图二中Word2Vec的训练我们有输入值X(one-hot向量), 和输出Y(作为label, multi-hot向量),所以我们可以训练我们的的Word2Vec的词向量,使其得到最贴近训练样本标签的结果。但是我们这节课讲的embedding层只有前一部分,并没有Y(label)这部分,embedding是通过什么原理训练出来的呢?embedding本质是个unsupervised learning吗?

    作者回复: 这里的embedding层是跟上层神经网络一起end2end训练出来的。当然是标签的,就是样本中的标签。 embedding层是通过上层逐层传导回来的梯度来进行更新的。

    2020-11-22
    12
  • 张程
    如果是电商推荐商品。没有 0和1 的label, 只有buy还是click的区别,这样的话请问应该如何处理?lable列全部为1吗?谢谢!

    作者回复: 怎么可能只有buy和click,有impression没被click和buy的商品不就是最合适的负样本吗。

    2020-12-03
    9
  • Geek_b4af04
    王喆老师,你好,我最近准备吧这几个模型改写为pytorch版本的代码,在进行category features的embedding的时候,是需要先将这些features变为one hot向量,再将这些one hot的向量变成embedding向量吗?但这样的话有些问题,这样数据大小就爆炸了,比如movie id 的features(19000个数据),从(19000,) -> (19000, 30001) -> (19000, 30001, 10)

    作者回复: 按照embedding层的构造,是一定要把id转换成onehot的,否则id这个数字本身怎么能输入到网络中呢? 参数爆炸这个事情也是肯定的,这也是为什么说embedding layer是最费时,费空间的部分,一个神经网络有可能超过90%的参数和时间都花在训练embedding层上。

    2020-12-08
    3
    7
  • 那时刻
    课后思考题,我的想法是在Stacking 层把不同的 Embedding 特征和数值型特征拼接在一起,即把电影和用户的 Embedding 向量拼接起来,形成新的包含全部特征的特征向量,该特征向量保存了用户和电影之间的相似性关系,应该可以直接用来计算用户和物品之间的相似度。

    作者回复: 其实不可以,因为二者不在一个向量空间。直接用dot product或者cosin similarity计算相似度都不可以。

    2020-11-19
    3
    7
  • 那时刻
    请问老师,对于数值型特征都有均值和标准差,比如电影评分均值和电影评分标准差两个特征。您在实际工作中,对于数值型特征都会额外加上均值和标准差两个特征吗?

    作者回复: 不一定,关于特征选择,不要纠结于这样的问题,自己去尝试。

    2020-11-19
    5
  • 灯灯灯
    老师你好, 我在运行时会出现以下的waring。请问是我设置的原因还是什么其他原因呢? WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'collections.OrderedDict'> input: OrderedDict([('movieId', <tf.Tensor 'ExpandDims_4:0' shape=(None, 1) dtype=int32>), ('userId', <tf.Tensor 'ExpandDims_17:0' shape=(None, 1) dtype=int32>), ('rating', <tf.Tensor 'ExpandDims_7:0' shape=(None, 1) dtype=float32>), ('timestamp', <tf.Tensor 'ExpandDims_9:0' shape=(None, 1) dtype=int32>), ('releaseYear', <tf.Tensor 'ExpandDims_8:0' shape=(None, 1) dtype=int32>), ('movieGenre1', <tf.Tensor 'ExpandDims_1:0' shape=(None, 1) dtype=string>), ('movieGenre2', <tf.Tensor 'ExpandDims_2:0' shape=(None, 1) dtype=string>), ('movieGenre3', <tf.Tensor 'ExpandDims_3:0' shape=(None, 1) dtype=string>), ('movieRatingCount', <tf.Tensor 'ExpandDims_5:0' shape=(None, 1) dtype=int32>), ('movieAvgRating', <tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=float32>), ('movieRatingStddev', <tf.Tensor 'ExpandDims_6:0' shape=(None, 1) dtype=float32>), ('userRatedMovie1', <tf.Tensor 'ExpandDims_18:0' shape=(None, 1) dtype=int32>), ... ('userGenre5', <tf.Tensor 'ExpandDims_16:0' shape=(None, 1) dtype=string>)]) Consider rewriting this model with the Functional API.

    作者回复: 大量TF的warning是平台自己的问题,暂时不用过于纠结

    2021-01-19
    4
收起评论
显示
设置
留言
47
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部