推荐系统入门学习简介(二)

       商品推荐分为常规推荐、个性化推荐。常规推荐是指商家选择一些固定商品放在推荐位,或者基于商品之间的关联性,进行相关的商品推荐。例如:在用户买了奶瓶之后推荐奶粉。个性化推荐指基于用户购物习惯,根据商品特性来进行推荐。例如“看过此商品后的顾客还购买的其他商品”推荐项。

       常规推荐的商品不会因为用户不同产生差异,主要是运营配置的活动或固定商品(商品精选)。除了在固定推荐位选定某些商品进行配置,例如选取10件固定商品放在签到页进行推荐。还有一些固定规则的动态配置商品,例如图中商品销量排行榜、商品收藏排行榜、某品类的销量排行榜(例如图书会有许多排行榜),这类根据浏览、收藏、销售数据做的商品统计在常规推荐时会经常用到,对用户的消费决策影响也比较大。

       个性化推荐:电商推荐系统将收集的用户信息、产品信息及用户画像分类作为系统输入,利用适当的推荐算法和推荐方式,根据用户设定的个性化程度和信息发送方式,给用户提供个性化商品推荐。用户对推荐结果的点击浏览、购买的反馈结果,又可以作为优化系统推荐的参考。

        完善的推荐系统一般由四部分组成,按照收集 → 分析 → 推荐的步骤,收集用户信息的用户行为记录模块、分析用户喜好的分析模型模块、分析商品特征的商品分析模块和推荐算法模块。

        用户行为记录模块负责搜集能反映用户喜好的行为,例如浏览、购买、评论、问答等;

        用户行为分析模块通过用户的行为记录,分析用户对商品的潜在喜好及喜欢程度,建立用户偏好模型;

        商品分析模块主要对商品进行商品相似度、商品搭配度、目标用户标签进行分析;

         推荐算法根据一定的规则从备选商品集合中筛选出目标用户最可能感兴趣的商品进行推荐。

        用户画像是根据用户特征(性别、年纪、地域等)、消费行为习惯(浏览、购买、评论、问答等)等信息进行抽象化,建立标签化的用户模型。构建用户画像的核心工作即是给用户贴“标签”,而标签是通过对用户行为记录分析而来的高度精炼的特征标识。推荐系统的难点,其中很大一部分就在于用户画像的积累过程极其艰难。其次用户画像与业务本身密切相关。在用户标签足够丰富并且多的时候,就可以对用户聚类,例如用A/B/C/D等四种典型用户画像来代表商城的目标用户,还可以将新用户进行归类这些典型用户画像中。

       商品分析模块主要根据商品的类目品牌、商品属性、产品评论、库存、销售记录、订单数据、浏览收藏、价格等数据来分析商品相似度、商品搭配度(可人工调整),并且对商品贴上目标用户标签。

       用户画像、商品分析模块的数据都是为推荐算法提供基础数据。商品推荐的算法有很多种,需要根据推荐结果反馈,不断优化模型。有时候还需要考虑人工因素的权重,例自营商品排在前面、评分高的店铺优先推荐等。在推荐时,还用一些特殊推荐:购买此商品的顾客也同时购买、看过此商品后顾客购买的其他商品、经常一起购买的商品,都是基于商品进行的推荐。

       如果完全按照用户行为数据进行推荐,就会使得推荐结果的候选集永远只在一个比较小的范围内,在保证推荐结果相对准确的前提下,按照一定的策略,去逐渐拓宽推荐结果的范围,给予推荐结果一定的多样性。

       在大数据时代,商品推荐模块虽然一定程度上进行了精准营销,提高商品转化率。但是与推荐的准确性有些相悖的,是推荐的多样性。有时候会出现推荐混乱的情况,并且引起用户反感。譬如曾经浏览过某款电视,连续一个月都推荐这款电视;甚至购买过手机之后,还不断推荐其他手机。主要是因为推荐算法做得不够到位,很多用户行为数据没有收集处理,商品关联度没做好就盲目推荐商品。

       

        用户协同过滤(UserCF):相似的用户可能喜欢相同物品。如加了好友的两个用户,或者点击行为类似的用户被视为相似用户。如我兄弟和她的太太互加了抖音好友,他们两人各自喜欢的视频,可能会产生互相推荐。

       物品协同过滤(ItemCF):相似的物品可能被同个用户喜欢。这个就是著名的世界杯期间沃尔玛尿布和啤酒的故事了。这里因为世界杯期间,奶爸要喝啤酒看球,又要带娃,啤酒和尿布同时被奶爸所需要,也就是相似商品,可以放在一起销售。

       模型协同过滤:使用矩阵分解模型来学习用户和物品的协同过滤信息。一般这种协同过滤模型有:SVD,SVD++等。这种协同过滤要比前两个来得抽象些,这里先不解释,后面详述。

       前面第一章说到,人工智能实践过程三个步骤:数据,学习和决策。这里也将用同样步骤,以图书销售推荐为例,解释物品协同过滤的过程。为了简单化,假设某图书销售平台总共有6本书销售,有6个用户购买。

       学习算法:前面说到ItemCF的定义是,相似的物品可能被同个用户喜欢。反过来讲,就是被同个用户喜欢的物品是相似商品。如上图中,图书1和图书2两本书,被用户A同时喜欢,这两本书具有相似性。而图书5和图书6,没有被同个用户同时喜欢,不具有相似性。

第二种是根据相似度预测评分推荐物品。如何决策要不要给用户B推荐图书2,图书4和图书6呢?如下图,通过用户B对图书1的评分 * 未知图书与图书1的相似度来预测用户B对剩下图书的评分。如图书2的预测评分 =  图书1的评分5分 * 图书1和图书2的相似度0.27 ,从而用户B对图书2的评分是:5*0.27=1.35。同样方式计算出其他图书的评分预测。

        物品协同过滤实际使用

       这是推荐系统里最朴素的算法,因为它的计算量会随着用户和物品的数量呈指数增长,所以它并不适合在大量用户或大量物品的场景使用。在它诞生的年代,还没有大数据,这种计算方式耗费大量内存,需要做大量的优化。我尝试过用100万用户,100万物品和500万条的数据在256G内存的机器上做过尝试,计算一分钟后就宣告内存耗尽。确实需要计算的话,一般使用Spark来实现。

        因为这个缺点,就需要新的算法来计算物品的协同过滤。

       前面提到,计算任意两物品之间的相似度后,有两个使用场景。针对这两个场景,分别有不同的迭代算法:

       根据相似度排序推荐最近邻物品:使用如Word2vec,Item2vec等Embedding类的算法,将物品嵌入固定的向量空间中,再使用LSH算法(局部敏感哈希算法)取最近邻物品。这个后续文章会介绍。

       根据相似度预测评分推荐物品:本章后续介绍的SVD算法。

       虽然这个算法使用较少了,但是物品协同过滤的思想都是一脉相乘的,理解了这个简单的cosine相似度计算方式,可以更好理解后续的迭代算法。

       最后补充一下,物品协同过滤的一个缺点,或者说是协同过滤的缺点,对于一个新物品,协同过滤是无法推荐的。因为新物品用户无评分,导致它跟所有物品的相似度都是为0。这个是使用这个算法时非常需要注意的一个点。

       在亚马逊上,由于用户评分的稀疏性(很多用户压根不评分),没有评分的用户无法跟其他用户计算相似性,从而导致很多用户之间没有相似度。所以2001年的时候,亚马逊选择物品协同过滤算法来做推荐,并发表了论文。这个论文也导致大家一度认为物品协同过滤优于用户协同过滤。

        而且,用户相似度的计算,最有效的方式不一定是通过本节中介绍的计算方式,带社交功能的APP可以通过用户的好友关系,一般的APP可以通过获取用户的通讯录实现用户协同过滤。这些方式都来的更加简单和直接。

        其中,用户矩阵部分代表着每个用户的偏好在一个二维隐语义空间上的映射。同样地,物品矩阵代表着每本图书的特性在一个二维隐语义空间上的映射。这两个矩阵也就是模型的结果。这样,我们训练模型的时候,就只需要训练用户矩阵中的8个参数和物品矩阵中的8个参数即可。大大减少了计算量。

        模型训练的过程,简单地说,就是通过最小二乘法,不断将用户评分数据迭代入矩阵中计算,直到把均方误差优化到最小。上图的结果是我通过Spark的ML库ALS模块直接计算的。

        算法的具体目标函数,损失函数和梯度等,详述则涉及很多机器学习知识点,这里就不作介绍了。技术方面有很多解读文章,需要进一步理解的同学,可以搜索相关文章阅读。

        得到全部的评分预测后,我们就可以对每本图书进行择优推荐。需要注意的是,用户矩阵和物品矩阵的乘积,得到的评分预估值,与用户的实际评分不是全等关系,而是近似相等的关系。如上图中两个矩阵绿色部分,用户实际评分和预估评分都是近似的,有一定的误差。

       在现在的实际应用中,SVD一般作为协同过滤的离线召回使用。一般地,将需要给用户推荐的物品提前离线计算好,存在HBASE中,在用户有请求的时候,直接读取推荐的结果,放入初排阶段的召回集中。

 

  1. 协同过滤优点:

协同推荐是应用最广泛的推荐算法。

基于内容推荐的算法,需要给物品打上标签和给用户建用户画像,才能实现匹配推荐。

相比之下,协同过滤简单了许多。它是仅使用用户行为的进行推荐,我们不需要对物品或信息进行完整的标签化分析,避免了一些人可能难以量化描述的概念的标签构建,又可以很好地发现用户的潜在兴趣偏好。

  1. 协同过滤缺点:

因为协同过滤依赖用户的历史数据,面对新的用户或者新的物品,在开始的时候没有数据或数据较少时,协同过滤算法无法做出推荐。需要等数据积累,或者其他方案进行弥补缺陷,也就是常说的冷启动的问题。

现在的实践,也不是单纯用协同过滤来做推荐,而是将他们作为其中的一个或几个召回策略来使用。

 

       推荐系统的思路也是这样,通过让机器学习每个用户的点击、购买、分享、收藏和负反馈等代表用户喜好和厌恶的数据,让机器知道用户的偏好,从而实现对用户可能喜欢的物品进行推荐。

       要利用算法从数据中提取特征,例如在深度学习图片识别领域,需要使用多层神经网络抽取图像的基础特征。实践表明,高阶特征可由低阶特征组合而成。下图中,最底层的正交边经过组合后,就可以得到脸,车,大象和椅子。反过来讲,任意图片,经过多层神经网络特征抽取之后,都可以得到相似的基础特征。所以可以简单地认为,基础特征的不同组合形成了不同的的图像,提取出图像的基础特征和组合参数就能识别图像。

      由于数据形式不同,推荐系统算法并不能像图像识别算法那样直接通过堆叠神经元层级来抽取特征。推荐系统抽取特征的过程需要不同类别算法的辅助。如推荐系统需要构建用户画像和物品画像,要用算法或规则先把用户的偏好标签和物品的特征标签都打好,计算好权重,然后再输入模型进行学习。

       学习是机器通过算法,通过大量的数据不断迭代优化,训练模型的过程。而决策是通过训练好的模型进行预测或分类等。

一个推荐系统,会由很多个模型构成。小到一个用户画像标签的预测模型,大到推荐的排序模型都可以拆解成数据→学习→决策的过程。这便是解决问题的思路。

 

给用户做出推荐响应的过程分为三个:

召回:从百万以上内容池中快速初筛出候选集

初排:根据点击率预估给候选集初步排序

精排:根据需要调整排序。

 

先说召回。收到用户请求后,我们需要一些快速的算法或者规则,从上百万甚至上亿的物品库中将最有可能的物品初步筛选出来。这个筛选的过程就叫做召回(Recall),也有些互联网公司将这个过程叫做匹配(Matching)。召回完成后,就可以得到几百个推荐候选集。一个推荐系统一般有多个召回算法或者召回规则,这叫做多路召回。如:

基于用户画像标签召回。

基于地理位置信息召回。

基于物品协同过滤召回。

基于热门商品召回。

 

再说初排。召回过程完成后,得到的候选集就被输入排序模型进行排序。模型将预测每个物品被用户点击的概率,且按照点击概率高到低进行排序。但是这个排序结果一般不是最终推荐给用户的结果,所以这个过程叫初排。初排后,一般会产生几十个推荐结果给下一步。

最后,我们看下精排。前面提到人工智能的两种思路。但是,在第二种思路大行其道的今天,并不是第一种思路就消失殆尽了。在推荐系统中,还需要策略产品经理设定一些专家规则。在算法还没有学习到某方面知识的时候,用这些规则告诉机器如何处理一些问题。精排就是需要使用规则的场景之一。

       精排一般是对排序的结果进行额外的筛查,降权或升权处理的过程。下面是一些常见的精排时处理:

对推荐结果的进行调整,保持每次推荐的多样性。如一口气推荐了10款华为手机,而且都靠的很近,这个时候就需要将结果减少,如只要前两个,而且打散。

出于商业目的,对一些物品进行流量扶持,将推荐结果中该类物品排到前面。甚至某些物品不管有没有被推荐,都直接插入并置顶。

对有违规风险,或者已经下架,或者该用户不喜欢的物品进行过滤

精排结束后,一般会产生8-10个结果直接推荐给用户。这就是整个推荐的过程。

 

       人工智能问题实践中,一般有三个步骤:数据,学习和决策。面对我们需要让机器学习的问题,首先我们要找到机器需要的数据,并做好特征提取。数据准备好后,再通过选择或构建模型让机器学习。

推荐系统给用户做推荐时,会经过三个步骤:召回,初排和精排。

 

 

 

自己动手写一个推荐系统:

       数据准备:

              一般来说,推荐系统数据分为两种:一种从在线的读取,比如用户产生一个行为,推荐系统就反应下,还有一种是从数据库里读出来。

 

       数据过滤:

              当我们得到每天产生的的数据后,这些数据太多了,我们应该写个过滤模块,把一些我们用不到的数据过滤掉。

              一般是这样做的:写个python的脚本,把过滤器放到一个单独的模块,要用的过滤器就到责任链里面注册下。这样别人和自己维护起来也方便点,顺便一说,过滤的东西一般来说有这样几种:一种是一个item只有一个user打过分的,而且以前没有人打分的,这样的数据放到推荐的模型里去跑虽然mahout会自动无视它,但其实按照power law来说是有不少的,内存能省就省吧;还有一种是有些黑名单的,有item和user各自的黑名单,这些也是事先要去掉的。

数据存储:

这个就是大家仁者见仁,智者见智的时候了,因为一般来说,是你选用的算法和算法具体的实现方式以及基础架构决定了你的存储方式,就不多说了。

我一般是这样做的:一般做成增量处理的方式,然后每天一计算,一周一回滚。由于算法实现的特殊性,每40个item user对存储在一起,有点类似于bitmap吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值