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