开始学习推荐系统的相关内容
- 1. 推荐系统和搜索的区别
- 2. 推荐系统Lambda架构
- 3. 推荐算法模型历程
- 4. 推荐算法流程
- 5. 推荐模型的构建流程
- 6. 相似度计算
- 7. 召回算法
- 8. 排序算法
- 9. 推荐系统的评价
1. 推荐系统和搜索的区别
- 推荐系统个性化强,用户被动的接受,希望能提供持续的服务,推荐主要是信息过滤系统。
- 搜索个性化弱,用户主动搜索,快速满足用户的需求。主要是构建稳定的信息流通通道
什么时候才需要推荐:
- 信息过载
- 需求不明确
2. 推荐系统Lambda架构
推荐系统要素:
- 前段界面
- 数据(Lambda架构)
- 业务知识
- 推荐算法
推荐系统整体架构
下面介绍大数据Labmda架构
- Lambda架构结合实时数据和Hadoop平台,提供实时的数据视图。简单说将离线计算和实时计算结合起来。
实时和离线的分层操作
离线:
- 分布式计算:Hadoop MapReduce、Spark
- 数据存储:HBase、Redis、MySQL
实时
- 流式处理数据
- 实时数据收集:Flume、Kafka
- 实时数据分析:Spark Streaming / storm、flink
下面是Lambda的架构图。首先数据源从flume中得到。一部分做批处理,一部分做实时处理。批处理把数据放在数据库上,然后经过MapReduce算出一个阶段,缓存起来。然后实时这部分也会做实时计算,然后将这2部分的计算结果汇总,为推荐系统提供服务。
这2部分的相辅相成。离线服务算的时间比较长,比如10分钟得出一次结果,那在前端用户看到的结果10分钟都不会变。然后实时计算是基于离线计算的结果做一些微调。这样用户看到的推荐结果就会实时变化。
3. 推荐算法模型历程
4. 推荐算法流程
上面讲了整个推荐系统的架构,下面我们只关注推荐算法。推荐算法只有3个阶段:
- 召回阶段
- 这里的召回不要和分类问题的召回率混淆,这2者是不同的概念。推荐算法的召回是海选,就是先从很多内容中选出一些内容,作为接下来推荐的候选人。也就是说我们后面推荐的结果都是从这些候选内容中选的。所以召回阶段决定了最终推荐结果的天花板
- 召回阶段常用算法
- 协同过滤 CF(基于物品和基于用户)
- 基于内容(根据用户的行为总结出用户的喜好,根据文本挖掘技术找到相似的商品)
- 基于隐语义
- 排序阶段
- 对召回阶段找到候选内容进行排序
- CTR估计(点击率估计),可以使用逻辑回归,输出用户对某个物品点击的概率,然后将概率进行排序,选出topK的物品做为最终的推荐结果
- 策略调整
- 新用户数据少采取补充策略(冷启动)
- 地域热门:根据用户当前的定位,统计附近的热门帖子
- 全局热门:对某个时间段的帖子进行热门排序
如果比较细致的看推荐系统,分为4个阶段:召回+粗排+精排+ReRanker
召回目的如上所述;有时候因为每个用户召回环节返回的物品数量还是太多,怕排序环节速度跟不上,所以可以在召回和精排之间加入一个粗排环节,通过少量用户和物品特征,简单模型,来对召回的结果进行个粗略的排序,在保证一定精准的前提下,进一步减少往后传送的物品数量,粗排往往是可选的,可用可不同,跟场景有关。之后,是精排环节,使用你能想到的任何特征,可以上你能承受速度极限的复杂模型,尽量精准地对物品进行个性化排序。排序完成后,传给重排环节,传统地看,这里往往会上各种技术及业务策略,比如去已读、去重、打散、多样性保证、固定类型物品插入等等,主要是技术产品策略主导或者为了改进用户体验的。
4.1. 长尾效应和推荐系统
长尾效应往往用来解释现实生活中的商业理论,将所有非流行的市场累加起来就会形成一个比流行市场还要大的市场。
长尾效应和推荐系统的关系:
目前的推荐系统或推荐算法,很难发现用户的隐性需求,也是目前推荐算法所追求的。目前而言,现在的推荐系统只能发现你的主观需求,比如你在B站上搜索一个关键词后,系统往往会推荐和这个关键词有关的内容,但是却很难发现你目前不知道,但是心里感兴趣的东西。所以这是一个很大的难点。
在推荐系统中,可以把长尾效应看做是一种目标,即向用户推荐他喜欢,但是不会自己发现的物品。由于长尾中的物品比较肺腑,推荐系统可能会有很大的收益。
4.2. 召回
召回是推荐系统的第一步,根据用户和商品的部分特征,从海量的物品中找出用户潜在感兴趣的物品,交给排序阶段。召回阶段需要快,所以模型不能太复杂。
现在召回环节一般采用多路召回,随便想到一个策略就可以做一路召回。
传统的召回思路:
先离线计算好商品的Embedding和用户的Embedding,然后在线上召回的时候,根据用户的Embedding和所有商品的Embedding内积,找出TopN。
- 根据用户行为召回
将用户一系列的行为,使用GRU/Transformer来聚合用户行为,生成1个用户兴趣嵌入。有监督学习,标签可以是next iterm prediction - 用户多兴趣拆分
上面根据用户行为生成1个用户兴趣嵌入,但是用户的兴趣可以有很多类,例如体育,购物等。用户多兴趣拆分的输入和上面一样,还是用户历史行为序列,但是输出的是用户多个兴趣嵌入,可以进行多兴趣点召回,避免单兴趣嵌入召回头部问题。可以看做是聚类问题,就是把不同的item聚到不同的兴趣类别中。 - 和知识图谱融合
首先构建一个用户和商品的行为图,如果用户对商品有行为产生,则建立一条边,这样就建立了用户-商品交互的二部图。这里面还隐藏这物品之间的一些知识。比如说用户点击过电影“泰坦尼克号”,这部电影是小李子主演的,我们就可以利用电影领域的知识图谱数据,来推荐小李子主演的其他电影给用户。 - 图神经网络模型召回
上面知识图谱是图神经网络的一个特例,但是知识图谱因为编码的是静态知识,而不是用户比较直接的行为数据,和具体应用距离较远。图中的节点是用户和商品,通过用户行为来建立边,边还可以带上权重,然后使用图神经网络,例如GraphSAGE来获取节点的嵌入。
4.3. 排序
4.3.1. LR
LR最早可以用在点击率预测中,LR是一个二分类,输出的概率表示用户点击的概率。
步骤如下:
构造特征
将所有特征进行离散化,变成one-hot输入- 模型训练
根据输入的特征和label(用户点击1或者不点击0)来训练LR分类器 - 模型推荐
给定一个用户u,以及一批候选商品,对用户u如何推荐商品。通过上述方法计算用户u对候选商品中每个商品的点击点击得分,然后按照得分从大大小排序,推荐前N个物品。
5. 推荐模型的构建流程
- 数据清洗阶段
- 数据来源
- 显性数据:打分,评论
- 隐性数据:历史订单、加购物车、页面浏览
- 数据来源
- 特征工程
- user-item的评分矩阵
- 如果没有显式的评分矩阵,可以用一些用户的行为,比如加入购物车,单曲循环,页面停留时间等。
- 算法
- 协同过滤:计算相似度
- 矩阵分解
- 产生推荐结果
- 交叉推荐:买了手机,推荐手机壳
- 向上推荐:买了自行车,推荐跑车
6. 相似度计算
相似度计算根据数据来选择。
- 数据是实数值,评分情况
- 数据是布尔值,是否消费
6.1. 余弦相似度
余弦相似度就是看2个向量夹角的cos值。余弦相似度范围[-1,1],从负相关到正相关。
缺点:只和夹角有关,不关心向量长度。可能会有误差。对2个电影打分,一个人打分向量(5,8),另一个人打分向量(0.5,1),这2个向量虽然夹角很小,但是长度差别很大。
6.2. 皮尔逊相关系数
对余弦相似度的优化,对向量做中心化,将向量a和b减去向量均值,在计算余弦相似度
6.3. 杰卡德Jaccard相似度
Jaccard = 交集/并集
比如用户2喜欢物品(2,7,10),用户4喜欢物品(2,5,7,9),2个用户的交集是物品(2,7),所以交集个数为2,2个用户喜欢用品的并集是(2,5,7,9,10),所以并集个数为5.则这2个用户的jaccard相似度=0.4
杰卡德相似度适合评分是0/1的情况
问题:无法反映具体用户的评分喜好信息,所以经常用来评估用户是否会对某商品进行打分,而不是预估用户对某商品打多少分。
7. 召回算法
7.1. 基于内容的召回算法
基于内容的推荐一般是文本类型的特征,需要提取关键词,计算关键词的权重。
一般步骤是:
- 先分词,
- 然后计算词的权重(TF-IDF),即提取关键字
- 然后使用word2vec得到词向量,从词向量构建物品向量
7.2. 协同过滤CF
协同过滤(Collaborative Filtering)的算法思想:物以类聚,人以群分
协同过滤推荐算法分为2类:
- 基于用户的协同过滤user-based CF:和你喜好相似的人,那他喜欢的东西你也可能喜欢
- 基于物品的协同过滤item-based CF:和你喜欢的东西相似的东西,你也可能喜欢
- 基于模型的协同过滤,现在最主流的协同过滤类型,包含矩阵分解,聚类算法,深度学习,图模型等。
缺点:
召回结果的候选item限定在用户的历史行为类目中,导致推荐结果越推越窄,难以发现长尾商品。
7.2.1. 基于用户的协同过滤
实现协同过滤的步骤:
- 首先计算用户与用户的相似程度
比如下图中,我们计算出用户1和用户2,3最相似 - 根据相似的人产生推荐结果
然后我们根据用户2,3的内容给用户1来推荐,用户3喜欢物品AC,用户2喜欢ADE,则向用户1初始推荐AC+ADE,而用户1已经消费过ACD,过滤掉用户1已经消费过的商品,最终推荐商品E
7.2.2. 基于物品的协同过滤
- 首先计算物品与物品的相似程度
比如物品A和物品B相似 根据相似的物品产生推荐结果
用户A原先买过物品A,然后就给推荐物品B物品A被4个用户消费过,物品B被2个用户消费过,其中用户5是2个物品共同的消费用户,对物品B来说这个用户5占所有用户的0.5,对物品A来说这个用户5占所有用户的0.25,所以物品A和B之间的相似度为0.5*0.25。按照这样方式计算所有物品之间的相似度,发现物品A和物品C
7.2.3. 基于模型的协同过滤
7.2.3.1. 矩阵分解MF
MF(Matrix Factorization,矩阵分解)是一个简单的Embedding模型。给定用户和物品矩阵$A \in \mathbb{R}^{m \times n}$,然后对其进行分解成用户嵌入矩阵$U \in \mathcal{R}^{m \times d}$和商品矩阵$V \in \mathcal{R}^{n \times d}$。$d << m和n$
矩阵分解的目标就是让$UV^T$的结果和$A$尽可能的相似。
在上面的目标函数中,只对观察到的obs的对$(i,j)$进行误差求和。即只对下图中为1的元素求误差,但是这并不能很好的推荐,泛化性能差。
因为我们需要对所有的值进行求误差,目标函数就变成下面这样:
最小化目标函数的方法包括:
- 随机梯度下降SGD
- 加权交替最小二乘法WALS
在2个矩阵U和V中,对U和V进行交替更新。(1)固定U求解V,(2)固定V求解U
7.3. 基于内容推荐和协同过滤的区别
基于内容的推荐和用户协同过滤都是计算用户的相似度,但用到的特征却不同。
- 基于内容的推荐使用用户画像特征,即用户的个人信息,例如年龄,性别,教育程度等
- 基于用户的协同过滤用的是用户对物品的评分特征,通过计算2个用户对商品的评分向量来计算相似性。
基于用户的协同过滤需要用到用户对商品的评分来计算相似性,当一个新用户没有对任何商品评分,因此会出现“冷启动”的问题,基于内容的推荐就没有这个问题。
8. 排序算法
8.1. 逻辑回归LR
LR最早可以用在点击率预测中,LR是一个二分类,输出的概率表示用户点击的概率。
步骤如下:
构造特征
将所有特征进行离散化,变成one-hot输入- 模型训练
根据输入的特征和label(用户点击1或者不点击0)来训练LR分类器 - 模型推荐
给定一个用户u,以及一批候选商品,对用户u如何推荐商品。通过上述方法计算用户u对候选商品中每个商品的点击点击得分,然后按照得分从大大小排序,推荐前N个物品。
LR模型最大的缺陷就是人工特征工程,耗时费力费人力资源,能否将特征组合的能力体现在模型层面呢?就不用人工再去组合特征了。
8.2. FM
FM英文全称是“Factorization Machine”,简称FM模型,中文名“因子分解机”。
FM在2010年提出,核心在于特征组合,以此减少人工参与特征组合工作。FM的优势:
- FM能处理高维稀疏场景
- FM具有线性的计算复杂度
FM在LR的基础上,引入任意2个特征的二阶特征组合,为每个特征,学习一个大小为k的一维向量。于是2个特征$x_i,x_j$的特征组合的权重值,通过特征对应的向量$v_i,v_j$的内积$
9. 推荐系统的评价
准确率
- 学术角度:RMSE,MAE,点击预估
- 工程角度:A/B test对比不同的算法,在线上运行对关键指标的影响
覆盖率
尽量照顾到大部分的产品- 探索和利用
- 利用:利用用户的历史行为,只给他推荐他曾经消费过的相似物品
- 探索:发现用户的新兴趣