01 推荐系统:我们应该怎样学习推荐系统?
你好,我是黄鸿波。
从今天开始,我们就要正式地进入专栏的学习了,希望这门课程能够帮助你和你的团队快速地搭建起一套企业级的推荐系统。
在正式学习如何实现企业级的推荐系统之前,我们先来聊一聊什么是推荐系统,以及我们应该怎么学习它。相信你学完这节课,会对推荐系统有着更加深刻地认识,它也会对你后面设计推荐系统有很大的帮助。
什么是推荐系统?
随着互联网时代的高速发展,大量的电商网站、新闻媒体、社交娱乐App如春笋般涌现出现,渐渐地,人们发现这些网站及App越来越“了解”我们,它们能够知道我们喜欢看什么内容的新闻,听什么类型的音乐,买哪类商品,甚至他们能够通过一系列的分析知道我们的年龄及喜好。正是由于这些网站和App能够很好地抓住我们的兴趣点,源源不断地将我们喜欢的内容呈现出来,我们才越来越离不开这类网站和App,而这背后离不开推荐系统的功劳。
让我们来想象这样一个场景,一位年轻的女性去商场购买衣服,在她进入商场的那一刻,就有一位服务人员默默地陪在她的身边,通过她的一系列行为来了解她对衣服的偏好。这位顾客几经挑选,买下了一条连衣裙。这时,服务员会根据自己的经验和对顾客的观察,为她推荐其他类似的连衣裙,或者能与这件连衣裙相配的衣服,例如一件小马甲。这样恰到好处地推荐很可能被采纳,这位女性就此把小马甲也买了下来。
现在,人们在家里就可以足不出户地网购了。网购面对的是一个个的电商网站,电商网站中的推荐系统(Recommend System)其实就充当了上面场景中服务员的角色。下面这张图显示的是在我电脑中打开的一个电商系统的网页。可以看到,由于我经常在这个网站上购买咖啡及咖啡相关产品,因此它会给我推荐咖啡机和咖啡豆等产品。
实际上,在我在打开电商网站的那一刻,我就已经被推荐系统“盯上了”,我的一举一动都逃不过推荐系统的“眼睛”。推荐系统通过记录和分析用户在网站上的每一个行为来判断用户的兴趣点和可能购买的物品,然后在它的系统内部快速运算并做出相应的反馈,尽可能地把它认为用户感兴趣的内容排在前面,以此提高商品的点击率和购买率。
当我们面对推荐系统推荐出来的商品时,一般会有3种可能的行为。
- 用户很愉快地购买了产品。此时我们可以认为,推荐系统所推荐的商品是非常准确的。
- 用户点进了这个商品的详情页面,浏览了一遍后关闭了页面。此时我们可以认为,用户对于推荐系统所推荐的商品比较感兴趣,推荐系统可以记录下来进行后续的处理。
- 用户根本没有点击进入这个商品的详情页面。推荐系统在记录下来之后,可以通过某种策略再次推荐。经过若干次推荐之后,推荐系统发现用户根本没有点击,这时我们基本可以断定,用户对这个商品是不感兴趣的。
第2种和第3种行为,会让推荐系统认为用户对被推荐的商品不感兴趣,即“负反馈”。而这个负反馈所针对的商品,即“负样本”。相反,用户感兴趣的商品为“正样本”。推荐系统不仅要挖掘正样本,更要提取负样本,这样才能使推荐系统的效果更好,提升用户对电商网站的黏度。
电商网站中的推荐系统只是推荐系统在业务领域中的一个案例,除此之外,我们还可以在互联网中找到许许多多应用了推荐系统的场景。
比如在旅游类网站中,推荐系统可以根据用户订阅机票的信息和浏览记录,为用户推荐目的地的酒店;在短视频类App中,推荐系统可以根据用户的浏览记录和点赞记录,为用户推荐他可能感兴趣的视频;在新闻资讯类网站中,推荐系统可以根据用户的阅读历史,为用户推荐他可能感兴趣的文章内容等。
由此可见,推荐系统在我们的日常生活当中随处可见,推荐系统对于一家互联网公司的盈利来说也是至关重要的,这就是推荐系统如今这么火爆的原因。
一个完整的推荐系统包含哪些内容?
到这里,我们已经了解了什么是推荐系统,接下来我们就来从技术方面来看一下,一个完整的推荐系统都包含了哪些内容。
实际上,一个完整的推荐系统是一个非常庞大的体系,它不只是一个算法,或者一系列算法的集合那么简单。推荐系统是一个整体,里面由若干个小的部分构成。我们先来从一个宏观的角度来感受一下一整套工程化的推荐系统都包含哪些部分。
上面这张图可以说是一整套推荐系统的架构图,这里所包含的不仅有推荐系统和推荐算法这两个部分,同时还包含了数据的存储处理、服务端的API接口以及Web层用户的访问等等。
在这里,访问层指的是用户访问我们的App或者网站时所使用的设备,它可以是手机、电脑或者iPad等,当用户打开我们的App(或者网站)时,就可以浏览到推荐系统给用户推荐的内容。
那么这个推荐的内容是怎么产生的呢?我们可以从下往上来看。
当用户访问到我们的网站或者App时,首先会从数据存储层里读取这个用户历史的浏览数据和用户的一些其他信息。然后推荐系统会利用这些信息对数据进行加工和处理,形成用来计算用户推荐内容的特征信息,它可以是用户画像、内容画像等,当我们把所需要的信息处理好之后,接下来我们就要将它们送入我们的算法或者模型中。
一般来讲,我们可以将推荐系统的模型算法分成两个大部分,分别是召回和排序。
召回层的意思就是找到用户可能喜欢的内容的候选集,这里的内容可能有成百上千个,也可能更多,总之,在这一部分就是要把所有用户可能感兴趣的内容都拿出来。
而排序层的意思就是将召回层拿到的召回集根据用户的喜好,再一次进行排序,按照推荐系统计算出来的用户点击内容的概率,对内容进行打分。这个时候,召回候选集里面的每一个内容都会有一个它对应这个用户此时唯一的分数,这些分数也代表着用户对这些内容可能的喜好程度。然后我们将这些分数从大到小排序,排序后取topN,这个时候得到的就是用户最喜欢的前N个内容,然后我们就可以将这些内容推荐给用户了。
实际上,这个排序层在真实的场景中还可以进行细分。一般来讲,我们还可以将其分成排序和重排序两个小的环节。排序层就是刚刚我们所说的,将召回层中的内容进行排序,取topN;而重排序则是将排好序的内容再进行细微的调整。之所以需要这一步,是因为我们排序出来的内容很可能存在内容上的冗余,如果直接呈现给用户,可能会有信息上的重复,也影响用户体验。
我们举个例子,比如说一个内容类的信息流App,通过排序层取到了15个内容,这15个内容前8个都是视频,中间4个是文章,最后3个是论坛里面的帖子。如果不经过重排序的话,用户就会看到前面都是视频,中间都是文章,最后都是帖子。这样的排序很不美观,也容易让用户审美疲劳。这时候我们进行重排序,就可以将视频、文章、帖子这几个部分穿插开来,让排序显得不那么单调,提升整体的观感了。
待重排序层产生了最终的内容后,接下来就是将它们与界面进行组装,然后再通过服务层的接口返回给用户。最后用户所看到的就是经过召回、排序、重排序后,最终呈现在App或者网站上的内容。
我们应该怎么学习推荐系统?
知道了推荐系统的概念和整体流程,那我们又应该怎么学习推荐系统、学好推荐系统呢?
虽然我们说推荐系统是一个很大的整体,但是作为一个算法工程师所需要掌握的其实主要在业务模型部分,这之中又包括了对数据的处理、对特征的处理、各种画像的建立、召回层、排序层以及重排序层这几个阶段。我们来看看怎么学习推荐系统,以及如何把这几个阶段给串联起来。
第一阶段,对推荐系统全局有一个大致的了解。
学习任何一个系统的第一步,都是对这个系统有一个全局性的了解,推荐系统也不例外。所以,我们首先要认识什么是推荐系统,知道推荐系统能做什么,以及推荐系统是由哪些部分构成的,这些部分的作用分别是什么。
这节课我们重点讲解了推荐系统的概念和作用,后面,我们还会用一些具体的企业级的推荐系统架构案例,详细阐述一个企业级推荐系统的数据流转、存储和推荐算法等各个部分,具体在推荐系统中扮演了什么样的角色。
第二阶段,了解一些简单的召回算法和排序算法。
当我们对推荐系统有了一个比较全面的了解之后,接下来我们就需要去了解构成这些推荐系统的技术了。
对于推荐系统而言,它的核心就是推荐算法,而推荐算法的核心又可以分成召回算法和排序算法。所以,学习推荐系统的第二步就是了解一些召回算法和排序算法。
对于常见的推荐系统而言,我们需要对召回和排序的算法都有研究。我的建议是,先去学一些业界用得比较多的,相对比较基础的算法。例如召回层的协同过滤算法、LFM算法、YoutubeDNN等等。
对于排序层,可以去了解下最基础的LR,然后在LR的基础上增加GBDT的部分,这个也是我们常用的GBDT+LR排序方式。然后就是一些深度学习方面的算法,例如DeepFM、xDeepFM、双塔模型等。此外YoutubeDNN也有对于排序层的算法。当然,我这里只是列举了一些常见的算法模型,实际上,我们要学的还有很多,在后面的课程中,我们会循序渐进地去学习。
第三阶段,了解召回算法和排序算法对数据和特征的需求。
对常见的算法有了一定的了解之后,我们就能够很清楚地知道,在什么样的情况下,我们需要什么样的数据,以及如何组织这些数据才能让算法的效果发挥到极致。因此,下一步我们要做的就是了解这些算法对数据和特征的需求,了解我们应该怎么样去收集数据,收集什么样的数据。
在推荐系统中,数据和特征是重中之重,不同的数据和特征组合,会使最后推荐的效果相差甚远。
数据特征是一个很广的概念,需要用到很多技术。比如说,我们有些时候需要提取关键词,这时我们就会用到NLP领域的知识;有时候,我们需要统计文章中的字数,或者统计一些类似词频的信息,这时我们又会用到Python中与统计学相关的内容;有时候我们还需要对时间、时序信息进行处理,甚至还要处理时序信息中心的缺失值问题,这个时候我们还要用到与缺失值处理相关的手法……
由此可见,数据和特征处理非常考察我们的综合能力,这个综合能力可能并不要求我们做得非常精,但是却要求我们的知识面非常广,这样才能让我们考虑问题更加全面。
第四阶段,了解一个简单的推荐系统是如何工作的。
当我们对算法和特征处理、数据处理等内容都有了一个清晰的认知时,我们这个时候实际上已经可以为用户推荐内容了。因为这个时候,我们已经能够通过算法生成我们的召回集和排序集了。到这里,我们还需要了解如何很好地把我们产生的数据推送给用户,同时得到一个正确的反馈。
实际上,这里我们所说的正确的反馈就包含在推荐系统完整的工作流程中。很多人认为,作为一个算法工程师,我们把算法所产生的内容推荐给用户,工作就完成了。但在我看来,这只是其中的60%的工作,而剩下40%的工作就是后续的信息回采和处理,这也是推荐系统的重中之重。
我们说推荐系统是一个整体,它实际上也是一个循环的信息流。当我们把推荐的内容给到用户的时候,用户就能够看到你推荐的这些信息,那么这个时候,实际上就会产生几种不同的可能性。对于文章等信息流推荐,用户可能进行了点击阅读,然后在此基础上又进行了点赞、收藏、评论等一系列的操作,这些操作就体现了用户对于这篇文章的喜好程度。
所以,这些内容我们也需要记录下来,然后转换成我们算法所需要的特征信息(例如在协同过滤算法中,就非常依赖这些信息)。然后这些信息又会反过来辅助算法,让算法计算出来的推荐结果更加准确。
在我们课程的后半部分,我们会讲解如何把推荐系统以服务的形式给到用户,然后再借助信息回采将用户的行为记录下来,迭代我们的模型。
当你对上面几个方面都有足够了解之后,相信你也已经从一个推荐系统的小白变成了一个有着相对丰富经验的算法工程师了。这个时候如果我们遇到了更难的问题,也可以借助所学,从容不迫地将问题拆解开了。
总结
这一节课的知识点到现在就已经讲完了,接下来我们来对这节课的内容做一个总结。
你可以先自问一下,什么是推荐系统?一个完整的推荐系统包括哪些流程?
推荐系统是一个比较庞大的体系,完整的推荐系统实际上包含着从数据存储、处理到模型处理,服务的搭建以及将内容推送给用户的一整套流程。
我们要从推荐系统的全局出发,知道这一套循环体系是如何流转的,继而深入地了解每一个算法的特点,学习数据处理的思路和方法,这样才能够设计出真正符合用户和企业需求的推荐系统。
课后题
学完这节课的内容,给你留两道思考题。
- 你想设计一个什么产品?它能够为用户带来怎样的服务?
- 你想设计一个怎样的推荐系统来服务你的产品?是商品推荐、信息流推荐还是关系推荐呢?
欢迎你在留言区留下你的观点,我们一起交流讨论,下节课见。
- 香格里拉飞龙 👍(4) 💬(3)
期待后续,不知道讲embedding召回时会不会讲faiss,入门课程也希望能更接近业界
2023-04-10 - GAC·DU 👍(3) 💬(2)
推荐系统和图数据库结合是不是会更好一些?对目前的各大平台的推荐系统体验并不好,之前在京东买个电动剃须刀,付款后推荐系统还推剃须刀,给用户的感觉就是推了个寂寞。
2023-04-10 - 海欧 👍(2) 💬(1)
目前排序模型部分已经发展到基于注意力机制和序列的din,dien深度模型,老师可以在课程里增加这部分模型的介绍和工程实战么
2023-04-11 - 欢少の不忘初心 👍(1) 💬(1)
关于老师的问题:从公司的角度需要开发关于房产的推荐系统,从个人的角度需要开发关于博客文章类的推荐系统,想给用户带来交互性,体验性更强的系统服务。从房产来说主要是房源的推荐,从博客来说主要是文章的推荐。 我是一个推荐系统的新人,关于文章中的一些名词不是很懂我大概学习整理了一下。 协同过滤算法:核心思想是利用用户的历史行为数据寻找用户之间的相似性。这个可以分成两大块,基于用户协同过滤,基于物品协同过滤。从用户来说就是把一个用户喜好的商品同时推荐给具有相同喜好的人。从物品来说,一个用户购买了某个商品,把相似的商品同时推荐给用户。这个算法存在的问题就是冷启动,新用户,新物品无法推荐数据稀疏过拟合等问题需要特殊处理。 LFM算法:也称矩阵分界算法,他可以解决协同过滤算法的稀疏问题。他是通过将用户和物品抽象成一个低维向量,通过向量之间的内积计算用户对物品的兴趣度进行推荐。同时也存在了数据过拟合问题,需要根据具体场景进行调参和优化。 LR算法:(逻辑回归)是一种常见的分类算法,通过将输入特征与权重进行线性组合然后将结果传递给一逻辑函数,然后将输出连续转换为二分类输出即预测样品属于正类或负类的概率。他也有一些问题,会受噪声和异常值的影响不适合处理多分类问题。这里可以采用正则化LR,Lasso回归,岭回归。 DeepFM与XDeepFM是深度学习的推荐系统模型。 通过老师的讲解以及专业名词的学习与了解使我受益匪浅,感谢老师!期待后续
2023-04-23 - peter 👍(1) 💬(1)
请教老师几个问题: Q1:能否详细讲一下环境搭建? 老师的课很好,尤其是实战,想从头跟下来。代码是python写的,我是小白,但估计勉强可以看懂。如果环境搭建成功,可以跑老师的代码,效果就非常好。环境搭建也许有一些坑,容易导致“入门到放弃”的心情。所以,老师能否详细讲一下环境搭建?包括win10下环境和linux下环境。 我的笔记本是win10,已经安装了虚拟机,ubuntu20。以正课形式,或者加餐形式,或者一个文档与代码放到一起,都可以。 Q2:老师在互联网公司做过推荐系统吗?老师目前在游戏公司工作,游戏公司需要推荐系统吗? Q3:chatGPT可以创建推荐系统吗? Q4:“召回”这个词,给人的感觉是“选择了,但觉得不好,又打回来”,词义有点偏负面,但文中的意思是“召回层的意思就是找到用户可能喜欢的内容的候选集”。 感觉这个词用得有点别扭。
2023-04-11 - 董俊俊 👍(0) 💬(1)
老师,一个php程序员该如何学习您的课程,感觉这些算法都好复杂?
2023-05-22 - Serendipity 👍(0) 💬(1)
我在学校读研,目前在研究推荐系统。读的一些论文比如NCF,NGCF,LightGCN,KGCN,KGAT这些模型究竟用在推荐系统的哪一个模块上,是召回模块还是排序模块,因为论文中不曾提及这些东西,只谈了性能指标的提升,如果我后续基于这些模型进行改进,搭建一个推荐系统原型又该如何做呢。感觉学术研究的推荐系统跟工业的推荐系统真的差不少。
2023-05-12 - 一轩明月 👍(0) 💬(1)
期望设计的产品: 抓取自己主要的信息源数据(公众号,blog,播客,推特,arxiv摘要......)每天给自己推荐一份阅读清单,能根据点击反馈匹配”阅读口味“ 当前困惑: 浏览”推荐算法工程师“(3年以下/无限制)招聘信息时,常能看到类似”熟悉Hadoop/Spark,具有海量数据处理能力“,“熟悉 Python/java/C++”的描述。向老师请教: 1. 所谓“熟悉”大数据处理工具,要达到什么程度,比如 shuffle、计算图的实现与优化都要清楚?还是会调 api,写 SQL 洗数据就可以? 2. 按我理解,数据科学的 python,大数据工具的 java、scala,cuda 算子/计算效率的 C++,应聘时三门语言都做到纯熟很难,从“强大的工程能力”要求出发,应该怎样取舍?哪些是必须项,哪些只是加分项? 谢谢
2023-05-07 - 麦克范儿 👍(0) 💬(1)
感谢黄老师的分享,看完了1-2讲还是有很多收获的。我目前从事BI工作,想学习下咱们的课程后争取往数据科学相关的岗位转型。想问下咱们这个课程教的知识和项目您觉得可以写到简历中并且应对一般的面试吗?如果我以后想深耕这块领域是否还需要再多补充很多底层的数学或算法知识呢?谢谢!
2023-04-26 - 全国花式伸脖子蹬腿锦标赛冠军🏆 👍(0) 💬(1)
老师,召回层和排序层没理解。 召回层的意思就是找到用户可能喜欢的内容的候选集,这里的内容可能有成百上千个,也可能更多。 排序层的意思就是将召回层拿到的召回集根据用户的喜好,再一次进行排序。 为什么不能直接排好呢,召回层是不是也是根据用户喜好生成召回集的,这两层不是都是根据用户的喜好来的吗
2023-04-24 - 新手学算法 👍(0) 💬(1)
公司新交给我一个任务是银行理财产品的推荐系统:根据客户的风险等级,投资偏好等用户画像和行为习惯来推荐理财产品,再根据用户的反馈来优化这个系统。我感觉不是特别复杂,但我是做nlp的,之前从来没有接触过推荐算法,老师在有什么好的建议?
2023-04-17 - 徐石头 👍(0) 💬(1)
1. 公司产品是新闻类短视频APP,用户能够浏览,收藏,点赞短视频内容 2. 信息流推荐,不知道怎么入手开始
2023-04-12 - 一叶浮萍 👍(0) 💬(1)
期待老师接下来的课程,也希望老师有时间的话,拓展一些更前沿的工程应用和实践
2023-04-11