con gorse使纯go实现的一套分布式推荐系统解决方案:
https://github.com/zhenghaoz/gorse,包含了master,worker和server三个部分。
整套模型中包含了三个实体:用户、物料、反馈
用户通过一个ID来唯一标示
物料包含一个时间戳,通过它来判断物料是否过期,Lables是物料的特征
反馈的类型可以是正向、负向或者中性( positive (like), negative (dislike) or neutural (read))
gorse做的事情就是把合适的物料推荐给合适的人:推荐数据包括两部分:个性化推荐和非个性化推荐(popular/latest/similar)。
三个节点的分工非常明确:
master节点负责用所有的物料数据和用户数据以及反馈数据来拆分训练集和测试集,然后训练模型,模型分为两大类:排序和点击预测;训练完毕后通过模型搜索来获取最优模型和参数。同时非个性化推荐也是master节点完成的。推荐结果写入缓存,缓存是用list来维护的,会定期过滤过期的数据。
worker节点 ,通过grpc从master拉取模型数据,还有用户列表,定时分批对每一个用户来计算推荐数据,存入缓存。
server节点提供,提供restful的api接口和swagger文档,前端可以通过接口从缓存中获取当前用户的推荐数据,或者对推荐的数据做出反馈。
以上就是gorse的架构和核心数据,下面结合源码来进行分析。源码目录如下:
master
master 节点的核心逻辑主要包含下面几步
1,训练模型的大循环也分为三个部分
其中排序模型包含三部分的内容
2,最佳模型参数筛选大循环
主要包括两部分的筛选:排序模型和点击预测模型:
排序模型具体有多种
点击预测模型参数搜索也分两步:搜索、计算评分
3,全局非个性化推荐,存入缓存
worker
个性化推荐的逻辑在worker节点上,运用master节点训练的模型数据,来做排序推荐,主要分为下面几步:
1,同步的数据分三类
2,个性化推荐是根据系统的处理能力和用户数量进行分批处理的,处理过程如下
server
其它两个节点主要是离线的,server节点提供在线服务,分为三步
提供http服务包括三个部分
以上就是三个节点的相关核心源码,下面介绍下排序模型和点击预测模型
1,排序模型
gorse实现了4个排序模型
A,als:Alternative -Least-Squares
交替最小二乘法
它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法可用于曲线拟合。
B,bpr:Bayesian Personalized Ranking
基于贝叶斯后验优化的个性化排序算法
BPR算法将用户对物品的评分(显示反馈“1”,隐式反馈“0”)处理为一个pair对的集合<i,j>,其中i为评分为1的物品,j为评分为0的物品。假设某用户有M个“1”的评分,N个“0”的评分,则该用户共有M*N个pair对。
这样数据集就由三元组 <u,i,j>表示,该三元组的物理含义为:相对于物品“j”,用户“u”更喜欢物品“i”。
C,ccd:Cyclic Coordinate Descent (CCD)
是一个启发式的迭代搜索算法,
D,knn:k-Nearest Neighbor
K最近邻分类算法
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的
大多数属于某一个类别,则该样本也属于这个类别
2,点击预测模型
Classification
Regression
分离器:支持k-fold、 比率ratio 、 leave-one-out分离数据集
模型:推荐模型基于协同过滤算法,包括矩阵分解、基于临接的方法、Slope One、Co-Clustering2
评估:可使用RMSE、 MAE来评分,包括准确率Precision、召回率Recall、归一化折损累积增益NDCG、MAP、MRR、AUC
参数搜寻:使用方式网格搜索grid search 或 随机搜索random search寻找最佳超参数