文章目录
- 1 初识推荐系统
- 1.1 什么是推荐系统?
- 1.2 推荐系统在哪里?
- 1.3 谁在用推荐系统?
- 1.4 为什么我们需要推荐系统?
- 2 推荐系统框架
- 2.1 在线部分
- 2.2 近线部分
- 2.3 离线部分
- 2.4 从数据和模型理解推荐系统框架
- 3. 评估指标
- 3.1 用户满意度
- 3.2 预测精准度
- 3.3 覆盖率
- 3.4 多样性、新颖性以及惊喜度
“千人千面”的背后是什么样的技术支持?例如淘宝为什么可以做到根据每个人的喜好实现个性化推荐?本文揭开这层面纱,即推荐系统!
1 初识推荐系统
1.1 什么是推荐系统?
推荐系统在维基百科上的定义是:它是一种信息过滤系统,手段是预测用户(User)对物品(Item)的评分和偏好。
1.2 推荐系统在哪里?
可以说推荐系统无处不在。
例如,如果我们进入一家超市,在超市的入口挂着促销的牌子,上面写着”今日推荐,本地西红柿打5折促销,数量有限,欲购从速!!!“ 超市的这个牌子可以说就是一个简单的推荐系统。
在互联网环境中,电子商务、电影视频、音乐电台、社交网络、新闻内容等网站或APP,在后台都会有推荐系统的支持,只不过不同规模的网站或APP推荐系统的规模不同而已。
以下是一些推荐系统应用的场景:
电子商务:给用户推荐商品,如淘宝、拼多多等
电影视频:给用户推荐电影与长短视频,如爱奇艺、优酷、 快手、抖音等
音乐电台:给用户推荐音乐和电台,如网易云音乐、QQ音乐等
社交网络:给用户推荐其他用户,如微博推荐用户、微信等
新闻内容:给用户推荐阅读内容,如微博,今日头条等
位置推荐:基于位置的推荐,如美团外卖、滴滴打车等
个性化推荐:千人千面,个性化广告、个性化内容 ,如微博、小红书、今日头条、百度信息流等
1.3 谁在用推荐系统?
结合上面说的本地西红柿促销的例子,直观的说明下推荐系统是谁在使用。
商家:在本地西红柿的例子中就是超市,超市把今日要促销的产品通过促销牌的方式简单、直接的展示出来。
客户:超市的顾客看到促销牌子,直接能够获得这样的信息:”今天买这个超市的本地西红柿,会有折扣!“。那么这个时候有西红柿需求的顾客为了能够打折,会直接去到本地西红柿的售卖区挑选西红柿。
物品:(确切地说物品也是在用推荐系统)本地西红柿通过促销牌会直接吸引有需求的顾客过来。
所以,商家、用户以及商家出售的物品或者服务都会使用到推荐系统,推荐系统包含了整个物品或者服务消费的过程。
1.4 为什么我们需要推荐系统?
假设如果没有推荐系统,我们在使用微博等信息流的APP时,系统会给我们展示一些按热度排序,但我们并不关心的内容。这样就会导致在用户的Feed中,大概率是用户并不感兴趣的内容,让用户淹没在大量无效信息中。同时也会导致产品的用户体验变差,造成用户的流失。
还是西红柿的例子,假设西红柿有很多种类,甜的、大的、便宜的等等。现在有一堆的西红柿,同时有一群人来选择西红柿,如果在这一对西红柿中没有推荐系统的帮忙,那么人们在选择的时候面对的就是在这一大堆西红柿中挑选。如果这个时候有推荐系统,并且已经按照不同维度将西红柿进行分类,那么人们就会按照自己不同的喜好,如喜欢大的,喜欢甜的或者喜欢便宜的在不同的分类中挑选,由于人们挑选的西红柿都是自己需要的,所以对西红柿这个物品整体的评价也会提高,同时销量也会提高。
所以,推荐系统可以在数据大爆炸的情况下,解决数据过载问题,帮助用户过滤无效信息,高效的发现对自己有效的信息,以便帮助用户快速决策,探索感兴趣的新鲜事物。同时对与商家而言,提供个性化服务,提高信任度和粘度,同时提高营收。
2 推荐系统框架
推荐系统可以分为离线层、近线层和在线层。架构如图1所示:
在线部分包含召回、过滤、排序以及规则部分,这几个部分组成了推荐引擎,负责接受用户请求,经过各个模块的处理,最终给用户返回推荐的物品。
近线部分包含了召回系统,模型服务和实时训练(模型服务和实时训练也可以认为是在线部分)。召回系统是从全局物料中(图中的内容生产系统),对物料进行分组,同时根据分组建立倒排索引,最终生成以分组为key,以组内的物料列表为value的用于多路召回的原始物料库。模型服务是提供线上模型计算服务的系统,它加载由实时训练和离线训练产出的模型,同时对推荐引擎提供算法能力。实时训练系统通知实时队列接收样本数据,并实时更新算法模型,是模型可以最快的适应线上数据的变化。
离线部分主要是离线数据库和离线训练。离线数据库是用来存储最原始数据日志以及抽象的业务日志的系统。离线训练系统接收经过特征处理的样本数据,通过机器学习、深度学习算法产生模型。
2.1 在线部分
用户在一次请求(Query)中,首先经过召回模块①,根据用户自身(如年龄、性别、兴趣标签、Embedding)、环境(如国家、地区、手机型号、网络环境)以及物品的一些通用特征(如关键词、分类等)等特征,通过倒排索引召回各路召回库的物料⑤,再对所有路的物料进行排序和融合,经过召回模块后,用户的候选物料级一般会从十万甚至百万的数量级将至千级别。
然后在经过过滤模块②,过滤模块的工作就比较简单了,一般是做去重、去低质等操作,主要过滤一些不适合展示或者降低用户体验的物料。
经过过滤模块之后,就是排序模块③,有的系统排序模块分为粗排和精排两个部分,有的只有一个排序模块,本文统一以排序模块进行讲解。排序模块作为对业务的直接展示部分,在整个推荐引擎,乃至推荐系统中都起着至关重要的作用。推荐模块接收召回的几千条物料,通过模型服务提供的各种排序算法的能力,对这几千条物料进行排序,最终排序模块会选择排序分数在TopN的物料输出。如果排序模块分为粗排和精排,一般经过粗排后会输出白以内的物料进行精排,精排后输出十几条甚至一条物料作为对用户最终的展示物料。
最后,有些系统为了多样性、新鲜度以及惊喜度考虑会在排序模块后加一个规则模块④制定一些规则输出,比如对于同一个人生产的内容进行打散展示,对同类内容只输出一条,插入运营扶持的物料等等。在用户获得推荐物料后,会将物料曝光的日志记录到离线数据库和在线日志系统中。如果用户进行了点击或者其他行为后,也会将用户的行为记录到离线数据库和在线日志系统中⑦。记录这些日志主要是为了完善召回系统、完善模型以及数据分析、报表查询和case追踪等。
2.2 近线部分
近线部分中主要的模块就是召回系统,召回系统主要的工作就是从在线日志系统和离线数据中收集近期的item以及最新产生的item进行倒排索引的建立⑩,同时将建好的索引库存入缓存,随时等待用户Query的到来。目前,一般的召回系统都会支持多路召回。召回的方式可以是规则、算法等,如热门程度在TopN的物品,男性喜欢的TopN的物品、包含某个关键字的文本、通过矩阵分解产生的物品向量相似度较高的物品等等。目前召回时常用的算法有CF、MF隐向量召回、FM隐向量召回以及DSSM向量召回等。对于向量召回又是一个新的话题,以后有机会可以深入讲解。
我这里把模型服务和在线学习放到了近线部分讲解,其实也可认为它们属于在线部分。模型服务主要工作就是给整个推荐系统提供在线的模型服务⑥,为整个系统提供算法能力的输出。其中不只包含召回算法、推荐算法还包含一些其他的分类、检测等算法。如上文提到的兴趣标签、内容标签一般就需要NLP相关的算法进行支持,低质过滤一般需要一些传统的分类算法支持。
在线学习的目的是实时生成最近最新的模型,以便模型及时发觉数据的变化,对后面的预测做及时的调整⑨。对于在线学习又是一个比较大的话题,这里不再进一步展开讲解。
2.3 离线部分
离线部分是离在线最远的,相比在线和近线部分,是实时性要求最低的。离线部分主要是通过离线数据库(离线数仓),对用户曝光、行为日志等进行收集、存储和处理,包括一些数据表的管理,数据聚合、数据分析、报表输出等都在离线部分完成。在机器学习的领域,还包括离线样本的生成等。生成离线的样本数据后,就可以在离线训练中对各种机器学习和深度学习算法进行训练了⑧。
以上,就是按照在线、近线和离线对整个推荐系统架构进行的划分。 这个架构图的每个模块会有不同的实现方式,但是万变不离其总,每个模块各司其职,让整个推荐系统可以正常高效的运转。
2.4 从数据和模型理解推荐系统框架
对推荐系统架构的划分,也可以根据不同领域模块划分为数据和模型两大部分。这里偷个懒借用王喆老师在知乎上分享的一张图来说明,如图2所示。
图2将推荐系统划分为数据部分和模型部分,数据部分主要的功能是对数据的存储和处理。模型部分主要做的是模型的生产、模型的使用以及线上模型与策略(或叫规则)的结合。
2.4.1 数据部分
数据部分主要应用一些主流的大数据架构,如批处理架构、流式处理架构、Lambda、Kappa、Unified架构,对数据进行离线的批处理处理(如Hadoop、Spark),流式的准实时处理(如Storm、Flink)以及客户端及服务器的实时处理(如Mysql、Redis)。通过这些处理,获取数据中的用户信息、物品信息以及场景信息等通过特征工程,生成特征数据用做模型的训练和预测。
2.4.2 模型部分
模型部分稍复杂些,主要分成模型训练与线上应用两部分。模型训练(在图的下方)又分为模型离线训练和模型在线更新。在对一个业务进行算法模型上的优化前,首先要对业务进行深入分析,选择合理的优化目标。然后在利用Sklearn、Spark MLlib,Pytorch以及Tensorflow等机器学习和深度学习框架进行模型训练。训练好的模型需要经过离线评估和在线AB测试后,才能够正式的封装成为模型服务进行上线。为了提高模型的实时程度,会引入模型在线更新,即在线学习,在线学习较离线训练数据特征实时性要求要高的多。
模型部分的线上应用部分,主要就是从候选物料库到推荐物品列表的过程,具体的上文已经详细的介绍,这里就不再赘述。需要说明一下的是模型服务部分,模型服务部分一般负责对线上数据进行数据的处理转换,生成可预测的数据,然后将数据经过加载到服务中的模型的计算,最终通过RPC的服务(如:Google的 gRPC、FaceBook的 Thrift、以及基于一些开源框架自研的RPC服务等)对外提供算法支持,目前模型服务比较常见的部署方式是采用容器化(Docker)的解决方案,容器化部署的好处是可以方便、快速的扩容和缩容。
3. 评估指标
以上介绍了什么是推荐系统,以及推荐系统的架构。下面我们再来聊一聊推荐系统的评估指标
3.1 用户满意度
推荐系统的存在主要是增强用户体验,增加用户粘性。所以如果我们可以拿到用户满意度的数据,那么我们就可以很容易的评价我们的推荐系统的好坏。然而,用户满意度的获取一般是通过问卷调查等成本比较高且获得有效数据比较少的方式。所以仅仅用用户满意度来评价推荐系统在数据上的支持不够。
3.2 预测精准度
一般用精确率作为评价推荐系统中算法模型的指标。精确率指预测出来用户会点击的物品中有多少是用户真正点击的,这个指标体现了算法模型的能力。与此类似的指标还有召回率以及AUC。
3.3 覆盖率
如果推荐系统总是推荐一些热门商品的话,那么它也不是一个良好的推荐系统。推荐系统是需要发现长尾物品,并且将其推荐给用户。所以覆盖率也是评价推荐系统的一个重要指标之一。
3.4 多样性、新颖性以及惊喜度
另外,推荐系统还有多样性、新颖性以及惊喜度等增强用户体验的指标。就多样性而言,假设我们看到的物品都是一类物品,那么很快就会审美疲劳,这个时候就需要推荐系统的多样性给我们带来不一样的物品。新颖性主要为了让用户发觉自己的新的兴趣,给用户并不知道实际上是用户感兴趣的东西。惊喜度就是让用户不断的产生惊喜感。以上三个指标都是为了增强用户体验。一般通过规则或者探索与发现来实现。
注意:所有以上的目标都是为了增强用户的CTR(点击率),从而促进CVR(转化率),最终达到商业目标增加应收。