个性化推荐已经成为现代人们生活的一部分, “猜你喜欢”、“相关阅读”你一定并不陌生。计算机如何做到对用户投其所好?企业在做个性化推荐时要如何精准把握用户兴趣?如何解决冷启动问题?如何避免推荐结果的单调与重复?近日,达观数据联合创始人于敬进行了《个性化推荐系统实践》的主题分享,深入浅出的讲解了个性化推荐的过程、难点及解决方法。
一、推荐系统概述
二、搭建推荐系统的关键算法
三、推荐系统难点分析和解决方法
四、深度学习在推荐系统中的应用
五、进阶资源推荐
一、推荐系统概述
常见的推荐系统主要有以下三种场景:
1.个性化推荐 例如打开今日头条时最先看到一个推荐页面,这是一个FEED流,还有像电商网站有猜你喜欢的推荐位置。
2.相关推荐 通常文章或视频的下方会出现一个相关推荐,有的也叫“看了还看”、“买了还买”等。
3.热门推荐 很多会出现在首页的热点位置。
推荐系统其实对于用户来说有其核心的价值。比如:
帮用户便捷的筛选出感兴趣的内容
在用户面对陌生领域时提供参考意见
当用户需求不明确时,作用户的“贴心助手”
满足用户的好奇心,比如很多短视频的APP
当用户有这么多诉求时候,推荐系统做的事情是什么?
首先它基于用户的兴趣,根据用户的历史行为做兴趣的挖掘,把物品和用户的个性化偏好进行匹配。
然后通过推荐算法或者技术把信息进行过滤,解决用户的过载问题。
当用户有新的行为发生时,比如点击或者搜索之后,能及时进一步捕捉用户的兴趣。
选择合适的场景,个性化或者相关,或者热门,来给用户进行推荐。
对于企业来说,个性化带来的效果也非常显著。电商巨头亚马逊每年30%的收入来自个性化推荐;自2008 年起,推荐算法为 YouTube 每天增加了数十万小时的观看时长,每年视频点击量增幅都达到50% ;Linkedin通过propensitymodel提供机器学习,最终为公司带来了数十倍的持续稳定的增长;我们进入京东、淘宝app或者网页端,每个用户的首页展示都是依据行为偏好进行精准推荐。
什么是个性化推荐系统?
个性化推荐系统解决的是用户和内容中间的关联关系,它是二者之间的桥梁。基于用户的兴趣偏好,把用户感兴趣的物品或者视频、资讯等推荐给用户,给用户带来沉浸式的体验,让用户感到一定的满足感,优化用户的体验。
推荐系统从它的初始来说主要是解决两大问题:信息过载和长尾问题。
信息过载是当用户面对大量信息时并不明确自己喜欢什么,但又确实有需求想看到喜欢的东西。从纷繁复杂的商品和内容中如何发现自己感兴趣的东西?对于用户来说是一种选择的困难。
另一方面来说,企业有新物品上线时,如何展示给喜欢它的用户?
根据达观数据服务的客户经验,我们发现物品没有曝光并不代表没有人喜欢它,而是没有在合适的时机曝光给对物品感兴趣的用户,推荐系统刚好能解决这方面的问题。
一方面系统基于大量的用户行为数据来分析挖掘用户的偏好;另外一方面,基于物品数据及物品自身的特点,把商品和用户的兴趣进行匹配,从而达到个性化推荐。用户可以找到自己感兴趣的东西,商家的一些商品或内容也能有更多曝光的机会。
推荐系统设计的目标主要有下面三个部分:
首先,功能要尽可能全面,刚才提到推荐个性化推荐、相关推荐和热门推荐,有些商家也包括一些混合推荐,一般在详情页里面下叫关联推荐,但有的产品会在关联推荐中放一个无限下拉的功能,这时候就要夹杂一部分个性化推荐在其中。
其次是效果要精准,即推荐的东西一定是用户感兴趣的。另外推荐的结果要尽可能丰富,内容或物品有更多的曝光机会。
第三是性能,当刷新一个页面的推荐结果,如果没有很快返回会带来很差的用户体验。从另一方面来说,我们的结果不一定是非常好的,但它绝对不能留白,就是无论怎么样推荐结果一定有返回,这是最基础的要求。
在实际的推荐场景里,功能、效果、性能三者相辅相成、也彼此互相影响,很多时候要进行折中的考虑。
二、搭建推荐系统的关键算法
1.达观数据推荐系统架构
上图是达观推荐的是总体架构。
达观数据有自己的运算平台、存储平台和传输平台。在此之上是组件层,很多推荐依赖于NLP做了进一步的分析挖掘。在此之上是模型层,模型有很多,比如用户画像就是对一个用户有全方位的刻画,同时也有物品画像,包括收益、点击、收藏,预估的收益,增长趋势等。
模型之上是算法层,包括矩阵分解、协同过滤,深度学习算法也是达观的一部分,同时还有基于统计的模型,包括点击反馈、关联规则挖掘等,还有比较重要的是基于内容的推荐。
算法层上面是组合层,单一的推荐算法有二三十种,基于单一的推荐算法会有机器学习的融合排序,基于不同业务场景会自适应选择一部分模型进行效果优化。
组合层上面是应用层,主要提供四种服务:
1. 个性化推荐,这是千人千面的推荐结果;
2. 相关推荐是以物推物,当看到商品、视频或文章会有一个关联的推荐;
3. 热门推荐,其实是热点分析;
4. 推荐理由,是推荐结果的解释。对于推荐理由的使用在PC中用得比较多。
2.推荐流程
推荐流程分为三部分:离线、近线和在线。
离线一般说召回,要从很多推荐的物品里进行召回。大的推荐客户每天会新增物品可能几十万,在推荐候选集中有几千万时并不是所有的每次都要重新计算一遍。离线模块的处理就是先做一个推荐结果的召回,这种召回一般叫重量级的算法,比如说做协同过滤、决策分解、深度学习等,这些会依赖于大数据的集群。由于数据量比较大,一般我们使用最近半年或者几个月的数据,跑一次的时间一般在几个小时,快的话是半小时。从几十万、几百万、几千万的候选集里面得到的候选集在几千这个维度。
经过离线模块的召回之后是近线的处理,也叫粗排,粗排是一些轻量级算法,比如刚刚提到在组合层达观有各种各样组合的模型,基于单一的推荐算法进行融合,一般使用的方式是内存+RDB。这部分处理时间非常快,一般在秒级,就是说当一个用户的行为发生改变后,他的推荐结果会做到实时更新。经过粗排之后,这个推荐结果一般是在百的量级。
最后一步在线主要做精排。当新的请求过来,通过这个用户的ID,根据离线找到近线模块处理的结果。拿到基于粗排之后的结果后做一些业务规则的处理,比如在一次推荐里要求多样性和时效性等。这里很多处理方式是基于加载内存的方式,处理时间是在毫秒级,返回的结果一般在10这个量级。
3.如何做热门推荐?
就热门推荐简单的方式可生成多维度的热门数据,热门数据有各种排行榜,比如点击的排行榜,购买排行榜等。当客户需要热门推荐的场景时可把热门推荐生成的结果直接返回给客户。另一方面,热门推荐也可以捕捉一些场景,比如处理冷启动和做一些基于问题探索时。
热门推荐的结果通常有一定理论依据,比如按购买、销量排序其实也是很多人容易接受的方式,在这部分也可以夹杂人工编辑的分析。所以首先基于用户行为(包括物品数据,用户本身的数据)生成不同维度的排行榜,在不同的时机推荐给用户。
4.如何做基于内容的推荐?
一个物品一般会有各种维度的使用信息,比如商品有标题、品牌、价格、折扣等,基于使用信息可以推荐标题上语意相似的商品。处理基于内容推荐时不仅是基于简单使用方面的匹配,会考虑到其他组合条件。比如服装类的商品加上不同的价格会得到不同的结果,这种找物方式是单纯拿到物品属性时的处理,但在实际场景下还有各种扩展,比如会做做类别和语义的扩展。
类别扩展:比如男生关注的是科技,是否可以推荐一下体育或军事等相关内容?类别扩展也是避免内容推荐过于单一的方式。
语义扩展:当你关注一个标签时,我们会把它相应的标签也拿到,基于你相关的标签也可以做其他方面的召回。比如当看欧冠时,是不是可以推荐西甲相关的新闻?一个用户关注梅西,但梅西的新闻有时比较有限,是不是可以给他推荐C罗的内容?语义扩展也可以解决推荐内容太过单一的问题。
5.基于主题模型的推荐
主题模型的推荐可以充分利用一个物品的文本特征,比如标题、描述或内容等。一篇文章拿到标题后,基于主题模型,基于LDA或者LSI可以把它生成一个向量。
基于这个向量得到关于主题的分布,计算它的相似度,基于这个相似度我们取topN可以得到一个推荐结果。
这种推荐结果比单纯基于文本和字面匹配的效果更好。
6. 协同过滤
协同过滤有两种,基于用户的协同过滤和基于物品的。基于用户的协同过滤首先计算用户之间的相似度,把相似的用户感兴趣的物品推荐给当前这个用户。基于物品的协同过滤先计算物品的相似度,基于相似度进行排序,最终得到当前这个物品比较相似的其他物品。
一个热门的商品会很容易影响到用户或者物品之间的相似度。比如今天有一社会热点事件,很多媒体跟踪除了爆款新闻,即使我平时是一个关注体育或科技领域的读者,也会点击看一下。这种情景下如果基于物品的相似度来处理得到的结果往往不好。所以在计算相似度时要做很多变形,比如对热门进行特别处理,对冷门的物品也需要做特殊处理和过滤等。
也要考虑用户有一些作弊行为,比如用户刷了某一领域很多东西,其他用户只是刷了部分,很多的用户和其他用户计算相似度时,可能都会在其他用户计算的候选集中,这也不符合实际场景。所以在实际处理时要对这部分做一些特殊的控制。
7. 潜在因子模型
基于潜在因子分析是完全由数学的方式、更好的模型来处理。他的输入是一个用户的行为矩阵,通过矩阵分解得到两个矩阵,基于这两个矩阵进一步复原,通过矩阵相乘的方式,就可以把原来用户没有操作过的物品的得分给预测出来。
单纯依赖用户行为数据进行预测有很多不足,给物品的打分和用户本身的打分差异可能很大。在上面的实验模型中可以充分考虑用户的bias信息。比如在电影场景中,由一个大牌明星主演,因为它的市场预期好所以容易得到好评。但当是小众电影或者很多新人主演,大家接受度不高,得分可能会相对低。也许它得到了3分,可能已经相当于大牌明星主演电影的5分。这就会导致物品和用户之间有各种bias信息。在做潜在因子模型时,可以把用户的bias信息和物品的bias信息加进来。
同时还要考虑很多特征要进行组合,男生加上体育和女生加上娱乐,往往是一个更好的特征。对这块来说,通过潜在因子模型可以把这些信息充分考虑进来。
8.用户模型构建
用户模型构建也是用户画像。在实际场景中如果精准挖掘用户兴趣偏好,个性化推荐能做得更好。用户画像有多种信息,基于注册信息有年龄、性别、地域等,还有另一种数据——用户的偏好,同时还有各种分类的场景,比如在电商里会判断一个用户他对价格是否敏感,是否喜欢小众的东西等。
这个分析牵涉到各种技术,比如基于概率统计可以得到一部分数据,另一部分,很多用户之间的兴趣有一定的关联性,可以做用户群体的聚类。预测用户对价值的喜好可借助一些常见的分类模型来处理。对于用户模型构建,我们一方面给推荐系统来使用,另外一部分也提供用户画像这种服务,当企业拿到用户画像后,可以做老用户的关怀、流失用户的召回等。
9.多算法融合
上面提到的都是单一推荐算法,比如基于内容的,基于热门的,包括基于协同过滤、矩阵分解、深度学习等,单一算法会得到一些推荐候选集,拿到推荐候选集后要做一个融合,将最后结果返回给用户。我们会将单一推荐候选集输入到融合模型里,让模型预测,按照用户偏好的高低排序,然后取得TOPN返回给用户。
推荐的整体流程有以上这几点,首先是各种单一算法召回,召回完进行融合,单一算法里又分了不同维度,比如协同过滤、矩阵分解,包括用户画像等。
三、推荐系统难点分析和解决方法
构建推荐系统有下面四个难点:
用户兴趣不仅存在多样性,而且会随着时间的变化而变化;其次对用户兴趣的挖掘需要海量数据,如何合理建模?以及不同算法模型对用户兴趣的刻画结果不同,如何优化模型?
冷启动包括新用户的冷启动和物品的冷启动。新用户是当一个用户没有任何行为数据和辅助信息的情况下,如何给他做好推荐?物品的冷启动即长尾问题——如何将新的物品快速推荐给可能对它感兴趣的用户?
3.如何解决实际应用中的性能问题?
4.如何解决推荐结果单调性和重复性?
基于这四点,和大家分享一下达观推荐系统对上述问题的解决方案(重点来了)
通过引入时间因子,基于不同的时间周期做用户画像。比如基于最近半年的或更久的数据做长期用户画像,基于近一个月或三个月做短期用户画像,同时还会有实时用户画像,基于这三种类型用户画像之间的差异化,能够感知用户的兴趣变更。
基于用户画像后做一个过滤机制,把推荐过或者质量不佳先过滤。这样做排序时会引入一个时间因子做一个衰减,另外也会做机器学习的预测,可以方便地调整推荐顺序。
接下来做优化,随着时间的推移,对于用户的刻画会更清晰准确。
对于物品的冷启动,达观数据使用CLUB算法。先给它合适的探索机会,初期时让物品有一定的曝光,曝光后我们会有一个更快的预期收益机制,加快模型的迭代。当在一段时间内观察预期的收益没有达到要求时,会把这部分的曝光逐渐降低。如果预期收益比较好,会增大一部分曝光。通过这种自学的机制来调整物品之间的曝光问题,新的物品便总是有曝光的机会。
对于用户的冷启动,即使用户没有任何数字信息,用户手机登陆APP时是否有其他可以采集的信息?比如地域,手机型号,基于这些东西可以做一些离线的挖掘。比如一线城市或四线城市,很大程度上会有一个偏好的差异。用Iphone手机和用其他品牌手机,基于历史的数据也会分析出差异点,然后进行针对性的调整。
有一种极端情况,拿不到上述数据时如何做推荐?当拿到用户的ID,基于一些历史行为经验挖掘一些高质量的物品,同时在生成推荐结果时尽量考虑到多样性。相当于当一个用户进入一个饭馆,虽然不知道他喜欢什么,但我们提供了种类丰富的菜单让用户选择。当用户选择自己感兴趣的内容,和推荐系统有交互时,无论是点击、收藏、点赞,借助我们的秒级反馈机制,推荐的结果就可以实时更新,我们会对实时的画像把握得越来越准。
此外达观数据借助自然语言处理技术,当新的物品进来,基于它的标题、类别等语义信息可以做预估,通过深度挖掘构建新物品的画像,辅助接下来是增加推荐还是减少曝光。
离线使用的是大量的集群方式,比如说Spark、Kafka跑一些重量级的算法,矩阵分解、协同过滤,包括深度学习等都属于离线模块来做的,这部分运算时间比较久。
在最上面叫在线模块,当用户有一次推荐请求他希望反馈推荐结果时,要保证快速毫秒级地返回推荐结果,不能做更多重量级算法。这部分往往是一些业务规则处理,可以基于内存或内存的数据库Redis的方式,实时返回给用户推荐结果。
在离线和在线模块之间,它们从小时级到毫秒级中间有很大的gap,用户行为发生变化后如何感知?接下来交给近线模块处理。近线模块可以做到当用户每一次行为变化后,系统都可以感知这种变化,然后把用户的推荐结果重新计算一遍,这时候结果往往是一些融合算法。融合排序输入的就是离线的各种挖掘,包括用户画像信息、他的场景画像和实质画像等。基于近线来说,它对各种单一推荐算法进行融合排序,最终存到内存数据库中。当在线模块接到新请求时,可以从这里面读取对用户近线计算好的结果,然后做业务规则返回给用户。
这就是“三层火箭”架构,它主要借鉴了搜索引擎的部分机制,包括队列、实时计算等。我们可以满足用户的兴趣和变化,同时也在高并发的情况下毫秒级返回给用户推荐结果,目前达观服务了上百家客户,三层火箭架构是一个有效的方式。
另外一个是重要性排序,可以基于物品本身的标题、标签、描述等信息做语义方面重要性的排序。基于文本处理可以有效解决推荐系统的冷启动问题。
四、深度学习在推荐系统中的应用
Embedding主要有两种方式。首先会做词Embedding,来完善内容多样性。当拿到item标签时,业界一般使用Word2vec方式进行专项的扩展。比如当用户关注欧冠这个标签时,是否可以找到西甲、意甲进行词粒度的扩展。这样在实际推荐中可以避免推荐结果太过单一。
另一个itemEmbedding主要应用于召回阶段。对于item Embedding,相当于我们把一个用户行为数据作为一个词粒度,然后输入到Word2vec得到itemEmbedding,基于item Embedding进行相似度计算方式可以得到相似的物品。然后作为一个结果的召回进入融合排序。
在第三种是做Embedding中做特征工程,得到一个物品或者一个用户的Embedding后,做featurevector的方式来使用,基于feature vector做machine learning。
2.基于DNN的推荐
在YouTube发布这篇论文的时候分了两个阶段来实现推荐结果,第一层是上面图片列的候选集生成的阶段。这个阶段DNN的处理方式它可以从百万量级直接降到百的量级。第二层是Ranking阶段,做一些重排序的方式。DNN把我们的推荐问题转化成分类问题,相当于对每一个观看的视频做一个分类。
另外一方面,论文中也提到DNN模型并没有用到原始的用户日志,而是对每个用户提取了等量的训练样本,这种方式主要有好处是可以减少高度活跃用户对loss函数的影响。
3.基于DKN的推荐
DKN主要是基于知识图谱,应用在Feed流推荐中。DKN是基于内容的深度推荐的框架下进行点击率的预测。比如每条新闻通过KCNN对标题进行处理,最终产生一个向量。同时我们引用注意力机制机做用户的Embedding,最终再结合深度神经网络做点击的预估。
2016年谷歌在一篇论文提出了Wide&Deep模型,这个模型里主要同时学习低阶和高阶的特征。
Wide模型是线性模型+特征组合,记忆性好、可解释性强。Deep是Deeplearning,这块特征工程较少,往往可以学习到更高层次的隐藏特征。但它需要较专业的领域知识来做特征工程,所以进一步产生了Deep FM。
对于达观来说,模型排序有下述这些方式。
(1)线性模型,依赖于人工特征工程,
(2)FM/GBDT+LR或Xgboost+LR,它主要是非线性的,达观做了特征融合。在很多场景下推荐效果会更好。
(3)模型的进一步演进,使用到DeepFM和Wide&Deep借助于深度学习,减少很多人工的特征工程。这部分的工作主要在调参上。
在达观服务的众多行业里,从线性、非线性,包括深度学习模型都在使用。每个行业自己的特点,不同的客户有自己的数据量和用户群体,达观会基于客户的推荐效果来选择对应比较好的模型。
2018年微软发布了一个模型XDeepFM,它其实是对DCN的改进,主要由linear、DNN、CIN组成。引入的CIN机制可以自动学习显式的高阶特征交互,该模型在几个数据集上都取得了超过DeepFM模型的效果。这部分达观推荐也正在探索和尝试中。