深度学习推荐系统实战_18_14_融会贯通Sparrow_RecSys中的电影相似推荐功能是如何实现的
你好,我是王哲课程进行到这里。
推荐系统架构的大部分知识点,包括特征、工程invade模型,到推荐服务的搭建。
线上推荐过程的实现,我们都已经学习并且实践过了。
如果你坚持跟我一起学习下来的话,可以说已经是武功小程了。
那为了帮你巩固所学,今天我就带你从头到尾实现一个完整的推荐功能,相似电影推荐来帮你打通推荐系统的任督二脉。
在开始实现相似电影推荐功能之前,我想先带你一起清点一下自己的技能库。
听过之前课程的同学应该知道,我喜欢把推荐的过程,比喻成做菜的过程。
接下来我就按照做菜的四个关键步骤,带你回顾一下前面学过的重点知识。
第一步,准备食材。
那准备食材的过程是我们准备推荐所需特征的过程。
在特征工程片中,我们不仅学会了怎么挑选食材,怎么处理食材,而且还实践了备菜的高级技能embedding技术。
那具体来说就是我们能够利用物品序列数据,通过item to back方法训练出embedding,也能够使用deep work和noteto back,把图结构数据生成graph embedding.总的来说,因为embedding技术的本质,就是利用了物品之间的关关性,所embebedding是做好相似推荐这盘菜的关键。
第二步,食材下锅备好的菜在正式开炒之前,我们肯定要把食材下锅。
在推荐系统中,食材下锅的过程有两个,一是把线上推荐所用的特征存储到数据库中。
在之前的课程中,我们已经实践过使用REDIS作为特征数据库的方式。
那一个是把模型部署到模型服务模块,我们也已经讲过了预训练embedding啊embedding加轻量级线上模型、tenn l of flow serving等多种模型服务的方式。
那这节课我们会采用预训练ebedding的方式进行模型服务。
那第三步,菜系技术,那做菜的技术说的是推荐服务器,线上推荐的整个流程是不是合理的那回到推荐系统中,就是召回层要快速,模型,排序部分要精确,这些具体的实现都影响着最终的推荐效果。
那对于召回层来说,我们已经学过单错与召回。
多路召回和基于embedding的召回。
对于排序来说,我们会主要利用embedding相似度来精式。
后续我们还会学习基于多种深度学习推荐模型的排序,最后是菜品上桌的过程,也就是把推荐的结果呈现给用户的过程。
这节课我会带你一起实现这一过程。
那提前剧透一下,在spell crixts中,我们会利用javascript异步请求推荐服务API获取推荐结果,再利用javascript加HTML,把结果呈呈现给用户。
因为这一部分不是我们推荐性的重点,所以我们这里只需要做到界面清爽,逻辑清晰就可以了。
那相信到这里,各位大厨已经准备好了所要的技能。
下面就让我们一起来实现spirr rex中的相似电影推荐功能吧。
首先我们来看看我在文稿中总结的啊spirr rex的相似电影推荐功能的技术架构图。
细心的你可能已经发现了这个架构图,其实就是在课程开始spirreres架构的精简版。
因为我们还没有学习深度学习推荐模型,还有模型评估相关的知识,所以把重点聚焦在已经学过的知识上就可以了。
那接下来我就结合这个技术架构图带你一步步的实现其中的每一模块。
并且我还会给你讲解一些没有在项目中实现的其他业界的主流的方法。
如果你还学有余力,希望你能抓住这个机会来扩展一下自己的知识面。
好,我们先来说一说数据和模型部分的时现。
那这部分的实现其实和我们第八节讲的embedding的实战思路是一样的。
我们可以选用item back、 deb work等不同的embedding方法来生成物品embedding向量。
那考虑到大数据条件下啊,数据处理与训练的一致性。
在项目中,我们会采用spark进行数据处理,同时选用spark mell lip进行mbebedding方法。
那这部分内容的具体代码,你可以直接参考项目中的offline embedding对象,它定义了所有项目中用到的embedding方法。
对于一些比较复杂的embedding方案,比如特征种类很多,网络结构也更多样化的embedding方型业界也很多,采用spark进行原始数据处理,那生成训练样本后就要有用NN flow、 low ytoch训练的方案。
但不论训练平台是怎样的,embedding方法的产出都是一致的,就是物品ID对应的embedding向量。
那为了方便线上服务使用,我们还需要在生成一百零后,把它们存入某个高可用的数据库。
那spr res is选用了最主流的内存数据库REDS作为实现方案。
这一部分的实现你可以参照offline embedding对象中的train item to back函数的REDIS的相关的操作。
那当然,业界也会使用c sandandr、 a加缓存、rex、 DB等不同的存储方案,来实现embedding向量的高效存储和读取。
但现阶段我们只需要学会REDIS就够用了。
到这里,REDS成为了连接线下和线上的关键节点。
那我们的线上服务部分又是怎么利用REDI中的embedding数据进行相似电影推荐的呢?线上服务部分是直接处理并接收用户请求的部分。
从文稿中架构图的最左边到最右边。
我们可以看到三个主要的步骤,分别是候选物品库的建立,召回层的实现和排序层的实现。
接下来我们一一来讲一讲。
首先是候选物品库的建立。
Spire access中候选物品库的建立,采用了非常简单的方式,就是直接把movie ls数据集中的物品数据载入到内存中。
但对于业界比较复杂的推荐业务来说,或选集的选取往往是有很多条件的,比如物品可不可用,有没有过期,有没有其他过滤条件等等。
所以,工业级推荐系统往往会通过比较复杂的circle查询或者API查询的方式来获取候选集。
第二步是召回层的实现。
我们在第十一讲中详细学习了召回层的技术,这里终于可以学以致用了。
因为物品的embedding向量已经在离线生成,所以我们可以自然而然的使用ebedding召回的方法来完成召回层的实现。
那同时,spare researts中也实现了基于物品mad data a多路召回回法案,具具体实实件可可以参考。
Similar movie process类中mumultiretrieval candidate、函数和retrieval candidate. By embedding函数。
最后一步就是排序层的实现的。
根据embedding相似度来进行相似物品推荐,是深度学习推荐系统中最主流的解决方案。
所以在embedds中,我们根据召回层过滤出的候选集,再从ree DS中取出相应的embedding向量,然后计算目标物品和候选物品之间的相似度,最后进行排序就可以了。
那这里相似度的定义是多样的,因以是余弦相似度也可以是内积相似度,还可以根据你训练embedding时定义的不同相似度指标来确定。
因为在word work中,相似度的定义是内积相似度,所以这里我们也采用内积为相似度的计算方法。
那同样具体的实现,你可以参照similar movie process类中的ranker函数。
那经历了这三个主要的线上服务步骤spirr acx就可以向用户返回推荐列表了。
所以接下来我们要解决的问题就是怎么把这些结果用端页面展示给用户。
项目的前端部分采用了最简单的javh TML加阿贾克斯请求的方式。
那阿阿贾斯的全称称是步java、 criript和SML请求,它指的是不刷新整体页面,用javascript异步请求服务器端更新页面中部分元素的技术。
那当前流行的javascript前端框架、react view等等,也大多是基于阿贾克斯来进行数据交互的。
但前端毕竟不是我们课程的重点,你了解我刚才说的基本原理就可以了。
好了,如果你已经在本地的六零一零端口运行起了spirr acsis,那直接点击我在文考中给出的链接,就可以看到电影终结者二的详细页面和相似电影推荐结果了。
到这里,我相信你已经串联起了spiracsis相似电影推荐的所有实现。
看到了推荐结果。
那么问题来了,推荐结果的好坏到底是如何判断的呢?关于这个问题,我们也会在后面的模型评估篇中进行系统性的学习。
不过这里我也想跟你聊聊这个话题,让你对它有一个大体的认识。
这对你建立后续的推荐评模型、评估体系是非常有帮助的。
首先要提醒的是,spirs开源项目自带的movie. Lengs数据集是经过我采样后的缩小集。
所以基于这个数据集训练出的模型的确确性稳稳性是比较低的。
你有兴趣的话,可以去movie lengs的官网下载二十兆data site进行训练,相信会得到更准确的推荐结果。
那其次针对相似物品推荐这个推荐场景,我们其实很难找到一个统一的衡量标准。
比如你能说功夫熊猫这部电影跟玩具总动员更接近,还是跟非物环游剂更接近嘛,对吧?好在工程师们还是总结出了一些有效的评估方法。
这里我挑了三个最常用的给你再讲一讲方法。
一是人肉测试在一种embedding结果新鲜出炉的时候,你作为创造他们的工程师,应该第一时间做一个抽样测试,看一看基于embedding的相似结果是不是符合你自己的常识。
那比如说我在embedding训练完后,随便在spare s中翻了翻,看到了两个页面,一个是儿童电影free veli的相似电影推荐界面,另一个是著名的动画电影toy story,就是玩具总动员的相似推荐界面。
那我把这两幅图都放在了文稿里,你可以和我一起来看一看,直观上来看free VE的推荐结果就非常不错。
因为你可以看到相似电影中都是适合儿童看的,甚至这些电影都和动物有关。
但是玩具总动员就不一样了,他的相似电影里边不仅有动画片,还有真实的谎言、阿甘正传这类明显偏成人的电影,这明显不是一个非常好的推荐结果。
为什么会出现这样的结果呢?我来做一个推测。
事实上,玩具总员本身是一部非常流行的电影,跟它近似的也都是类似真实的谎言、阿甘正传这类很热门的电影。
这就说明了一个问题,热门电影其实很容易跟其他大部分电影产生相似性。
因为他们会出现在大多数用户的评分序列中。
针对这个问题,其实仅利用用户行为序列的embedding方法是很难解决的这需要我们引入更多的内容性特征,进行有针对性的改影。
比如电影类型、海报、风格,或者在训练中有意的减少热门电影的样本权重,增大冷门电影的样本权重等等。
那总的来说,遇到推荐结果不合理的情况,我们需要做更多的调查研重发现这些结果出现的样本权因才能找到改进的方向。
方法一,说完了,我们再来聊一聊。
方法二就是只定ground truth也可以理解为指定一个标准答案。
虽然我们说相似电影的ground truth因人而异,但如果只是为了进行初步的评估,我们也可以指定一些比较权威的验证集。
比如对于相似电影来说,我们可以利用IMDB的moluck list的结果去做验证我们的相似电影结果。
当然要补充说明的是要注意有些ground truth数据集的可用范围,不能随意在商业用途中使用未经许可的数据集。
那最后是方法。
三,利用商业指标进行评估。
我们相似影片比较难以直接衡量,我们能不能换一个角度来思考一下,做相似影片这个功能的目的是什么呢?对于一个商业网站来说,这个目的无非是提高点击率播放量等等。
因此,我们其实完全可以越过评估相似度这样一个过程,直接去评估它的终极商业模型。
举个例子,我们可以通过上线一个新的相似电影模型,那相似电影这个功能模块的点击率提高假设提高了百分之五,那这就是一个非常成功的模型改进。
至于相似电影到底有没有那么相似,我们反而不用那么纠结了。
好了,今天的课程就讲到这里,我们一起来做个总结。
那这节课我们使用embedding方法准备好了。
食材,使用REDIS把食材下锅,做菜的步骤稍微复杂一点,分为建立候选集,实现召回层、实现排序层这三个步骤。
最后我们用HTML加阿贾克斯的方式,把相似电影推荐这盘菜呈现出来。
那既然有做菜的过程,当然也有品菜的阶段。
针对相似物品推荐这一常见的功能,我们可以使用人肉测试、grow truth和商业指标评估,这三种方法对得到的结果进行评估。
也希望你能够在实际的业务场景中活学活用,用评估结果指导模型的下一步改进。
那我希望通过这节课的总结和实战,能让你融会贯通的理清我们学过的知识。
所以我把需要掌握的重要知识点总结在了一张图里,放在了文稿中,你可以利用它复习巩固。
好了,那到这里我们线上服务篇的内容就全部结束了。
通过这一篇的学习,我相信你已经清楚了推荐系统的全部技术架构,以及核心的深度学习技术embedding的运用方法。
但我要说的是,其实盛宴还未开始。
下一篇,我们将进入深度推荐模型的学习和实践。
我曾经说过,深度推荐模型是深度学习推荐系统。
这个王冠上的明珠,正是他对推荐模型的革命,让深度学习的浪潮席卷推荐性的领域。
那希望你再接再厉,让我们一起把这颗明珠摘下吧。
好了,课程的最后让我们看一道思考题。
那刚才我说到玩具总动员的相似,电影推荐结果并不好。
我认为可能是因为热门电影的头部效应造成的。
你认为这一观点是正确的吗?你觉得还有其他可能的原因吗?如果让你去做一些embedding方法在这个问题上的改进,你还有什么好的想法吗?那欢迎你把你的成果和优化的方法分享到留言区,也欢迎你能把这节课分享出去,让更多的人从我们的实践中受益。
我们下节课见。