深度学习推荐系统实战_31_23_实战如何用深度学习模型实现Sparrow_RecSys的个性化推荐功能
你好,我是王哲,今天又是一堂实战课。
在这节课里,我会带你利用我们现阶段掌握的所有知识,来实现spare rest中的猜你喜欢的功能。
啊,具体来说,我们会根据一位用户的历史行为,为他推荐可能喜欢的电影这个功能啊,几乎会用到所有的推荐系统模块,包括离线的特征、工程模型训练以及线上的模型服务和推荐逻辑的实现。
如果说完成了十四节那一讲的相似电影功能,还只是你武功小乘的标能那。
看透了这节课的实战,就代表着你掌握了推荐系统技术框架中的大部分内容。
你也就能在推荐系统的实际工作中做到驾轻就熟了。
正式开始实践之前啊,我们还是先来清点一下自己的技能库,看看经过推荐模型片的学习,我们技能库中的兵器又增加了多少?哪些课用来实现猜你喜欢这个功能。
那下面我就按照从离线到线上,由数据到模型的顺序,依次梳理一下特征,工程模型、离线训练、模型、服务推荐服务器逻辑这四大部分的技能点。
首先是模型的特征工程部分。
那特征工程是所有机器学习项目的起点,咱们的推荐模型也不例外。
为了训练推荐模型,我们需要准备好模型需要的样本和特征。
此外,再进行线上推断的时候,推荐服务器也需要在线上实时拼装。
好,包含了用户特征、物品特征、场景特征的特征向量发送给推荐模型,进行实时推断。
那在模型实战准备二这节课里,我们就通过spark处理好了TNRL flow训练所需的训练样本,还把spark处理好的特征插入RELIIS特征数据库中供线上推断使用。
不熟悉这部分内容的同学,最好再复习一下相关的内容,把这把武器装进自己的技能库。
那接着我们来看模型离线训练的部分,那为了在线上做出尽量准确,或者说推荐效果,尽量好的排序。
我们需要在离线训练好排序所需的推荐向型。
我们在推荐模型这一篇中学习和实践的所有深度推荐模型,都是围绕着这个目的展开的。
虽然这些深度推荐模型的结构各不相同,但他们的输入输出都是一致的。
输入是由不同特征组成的。
特征向量输出是一个分数。
这个分数的高低代表了这组特征对应的用户对物品的喜好程度。
那具体实践的时候,我们在tencil flow平台上实现了embedding MRP wede and leaep.比如说CF、双塔模型和DFM等几种不同的深度推荐模型。
它们中的任何一个都可以支持猜你喜欢的排序功能。
那在实际的工业级系统中,我们会通过离线、在线等不同的评估手段,挑选出最好的那个模型,去支持真实的应用场景。
那在spell resets,我我们会neneroc c模模为为来来实参参喜欢功能。
其他模型的上线方法与neurroc f基本一致。
唯一的区别是,对于不同的模型来说,他们在模型服务的部分需要载入不同的模型特件,并且在线上预估的部分也要载入模型相应的输入特征。
然后我们再来看模型服务的部分。
那模型服务是推荐系统中连接线上环境和线下环境的纽带之一。
在离线训练好模型之后,为了让模型在线上发挥之用,做出实时的推荐排序。
我们需要通过模型服务的模块把推荐模型部署上线。
我们曾经在第十三节课中详细介绍过主流的模型服务方法,它们是预存推荐结果预训练embedding加轻量级线上模型,利用PMML转换和部署模型以及TENFLO serving.因为我们这一篇的深度学习模型都是基于TERF low训练的。
所以这节课我们也会采用TENFOW serving作为模型服务的方式。
那最后我们来看推荐服务器的内部逻辑实现。
那模型服务虽然可以做到猜你喜欢中电影的排序,但是要进行排序,仍然需要做大量的准备工作。
比如说候选集的获取、召回层的构建、特征的获取和拼装等等。
这些推荐逻辑都是在推荐服务器内部实现的推荐服务器。
那像推荐系统的线上心脏是所有线上模块的核心。
我们曾经在相似电影功能中实现过整套的推荐架辑。
今天我们关注其中不同的部分就是特征的拼装,以及从推荐服务器内部请求模型服务API的方法。
好了,现在我们已经清点好自己的技能库了。
接下来就让我们使出十八般武艺来打造猜你喜欢这个推荐功能吧。
我们先来看猜你喜欢推荐功能的技术架构。
那与相似电影功能一样,猜你喜欢相关的技术架构,也是由由数据模型部分、线上部分和前端部分组成的。
我们先来看整个功能的技术架构图,再来说说每个部分具体的实现细节。
那文稿中的图一就是猜你喜欢功能的技术架构图。
接下来就跟着我按照从左上到右下的顺序,一起随着数据流的走向来过一遍这个架构图吧。
首先我们来看数据和模型的部分,左上角是我们使用的数据集。
Mov EEES,它经过spark的处理之后,会生成两部分的数据,分别从两个出口出去特征部分会存入REDIS供线上推断时推荐服务器使用,样本部分就提供给TERFLOW训练模型。
Tensffo完成模型训练之后,会导出模型文件,然后模型文件会载入到TENFLOW ming接接着ENRFOO ming会对外开放模型服务,API供推荐服务器调用。
接下来我们再来看推荐服务中的推荐逻辑,就是图中有jtti标志的框图部分。
那在这里,根据movie length数据集生成的候选电影集合,它会依次经过候选物品集取召回层排序层集合,最终生生成n的电影推荐列表,然后返回给前端前端,利用HDML和javascript把它展示给用户。
那在整个过程中,除了排序层和TNCFLO serming的实现,其他部分我们都已经在之前的实战中一一实现过了。
所以今天我们会重点讲解推荐服务器排序层和tenn l flow面的实现。
那在推荐服务器内部,经过召回层之后,我们会得到几百量级的候选物品集。
最后我们到底从这几百部电影中推荐哪些给用户,它的顺序是怎样的,这个工作就交由排序层来处理了。
那因为排序的工作是整个推荐系统提高效果的重中之重,所以在业界的实际应用中,往往会交给评估效果最好的深度推荐模型来处理。
那整个的排序过程可以分为下面三个部分。
那第一个部分准备线上推断所需的特征拼接成servjason格式的特征样本。
第二个部分,把所有候选物品的特征样本批量发送给TENF loor serving API.第三个部分,根据tn l flow serving API返回的推断得分进行排序生成推荐的表。
接下来我们就详细来讲讲这三步中的实现重点。
首先,第一步的实现重点在于特征样本的拼接。
那因为实践例子里,我们使用了neurserc f作为排序模型,而neserer所需的特征只有user ID和item ID,所以特征是比较好准备的那这些特征是怎么拼接成模型推断所需的样本的呢?那我们来看文稿中的代码,在代码中,我们先把user ID和movie ID加入到jason格式的样本中,然后再把样本加入到jason数组中。
接下来,我们又以HTTP post请求的形式,把这些jason样本发送给TF serving的API进行批量预估,在收到预估得分保存,存在选级map中供排序序层排序。
那详细的代码你可以参考项目中的right for your process.这个类那第二步的时间重点就在于怎么建立TNLL flow serving API啊,事实上我们通过十三讲保型服务的实践部分,已经能够搭建起一个测试模型的API了。
那想要搭建起我们自己模型的tenn flow, serving API,只需要把之前载入的测试模型文件替换成我们自己的模型文件就可以了。
这里我就以neurl CF模型为例,带你看一看模型文件是怎么被导出和导入的。
首先是模型的导出。
在neurl CF的TNLL flow实现中,我们已经把训练好的模型保存在了model这个结构中,然后需要调用safe model这一个函数来把模型序列化。
那从文稿中的代码中,你可以看到这一个函数需要传入的参数,包括保存的model结构、保存的路径,还有是否覆盖路径、overright等参数。
那其中我们要注意的是保存路径。
这个参数你可以看到,在我的保存路径中加上了一个模型版本号零零二。
这对于tn l fo servserving很重要的,因为tn NF fo o serving总是会找到版本号最大的模型文件进行载入。
那这样做它就保证了我们每次载入的都是最新训练的模型。
那详细的代码你可以参考uninl LF点PY文件。
那其次呢是模型的导入。
这个导入命令非简简单,就是NNFOL serving的API启动命令。
我们直接看文稿中具体命令中的参参数。
那这里面最重要的参数就是指定载入模型的路径和预估UL.而载入路径就是我们刚才载入模型的路径,但是在这里我们并没有加模型的版本号,这是为什么呢?因为版本号是供tenn l fo serving ing找最新模型用的的那n cfer serving在在模型路径会自自的找到版本号最大的模型载入,因此不可以在载入路径上再加上版本号。
除此之外,冒号后的部分models reck model指的是TF serving API这个模型上的具体UIL.那刚才我们是通过请求models reck model predict获得模型预估值的那请求链接中的models reack model就是在这里设定的那在执行这些命令之后,我们就可以在docker上运行起TF serving的API了。
那最后我们来看第三步的时间,重点获取返回得分和排序。
那我们们看看一tenforfor serving API返回得分的格式,我们返回值也是一个jason数组的格式。
那数组中的每一项对应着之前发送过去的候选电影样本。
所以我们只要把返回的预估值赋给相应的样本,然后按照预估值排序就可以了。
详细的过程,你也可以参考reack for you process中排序层的代码。
如果你已经正确的建立起了REDIS和teanphfor serving API服务,并且已经分别导入了特征、数据和模型文件,我们就可以启动rexes server查看猜你喜欢的结果了。
那文稿中的图二就是为用户ID为六的用户啊在neurroc f模型下的推荐结果。
那注意这里我们是通过在链接中设置model变量为neurroc f来决定产生结果的模型的那通过用户的评分历史,我们可以看到这个用户偏向于观看动作类的电影,同时夹杂了一些爱情片和动画片。
而在猜你喜欢的结果里,我们也可以看到spare resis为他推荐的电影,也包含了这三类电影。
那有兴趣的话,你也可以看在spare acis里边逛一逛,看看推荐的结果,在你眼中是不是合理的。
好了,今天的实践就到这里,我们一起来做个总结。
那今天我们通过实现猜你喜欢功能,串联起了我们之前所学的知识。
那希望你看到推荐结果的时候,有种武功大成驾轻就熟的感觉。
那要知道这里面所有的代码都是我们曾经学习过的。
这里边的每个结果都是我们通过自己的所学生成的那希望你能在这里为自己鼓掌,这是一个不小的里程碑。
那下面我们再重点总结一下今天实践用到的技术。
那首先我们用spark对movie length原始数据进行了处理,生成了训练样本和特征啊。
样本是供TNL flow进行模型训练用的,而特征则存入REDIS供线上推断使用。
那在TER fhow平台上,我们以neuroc f模型为例,训练并导出了neuroc f的模型文件,然后使用用tenn LL serving载入模型文件,建立线上模型服务API那推荐服务器的排序层,从REDIS中取出用户特征和物品特征,组装好jason格式的特征数据发送给tene l flow serving API.那再根据返回的预估分数进行排序,最终生成猜你喜欢的推荐列表。
虽然我们实现了猜你喜欢的功能,但是在课程进行到这里,你一定会有一个疑问,那就是我们的推荐结果到底是好还是坏呢?我们总不能老是人肉去查看结果的好坏吧,这样效率又低又不准确啊。
没错,推荐系统的效果评估其实是有一套非常完整的评估体系的。
啊,别着急,从下一篇的模型评估篇开始,我们就会系统的讲解推荐系统的评估方法。
那期待继续与你同行。
最后我们来看一道思考题,推荐系统的特征,预处理是一项很要要的工作。
那比如一些线续特征的规划分统等等。
那么这些预处理的过程,我们应该放在线上部分的哪里完成呢?是在TNCFLO serping的部分,还是在推荐服务器内部,还是在离线部分完成?你有什么好的想法吗?那期待在留言区看到型,想评估思考,那期待下一节课见。