原文出处: 飒然Hang
首先需要明确的就是推荐系统的目标,一般来说不外乎以下几个:
基于这些目标,推荐系统包括四种推荐方式:
其中,前三者是和机器学习没有任何关系的,但却是推荐效果最好的三种方式。一般说来,这部分内容应该占到总的推荐内容的80%左右,另外20%则是对长尾内容的个性化推荐。 个性化推荐系统个性化推荐是机器学习应用的一个典型场景。在本质上和搜索引擎是一样的,同样是为了解决信息过载的问题。搜索引擎某种意义上也是一个个性化推荐系统,但是其输入特征是可以从搜索关键字直接可以得到的。而一般的推荐系统,输入特征则是需要机器学习才能得到。 个性化推荐系统一般由日志系统、推荐算法、内容展示UI三部分组成。
其中,个性化推荐中最为核心的推荐算法,目前比较流行的有以下几种:
个性化推荐系统的典型架构如下图所示: 在线业务系统的日志接入数据高速公路,再由数据高速公路迅速运转到离线数据处理平台和在线流计算平台;离线数据处理平台周期性地以批处理方式加工过去一段时间的数据,得到人群标签和其他模型参数,存放在高速缓存中,供在线业务系统使用,与此同时,在线流计算平台实时对线上的日志数据做处理,对离线计算出的数据进行补充、修正等;在线业务系统综合离线特征和在线特征使用一定的逻辑得到输出供业务使用,产生的日志流入数据高速公路。 基于此框架,个性化推荐系统的典型流程如下所示: 可知,一个推荐系统主要有以下模块组成:
数据ETL-1对原始的用户行为等数据进行清洗、加工,如字段、属性、格式化等,作为下一步推荐算法的输入。 推荐算法对于个性化推荐系统来说,推荐算法应该是其最核心的部分。目前有很多流行的算法,比如:
推荐算法的输出结果一般是一个用户对应一个item列表或者是一个item对应一个item列表。此部分主要考虑的是算法的时间复杂度,不管是哪一种算法,一旦用户或者内容数据上了百万级别,都需要通过分布式计算如MapReduce、Spark等来进行解决。 推荐算法的基本流程如下图所示: 数据ETL-2对推荐算法产生的结果进行清洗、格式化等,作为下一步存储模块的输入。 用户画像存储存储用户的偏好以及行为数据等信息。对于偏好,采用标签量化来表示,是一种随着时间衰减的值。对于用户画像,是批量写入、实时读取,所以存储要着重考虑读的性能。可以选择使用Redis集群作为技术方案,能够最大满足读的性能,缺点是Redis的成本昂贵且不支持auto index。也可使用Hbase作为存储,使用ElasricSearch构建二级索引,以应对根据多种维度聚集用户的需求(比如过滤某一个标签下的所有用户)。 推荐结果存储对各种推荐算法计算出的推荐结果的存储。存储空间要求大,格式复杂。对于存储的容量和读写性能要求都比较高。可以选择使用Redis集群作为此部分的存储方案。 服务调用整合用户画像和推荐结果两部分数据,向外提供推荐调用的接口。主要是数据库IO调用开销。
该模块需要采取一定的策略聚合多种推荐算法的推荐结果,直接面向业务。策略由于会随着面向的业务不同而不同,需要可配置化。同时也提供对外暴露用户画像的接口,使得业务方可以使用用户画像做针对性的处理。可以采用RPC机制对外暴露服务接口。 需要考虑的问题对于一个推荐系统,结合其实现目标,还有一些需要注重考虑的问题。 实时性问题由于计算用户、item矩阵或者进行矩阵分解是需要离线进行且比较耗时,因此协同的推荐算法是很难达到实时性的。实时部分的推荐主要依靠基于用户画像的推荐来进行。最终的推荐列表是根据一定的策略对这两部分进行聚合的结果。 时效性内容问题时效性内容指的是那些与时间强相关的内容,比如新闻、时事等。如果一条10天前xx球员获得冠军的新闻现在被推荐了出来,可想用户肯定是莫名其妙或者是很失望的。因此,对于时效性内容,需要与普通的待推荐的内容区分开,做单独的推荐或者不走个性化推荐。 冷启动问题不管使用何种推荐算法,都会面临冷启动问题:当用户是新用户,如何给用户推荐item呢?当内容是新内容,如何推荐给用户?
多样性问题在基于用户画像的推荐算法中,取出用户的多个标签,然后根据相关度从不同的标签中取不同数量的内容,这样既兼顾了用户的多种兴趣也能够在一定程度上解决多样性的问题。 如:用户具有tag:A B C D,相关度为wA wB wC wD,Total推荐为总共需要推荐的条数,那么
内容质量不管是热门推荐、人工推荐还是取某一标签下的内容列表都牵扯到的一个问题就是:如何给内容排序? 当用户对内容的喜好不一样,可以按照兴趣度来排序;但当无法区分兴趣度的时候(比如:用户是新用户;内容都是新内容;用户对于某一标签下的内容兴趣度一样),可以使用内容质量来做排序。click/pv是一种评判内容质量的方式。此外,使用卷积神经网络相关算法也可以构建内容质量模型。 惊喜问题推荐系统的惊喜目标一直是一个难题,被称作EE(Exploit & Explore)问题,bandit算法是解决这个问题的一个派系,就是估计置信区间的做法,然后按照置信区间的上界来进行推荐,以UCB、LinUCB为代表的。简单点说就是先不考虑你喜不喜欢就把质量高的内容推荐给你,后面根据用户的行为反馈对推荐内容作调整。具体的可以参见此篇文章:推荐系统的苟且和远方。 总结借用推荐系统的那点事一文的几句话做为结语:
以上是推荐系统实践的一些经验 |
|