深度学习推荐系统实战_12_答疑_基础架构篇特征工程篇常见问题解答
你好,我是王哲到今天为止啊,基础架构篇和特征工程篇,我们都学完了。
这段时间,我收到了同学们的很多留言,也看到了大家在学习和实践过程的很多疑惑。
所以这节课我特意挑选了十个典型的问题,想和你好好讨论一下,希望可以解决你的疑惑。
我们在第二节课讲了spell rex项目的安装方法,不过我在留言区看到个别同学在安装的时候还是会遇到一些困难。
这里我整理出了两个比较典型的问题,我们一起来看一看问题。
一是因为没有项目经验,想知道把spell rex项目get clone到到本地之后,怎么运行这个maven project啊?这里在重重新描述一下整安安装和执行过程。
程希里我以解解的过程,希一步安安装idea嗯,到我文稿给出的地址下载这个IDE,安装idea后打开它。
第二步是idea中打开项目,我们选择file open,选择github可用到的项目根目录,就可以把项目整体导入到idea.第三步是maven project的配置啊,我们在idea的项目结构树中的pom点XML上,点击右键设置为maven project就可以了。
第四步是配置SDK啊,spell recks利用了java八和scala二点一一的编译环境。
你可以在file project structure project中配置java SDK啊,并且在global library中配置scala SDK啊。
第五步,运行推荐服务器,找到类文件,raxis server,在上面点击右键,然后再点击run就可以运行器推荐服务器了。
啊。
第六步,是打开spir XX的首页啊,在浏览器中输入local host六零一零。
如果看到了spirr x首页的时候,就说明你整个的配置和安装的过程成功了。
好,我们再来看第二个问题,在项目中没有找到为你推荐页,也没有看到一些项目介绍中提到的推荐方法是我的安装过程中哪里出错了吗?啊,这里我再强调说明一下,你没有安装错那spell access,这个项目是随着课程的进展逐渐完善起来的。
啊,所以如果你在学习的时候,课程还没有完结,那下面我就会缺少课程还没有进行到的模块。
那比如说为你推荐这个功能,是在课程的推荐模型片中加入的。
啊,所以相应的项目模块我也会在之后的课程中再加入。
那课程已经讲解或者提到的问分,一定会在spspl rex中有对应的时时代代码,那就是spirl rexcess项目安装方面的疑惑。
除了这些啊,我还发现同学们在学习的过程中对某些知识点有疑惑。
那下面我就帮同学们来解答一些典型的疑惑来看问题三啊,说是网上大部分资料的观点都认为协同过滤这样的传统方法应该是在召回层,但在我们的课程中把协同过滤放在了排序层,这是为什么呢?啊,这是个好问题。
要知道啊,五六年前的传统推荐系统不少,还在使用协同过滤作为主的排序模型啊,这几年它就被慢慢淘汰了。
排序层变成了以深度学习推荐模型为主的复杂模型。
但是我们要知道,因为啊协同过滤类算法其实是比较简单的。
线上的计算过程也很高效。
那么比如矩阵分解之后,可以进行embedding的快速特效,所以我们把它放在召回层也是完全可以的那在这门课中,我们总结的推荐系统架构是一个比较经典的架构。
但是我要说你也完全没有必要认为它是无法改变的一个真理,是吧?因为技术永远都是在不断的权衡和改变之中的那在实际的应用场景之中,我希望你能够根据业务特点来灵活的运用。
那第四个问题是这样的,说像多模态或者是通过其他预训练方法得到的向量,直接加到推荐排序模型中,作为特征的话,感觉没什么效果。
那我理解这是因为预训练学习的目标和排序,学习目标并不一致。
这个问题老师是怎么看呢?啊,我觉得这是一个很好的业务实践中的问题。
那多模态指的是说在推荐系统中引入视频、图片、语音等多种不同形式的数据和特征,希望来提升推荐效果。
那在实际的业务应用里啊,确实存在多模形特征效果不强的问题。
那结合我的实践经验,我觉得问题根源还是因为目前多模态的技术本质上还是处于比较初步的阶段。
那比如说用一些CV的技术去处理啊视频图像识别出一些物品。
那比如说视频里有汽车,有树木、有人物等等之类的特征,对吧?但是你要说这些物品对于最终的推荐效果有没有影响?那比如说视频中出现汽车到底对于用户的点击率影响有多大,那我觉得还是比较微弱的那在视频推荐中,这个特征可能远远不及一个知名的演员这样一个要素的影响大。
当然我一直强调所有的的效果都要跟呃业务场景紧密的结合起来。
所以多模态到底有没有作用,根本呃无法一概而论,还是跟你的使用方法和对业务的理解是强相关联的那比如说在短视频的推荐中,如果你能精确的识别出视频中的明星是哪一位是吧?再用它作为推荐特征,我想肯定是对最终的推荐效果有正向的影响的。
好,那我们接着来看问题。
五、说是对训练数据中的某项特征进行平方或者开方,是为了改变训练数据的分布。
训练数据的分布被改变后,训练出来的模型岂不是不能正确拟合训练数据了啊,这是一个常见的误区啊。
如果你有这样的问题呢,说明还没有弄明白特征分布和训练数据分布之间的关系。
那对训练数据中的某个特征进行开方或者平方操作,它的本质上是改变了特征的分布。
还不是训练数据的分布,那特征的分布和训练数据的分布其实没有本质的联系。
只要你不改变训练数据,label就是标签的分布,最终预测出的结果应该都是符合数据分布本身的啊。
因为你要预测的是其实是label是吧?是你要预测的是标签并不是特征本身。
而且在最终的预测过程中,这些平方开方的特征处理的操作是需要在模型推断的过程中复现的,本质上可以看作是模型的一部分,所以不存在改变数据分布的问题。
呃,下一个问题是说有同学问,为了使graph embedding的结果能够表达网络的结构性,在随机优走过程中,我们需要让有组的过程更倾向于BFS宽度优先搜索。
这里是不是应该是DFS深度优先搜索呢?在质性应该用BFS吧。
啊,这是我们啊第七讲graph embedding中的一个知识点。
这个疑问非常的常见。
因为BFSDFS以及结构性和同质性的关系本身确实有一些反知觉。
这也是是我们在学习notebig模型时候经常会有的问题啊,也推荐其他有疑问的同学关注一下。
那在这里我需要再次强调一下,课程中的描述是完全正确的。
也就是说,为了graph embedding的结果能表达网络络结构构在随机优走的过程程,我们需需要让有组过程程倾向于BFFS.那为了表达同质性需要倾向于BFS吧,是一定要理清它们之间的正确关系。
那这里我也直接把note back原论文中的论述贴在了文稿里。
那你可以直接参考一下原文,我觉得会理解的更深刻一些。
嗯,OK解决了一些常见的知性的疑问。
我们再来看一些关于课程具体内容的延伸思考。
我觉得这些问题提的都非常好,说明同学们在学习的时候都有认真的思考。
同时我也鼓励大家带着问题来学习,把自己的思考分享出来。
这样也能够帮助到更多的同学。
嗯,好,我们来看问题七啊。
有同学提问说,我注意到flink最近更新的比较频繁,号称可以做到批流一体分析,甚至ETL领域好像也可以用起来。
那们在设计系统架构的时候,直接用flflink取代spark,让ETL和实时部分统一到一个架构上,是否可行呢?那这个问题非常好。
那这其实也是大数据工程师们一直追求的啊所谓的批流一体的卡怕架构。
那在capa架构中的实践,其实啊遇到的困难也是不少的啊,这其中困难一是因为有一些历史的遗留问题,比如当前很多公司的数据体系,大部分还是建立在spark基础上的那直接用flink完全替代它肯定是有风险的。
所以很多公司还是沿用着批流混合的lambd架构。
那另外用spark和flink发展的问题。
那flink在进化的同时,其实spark也在不断的发展。
那比如说spark最近发展的structure的streaming,就是为了跟flink竞争。
而且啊spar本身的社区的成熟程度和这么多年的积累还是超过目前的flink的。
所以也很难说flink未来会完全的替代spark.那毫无疑问,批流一体是未来的方向,业内的工程师们也都在朝这个方向努力。
那但我个人觉得spark和flink还是会长期共存共同发展。
那下一个问题说是嗯老师,请问关于大数据数据出口的那部分内容,实时的用户推荐请求也是会经过大数据处理生成可供线上推移的数据吗?针对啊大数据出口的第二点的内容啊,这是第一节课后的课后留言。
你可以先啊翻看一下第一节的内容,然后再听我讲。
那么说在呃推荐服务器做线上推断的时候,那实时用户请求里面确实会包含一些特征。
那这些特征一般是直接在服务器内部提取出来的。
那么比如说时间啊,比如说这个用户低相关的一些信息是吧?所以肯定不需要再在呃数据流中走一遍。
但是线上请求数据最终还是会落盘的存到我们的这个文件系统中。
那生成日志数据。
那在这个过程中,一些流处理和批处理的平台会对这些数据做一些进一步的处理。
那生成今后可供使用的啊特征以及训练用的样本,这部分是需要经过流处理或者批处理的过程的。
好了,接着是问题九有同学问王老师在线预测的时候,模型所需的特征是直接从数据库读取还是在线实时组装啊?我在想,如果只是用户或者物品自身的特征的话,可以从数据库读取。
但如果是用户和物品的交叉特征的话,是不是必须实施组装啊?这是这一个非常好的问题啊,基本可以算作刚才那个问题的延续。
那我的回答呃是这样的,说一般来说呢啊如果组合特征可以在线处理,那最好就在线处理。
因为组合特征有组合爆炸的问题。
为了解决宝贵的存储资源,我们一般不把组合特征全部存储在这个啊数据库里边。
那但是对于有些不得不存储的组合特征,比如说用户插成物品的这样一个曝光,点击记录。
那如果线上模型需要的话,我们还是要存储到啊数据库中。
因为这些特征你是没法在线上直接组合得到的,因为它是一些啊日志和一些历史数据的一些特征啊。
接着我们来看最后一个问题,为什么深度学习的结构特点不利于稀疏特征向量的处理呢?那首先我想说这个问题问的非常非常好。
如果不解决这个问题,在整个embedding技术的意义就没有了。
所以我也希望你能好好的思考一下这个问题。
那我的答案是这样的。
如果我们深入到神经网络的梯度下降,学习过程中的话就会发现,如果特征过于稀疏,会导致整个网络的收敛速度非常慢。
因为每一个样本的学习,只有极少数的权重会得到更新。
在这样样本有限的情况下,那会导致模型的不收敛。
那另一个方面,one house类的稀疏特征的维度往往非常大,可能会达到千万甚至亿的级别。
那么如果我们直接把这个千万甚至亿级别的呃稀数特向量直接扔到这个深度学习网络中的话,整个模型的参数数量会非常的庞大。
那这对于一般公司的算力都是吃不消的那所以基于上面两个原因,我们往往先通过embedding把原始稀疏特征稠密化,然后再输入复杂的深度学习网络进行训练。
那或者说做一个提前的预训练。
这样的话我们就不用把参数非常多的embedding层放进去了。
那这相当于是在原始特征向量跟上层的复杂深度学习网络之间做了一个隔离。
啊,这就是啊为什么我们要在深度学习网络中去加入evarling层的啊原因啊。
好了,这节课的答疑就到这里了,非常感谢前八讲对内容有深度思考和提问的同学,你们的每个问题都很精彩。
那在接下来课程中,欢迎你继续畅所欲言,把留言区这个工具好好利用起来,我们一起进步。