zhuanlan.zhihu.com/p/153451292
推荐系统框架
- 主要流程 打标、召回、排序、重排(同类内容的控量或打散)
- 标签系统,可以用hbase存储
- 大数据计算 spark , 流处理flink
核心模块
- 物料数据 物品、标签
- 用户数据 用户基础数据、用户行为
- 用户画像
- 实时计算
- 算法模块
- 推荐引擎 如果业务要求实时性不强,用户和数据量都不是很庞大,那么在离线按小时或天的频次直接计算各个用户可能的偏好物料即可,无论通过用户画像偏好匹配物料,还是使用训练好的模型进行直接预测排序,只要能满足业务要求就是一套好系统。但很多场景用户访问要求实时性高,业务特性复杂,就需要一套专门的推荐引擎将推荐系统及依赖的各模块整合起来,包括构建倒排索引、召回、排序、rerank及其他依赖模块,便于灵活开发与部署。另外评估推荐 系统效果也需要科学的分桶实验系统也需要在推荐引擎模块中实现。 系统效果也需要科学的分桶实验系统也需要在推荐引擎模块中实现。
用户画像
通过统计挖掘的方式,计算出用户对特定维度的偏好,以带权列表的方式刻画出不同用户的兴趣偏好
score为关键词k的兴趣得分,分子是用户对所有行为物料中带有关键词k的兴趣累加,i为用户行为中的第i个物料,α为对该物料行为权重,比如点赞就比点击的权重要高,ω为关键词k在物料上的权重分,f(t)是一个时间衰减函数,表明用户在某一时刻对物料关键词的兴趣衰减程度,距离当前时间越长,感兴趣的衰减程度越高。分母是所有行为物料的个数。所有关键词计算出score值后再进行归一化排序,即可得出用户在关键词兴趣上的偏好序列
- 各类用户画像信息经过计算还是存储在中间数据表中,如果推荐引擎线上使用还需要转存到redis中,为节省redis访问最好一个用户id作为key,所有画像信息用json字符串作为value
- 另一种做法是搭建画像服务
实时流计算结果也一般输出到不同的redis key当中,供线上取用
模型训练
首次搭建排序模型可以先用基础模型如LR或GBDT跑出一个baseline快速上线,后续逐步迭代为复杂模型。推荐算法模型一般经历了由简入繁的过程,数据量不断增大,模型不断复杂,大规模数据集下深度学习模型已经逐渐成为主流,但这也是行业头部公司所独享,只有他们才有足够的数据和算力来支撑庞大复杂的模型,绝大多数公司在中等数据集下,仍然使用主流的线性模型,通过分析用户行为及数据,构建特征工程及样本数据优化,得来的效果要比深度学习模型更好。
线上预测
通常线上使用预测服务的形式实时提供模型推断功能,这时需要通过推荐引擎接口将待排序候选集的物料id、用户id以及请求上下文信息传给预测服务。预测服务中也分为特征抽取、物料打分排序、模型同步校验等模块。通过传入的物料id及用户id,可以从特征库中在线抽取特征,结合上下文特征得到所有候选集的特征信息,进而通过模型中各特征权重,计算每个物料的打分。这个过程中注意被抽取的特征id要同训练好模型中的特征权重id保持一致,同时各物料特征抽取和打分过程可以通过并行化方式提升系统性能。训练好的模型由离线训练流程定时同步到线上预测服务机器,注意同步时需要同时把模型的checksum一并同步并在服务端进行校验,当同步失败时仍使用缓存的上次同步模型进行预测,避免数据不一致。候选集物料被打分后进行整体排序,结果返回给推荐引擎。
后续算法侧的迭代优化,一方面可以跟进业界前沿的模型方法,一方面通过分析用户行为与业务数据来尝试在特征和样本数据层面做优化,而后者可能才是产生更直接收益的法宝,毕竟不是所有公司都能有Google阿里家那种量级的用户数据,复杂模型应用起来因为过拟合的问题甚至带来负向效果。反过来说大厂在模型上的创新也是基于不断分析积累用户行为的经验得来
经典算法
召回算法
zhuanlan.zhihu.com/p/115690499
特征标签推荐
这个例子是bool model,值为0、1
- 划分特征
- 特征矩阵,其中每一行代表一个应用程序,每一列代表一个特征
- 在同一特征空间中表示app 与 用户
- 选择一个相似性指标(如,点积)。然后,推荐系统会根据此相似性度量标准为每个候选item打分
缺点
- 特征表示在某种程度上是手工设计
- 只能根据用户的现有兴趣提出建议。换句话说,该模型扩展用户现有兴趣的能力有限
协同过滤(lookalike)
-
同时使用user和item之间的相似性来进行推荐
-
根据相似用户B的兴趣向用户A推荐商品。此外,可以自动学习Embedding,而无需依赖手工设计的特征
-
基于用户(user-based)的协同过滤: 主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。
-
基于项目(item-based)的协同过滤: 和基于用户的协同过滤类似,只不过这时我们转向找到物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么我们就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。比如你在网上买了一本机器学习相关的书,网站马上会推荐一堆机器学习,大数据相关的书给你,这里就明显用到了基于项目的协同过滤思想。
-
基于模型(model based)的协同过滤: 是目前最主流的协同过滤类型了,所含算法是非常之多的,如矩阵分解、关联算法、聚类算法、深度学习、图模型等等。
矩阵分解 && svd
矩阵分解的目标是将原始的用户-物品评分矩阵 分解为两个或多个低维度的矩阵的乘积,通常是用户特征矩阵和物品特征矩阵。这些特征矩阵包含了用户和物品的潜在特征向量
而SVD则是一种更为纯粹的数学降维方法,其用于将一个矩阵分解为三个矩阵的乘积,从而发现数据中的潜在结构和特征。
给定一个 𝑚×𝑛 的矩阵 𝐴 ,SVD将其分解为以下形式:
其中, 𝑈 是一个 𝑚×𝑚 的正交矩阵, Σ 是一个 𝑚×𝑛 的对角矩阵, 𝑉𝑇 是一个 𝑛×𝑛 的正交矩阵。 𝑈 的列向量称为左奇异向量, 𝑉 的列向量称为右奇异向量, Σ 的对角线元素称为奇异值。
SVD的优点之一是可以对矩阵进行降维。通过保留最大的 𝑘 个奇异值和相应的奇异向量,我们可以近似地表示原始矩阵A,并且这种低秩近似可以捕捉到数据的主要特征,去除噪音和冗余信息。
逻辑回归模型
zhuanlan.zhihu.com/p/160244758
cloud.tencent.com/developer/a…
逻辑回归本质上是个分类模型,相较于协同过滤类算法利用用户和物品的相似度进行推荐,逻辑回归是将推荐问题转化为一个分类问题来解决或者说是一个点击率预估(Click Through Rate , CTR)问题。
用逻辑函数把线性回归的结果(-∞,∞)映射到(0,1)
数学表达
POLY2模型
FM模型的诞生源于业界人员的这样一种尝试:在逻辑回归的基础上直接增加一个高阶特征组合项目,进而挖掘组合信息。
但一开始,这个高阶项目并不像现在使用的形式,它由单一特征之间两两组合得出,其二阶表达式如下所示:
这种特征组合的方式被称为POLY2模型。
POLY2模型的不足之处很容易看出:
- 模型训练复杂度高、训练开销大;
-
- 参数量从 𝑛 上升到 𝑛2 ,模型复杂度与训练压力剧增。
- 模型容易无法收敛;
因子分解机FM
对比FM与POLY2的二阶部分,可以看出两者的主要区别为FM用两个向量的内积 代替了单一的权重系数