推荐系统基础
推荐系统(Recommender System)是一种信息过滤系统(Information Filtering System),其核心目标是解决在海量数据环境中用户与物品(Items)之间的信息过载(Information Overload)问题。系统通过建模用户偏好与物品属性,预测用户对于其未曾接触过的物品的偏好程度或评分,从而实现个性化推荐。
推荐系统的基本概念
从数据来源、效果评估到商业目标和工程实践,推荐系统主要包括四个核心方面:
1. 用户行为(User Behaviors)—— 推荐系统的信号与养料
用户与推荐内容交互时产生的各种行为,是推荐系统赖以生存的数据信号,模型通过学习这些信号来理解用户的偏好。
- 点击(Click)
- 定义:用户点击了推荐给他的某个物品(如一篇文章、一个视频、一件商品)。
- 解读:最常见、最容易获取的行为信号,通常被认为是弱正反馈。表明用户对标题或封面图产生了兴趣,但不代表一定喜欢内容本身。
- 点赞(Like)
- 定义:用户对内容按下了”赞”按钮。
- 解读:比”点击”更强的正反馈信号,明确表达了用户对内容的认可和喜爱。
- 收藏(Favorite / Collect)
- 定义:用户将内容加入到自己的收藏夹或列表中。
- 解读:非常强的正反馈信号,意味着内容具有长期价值。
- 转发(Share / Forward)
- 定义:用户将内容分享到其他平台或发送给朋友。
- 解读:最强的正反馈信号之一,用户愿意用自己的社交信誉为其背书。
小结:在构建推荐模型时,通常会给这些不同的行为赋予不同的权重(Weight),如”收藏”权重高于”点击”。
2. 消费指标(Consumption Metrics)—— 衡量推荐算法好坏的尺子
这些指标用于量化评估推荐系统在技术层面的表现,直接与用户行为挂钩。
- 点击率(Click-Through Rate, CTR)
- 定义:用户点击推荐内容的次数占总推荐曝光次数的比例。
- 公式:
1
CTR = 总点击次数 / 总曝光次数 × 100%
- 解读:衡量推荐内容吸引力的核心指标,也是精排模型最常优化的目标之一。
- 交互率(Engagement Rate)
- 定义:用户与推荐内容发生”深度交互”的次数占总曝光次数的比例。
- 公式:
1
总交互次数 = w1 × 点击数 + w2 × 点赞数 + w3 × 收藏数 + ...
- 解读:比 CTR 更全面,反映内容质量和用户满意度。
3. 北极星指标(North Star Metric)—— 推荐系统服务的商业目标
北极星指标是指引整个产品方向的最高层商业目标,推荐系统的所有优化最终都应服务于提升北极星指标。
- 用户规模(User Scale)
- 定义:如日活跃用户数(DAU)、月活跃用户数(MAU)。
- 解读:好的推荐系统应提升用户留存率,扩大用户规模。
- 消费(Consumption)
- 定义:用户在产品中消费内容的总量。
- 解读:如总观看时长、总阅读时长/篇数、总播放时长/曲数、总成交金额(GMV)等。
- 发布(Publishing / Creation)
- 定义:内容平台上内容创作者的发布数量和活跃度。
- 解读:推荐系统要服务好消费者,也要服务好创作者,激励持续发布高质量内容。
4. 实验流程(Experimentation Process)—— 科学迭代的必经之路
用于验证新推荐算法或策略是否有效,并安全应用到全量用户。
- 离线实验(Offline Experiment)
- 定义:在历史日志数据上进行模型训练和评估。
- 步骤:将日志分为训练集和测试集,训练新模型并评估离线指标(如 AUC, Precision, Recall)。
- 优缺点:成本低、速度快、无风险,但与线上环境有差异。
- A/B 测试(A/B Testing)
- 定义:将用户随机分组,线上同时运行不同算法,是验证算法效果的黄金标准。
- 步骤:A 组用旧算法,B 组用新算法,比较线上指标。
- 推全(Full Rollout / Deployment)
- 定义:AB 测试证明新算法更优后,逐步部署到全部用户。
- 步骤:通常灰度发布,逐步扩大覆盖比例,监控系统指标。
推荐系统链路
现代推荐系统采用多阶段排序(Multi-stage Ranking)架构,像漏斗一样分阶段筛选和排序,平衡效果与效率。
召回(Recall)
召回是整个推荐流程的第一步,也是效率要求最高的一步。 - 目标:从海量物品库中快速筛选出与用户兴趣相关的候选集。此阶段追求“宁可错杀一千,不可放过一个”,重在覆盖率(召可回率),即确保用户可能感兴趣的物品尽量都在这个候选集里。 - 输入:全量物品库(几万~上亿)。 - 输出:初步候选集(几千)。 - 方法:多路召回策略, 即通常会综合使用多种简单策略来共同组成候选集。 - 协同过滤(Collaborative Filtering):基于“物以类聚,人以群分”的思想,例如“购买了A的用户也购买了B, 给用户推荐他喜欢过的物品的相似物品”(Item-based)或“与您相似的用户喜欢C, 给用户推荐与他相似用户喜欢的东西”(User-based)。 - 基于向量的召回 (Embedding-based):目前最主流的方法。将用户和物品都表示为高维空间中的向量(Embedding)。通过高效的向量相似度检索(如 FAISS、Annoy),快速找到与用户向量最接近的物品向量。例如经典的双塔模型 (Two-Tower Model)。 - 内容模型召回:根据物品本身的属性(如类别、标签、关键词)进行匹配。 - 热门物品或趋势召回:对于新用户或兴趣不明确的用户,推荐近期热门的物品。 - 为何需要此步骤: 直接对全量物品进行复杂排序的计算成本是无法接受的。召回阶段通过简单、高效的模型,将计算范围缩小到千量级,为后续更复杂的排序模型做好准备。
粗排(Coarse Ranking)
- 目标:对召回候选集进行初步排序,,使用比召回更复杂、但比精排更简单的模型,进一步剔除相关性不高的物品,缩小候选集规模。
- 输入:召回候选集(几千)。
- 输出:更小的候选集(几百)。
- 方法:简化机器学习模型(LR、GBDT、小型神经网络)。
- 为何需要此步骤: 它是一个承上启下的“中间层”。精排模型虽然效果好,但计算开销大,直接处理几千个物品依然很慢。粗排模型作为一个轻量级的排序模型,可以快速地为精排阶段减负。
精排(Fine Ranking)
精排是整个推荐链路中最为核心和复杂的环节,直接决定了推荐效果的天花板。 - 目标:精准排序。利用强大的、复杂的模型,对粗排筛选出的几百个物品进行精准的点击率(CTR)、转化率(CVR)等指标的预测,并按照预测分值进行排序。此阶段重在准确率(Precision)。 - 输入:粗排候选集(几百)。 - 输出:一个带有精确预测分数的、排序后的列表(几百物品)。 - 方法:大规模深度学习模型(Wide & Deep、DeepFM、DIN 等)。 - 为何需要此步骤: 在候选集规模已经大大减小的情况下,系统有充足的计算资源来运行复杂模型。这使得模型可以使用海量的特征,包括用户特征(年龄、性别、历史行为)、物品特征(类别、价格)、上下文特征(时间、地点)以及它们的交叉组合特征,从而做出最精准的判断。 ## 重排(Re-ranking) - 目标:优化与多样性。在精排结果的基础上,进行最终的列表调整。重排考虑的不仅是单个物品的得分,而是整个列表呈现给用户时的整体体验。 - 输入:精排列表(几百)。 - 输出:最终列表(几十)。 - 方法: - 多样性(Diversity):通过打散和插播策略,确保推荐结果中包含不同类别、不同风格的物品。例如,使用 MMR (Maximal Marginal Relevance) 算法,平衡物品的相关性和多样性。 - 业务规则干预:推广新品、促销品,或者对某些物品进行降权(例如已购买的物品)。 - 上下文感知:去除重复项,避免短时间内重复推荐。 - 公平性(Fairness):确保不同商家或内容创作者能获得合理的曝光机会。 - 为何需要此步骤: 如果完全按照精排的预测分值排序,可能会出现结果高度相似(例如推荐一整排同款不同色的鞋子)、头部物品包揽所有流量、或忽略了新品曝光等问题。重排阶段就是为了解决这些问题,提升用户体验和满足业务需求。
推荐系统的 AB 测试
下列内容是在工业界进行大规模 A/B 测试时非常核心且高级的概念,反映了顶级互联网公司如何在高并发和快速迭代环境下科学、高效地优化产品和算法。
1. 分层实验(Layered Experiments)
这是一种能够大幅提升实验效率的流量分配机制,其核心思想在于将互不干扰的实验叠加在同一批用户上。
基本思想:一个推荐系统可以被拆分成不同的“模块”或“层面”,例如:
- UI 层:负责按钮颜色、字体大小等界面展示。
- 召回策略层:负责从海量物料中捞取候选集。
- 排序模型层:负责对候选集进行精准排序。 分层实验平台允许我们为这些不同的层面独立地开设实验。
同层互斥(Mutually Exclusive within a Layer):在同一个层内,实验之间是互斥的。这意味着一个用户在某个时刻,只能被分配到该层的一个实验组中。例如,在“排序模型层”,一个用户要么看到A模型的结果,要么看到B模型的结果,不可能同时看到两者。流量在该层内被完整切分。
不同层正交 (Orthogonal between Layers):在不同的层之间,实验是正交(独立)的。这意味着一个用户可以同时属于不同层的多个实验组。例如,一个用户可以同时是“UI层-红色按钮”实验组的成员,又是“排序模型层-新版模型B”实验组的成员。系统假设UI的改变和排序模型的改变是两个独立事件,它们的效果不会相互影响。
优势:允许多个团队并行开展实验,大幅提升创新速度。
2. Holdout 机制(Holdback 实验)
这是一种用于衡量长期、累积影响的宏观实验方法,其视角超越了单次A/B测试的短期收益。
- 基本思想:从全部用户中,永久性地分出一小部分(例如 1%\~5%)作为“绝对对照组”或“Holdout 组”。这个组的用户将永远不会体验到任何新的推荐功能或算法优化,他们使用的始终是一个非常稳定、原始的版本。而剩下 95%~99% 的用户则会不断地体验到通过A/B测试胜出的新功能。
- 作用:
- 衡量部门的整体业务收益:单次的A/B测试衡量的是单个小改动的短期收益。但是,一个季度、一年下来,整个部门上线的几十上百个“胜出”的实验,它们累加起来的效果究竟有多大?会不会有些短期收益在长期来看会相互抵消,甚至产生负面作用(例如用户对某种策略产生疲劳)?
- 步骤说明:通过在年底或季末比较“实验大盘用户”和“Holdout组用户”的核心业务指标(如留存率、总消费时长等),就可以清晰地衡量出,在这一整段时间里,整个推荐团队的所有努力共同创造的净业务价值。这为衡量团队的长期ROI(投资回报率)提供了最可靠的依据。
- 比喻:Holdout 组就像科学实验中的”空白对照组”, 它为我们评估所有变量的“混合累积效应”提供了一个不变的基准。
3. 实验推全(Full Rollout)与反转实验(Reverse Experiment)
这是与实验生命周期管理相关的两个重要操作。
实验推全
AB 测试胜出后,将新策略逐步推向全体用户,通常采用灰度发布。 - 基本思想:当一个A/B测试(例如,新算法B vs. 老算法A)在经过足够长的时间和数据收集后,被验证为显著优于对照组时(例如,新算法B的点击率显著更高),决策者就会决定将这个新算法B的策略应用到100%的全体用户。这个过程就是“推全”。 - 步骤说明:为了线上服务的稳定性,推全通常是逐步进行的(也称灰度发布),例如先推10%的流量,再到50%,最后到100%,并在此期间密切监控各项系统指标。 ### 反转实验 (Reverse Experiment) 验证已上线老功能是否依然有效,或移除后是否有负面影响。 - 基本思想:这是一种“回过头看”的实验,主要目的是验证已上线很久的老功能是否依然有效,或者说,移除它是否会带来损失。 - 操作流程:假设“功能F”在一年已经全量上线了。现在,我们将以“全体用户(都有功能F)”作为基线,然后开启一个反向的AB测试: A组(对照组):保持现状,拥有功能F。 B组(实验组):移除功能F,体验没有该功能的状态。 - 为何需要此机制? - 确认长期价值:验证该功能是否至今仍在创造价值。如果移除后,B组的核心指标显著下跌,说明该功能依然重要。 - 清理“技术债务”:如果移除后,B组的指标没有任何变化,甚至有所提升,这说明该功能可能已经“过时”或产生了不易察觉的负面影响。这为工程师安全地移除老旧代码、简化系统提供了强有力的数据支持,避免产品功能无限膨胀和代码腐化。
参考论文: Tang, Diane, et al. “Overlapping experiment infrastructure: More, better, faster experimentation.” Proceedings of the 16th ACM SIGKDD international conference on Knowledge discovery and data mining. 2010.
推荐系统的前世今生: https://www.bilibili.com/video/BV1EE421G7dg/