推荐系统入门笔记
架构概览
- UI模块:展示推荐结果,收集用户的交互行为;
- AB实验分流模块:根据实验配置等分流用户请求用于后续指导策略的迭代优化;
- 推荐引擎模块:在线执行推荐服务,从召回、排序到重排,需要经过去重等服务处理,最终返回用户推荐结果,并给前端UI展示。
- 模型服务模块:处理训练数据,训练产出召回、排序或者重排阶段需要的各种算法模型,并提供模型预测服务。
- 除此之外,推荐系统还需要有日志收集、用户画像计算、特征服务、内容理解等支撑模块。
核心模块
内容理解:理解其所推荐的内容,包含视频、文本、音频等各种形式。需要完成分类/标签提取/表征学习/知识图谱建设等任务;
用户画像:对用户属性、行为和需求的描述。基于用户数据,通过各种方法(数据挖掘、机器学习等)产出全方位的特征描述;
召回:初筛内容,从海量内容里筛选出小量级的内容展示给用户;
排序:使用复杂的排序模型融入各种特征,对召回的结果进行打分:
- 粗排:用低复杂度的模型对召回结果进一步筛选;
- 精排:对粗排结果做精细的计算;
重排:对精排后进一步调整,引入业务规则和策略,比如去重、插入广告等;重排的输入是精排排序后的序列结果,所以这一结果常常使用考虑失血性的模型比如RNN和Transformer,以及强化学习
效果测试
A/B 测试
离线结果正向后,要做线上的小流量 A/B 测试,考察新召回通道对线上指标的影响,也需要通过 A/B 测试选取最优参数。
对用户随机分桶,把其中一个桶设置为对照组,其他桶则用不同的策略。
分层实验
如果线上流量较小:根据推荐的环节,比如召回粗排精排重排等层,不同层把用户不同地随机分桶。
同层互斥,不同层正交,即每个桶上的某一层只能施加一种新策略,但是其他层也可以施加新策略,每个层都可以使用 100% 的流量。
Holdout 机制
取 10% 的用户作为 holdout 桶,用来评估改进后的实验效果。

推全实验
如果某一层的实验取得了正向的收益,则新开一层将其推给所有用户

反转实验
在推全层开出一部分用户继续用旧策略,就可以继续观察旧策略的指标,以此来评估一些需要长时间才能体现的指标。
召回模型
传统召回策略
基于内容的召回(Content Base Recall, CB):直接利用物品(item)的内容特征(如商品的类目、品牌、标签、文本描述、图片特征等),不考虑用户的行为历史或偏好建模,直接在物品空间中进行相似度计算和召回。
经典协同过滤(Collaborative Filtering, CF):同时使用用户和物品之间的相似性来推荐:
- 基于用户:相似的用户可能喜欢相同的物品;
- 基于内容:根据用户过去行为所偏好的物品的内容特征,再找到与之相似内容特征的物品。
- 基于模型:直接用机器学习模型来预测用户喜欢的物品。对新用户或新物品不友好,模型预测需要有用户或物品的关联行为。因此,如果训练数据中没有该用户或该物品(例如新用户或新物品),就无法得到相应的预测结果。
探索类召回:兴趣探索,也称为Exploit-Explore问题。Exploit能够对用户较为明显的兴趣进行迎合,Explore则需要不断探索用户的新兴趣:
-
赌徒算法:多臂赌机问题(Multi-Armed Bandit Problem,MAB)。赌博机有k个摇臂,玩家投一个游戏币以后可以按下任意一个摇臂,每个摇臂以一定的概率吐出硬币作为回报,且每个摇臂的中奖概率不同。玩家的目标是通过一定的策略获得最大化的累积回报。
思路:用类别或主题来表示每个用户的兴趣(摇臂),通过几次试验来试探出用户对每个主题的感兴趣概率,即 “选择—观察—更新—选择”,不断逼近用户的感兴趣领域;
具体算法:置信区间上界算法(Upper Confidence Bound, UCB):
-
:第 时刻第 个臂(动作、物品)的上置信界值,在第 个时间步,以很高的概率( ),臂 的真实期望回报 不会超过这个上界。 由 Hoeffding 不等式假设取值范围为
且均值形式下计算而来,置信度是 ,具体参见 集成学习中的霍夫丁不等式。我们把“每个臂的试验过程”看作一组独立样本,因此每个臂都有自己的 Hoeffding 不等式、自己的置信上界。选择分数最大的臂。 -
:代表你目前观察到的平均奖励,你认为哪个臂目前回报高就倾向于选择它。 -
:当某个臂被选择次数少( 表示第 个臂到第 次为止被选择的次数)时,这项会很大;时间 越大, 越大,推动你去重新尝试那些过去试得少的臂。
-
向量化模型召回
将物品或内容通过模型转换为低维空间中的Embedding向量,向量间的距离可以衡量物品或内容之间的相似性。在召回时使用近邻检索技术,以用户感兴趣的物品或内容为中心点,检索相似物品或内容作为召回结果。
检索相似向量:
- KNN
- ANN:对数据进行编码,然后用 KD-Tree 进行划分,根据第
个维度的信息,提取出一个样本作为当前节点,然后将其余样本根据大小分布于左右子树中。常用的编码方法有: - 局部敏感散列(LSH)方法:在高维空间相邻的数据经过散列函数的映射转化到低维空间后,它们落入同一个桶的概率很大,而不相邻的数据映射到同一个桶的概率则很小。需要设定一个散列函数,满足在散列前距离较近的数据点,在散列后也要有较大概率距离较近;而距离较远的数据点,在散列后要有较大概率距离较远(较小概率距离较近)。
- 矢量量化
向量化模型:
- Item2Vec:目的是得到物品Embedding和用户Embedding。物品Embedding是利用用户行为序列,计算生成每个物品的Embedding;用户Embedding则是由历史物品Embedding平均或聚类得到。
评估召回模型
召回模型的目标是从百万级甚至亿级物品中,快速召回出一个小规模但高覆盖的候选集,供后续排序模块使用。所以召回模型的评价指标强调两个核心:
- 覆盖用户真实兴趣(Recall 类指标)
- 不要错过重要物品(Hit 类指标)
在推荐系统的评估中,通常把推荐问题视为一个二分类问题:
- 正样本:用户真正感兴趣、在测试集里出现过的物品(称为 Ground Truth)。
- 负样本:用户不感兴趣或未与之互动的物品。
虽然召回后还需要排序,但是召回阶段还是会进行打分,通常在评估的时候使用召回的 TopK 个样本评估。
Recall & Precision & F1
Recall 在推荐系统中强调用户感兴趣的样本有多少真正被找回来,其表示的是模型错过的多少;
Precision 在推荐系统总强调召回的有多少是用户感兴趣的,其表示的是是召回的命中率(Hit rate);
F1 仍然是 Recall 和 Precision 的调和平均,其更接近两个数中比较小的那个。
Note
调和平均数:强调两个数中较小的那个
Coverage
覆盖率反映了推荐算法发掘长尾的能力, 覆盖率越高, 说明推荐算法越能将长尾中的物品推荐给用户。即:推荐系统能够推荐出来的物品占总物品集合的比例。如果所有物品都被给推荐给至少一个用户, 那么覆盖率是100%。
AUC
AUC 计算正样本和负样本之间,模型是否正确地将正样本排序得更靠前的概率。
直观版本:
优化版本(计算出正样本排名之和的理论最优结果:正样本全排前面,然后用实际结果减去最优结果,再除以样本总对数):
:正样本在排序中的总排名值(越靠后数值越大) :这是如果正样本全都排在最前面,它们应有的排名和,所以分子相当于:正样本比负样本排名低的总排名差 - 所有正负配对的对数