一文带你掌握推荐系统
编辑导语:推荐系统现在被广泛利用,最常见的例子就是淘宝的推荐算法,可以根据你的基本信息进行推荐,比如性别、地区、浏览等等,推荐你可能感兴趣的东西;本文作者分享了一些基本的推荐系统知识点,我们一起来看一下。
如题,本文的主要内容是推荐系统相关的东西,会涵盖推荐系统相关的大部分知识点,对于非技术人员应该是能基本了解推荐系统了。
本文主要包括推荐系统的相关概念、推荐系统的架构和流程、常见的推荐算法、挖掘、召回、排序、评估和总结这几部分。
概念部分会简述推荐系统相关的理论知识,架构和流程主要是介绍推荐系统的通用架构和常规的推荐流程。
算法部分主要是一些常见的推荐算法介绍,挖掘——召回——排序主要是基于推荐流程的详细展开。
评估部分指的是如何评估一个推荐系统的好坏,总结部分主要是整体内容的回顾,以及一个真实推荐系统的案例。
可以按照个人兴趣直接跳至对应的小节浏览,也可以按照顺序进行阅读,遇到看不懂的部分建议先跳过,遇到读不下去的情况,建议先Mark。
以下,开始正文部分。
一、推荐系统的相关概念
在正式展开文章之前,我们先简单的了解下推荐系统相关的理论知识。
1. 什么是推荐系统
先来看下Wiki的定义:一种信息过滤系统,用来预测用户对物品的行为和偏好。
按照字面意思理解下来,就是帮助过滤信息,预测用户对物品的行为和偏好。
在今日头条曹欢欢博士的一次分享中提到了这样一个定义:
资讯推荐系统本质上要解决用户,资讯和环境的匹配,y=F(Xi,Xu,Xc)。
感觉把这个定义延伸到其他推荐系统上也是成立的,那就是推荐系统本质上要解决用户,物品和环境的匹配问题,帮助建立用户和物品之间的连接。
回到定义本身,理论上说能实现这个功能的系统都可以称之为推荐系统。
2. 为什么要有推荐系统
先来回顾一下互联网诞生到目前为止,我们寻找信息方式的变化历程。
最早期的时候,信息是比较稀缺的,那个时候信息比较分散,寻找的效率较低,主要是人找信息。
后来信息逐渐丰富起来了,有些人或者公司专门把各种信息聚集在一个地方,人们可以通过类目导航进行查找,典型的公司是三大门户。
再后来信息量越来越大,人工添加的类目已经不能覆盖所有信息了,于是诞生了另外一种信息获取方式——搜索,典型的公司是Google、百度。
再再后来,人与信息的关系从单向的人找信息演变成了现在的双向关系,人在海量的信息中找着自己需要的东西,同时海量的信息也在找合适的人。
从这个演化过程中,我们可以看到推荐系统的出现有两个重要的前提:一个是信息过载,一个是需求不明确。
数量有限的情况下根本不需要推荐,用户自己就能浏览完所有的物品;再往后发展,数量级不大的情况下,人工干预就可以解决,当人工干预也无法解决时,这个时候就需要推荐系统了。
当用户需求比较明确的时候,用户会倾向于使用搜索,需求不太明确时,基于用户历史的一些行为和偏好给用户推荐一些东西能让用户先留下来,在逛的过程中可能就产生了一些新的诉求。
从以上的部分可以看到推荐系统是一个多方共赢的存在:
- 对用户而言,能够发现自己感兴趣的东西,提升用户体验;
- 对物品而言,能够发掘长尾物品的利用效率,盘活整体资源;
- 对平台而言,能够获取用户价值和商业价值。
推荐系统典型的应用场景比如电商类的买了又买、看了又看,社交产品中你可能感兴趣的人,音乐电影中的猜你喜欢,以及一些信息流产品等。
3. 你需要推荐系统么
既然推荐系统那么好,要不在产品中加一个呗?
在决定如何加一个推荐系统之前,先确定要不要做,以及投入产出比是否合适。
首先对于不同业务模式,不同阶段的业务需要关注的侧重点是不同的,比如一个工具型产品需要推荐系统么,一个资讯App的早期需要推荐系统么。
其次推荐系统短期内的价值容易被高估,而且搭建起来也是比较费时费力费钱的。
虽然用一些简单的算法就可以有一定的效果,想进一步提升效果,则需要很大的投入。
事情都是相对而言的,具体是否需要搭建推荐系统,需结合业务模式、时间点、战略需求、团队能力等多方面因素综合考虑。
二、推荐系统的架构和流程
这部分主要是关于推荐系统整体的架构以及如何实现推荐流程的。
1. 通用推荐架构
这部分内容主要分为整体技术框架,推荐系统架构、推荐引擎架构这几部分。
它们依次为包含关系,推荐系统是整体技术框架中的一环,推荐引擎又是推荐系统的一环。
整体技术框架:
下图为推荐系统的整体技术框架:
从下往上依次为数据的生产、存储、候选集触发,融合过滤重排序。
重排序之后就是输出的推荐结果,然后再供各业务调用,比如猜你喜欢,看了又看,买了又买。
推荐系统架构:
整个推荐系统可以看作是一个加工厂,输入用户和物品数据,输出用户可能会感兴趣的物品清单,然后从物品清单中取前若干个作为推荐结果给到用户。
在这个过程中还需要做一些过滤、排序工作,输出结果的时候最好能让用户知道为什么推荐这个东西,这样用户的接受度会高一些。
比如已经产生了一个用户可能感兴趣物品的Top100,之后需要把用户已经买过的东西过滤掉。
然后再基于用户的一些历史行为进行排序,比如经常看的东西权重高一些,很久之前看的东西权重低一些,最终排一个名次,再按照排序名次取前10个展示给用户。
要实现这个效果,就需要依赖于很多推荐引擎,简单理解就是会很多个推荐人,各自负责推荐一些候选结果。
推荐引擎架构:
单个推荐引擎和整体推荐架构没什么特别大的差异,无非是推荐引擎先自己走一遍推荐流程,把输出的推荐结果作为新的输入部分,再走一遍推荐流程。
推荐引擎整体可以分为四部分,分别是用户特征、物品候选集、用户-物品匹配、过滤、融合和排序。
用户特征部分做的事情主要是将用户的行为数据(点击、浏览、购买等)和属性数据(人口属性、用户关系、兴趣爱好等)转化为对应的特征,供用户-物品匹配部分利用。
物品候选集就是需要给用户匹配的物品,通常也需要转化为对应的物品特征。
有了物品特征和用户特征之后,需要做的就是生成用户-物品的初始化推荐列表。
再之后就是基于初始推荐列表的一些处理,过滤掉一些东西,按照用户的行为反馈、物品属性和一些产品策略再进行列表顺序的调整,生成最终的推荐结果。
2. 通用推荐流程
上面主要是一些架构相关的东西,这部分主要是如何生成推荐结果。
理论上推荐流程可以分为挖掘——召回——排序这几部分。
挖掘就是上面说的用户特征和物品特征的生成部分,这部分做好了,后面的推荐结果才会有好的效果。
召回就是从原始的数据集中基于种种策略先挑选一部分物品,这部分需要尽可能全的覆盖用户需求,通常会把十万甚至百万级的候选集过滤到数百量级。
排序就是针对召回的数百个物品进行更深层次的加工,优先选择若干个结果推荐给用户,通常数量在数十级。
以上是理论上的流程,然而实际上每个部分都比较复杂,而且也不仅仅只有一个模型,通常情况下都会有N多模型,不同的模型用到的可能是不同的算法和策略。
三、常见的推荐算法
这部分主要是一些常见算法的简单介绍,篇幅有限不详细展开,之前写过一篇算法相关的文章,感兴趣的可以看一下:产品经理必知的推荐算法二三事。
1. 基于流行度的推荐
其实就是我们通常说的热门,基于最高评分、最多购买、最多下载、最多观看等维度给用户进行推荐。
通常情况下可以作为冷启动策略或者兜底的策略,前者是用户刚进来没有任何信息和行为偏好的时候,后者是在其他算法没有推荐结果的时候作为替补策略。
通常情况下计算规则基本都符合下面这个公式:
热度分=(基础分+加权分+行为交互分)*时间衰减
这里面会有很多变形,比如可能需要按照不同类目、维度给予不同的初始权重,可能会人工干预做一些升降权,不同行为的权重会不同等等。
2. 基于内容的推荐
首先澄清一个误解,基于内容的推荐包含有标签的推荐,但并不等于标签的推荐,标签只是基于内容推荐的一小部分。
标签、关键词、实体、分类、主题、词嵌入向量等,都是内容推荐中的一些手段。
基于内容推荐的核心是得到内容画像和用户画像,整体实现流程是先通过内容挖掘得到内容画像;然后基于用户的行为生成对应的用户画像,再基于用户画像和内容之间的相似度来给用户推荐不同的内容。
举个“栗”子:
- 现在要推荐一个新的视频,但视频没有画像,无法推荐,只能随机推一部分流量先看下效果;
- 通过对标题文本进行分析之后发现这是个娱乐类的视频,这个时候就能定向推一部分用户了,效果会比随机推荐好;
- 经过对文本进一步分析后发现内容属于某影视剧的主题,那这个时候就可以基于该主题进行分发,会更精准一些;
- 通过对视频内容识别之后,发现视频中有XX明星,那这个时候推给Ta的粉丝,效果会更好。
以上,就是在内容挖掘之后,基于内容画像进行的推荐。
对于消费了该视频的用户,就可以打上XX标签、主题,然后再不断更新用户画像对应的维度和权重。
此外在新内容冷启动的时候,也可以先计算和现有物品的相似度,然后再基于相似度推荐给可能感兴趣的人群。
3. 近邻推荐
也就是大名鼎鼎的基于用户的协同过滤和基于物品的协同过滤。核心思想是物以类聚,人以群分…
基于用户的协同过滤:
整体思想是找到和用户相似的群体,给用户推荐这群用户中比较流行但该用户没有听说过的东西。
比如A点击喜欢了一篇文章,这个时候就可以给A推荐Ta所在群体中其他人喜欢,但是A没有看过的文章。
这个策略的主要问题在于如何计算用户之间的相似度,通常的计算方法有两种:
- 计算用户之间的余弦相似度;
- 计算用户之间有正反馈物品的相似度,比如A喜欢了的文章和B喜欢了的文章有多少是重合的。
基于物品的协同过滤:
用户协同过滤的思想是计算用户-用户的相似度,物品协同过滤就是基于物品-物品相似度的推荐,先找到用户喜欢过的物品最相似的物品列表,然后给用户推荐这些物品。
只不过这个物品-物品的相似度并不是直接计算得到的,而是通过喜欢物品一的用户和喜欢物品二的用户的交集来计算的,两个物品相似是因为它们出现在很多共同用户的喜好列表中。
这里面需要注意的是热门物品和其他物品之间的相似度,理论上来说大多数用户都可能会喜欢热门物品,这样就可能造成热门物品-单个物品的相似度很高,所以需要适当的对热门物品进行降权处理。
4. 矩阵分解
矩阵分解可以看作是隐语义模型的一种实现方式,核心是为了获得物品和用户的隐向量,然后基于隐向量进行后续的计算和推荐。
近邻推荐是基于用户——用户或者用户——物品矩阵中已有的数据去计算未知的数据,矩阵分解则是将这个矩阵分解为两个小矩阵,后续的计算不再使用原始矩阵,而是采用这两个小矩阵。
素材来源于互联网
比如分解用户-物品矩阵后得到用户u的向量是 Pu,物品i的向量是Qi,那么要计算物品i推荐给用户u的推荐分数,直接计算点积即可。
矩阵分解有时也被称作SVD,但SVD 和矩阵分解不能划等号,因为除了SVD还有一些别的矩阵分解方法。
比如加了用户隐式反馈行为和属性的SVD++,加了时间因素的Time-SVD,还有用来求解矩阵的交替最小二乘法ALS等。
5. 基于关联规则的推荐
关联规则更多是基于统计模型的推荐,表现形式为A和B有很大的关联性,买了A我就给你推荐B。
通常在电商中运用的比较多,比如买了个炒锅为你推荐锅铲,买了个手机为你推荐耳机等。
6. 基于图模型的推荐
图模型指的是把用户行为表示为二分图模型,将个性化推荐算法放到二分图模型上。
那给用户u推荐物品的问题就可以转化为度量用户顶点Vu和与它没有边相连的物品顶点在图上的相关性,相关性越高,物品在推荐列表中的权重越高。
深度学习:CNN、RNN等。
7. 混合推荐
通常情况下上面的这些算法大都是同时存在的,毕竟本身就会有N个推荐引擎。
通常情况下,常见的混合策略一般是加权、交叉、切换、分级、分层。
- 加权指的给不同的算法赋予不同的权重,将多个算法的推荐结果组合在一起,然后取TopN;
- 交叉指的是直接将不同算法的结果推荐给用户,比如固定位置展示或者按照百分比出;
- 切换指的是在不同的场景下采用不同的算法,比如资讯类产品优先基于内容推荐,找不到合适的内容再基于协同过滤,最后基于热门;
- 分级指的是按照算法的效果好坏进行使用,优先使用效果好的算法,无推荐结果时再使用次好的算法;
- 分层指的是把前一层算法输出的结果作为后一层的输入结果,然后再不断的进行优化。
以上,就是常用算法相关的内容,后面是基于推荐流程展开的内容,分别是挖掘、召回和排序。
四、挖掘
挖掘也就是通常说的特征工程,有效的特征和特征组合直接决定着后续推荐结果的好坏。本部分会简单的说下整体流程,以及常见的特征。
1. 整体流程
特征工程整体流程大致可以分为特征清洗、特征预处理、特征处理和特征监控这几部分。
特征清洗主要是将一些异常样本进行清洗,对一些样本进行采样。
特征预处理主要是对单个特征类型的一些转换,同时对异常值、缺失值进行处理,此外还有对多个特征的降维、选择。
特征处理主要是对特征进行离散、平滑、组合、聚合等处理,以达到更好的效果。
特征监控一方面是对特征的有效性进行分析,看特征是否真的有效,另一方面是监控特征的重要性是否有变化,避免影响模型效果。
2. 常见的特征
常见的特征可以分为用户特征、物品特征、相关性特征、环境特征、上下文特征等。
用户特征指的是自然属性(姓名、性别、年龄等)、画像特征(兴趣爱好、行为等)、关系特征(人群属性、亲密度、关注关系等)。
物品特征可以分为静态和动态两大类,静态指的是物品的固有属性,如分类、标签、关键词、主题、类型、语义等,动态指的是全局热度、分类热度、关键词热度等。
相关性特征指的是分类匹配、关键词匹配、语义匹配、uid-mid匹配、点击相似、兴趣分类相似、主题相似、兴趣词相似、向量相似等。
环境特征指的是时间、地点、网络环境、天气等。
上下文指的是用户最近N条浏览内容、点击内容,或者是内容的相关内容,内容发布者的其他内容等。
下面为今日头条的一些特征,可以简单的了解下。
五、召回
通常情况下候选集的数量可能有十万,百万甚至千万的量级,这种情况下如果直接计算用户相似度或者物品相似度的话,复杂度会非常高,成本也会非常大。
召回这个环节的主要任务就是从大规模的候选集中初步筛选出来一部分内容,供后续的排序环节使用,所以这个环节需要覆盖很广很全的范围。
召回的触发机制主要是基于用户特征和环境特征,比如用户画像相关、兴趣相关、行为相关、上下文相关等;此外还有一些运营规则和产品策略,比如热门、特定类型提权、降权等。
常见的召回策略包括上文算法部分的那些算法,以及一些其他策略,比如基于热门、内容、协同过滤、关联规则、图模型、地理位置、时间、用户关系等的召回策略。
有了初步的召回集之后,就可以考虑一些过滤规则了,比如过滤掉用户曾经购买过、明确表示过不喜欢的物品或者已经失去了时效性的物品等。
如果候选集较小,可以考虑在生成候选集之后就进行过滤,如果候选集较大,可以考虑在初始推荐列表中再过滤掉不该在候选集中的物品。
六、排序
按照排序类型来划分的话,排序可以分为粗排和精排,按照目标来划分的话,排序可以分为单目标排序和多目标排序。
单目标和多目标倒还好理解一些,毕竟不同的目标需要的模型和策略可能是不同的,那为什么类型又区分成粗排和精排。
主要可以分为两方面的原因,一方面大多数用户其实消费不了那么多内容,我们精心为用户准备了Top100的内容,大多数情况下用户可能只消费10条内容,那90条内容的工作量可能就浪费了;另一方面排序的核心任务是对召回集给出的结果进行精准的排序,需要兼顾很多模型和特征,这就需要在效率、成本和性能之间做平衡了。
基于这两点原因,将排序又分为了粗排和精排两个阶段。
- 粗排阶段处理的物品数量在数百级,主要负责对召回的物品进行打分,也可以理解为用户的感兴趣程度。
- 精排阶段处理的物品在数十级,同时还会有一些产品规则方面的考虑,比如对于多样性、新颖性、兴趣探索方面的考虑,以及对于特定内容的加权、过滤或者强制隔离等。
单目标排序比较常见的是CTR(点击率)预估,当然这个C并不一定只能是Click,也可以是其他任何行为。
比如视频是不是会看完,看完后是不是会收藏,是不是会分享到第三方平台,查看的商品是不是会购买等,这些都可以看成那个可以被预估发生概率的CTR。
多目标顾名思义就是在排序阶段希望能够满足多个目标,比如视频的点击率+停留时长+完播率,电商的点击率+购买率+客单价。
知乎的排序模型就是一个多目标模型,有基于点击率的模型,基于收藏率的模型,基于点赞率,基于评论率等一共8个目标。
排序模型一般用目标值和AUC来进行衡量,目标值就是排序模型最开始的目标,点击率、停留时长、购买率等。
AUC全称是Area Under Curve,意思是曲线下的面积,这里的曲线就是ROC曲线,这个值在数学上等价于模型把关心的那一类样本排在其他样本前面的概率。
AUC最大是1,完美结果,0.5就是随机排列,0就是完美地全部排错,当然0也可以变成1,效果最差的其实是0.5左右的。
1. 评估
这部分主要来源于《推荐系统实践》这本书,篇幅有限,不再展开,后面会单独写一篇文章来看如何评估一个推荐系统的好坏。
用户满意度:点击率,用户停留时长,转化率等指标。
预测准确度:分为评分预测和TopN预测。
- 评分预测主要是通过RMSE来衡量,即预测评分和真实评分之间的均方根误差。
- TopN预测主要是用召回率和准确率来进行衡量。
召回率=推荐数与有反馈数的交集/有反馈数
准确率=推荐数与有反馈数的交集/推荐数
覆盖率:推荐系统能够推荐出来的物品,占总物品集合的比例。
多样性:描述的是推荐列表中物品两两之间的不相似性,希望尽可能多的覆盖用户的兴趣点。
新颖性:给用户推荐那些他们以前没有见过的东西。
惊喜度:给用户的推荐结果是和用户历史上喜欢的物品不相似,但用户却又觉得满意的推荐。
信任度:增加推荐系统的透明度,让用户知道推荐的理由;比如为什么给用户推荐了这个东西,可能是历史基于历史的某次行为,也可能是基于某个好友信息。
实时性:能够实时更新推荐列表,来满足用户行为的变化,能够将新加入系统的物品推荐给用户。
健壮性:推荐系统抗击作弊的能力。
商业目标:能否满足商业需求,比如GMV、广告收入等。
七、最后
以上就是本文的主要内容,先简单的介绍了一些理论知识,然后介绍了通用的推荐系统架构和流程,之后按照推荐流程的挖掘——召回——排序环节进行展开,最后简单的列举了一些衡量推荐系统好坏的指标。
整个推荐系统的核心是帮助用户发现潜在的用户-物品或者用户-用户连接,先尽可能全的进行覆盖,再尽可能精准的进行排序。
主要流程可以总结成下图,分别是挖掘——召回——排序。
下图为微博的推荐系统的整体架构,感兴趣的可以研究一下。
素材来源于《AI时代精准个性化推荐》
下图是微博推荐算法的架构,包括基础层(挖掘)、召回层、排序层,可以结合着上面章节的内容再深入了解下。
素材来源于《AI时代精准个性化推荐》
以上,就是本文的主要内容,有哪些知识点写错的欢迎指出来;欢迎斧正、指点、拍砖,愿你有所收获。
本文写作过程中,参考了以下作品或资料,主要有:
书籍《推荐系统实践》 By 项亮
书籍《美团机器学习实践》By 美团算法团队
演讲《AI时代精准个性化推荐》By 苏传捷
知乎Live 《推荐算法那点事》 By 姚凯飞
音频课程 《推荐系统三十六式》 By 邢无刀
#专栏作家#
王家郴,公众号:产品经理从0到1,人人都是产品经理专栏作家,喜欢网球和骑行的产品汪,目前奔走在产品的道路上,漫漫产品路,与君共勉。
本文原创发布于人人都是产品经理。未经许可,禁止转载
题图来自 unsplash,基于 CC0 协议
强烈支持,文章非常棒,超级适合了解推荐系统全貌
写的太好啦!学习学习!