王喆-推荐系统复习篇-相似电影推荐功能(代码片段)

山顶夕景 山顶夕景     2023-01-23     275

关键词:

学习总结

(1)在sparrow RecSys中使用 Embedding 方法准备好了食材,使用 Redis 把食材下锅,做菜的步骤稍微复杂一点,分为建立候选集、实现召回层、实现排序层这 3 个步骤。最后我们用 HTML+Ajax 的方式把相似电影推荐这盘菜呈现出来。
(2)品菜:针对相似物品推荐这一常见的功能,可以使用人工测试、Ground truth 和商业指标评估这三种方法对得到的结果进行评估。用评估结果指导模型的下一步改进。
(3)参考最后部分的思维导图。

一、清点技能库

1.1 准备食材

即特征工程篇(常用特征:用户行为数据、用户关系数据、属性标签类数据、内容类数据和场景context上下文信息等)的内容,这里用分布式计算平台Spark进行特征处理(Spark的计算过程:Stage内部数据高效并行计算,Stage边界处进行消耗资源的shuffle或者reduce操作),处理的结果是生成embedding(针对序列数据或者图结构数据)

——具体而言:利用物品序列数据,通过 Item2vec 方法训练出 Embedding,也能够使用 Deep Walk 和 Node2vec 把图结构数据生成 Graph Embedding。

1.2 食材下锅

过程有两个:一是把线上推荐所用的特征存储到数据库中,我们用 Redis 作为特征数据库的方法,另一个是把模型部署到模型服务模块(后面用tensorflow serving)。

1.3 做菜技术

推荐服务器线上推荐的整个流程是否合理。那回到推荐系统中就是指,召回层要快速准确,模型排序部分要精确。主要学习了召回层(快速准确地过滤出相关物品,缩小候选集)的三种召回策略,我们后面采用embedding的召回方法——计算物品embedding和用户embedding的相似度进行推荐。

这个相似度的计算单纯用聚类或者kd-tree的索引方法都不太好,所以大佬们提出用局部敏感哈希LSH,即使用分桶策略使得最近邻查找embedding的时间复杂度为常数级别。

1.4 上菜过程

这部分还没学:在 Sparrow Recsys 中,会先利用 JavaScript 异步请求推荐服务 API 获取推荐结果,再利用 JavaScript+HTML 把结果展现给用户”。因为,这一部分内容不是推荐系统的重点,所以我们这里只要做到界面清爽、逻辑清晰就可以了。

二、相似电影推荐功能

图1 Sparrow Recsys 相似电影推荐功能的技术架构图

2.1 数据和模型

(1)考虑到大数据的数据处理与训练的一致性——用spark进行数据处理;用sparkMLlib进行embedding的训练(如deepwalk、item2vec等)。
代码参考:项目中的_com.wzhe.sparrowrecsys.offline.spark.embedding.__Embedding_对象,它定义了所有项目中用到的 Embedding 方法。

【注意】
对于一些比较复杂的 Embedding 方案,比如特征种类很多,网络结构也更多样化的 Embedding 模型,业界也多采用 Spark 进行原始数据处理,生成训练样本后交由 TensorFlow、PyTorch 训练的方案。

(2)需要将生成的embedding存入一个高可用的数据库(我们选用主流的redis),这里的redis是连接线上和线下的关键节点。
代码参考:com.wzhe.sparrowrecsys.offline.spark.embedding.Embedding对象中 trainItem2vec 函数的 Redis 存储操作。

业界也会使用 Cassandra+ 缓存,RocksDB 等不同的存储方案来实现 Embedding 向量的高效读取,但我们现阶段只要学会 Redis 存储和读取操作就够用了。

2.2 线上服务

经过以下三个主要的线上服务步骤,Sparrow Recsys 就可以向用户返回推荐列表。

(1)候选物品库的建立

Sparrow Recsys 中候选物品库的建立采用了较为简单的方式:直接把 MovieLens 数据集中的物品数据载入到内存中。

但对于业界比较复杂的推荐业务来说,候选集的选取往往是有很多条件的, 比如物品可不可用,有没有过期,有没有其他过滤条件等等,所以,工业级推荐系统往往会通过比较复杂的 SQL 查询,或者 API 查询来获取候选集。

(2)召回层的实现

因为物品的 Embedding 向量已经在离线生成,所以我们可以自然而然的使用 Embedding 召回的方法来完成召回层的实现。同时,Sparrow Recsys 也实现了基于物品 metadata(元信息)的多路召回方法。
代码参照:com.wzhe.sparrowrecsys.online.recprocess.SimilarMovieProcess类中的 multipleRetrievalCandidates 函数和 retrievalCandidatesByEmbedding 函数。

(3)排序层的实现

根据 Embedding 相似度来进行“相似物品推荐”,是深度学习推荐系统最主流的解决方案。可以是余弦相似度,也可以是内积相似度,还可以根据你训练 Embedding 时定义的不同相似度指标来确定。
因为在 Word2vec 中,相似度的定义是内积相似度,所以, 这里我们也采用内积作为相似度的计算方法。

代码参照: com.wzhe.sparrowrecsys.online.recprocess.SimilarMovieProcess类中的 ranker 函数。

2.3 前端

Sparrow Recsys 的前端部分采用了最简单的 HTML+AJAX 请求的方式。

AJAX 的全称是 Asynchronous JavaScript and XML,异步 JavaScript 和 XML 请求。它指的是不刷新整体页面,用 JavaScript 异步请求服务器端,更新页面中部分元素的技术。当前流行的 JavaScript 前端框架 React、Vue 等等也大多是基于 AJAX 来进行数据交互的。

如果已经在本地的 6010 端口运行起了 Sparrow Recsys,那直接点击这个链接:http://localhost:6010/movie.html?movieId=589 , 就可以看到电影《终结者 2》的详情页面和相似电影推荐结果了。

三、相似电影推荐的结果和初步分析

【注意】
(1)Sparrow Recsys 开源项目中自带的 MovieLens 数据集是经过王喆大佬采样后的缩小集,所以基于这个数据集训练出的模型的准确性和稳定性是比较低的。可以去MovieLens 官网选择 MovieLens 20M Dataset 下载并重新训练,会得到更准确的推荐结果。

3.1 人工测试

主页点击电影看出来的相似推荐效果是否合理。

仅利用基于用户行为序列的 Embedding 方法是很难解决推荐效果不佳的问题。这需要我们引入更多内容型特征进行有针对性的改进,比如电影类型、海报风格,或者在训练中有意减少热门电影的样本权重,增大冷门电影的样本权重等等。总的来说,遇到推荐结果不合理的情况,我们需要做更多的调查研究,发掘这些结果出现的真实原因,才能找到改进方向。

3.2 指定Ground truth

可以指定一些比较权威的验证集。比如,对于相似影片来说,可以利用 IMDB 的 more like this 的结果去做验证我们的相似电影结果。要注意有些 Ground truth 数据集的可用范围,不能随意在商业用途中使用未经许可的数据集。

3.3 利用商业指标进行评估

对于一个商业网站来说,无非是提高点击率,播放量等等。因此,我们完全可以跃过评估相似度这样一个过程,直接去评估它的终极商业指标。举个例子,我们可以通过上线一个新的相似电影模型,让相似电影这个功能模块的点击率提高,假设提高了 5%,那这就是一个成功的模型改进。

四、思维导图

回顾前三章:

4.1 基础架构篇

4.2 特征工程篇

4.3 线上服务篇:

首先是这部分的线上服务基础(高并发三架构机制)、存储模块和召回层的细节。

最后的是线上服务篇的模型服务,后面主要用tensorflow serving:

五、作业

搜《玩具总动员》出现《阿甘正传》等非儿童动画类电影的相似电影推荐,可能是热门电影的头部效应(热门电影其实很容易跟其他大部分电影产生相似性),还有其他可能吗?

【答】
热门特性,可以大概的猜测几点:经典、新颖、价值高、文化核心、受众用户群、时间效应等等。所以召回层的多路召回策略又会衍生出几个问题:
1、如何调整热门推荐与个性化推荐权重。
2、随着时间效应消失,热门度对个体对用户群又是怎么影响的,又如何实现精准的推荐呢?
3、推荐系统针对个人与用户群场景如何切换?

【其他可能】
(1)比如有些人的兴趣就是看热门影片。 只要在最后在排序的时候,过滤掉用户已经看过,和推荐过n次依然没有看的(说明不感兴趣),这样的推荐应该很make sense。评价系统好不好的终极标准是观看时间和点击率,而且一般人的直觉感觉推荐热门电影的点击率就会比其他的高。
(2)有的时候潜在的数据pattern我们不一定都能解释的了,但是模型能够学到这些pattern。如《玩具总动员》有些成年人也喜欢看hhh。

【Embedding 方法上的改进建议】
1、Attention机制的Embedding算法
2、类别标签TF-CR权重计算等 。
3、也可以通过改变node2vec的随机游走概率调整【结构性】和【同质性】。
4、最后,具体问题具体分析,请结合业务改进推荐系统,又如短视频推荐:停留时间、点击率、点赞数、点击转化率等作为热门评估指标。
【其他改进】
1、重排层的策略性方法:在推荐最终展示前在加一层简单的规则过滤,例如利用电影类别把非儿童的电影剔除掉。

六、课后答疑

(1)在小视频行业,基于CTR或播放量的商业逻辑进行推荐策略的调整,在实际过程中往往会变成大量推荐低俗、擦边内容,短期各个指标会上涨,但从长远来看,其实是损害了整个商业收益。所以在短视频一般会以播放时长ts做为商业指标。

【答】CTR对一些标题党、低俗预览图之类的确实有偏好。也可以在正样本的定义上下功夫,把真正播放超过一定时长的作为正样本,算是可以在CTR模型的框架上继续做改进。

(2)线上服务建立候选集的时候,文章里面提到利用sql等方式进行查询,这样的话对于大量物品会不会有耗时问题,真实环境一般是怎么处理的?

【答】基于传统数据库的sql方式当然是比较老式的方式。一般来说会建立一个candidate retrieval api来处理这个事情,这个api内部可以通过预处理,内存数据库,提前load等不同的方式来把candidate提前处理好。

Reference

(1)https://github.com/wzhe06/Reco-papers
(2)《深度学习推荐系统实战》,王喆

王喆-推荐系统前沿篇-(task1)youtube推荐架构

学习总结YouTube推荐架构=召回层(多,快)+排序层(少,精)。候选集生成模型:用了EmbeddingMLP,注意最后的多分类的输出层,预测的是用户点击了“哪个”视频。线上服务时,需要... 查看详情

王喆-深度学习推荐系统实战基础架构篇-(task1)dl推荐系统架构

学习心得通过task1的学习在脑海里建立DL背景的推荐系统架构:为了解决【在“信息过载”情况下,用户怎么高效获取感兴趣的信息】的问题,并且构建更好的拟合数据和表达能力的模型,深度学习上场了。其中DL... 查看详情

推荐系统入门到项目实战:基于相似度推荐(含代码)(代码片段)

【推荐系统】🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【推荐系统入门到项目实战... 查看详情

推荐系统基础之介绍入门篇(代码片段)

大家好,我是辣条。今天给大家带来推荐系统介绍入门。目录一、推荐系统简介二、推荐系统设计2.1推荐系统要素2.2推荐系统架构三、推荐算法一推荐模型构建流程二最经典的推荐算法:协同过滤推荐算法(Collaborativ... 查看详情

推荐系统案例基于协同过滤的电影推荐(代码片段)

案例--基于协同过滤的电影推荐1.数据集下载2.数据集加载3.相似度计算4.User-BasedCF预测评分算法实现5.Item-BasedCF预测评分算法实现前面我们已经基本掌握了协同过滤推荐算法,以及其中两种最基本的实现方案:User-BasedCF和It... 查看详情

基于卷积神经网络cnn的电影推荐系统(代码片段)

...目使用文本卷积神经网络,并使用MovieLens数据集完成电影推荐的任务。推荐系统在日常的网络应用中无处不在,比如网上购物、网上买书、新闻app、社交网络、音乐网站、电影网站等等等等,有人的地方就有推荐。根据个人的喜... 查看详情

ml之kg:基于movielens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行top电影推荐案例(代码片段)

...KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例目录基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)... 查看详情

电影推荐的 MapReduce Jaccard 相似度计算

】电影推荐的MapReduceJaccard相似度计算【英文标题】:MapReduceJaccardSimilarityCalculationformovieRecommendations【发布时间】:2019-01-1614:16:15【问题描述】:我正在参加有关分布式系统的考试,我试图解决去年考试中的一个MapReduce问题。但... 查看详情

毕业设计-题目:基于协同过滤的电影推荐系统-django在线电影推荐协同过滤(代码片段)

...题背景和目的3协同过滤算法原理3.1基于用户的协同过滤推荐算法实现原理3.1.1步骤13.1.2步骤23.1.3步骤33.1.4步骤44系统实现4.1开发环境4.2系统功能描述4.3系统数据流程4.3.1用户端数据流程4.3.2管理员端数据流程4.4系统功能设计5主要... 查看详情

推荐系统-01-spark电影推荐评估与部署(代码片段)

查看详情

ml之cf:基于movielens电影评分数据集利用基于用户协同过滤算法(余弦相似度)实现对用户进行top5电影推荐案例(代码片段)

...于用户协同过滤算法(余弦相似度)实现对用户进行Top5电影推荐案例目录基于MovieLens电影评分数据集利用基于用户协同过滤算法(余弦相似度)实现对用户进行Top5电影推荐案例 #1、定义数据集#3、模型训练与推理#3.1、切分数据集ÿ... 查看详情

c-02推荐系统(代码片段)

目录推荐系统一、导入模块二、收集数据三、数据预处理3.1无评分电影处理四、协同过滤算法-基于用户的推荐4.1余弦相似度4.2数据标准化处理五、预测六、测试更新、更全的《机器学习》的更新网站,更有python、go、数据结构与... 查看详情

王喆:工作近十年的方向思考

《DataFun·5周年系列技术文章》专栏·第02篇作者|王喆 策划 | Hoh导读:大家好,我是《深度学习推荐系统》的作者王喆,很多同行可能读过这本系统性介绍推荐系统的书,但大多数人可能不知道我职业生涯的头四... 查看详情

推荐系统实践:基于数据集movielens构造简单推荐系统(代码片段)

...高分电影项目的评分,把预测评分最高的M个电影项目推荐给当前用户。关键词:协同过滤;标签共现;电影推荐;Demo实战验证MovieLens是蛮经典的数据集,在验证推荐算法的初期经常会使用到。本文的数据... 查看详情

如何评估基于内容的推荐系统

】如何评估基于内容的推荐系统【英文标题】:HowtoevaluateaContent-basedRecommenderSystem【发布时间】:2011-09-0407:14:28【问题描述】:我正在构建一个基于内容的电影推荐系统。很简单,只要让用户输入一个电影的名字,系统就会找到... 查看详情

微信小程序|基于chatgpt实现电影推荐小程序(代码片段)

文章目录**效果预览**1、根据电影明星推荐2、根据兴趣标签推荐3、根据电影名推荐一、需求背景二、项目原理及架构2.1实现原理(1)根据用户的兴趣标签(2)根据关联类似主题的题材(3)根据特定的电... 查看详情

推荐系统基础-纪要(代码片段)

推荐系统纪要推荐概念Lambda架构介绍推荐算法架构推荐模型构建流程协同过滤思路介绍相似度计算使用不同相似度计算方式实现协同过滤协同过滤基于模型的算法推荐系统的评价推荐系统的冷启动基于内容的推荐基于内容的推荐... 查看详情

基于python的电影数据可视化分析与推荐系统(代码片段)

...分析,实现电影的检索、热门电影排行和电影的分类推荐,同时对电影的评论进行关键词抽取和情感分析。2.功能组成        基于python的电影数据可视化分析系统的功能组成如下图所示:3.基于python的电影数据可... 查看详情