推荐系统入门笔记

架构概览

  1. UI模块:展示推荐结果,收集用户的交互行为;
  2. AB实验分流模块:根据实验配置等分流用户请求用于后续指导策略的迭代优化;
  3. 推荐引擎模块:在线执行推荐服务,从召回、排序到重排,需要经过去重等服务处理,最终返回用户推荐结果,并给前端UI展示。
  4. 模型服务模块:处理训练数据,训练产出召回、排序或者重排阶段需要的各种算法模型,并提供模型预测服务。
  5. 除此之外,推荐系统还需要有日志收集、用户画像计算、特征服务、内容理解等支撑模块。

核心模块

内容理解:理解其所推荐的内容,包含视频、文本、音频等各种形式。需要完成分类/标签提取/表征学习/知识图谱建设等任务;

用户画像:对用户属性、行为和需求的描述。基于用户数据,通过各种方法(数据挖掘、机器学习等)产出全方位的特征描述;

召回:初筛内容,从海量内容里筛选出小量级的内容展示给用户;

排序:使用复杂的排序模型融入各种特征,对召回的结果进行打分:

  • 粗排:用低复杂度的模型对召回结果进一步筛选;
  • 精排:对粗排结果做精细的计算;
image-20250614121708278

重排:对精排后进一步调整,引入业务规则和策略,比如去重、插入广告等;重排的输入是精排排序后的序列结果,所以这一结果常常使用考虑失血性的模型比如RNN和Transformer,以及强化学习

效果测试

A/B 测试

离线结果正向后,要做线上的小流量 A/B 测试,考察新召回通道对线上指标的影响,也需要通过 A/B 测试选取最优参数。

对用户随机分桶,把其中一个桶设置为对照组,其他桶则用不同的策略。

分层实验

如果线上流量较小:根据推荐的环节,比如召回粗排精排重排等层,不同层把用户不同地随机分桶。

同层互斥,不同层正交,即每个桶上的某一层只能施加一种新策略,但是其他层也可以施加新策略,每个层都可以使用 100% 的流量。

Holdout 机制

取 10% 的用户作为 holdout 桶,用来评估改进后的实验效果。

image-20250625100723564

推全实验

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

image-20250625100948852

反转实验

在推全层开出一部分用户继续用旧策略,就可以继续观察旧策略的指标,以此来评估一些需要长时间才能体现的指标。

召回模型

传统召回策略

基于内容的召回(Content Base Recall, CB):直接利用物品(item)的内容特征(如商品的类目、品牌、标签、文本描述、图片特征等),不考虑用户的行为历史或偏好建模,直接在物品空间中进行相似度计算和召回。

经典协同过滤(Collaborative Filtering, CF):同时使用用户和物品之间的相似性来推荐:

  • 基于用户:相似的用户可能喜欢相同的物品;
  • 基于内容:根据用户过去行为所偏好的物品的内容特征,再找到与之相似内容特征的物品。
  • 基于模型:直接用机器学习模型来预测用户喜欢的物品。对新用户或新物品不友好,模型预测需要有用户或物品的关联行为。因此,如果训练数据中没有该用户或该物品(例如新用户或新物品),就无法得到相应的预测结果。

探索类召回:兴趣探索,也称为Exploit-Explore问题。Exploit能够对用户较为明显的兴趣进行迎合,Explore则需要不断探索用户的新兴趣:

  • 赌徒算法:多臂赌机问题(Multi-Armed Bandit Problem,MAB)。赌博机有k个摇臂,玩家投一个游戏币以后可以按下任意一个摇臂,每个摇臂以一定的概率吐出硬币作为回报,且每个摇臂的中奖概率不同。玩家的目标是通过一定的策略获得最大化的累积回报。

    思路:用类别或主题来表示每个用户的兴趣(摇臂),通过几次试验来试探出用户对每个主题的感兴趣概率,即 “选择—观察—更新—选择”,不断逼近用户的感兴趣领域;

    具体算法:置信区间上界算法(Upper Confidence Bound, UCB):

    UCBi,t=μ^i,t+2lntni,t
    • UCBi,t:第 t 时刻第 i 个臂(动作、物品)的上置信界值,在第 t 个时间步,以很高的概率(1t4),臂 i 的真实期望回报 μi 不会超过这个上界。

      由 Hoeffding 不等式假设取值范围为 [0,1] 且均值形式下计算而来,置信度是 t4,具体参见 集成学习中的霍夫丁不等式。我们把“每个臂的试验过程”看作一组独立样本,因此每个臂都有自己的 Hoeffding 不等式、自己的置信上界。选择分数最大的臂。

    • μ^i,t:代表你目前观察到的平均奖励,你认为哪个臂目前回报高就倾向于选择它。

    • lntni,t:当某个臂被选择次数少(ni,t 表示第 i 个臂到第 t 次为止被选择的次数)时,这项会很大;时间 t 越大,lnt 越大,推动你去重新尝试那些过去试得少的臂。

向量化模型召回

将物品或内容通过模型转换为低维空间中的Embedding向量,向量间的距离可以衡量物品或内容之间的相似性。在召回时使用近邻检索技术,以用户感兴趣的物品或内容为中心点,检索相似物品或内容作为召回结果。

检索相似向量:

  • KNN
  • ANN:对数据进行编码,然后用 KD-Tree 进行划分,根据第 i 个维度的信息,提取出一个样本作为当前节点,然后将其余样本根据大小分布于左右子树中。常用的编码方法有:
    • 局部敏感散列(LSH)方法:在高维空间相邻的数据经过散列函数的映射转化到低维空间后,它们落入同一个桶的概率很大,而不相邻的数据映射到同一个桶的概率则很小。需要设定一个散列函数,满足在散列前距离较近的数据点,在散列后也要有较大概率距离较近;而距离较远的数据点,在散列后要有较大概率距离较远(较小概率距离较近)。
    • 矢量量化

向量化模型:

  • Item2Vec:目的是得到物品Embedding和用户Embedding。物品Embedding是利用用户行为序列,计算生成每个物品的Embedding;用户Embedding则是由历史物品Embedding平均或聚类得到。

评估召回模型

召回模型的目标是从百万级甚至亿级物品中,快速召回出一个小规模但高覆盖的候选集,供后续排序模块使用。所以召回模型的评价指标强调两个核心:

  • 覆盖用户真实兴趣(Recall 类指标)
  • 不要错过重要物品(Hit 类指标)

在推荐系统的评估中,通常把推荐问题视为一个二分类问题:

  • 正样本:用户真正感兴趣、在测试集里出现过的物品(称为 Ground Truth)。
  • 负样本:用户不感兴趣或未与之互动的物品。

虽然召回后还需要排序,但是召回阶段还是会进行打分,通常在评估的时候使用召回的 TopK 个样本评估。

Recall & Precision & F1

Recall 在推荐系统中强调用户感兴趣的样本有多少真正被找回来,其表示的是模型错过的多少;

Precision 在推荐系统总强调召回的有多少是用户感兴趣的,其表示的是是召回的命中率(Hit rate);

F1 仍然是 Recall 和 Precision 的调和平均,其更接近两个数中比较小的那个。

Note

调和平均数:强调两个数中较小的那个

Harmonic Mean=2xyx+y

Coverage

覆盖率反映了推荐算法发掘长尾的能力, 覆盖率越高, 说明推荐算法越能将长尾中的物品推荐给用户。即:推荐系统能够推荐出来的物品占总物品集合的比例。如果所有物品都被给推荐给至少一个用户, 那么覆盖率是100%。

 Coverage =|uUR(u)||I|

|I| 表示所有物品数量,U 表示用户集合, 表示并集,推荐系统给每个用户推荐一个长度为 N 的物品列表 R(u)

AUC

AUC 计算正样本和负样本之间,模型是否正确地将正样本排序得更靠前的概率

直观版本:s(i) 表示第 i 个物品的打分,P 表示正样本集合,N 表示负样本集合:

AUC=1|P||N|iPjNI[s(i)>s(j)]

优化版本(计算出正样本排名之和的理论最优结果:正样本全排前面,然后用实际结果减去最优结果,再除以样本总对数):

AUC=1|P||N|(iPRanki|P|(|P|+1)2)
  • iP:正样本在排序中的总排名值(越靠后数值越大)
  • |P|(|P|+1)2:这是如果正样本全都排在最前面,它们应有的排名和,所以分子相当于:正样本比负样本排名低的总排名差
  • 所有正负配对的对数 |P||N|