深度学习推荐系统实战
王喆
Roku 推荐系统架构负责人,前 hulu 高级研究员,《深度学习推荐系统》作者
10764 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?
04 | 特征工程:推荐系统有哪些可供利用的特征?
06 | Embedding基础:所有人都在谈的Embedding技术到底是什么?
课程目录
已完结/共 44 讲
开篇词 (1讲)
开篇词 | 从0开始搭建一个深度学习推荐系统
基础架构篇 (5讲)
01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?
02 | Sparrow RecSys:我们要实现什么样的推荐系统?
03 | 深度学习基础:你打牢深度学习知识的地基了吗?
国庆策划 | 关于深度学习推荐系统,我有这些资料想推荐给你
国庆策划 | 深度学习推荐系统基础,你掌握了多少?
特征工程篇 (6讲)
04 | 特征工程:推荐系统有哪些可供利用的特征?
05 | 特征处理:如何利用Spark解决特征处理问题?
06 | Embedding基础:所有人都在谈的Embedding技术到底是什么?
07 | Embedding进阶:如何利用图结构数据生成Graph Embedding?
08 | Embedding实战:如何使用Spark生成Item2vec和Graph Embedding?
答疑 | 基础架构篇+特征工程篇常见问题解答
线上服务篇 (7讲)
09 | 线上服务:如何在线上提供高并发的推荐服务?
10 | 存储模块:如何用Redis解决推荐系统特征的存储问题?
11 | 召回层:如何快速又准确地筛选掉不相关物品?
12 | 局部敏感哈希:如何在常数时间内搜索Embedding最近邻?
13 | 模型服务:怎样把你的离线模型部署到线上?
14 | 融会贯通:Sparrow RecSys中的电影相似推荐功能是如何实现的?
答疑 | 线上服务篇留言问题详解
推荐模型篇 (12讲)
15 | 协同过滤:最经典的推荐模型,我们应该掌握什么?
16 | 深度学习革命:深度学习推荐模型发展的整体脉络是怎样的?
模型实战准备(一) | TensorFlow入门和环境配置
模型实战准备(二) | 模型特征、训练样本的处理
17 | Embedding+MLP:如何用TensorFlow实现经典的深度学习模型?
18|Wide&Deep:怎样让你的模型既有想象力又有记忆力?
19|NeuralCF:如何用深度学习改造协同过滤?
20 | DeepFM:如何让你的模型更好地处理特征交叉?
21|注意力机制、兴趣演化:推荐系统如何抓住用户的心?
22|强化学习:让推荐系统像智能机器人一样自主学习
特别加餐 | “银弹”不可靠,最优的模型结构该怎么找?
23| 实战:如何用深度学习模型实现Sparrow RecSys的个性化推荐功能?
模型评估篇 (5讲)
24 | 离线评估:常用的推荐系统离线评估方法有哪些?
25 | 评估指标:我们可以用哪些指标来衡量模型的好坏?
特别加餐|TensorFlow的模型离线评估实践怎么做?
26 | 在线测试:如何在推荐服务器内部实现A/B测试?
27 | 评估体系:如何解决A/B测试资源紧张的窘境?
前沿拓展篇 (6讲)
28 | 业界经典:YouTube深度学习推荐系统的经典架构长什么样?
29 | 图神经网络:Pinterest是如何应用图神经网络的?
30 | 流处理平台:Flink是如何快速识别用户兴趣,实现实时推荐的?
31|模型迭代:阿里巴巴是如何迭代更新推荐模型的?
32 | 强化学习案例:美团是如何在推荐系统中落地强化学习的?
33|技术权衡:解决方案这么多,哪个最合适?
结束语 (2讲)
结束语|深度学习时代需要什么样的推荐工程师?
期末考试 | “深度学习推荐系统”100分试卷等你来挑战!
深度学习推荐系统实战
15
15
1.0x
00:00/00:00
登录|注册

模型实战准备(二) | 模型特征、训练样本的处理

你好,我是王喆,欢迎来到模型实战准备第二课。
这节课,我们来讲实战中所需的模型特征和训练样本的处理。为什么我们要专门花一节课的时间讲这些呢?因为在推荐模型篇中,我们的重点在于学习模型结构的原理和实现,而要实现并且训练这些模型,我们就必须先解决训练所需的样本和特征的处理问题。
这节课我们先来把模型实战的准备工作做完。具体来说,今天,我会带你用 Spark 来处理深度学习模型训练所需的样本和特征,再把特征存储到 Redis 中,供模型线上服务时调用。

为什么选择 Spark 为 TensorFlow 处理特征和样本?

这个时候,你可能会有疑问,我们的深度学习模型将在 TensorFlow 上进行训练,为什么要用 Spark 处理样本?可不可以直接让 TensorFlow 解决所有的事情呢?这是一个好问题,在我们学习具体的技术之前,先解决这个架构上的疑问是很有必要的。
在业界的实践中,我们需要记住一个原则,就是让合适的平台做合适的事情。比如说,数据处理是 Spark 的专长,流处理是 Flink 的专长,构建和训练模型是 TensorFlow 的专长。在使用这些平台的时候,我们最好能够用其所长,避其所短。这也是一个业界应用拥有那么多个模块、平台的原因。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?
04 | 特征工程:推荐系统有哪些可供利用的特征?
06 | Embedding基础:所有人都在谈的Embedding技术到底是什么?
12 | 局部敏感哈希:如何在常数时间内搜索Embedding最近邻?
24 | 离线评估:常用的推荐系统离线评估方法有哪些?
31|模型迭代:阿里巴巴是如何迭代更新推荐模型的?
该试读文章来自付费专栏《深度学习推荐系统实战》,如需阅读全部文章,
请购买文章所属专栏
立即购买
登录 后留言

精选留言(17)

  • onepencil
    线上会组装当前访问时的历史序列及历史平均值等,可以利用flink实时落盘这些线上特征,这样线下就不用再离线生成,也就杜绝了特征穿越问题

    作者回复: 赞,这是业界的解决方法之一,存储特征的snapshot。

    2020-11-16
    3
    44
  • Sebastian
    老师好,想问下使用hset把用户和物品的特征存入redis的场景下,如果用户上亿物品也上亿的话,存入redis会使用很大的资源。实际场景下并不是所有用户都是活跃用户,很多情况下可能用不上。那是否是在redis只存入活跃用户的特征呢?但是如果这样解决,遇到非活跃用户是否就没有特征值了?

    从您的实践经验里有什么好的方法吗?

    作者回复: 我在存储模块那节课说过,SparrowRecsys项目确实对存储模块进行了一定程度的简化,实际应用中还是要多考虑分级存储,redis实际上当作一个缓存层来使用。

    关于大量数据key value数据的存储和线上查找,可以多调研rocksdb,cassandra,dynamodb和mongodb。

    2020-11-16
    2
    11
  • AI
    老师好,为什么用户id和电影id要作为特征进行输入,我的理解是id不是相当于一个索引吗?

    作者回复: 用户id和电影id都是非常重要的特征,因为他们之间的关系包含了用户的历史行为信息,其中又隐含了非常多的用户的兴趣偏好。

    2021-03-01
    2
    8
  • 那时刻
    把评分大于等于 3.5 分的样本标签标识为 1,意为“喜欢”,评分小于 3.5 分的样本标签标识为 0,意为“不喜欢”。这样可以完全把推荐问题转换为 CTR 预估问题。请问老师,3.5分这个值是怎么来的呢?

    另外一个问题,我们把评分时间戳作为代表时间场景的特征放到特征工程中。请问把时间戳用于特征工程,有木有需要注意的地方?比如是否是周末,假日等?老师在实际应用中有哪些实践么?

    作者回复: 两个问题都很好,希望大家都有这样实践中的思考。

    第一个问题。基本原则是我在分析完分数的总体分布后得出的,3.5分基本是正负样本比例1:1的分界线,另外大于3.5分也符合我们直观意义上的高分,所以认为3.5分是比较合理的。

    第二个问题。确实像你说的这样,我们实践中经常从时间戳中提取出周末,假日,季节这些特征,因为这些时间特征往往影响着数据的一些潜在模式,所以还是非常有价值的。

    2020-11-17
    4
    8
  • 萬里長空
    老师,问一个spark-udf的问题,看官网上定义udf的时候要使用register,但是您这里并没有使用,是sql与DataFrame的区别吗?

    作者回复: 是的,是spark sql和直接操作dataframe的区别。直接操作dataframe不用register

    2020-11-20
    6
  • 倪钰鑫
    老师好,我想问下用户行为的时间序列,最一开始的那个用户行为的历史数据我们都是置0吗?比如您上面所说的“userAvgRating”,在B上是填A的打分3,那么在A上呢?因为这里收集到的信息A是最前面的,那此时就是置为0吗?还是说可以选一个全局中值填进去呢?

    作者回复: 这是个好问题,涉及到默认值选取的问题。常规做法是把全局的均值填进去,但其实没有什么统一的最好的方法。

    2021-01-23
    2
    5
  • ZLZ
    王老师,请问我在训练CTR模型过程中,有两种训练样本处理方式,第一种是使用T-1天的数据进行shuffle,其中80%作为train dataset,20%作为训练过程中的val dataset,即使用T-1天的数据进行模型训练,针对T天的数据进行线上预测;第二种方式是使用T-2天的数据作为train dataset,T-1天的数据作为val dataset,即2使用T-2天的数据进行模型训练,针对第T天的数据进行线上预测;我理解第一种方式是不是容易造成信息穿越,例如在某一天有某个活动,但是第二天没有这个活动,那模型在第二天会效果不好,但是第二种方式线上是采用T-2天的模型,相比于第一种方式(线上使用的是第T-1的模型),是不是效果会打折扣

    作者回复: 是这样,第一种方式是不建议采用的。第二种我建议缩短数据分割的粒度,比如改成T-1小时

    2021-05-18
    2
    2
  • 林昱榕
    //add rating features
        val movieRatingFeatures = samplesWithMovies3.groupBy(col("movieId"))
          .agg(count(lit(1)).as("movieRatingCount"),
            format_number(avg(col("rating")), NUMBER_PRECISION).as("movieAvgRating"),
            stddev(col("rating")).as("movieRatingStddev"))
        .na.fill(0).withColumn("movieRatingStddev",format_number(col("movieRatingStddev"), NUMBER_PRECISION))

    老师,特征处理中电影的打分特征应该也是要做window处理吧,谢谢~

    作者回复: 是这样,最好要进行window处理。可以自行修改提交PR

    2021-01-26
    1
  • abc-web
    王老师,想问一下,如果标签或其他属性是中文内容需要进行特征处理还是直接进行word2vec?谢谢!

    作者回复: 先分词再word2vec

    2021-01-24
    2
  • Jay
    刚入坑,好像一直没有看到关于特征组合的内容,这个点一直没有理解清楚,啥时候会讲讲呢?

    作者回复: 组合特征当然可以通过人工组合的手段进行组合,这点我们仍然可以沿用之前传统机器学习的经验。

    对于深度学习模型来说,也可以交由模型的内部结构来组合,这一点后面关于模型的讲解还会涉及到。

    2020-11-18
    2
    2
  • คิดถึง 
    王老师好,如果我想在数据集中添加其他特征,类似用户年龄、性别等,该修改哪些地方呢?
    2021-08-31
  • ZLZ
    还有一个问题,电商领域中,在一个新的推荐场景,初期采用的是热门推荐进行积累数据的,就几乎没有用到什么特征,在用户行为数据积累量足够的情况下,准备训练样本,上推荐模型,模型用到的特征有离线特征(根据T-1天用户行为加工得到) + 实时特征(例如最近五分钟的点击次数),但是在离线训练模型时,无法拿到线上真实的实时特征(因为热门推荐没有用到实时特征,但是用户的行为日志是写入hive了),所以我通过历史的用户行为日志(例如:用户在某个时刻点击了某个商品)模拟复现出用户行为时刻的实时特征值,作为离线模型的训练集,这样做合理么,会有什么问题么,对于这种新场景,第一次上推荐模型的时候缺失真实实时特征该如何处理呢

    作者回复: 合理

    确实真实特征是冷启动的问题,可以查阅一些冷启动方面的文章。

    2021-05-18
  • Geek_3c29c3
    老师,由于用户有上亿个,在训练样本时,只是有一部分用户的usrid去进行训练,在模型上线时,不在模型训练所用的usrid里面,一般来说都有哪些处理方法呢?

    作者回复: 可以参考我的这篇文章https://zhuanlan.zhihu.com/p/351390011

    2021-04-27
    1
  • Sanders
    "咱们课程中讲了基于 userId 的 window 函数方法,你觉得还有哪些方法也能避免引入未来信息吗?"可以通过构建分区表的方式记录总的rattings,ratting次数以及日期分区
    2021-02-04
  • 灯灯灯
    老师请问 对于像movielens的数据集给出具体评分的数据集 不把评分分为是否》3.5的两类而是直接对评分做预测 是否会得到更准确地预测呢?

    作者回复: 当然可以去尝试,这里只为大家理解原理提供一种方法。

    2021-01-27
  • Wiiki
    王老师,我按照您的示例代码,将用户特征存入redis(调用extractAndSaveUserFeaturesToRedis(samplesWithUserFeatures)的时候报错了,首先是报错:java.lang.Integer cannot be cast to java.lang.String,我在调试的过程中发现valueMap("userAvgReleaseYear") = sample.getAs[String]("userAvgReleaseYear")这个字段并没有将年份转换成String,还是原来的Int类型,所以改成 valueMap("userAvgReleaseYear") = sample.getAs[Int]("userAvgReleaseYear").toString,这个异常解决了,然后又报错:Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: ERR wrong number of arguments for 'hset' command,定位到return client.getIntegerReply()这个代码出错了。目前没有找到具体原因,麻烦老师帮忙解答一下呀~ 谢谢

    作者回复: 第一个问题确实是个bug,我已经提交了修改。
    第二个问题我这边不存在,可能还需要你来debug一下。确认本地的redis环境都配置好了吧?

    2020-11-19
    4
  • fsc2016
    老师,有俩个问题请教您:
    1,前面章节生成了用户和物品的embding,这些embding也会作为一个特征字段加入到本节生成的用户和物品特征中嘛
    2,本节提取了用户和物品特征,那进行ctr预估的话,是根据rateing表中,为每条记录添加对应提取出的用户特征和物品特征,作为一条训练记录。这样组合的话,是不是使用未来信息了?关于如何组装成一条训练记录进行ctr预估,该怎么做了

    作者回复: 1. 可以的,也是常用的做法,就是预训练embedding+深度模型的做法

    2. 这个问题不是特别理解,我已经在这节专门讲了如何用window函数生成用户和物品特征,来消除未来信息,应该是回答了你这个问题?

    2020-11-18
    2
    1
收起评论
17
返回
顶部