个性化的黎明:当世界开始为你排序
第 1 章 个性化的黎明:当世界开始为你排序
闹钟在 6:47 分准时响起。Sarah 还没完全睁开眼睛,左手已经本能地滑向床头柜上的手机——屏幕亮起的瞬间,一份为她量身定制的世界正在静默加载:天气小卡显示她所在街区午后有雷阵雨,建议她把下午三点的瑜伽课改到室内;新闻流顶部是一条她两个月来追踪的 AI 监管法案的最新进展;播客 App 自动续播她昨晚没听完的那一期 *Latent Space*;短视频信息流第一条是一只孟加拉猫试图钻进纸袋,恰好契合她上周连续点赞的十条猫咪视频;而她最常用的购物 App,则把一款她三天前浏览过却没下单的空气炸锅悄悄标成了 8.5 折。
Sarah 不知道的是,在她还没清醒的这两分钟里,数十个模型已经替她做出了数百次排序决策。她更不知道的是,这种"被排序"的感觉,已经悄悄塑造了她对世界的看法——她看到的天气是被解释过的天气,她看到的新闻是被筛选过的新闻,她看到的猫是被推荐过的猫。
这就是我们这本书要拆开的第一层礼物:推荐系统(Recommender Systems)已经不再是一个藏在 App 后台的技术黑箱,它是我们这个时代的基础设施——一个关于注意力、欲望与选择权的隐形操作系统。
```mermaid flowchart TD A["Recommendation System<br/>推荐系统"] --> B["Collaborative Filtering<br/>协同过滤"] A --> C["Content-Based<br/>基于内容"] A --> D["Knowledge-Based<br/>基于知识"] A --> E["Hybrid Methods<br/>混合方法"] B --> B1["User-Based CF"] B --> B2["Item-Based CF"] B --> B3["Matrix Factorization"] C --> C1["Feature Engineering"] C --> C2["Profile Matching"] D --> D1["Constraint-Based"] D --> D2["Case-Based Reasoning"] E --> E1["Weighted / Cascade / Switching"] E --> E2["Meta-Learning / Stacking"] ```
*Figure 1.1 — 推荐系统的四大基本范式及其子分支。这张图将作为整本书的导航图:第二、三章聚焦协同过滤,第四章进入基于内容与基于知识,第五章讨论混合策略,而从第六章开始,我们会逐层把这张图推向深度学习时代。*
---
1.1 推荐系统到底在解决什么问题
如果你只能用一句话回答"推荐系统是什么",最准确的版本大概是:推荐系统是一种在信息过载的环境下,根据用户的历史行为、上下文与显式偏好,预测用户对未接触物品兴趣度,并据此对候选物品进行排序的软件系统。 英文原版定义可以追溯到 Resnick 和 Varian 在 1997 年提出的那句经典表述:
> *"A recommender system is a system that produces individualized recommendations as output, or has the effect of guiding the user in a personalized way to interesting or useful objects in a large space of possible options."* > > 推荐系统是一种能够产出个性化推荐结果,或能在大量候选项中以个性化方式引导用户发现有趣、有用物品的系统。
—— Paul Resnick & Hal R. Varian, *Communications of the ACM*, 1997
但这个定义太"教科书",它没有说出一个工程师真正关心的东西:推荐系统在数学上到底在算什么?
让我们暂时把所有花哨的术语剥掉,把问题写成一个抽象函数。设用户集合为 $U$,物品集合为 $I$,我们要找的是一个打分函数:
$$\hat{r}: U \times I \times C \rightarrow \mathbb{R}$$
其中 $C$ 是上下文(context)的集合——它可以是时间、设备、地理位置、当前会话、用户当下的情绪等任意可以被工程系统捕获的信号。$\hat{r}(u, i, c)$ 读作"在上下文 $c$ 下,预测用户 $u$ 对物品 $i$ 的兴趣度"。
这个函数几乎就是推荐系统研究二十多年来所有论文、所有竞赛、所有产品背后的共同母题。Netflix Prize 优化的是它的均方根误差(RMSE),YouTube 短视频优化的是它的预期观看时长(Expected Watch Time),而 Spotify 的 Discover Weekly 优化的则是它的"完成率 + 跳过率"的组合。形式统一,目标分裂——这正是推荐系统迷人的地方,也是它让人头疼的地方。
理解这一点之后,我们可以给出本章要回答的三个具体问题:
1. 历史上,人们是怎么一步步逼近这个函数的?(范式演化的故事) 2. 逼近这个函数的"骨架"长什么样?(四大基本范式) 3. 这个函数到底该追求什么值?(目标函数的权衡)
接下来,我们就按这个顺序,把推荐系统二十多年的演化史在 8000 字里讲清楚。
---
1.2 从一次咖啡馆争论说起:四种世界观
为了不让你在抽象定义里迷路,我们先把镜头切到本书的两位主角身上。
Lin,35 岁,某头部电商平台的高级推荐工程师,本书的工程视角锚点。她 2012 年从一所普通 985 的计算机系毕业,加入了一家做电商的公司,亲历了从 MapReduce 到 Spark 再到 Flink 的整个数据流水线变迁。她的口头禅是:"先把它跑起来。" 她对算法的优雅与否不太感冒,更在意 AUC 能不能涨一个点、召回延迟能不能压到 50ms 以内、线上服务的 P99 不能抖。
Maya,29 岁,剑桥大学机器学习博士在读期间退学创业,目前在一家欧洲音乐流媒体公司担任研究科学家。她的口头禅是:"先把它想清楚。" 她对模型的偏置(bias)、方差(variance)、归纳偏置(inductive bias)有近乎洁癖的执着。她会为了一个 loss function 的数学性质和同事争论一下午,也会因为线上指标降了 0.2% 而失眠。
我们在第一章末尾会让他们相遇一次,现在先把镜头交给他们各自的工作台——这两种工作台,刚好对应了理解推荐系统的两条入口。
1.2.1 协同过滤(Collaborative Filtering):用别人的眼睛看世界
Maya 的研究方向以协同过滤为起点。所谓协同过滤,核心思想只有一句话:"和你相似的人也喜欢这个,那你也大概率会喜欢。" 它不关心物品长什么样,只关心用户和物品之间的行为矩阵。
形式化地,我们有一个用户-物品交互矩阵 $R \in \mathbb{R}^{|U| \times |I|}$,其中 $R_{ui}$ 是用户 $u$ 对物品 $i$ 的已知评分(显式反馈,如 1-5 星),或者是一个 0/1 二值(隐式反馈,如点击、播放完成)。协同过滤的目标是矩阵补全(Matrix Completion):
$$\min_{U, V} \sum_{(u,i) \in \Omega} (R_{ui} - \langle \mathbf{u}, \mathbf{v}_i \rangle)^2 + \lambda(\|U\|^2 + \|V\|^2)$$
其中 $\Omega$ 是已知评分的位置集合,$\mathbf{u}$ 和 $\mathbf{v}_i$ 分别是用户和物品的隐向量(latent factor),$\lambda$ 是正则项系数。
这套语言,是 2006 年 Netflix Prize 把它推上神坛后我们才熟悉的;但思想本身可以追溯到 1992 年 Xerox PARC 的 Tapestry 系统——那是人类历史上第一个明确以"协同过滤"命名的推荐系统,由 Goldberg、Nichols、Oki 与 Terry 设计。Tapestry 解决的是公司内部邮件过载问题:它让员工手动标记邮件为"重要"或"垃圾",然后推荐"和你做过相似标记的人也认为重要"的邮件。它的成功不在于算法的复杂,而在于一个关键洞察:集体的智慧可以代替单个用户的判断。
十年后,明尼苏达大学的 GroupLens(Resnick 等,1994)把这个想法搬到了新闻组推荐上,并第一次引入了自动协同过滤(Automated Collaborative Filtering)的概念——也就是说,"和你相似的人"这个判断,不再需要用户手动指定,而是由算法自动推断。这是推荐系统从"工具"走向"系统"的转折点。
协同过滤有三个主要分支,难度递增:
- **User-based CF**:先找相似用户,再聚合他们对候选物品的评分。直觉简单,但相似度计算开销大,且对长尾用户极不友好。
- **Item-based CF**(Amazon 在 2003 年的著名论文中推广):先计算物品之间的相似度,再根据用户历史行为的物品集合加权打分。线上服务的效率显著优于 User-based,至今仍被很多生产系统作为召回通道之一。
- **Matrix Factorization / 隐语义模型**(Koren, Bell, Volinsky 在 2009 年综述中系统总结):把矩阵 $R$ 分解成两个低秩矩阵 $U$ 和 $V$,用户和物品都被映射到同一个 $k$ 维隐空间,距离近的就相似。Netflix Prize 的前三名几乎都用到了这个思路。
Maya 会告诉你,协同过滤的优雅之处在于它不需要任何关于物品的先验知识——你不需要知道这部电影是科幻还是爱情,是国产还是好莱坞,只要有足够稠密的用户行为矩阵,它就能工作。但它的脆弱之处同样致命:冷启动(cold start)。一个新用户没有行为记录,一个新物品没有曝光数据,协同过滤就完全失效。这是 Lin 在生产环境中每天都要面对的真实伤口。
1.2.2 基于内容的推荐(Content-Based):用物品自己的语言说服你
如果在 Maya 的实验室里她用协同过滤,那在 Lin 的工位上,她更常用的是基于内容的推荐。
顾名思义,这种范式试图回答:"你过去喜欢的东西,它们有什么共同特征?那么任何拥有这些特征的新东西,你大概率也会喜欢。" 它绕开了协同过滤的冷启动诅咒——只要物品有描述(电影有类型、导演、演员,商品有类目、标签、品牌),就能开始推荐。
形式化地,对每个用户 $u$ 我们维护一个用户画像(User Profile) $\mathbf{p}_u \in \mathbb{R}^d$,它可以是该用户过去交互过的物品特征的加权平均;每个物品也有特征向量 $\mathbf{f}_i \in \mathbb{R}^d$,推荐分数就是两者的相似度(通常是余弦相似度):
$$\hat{r}(u, i) = \cos(\mathbf{p}_u, \mathbf{f}_i) = \frac{\mathbf{p}_u^\top \mathbf{f}_i}{\|\mathbf{p}_u\| \|\mathbf{f}_i\|}$$
这种范式的历史几乎和协同过滤一样古老。1992 年前后,MIT 媒体实验室的 *Daily Learner* 系统(Shardanand & Maes, 1995)就开始用这种方式推荐音乐——它让用户对一组样本音乐打分,然后系统根据音乐的元数据特征(年代、流派、节奏)构建用户画像,再去匹配库里其他音乐。
基于内容的方法有两个显著优点和两个显著缺点:
| 优点 | 缺点 | |---|---| | 不依赖其他用户的数据,天然解决新用户冷启动 | 需要物品的语义特征,新物品冷启动依然存在 | | 推荐结果有较强的可解释性——"因为你最近看了 X,所以推荐 Y" | 多样性差——容易陷入"过滤气泡(Filter Bubble)":因为用户画像收敛得越来越窄,推荐列表也越推越窄 |
Lin 在实际工作中会用基于内容的方法做"安全召回"——当协同过滤拿不到结果时,至少这个通道还能给出"看起来合理"的推荐,不至于让首页空白。但她也深知这条通道的局限:它会把用户困在他过去的影子里。
1.2.3 基于知识的推荐(Knowledge-Based):把领域专家请进算法
第三种范式在电商和高端服务行业非常常见:基于知识的推荐。它特别适合低频、高单价、有明确需求结构的场景——比如买房、买车、挑保险、配置 B2B 软件。
核心思想:通过显式的约束规则或相似度函数,把用户的需求直接映射到物品上。 它不依赖历史行为,因为这类场景的历史行为本身就稀疏到几乎无法使用。
它有两个主要子流派:
- **基于约束(Constraint-Based)**:用户提出一组需求(如"预算 50 万以内,三居室,地铁 500 米内"),系统根据领域本体(ontology)找到满足所有约束的物品。
- **基于案例(Case-Based Reasoning)**:根据用户当前的需求案例,检索出相似的过往成功案例,作为推荐依据。
比如你打开链家 App,输入"海淀、800 万以内、户型方正",系统给你的不是"和你相似的人还看了这些房子",而是严格满足你约束的房子。这类推荐的可解释性极强——每一项推荐都可以追溯到具体的用户需求和领域规则。
它的代价是:领域知识的获取成本极高。 每进入一个新行业,都要重新建模、做本体设计、让领域专家参与规则编写。这就是为什么它无法像协同过滤那样横扫互联网——它是一种"重资产"的推荐范式。
1.2.4 混合方法(Hybrid Recommenders):成年人的世界不做单选题
如果你去问任何一个有五年以上推荐系统经验的工程师:"你线上跑的到底是哪一种?" 十有八九他会苦笑:"全是。" 这就是混合推荐成为工业界事实标准的原因。
Burke 在 2002 年的综述里把混合策略分成了七类:加权(Weighted)、切换(Switching)、混合(Mixed)、级联(Cascade)、特征组合(Feature Augmentation)、特征级联(Feature Combination)和元层级(Meta-Level)。我们不一一展开,但有一个心法你一定要记住:混合不是把几种方法的分数平均一下就完事,而是要让它们各司其职——典型架构是"召回 → 粗排 → 精排 → 重排":
1. 召回(Retrieval):从百万级物品库里捞出几百到几千个候选。这一阶段强调覆盖率(Recall) 和多样性,常用的方法包括协同过滤的 ANN(近似最近邻)、基于内容的 embedding 召回、热门兜底等等。 2. 粗排(Pre-Ranking):用轻量模型把几千压到几百,关注延迟。 3. 精排(Ranking):用复杂模型(如深度神经网络)精打细算每一格分数,关注准确率。 4. 重排(Re-Ranking):考虑多样性、新颖性、公平性等业务约束,对精排结果做最后的业务编排。
Lin 每天的工作,本质上就是让这四层之间的接口保持稳定。她不需要亲自实现深度学习模型,但她必须理解每层的输入输出和 SLA,因为一旦某层抖一下,整条链路都可能崩。
> *Mix is not the goal. Mix is the consequence of having solved multiple sub-problems well.* > > ——*混合不是目标,混合是每个子问题都解得还不错的副产品。*
这是 Lin 在一次内部分享里说的一句不太严谨但很有用的话。
---
1.3 二十六年:一部极简推荐系统编年史
为了让上面的四大范式不再只是静态分类,我们把镜头拉远到历史维度。一部推荐系统的编年史,可以浓缩为下面这条主线:
1992 → 1997 → 2003 → 2006 → 2009 → 2015 → 2017 → 2020 → 2023
每一格都代表一个让推荐系统从"玩具"变成"基础设施"的关键节点。
1992 — Tapestry 诞生(Xerox PARC)
Tapestey 的论文标题是 *"Using Collaborative Filtering to Weave an Information Tapestry"*(用协同过滤编织信息挂毯)。它第一次明确使用了"collaborative filtering"这个词,并提出了一个影响未来三十年的设计哲学:让用户成为信息的组织者。
1994 — GroupLens(MIT × 明尼苏达)
GroupLens 把协同过滤从公司内部搬到了开放互联网(Usenet 新闻组)。它的贡献不仅是系统,更在于第一次把推荐系统的评测方法系统化——交叉验证、留一法(Leave-One-Out)、均方误差作为指标,这些做法至今仍是推荐系统论文里的标配。
1997 — Resnick & Varian 的 ACM 综述
这篇综述第一次让"推荐系统"这个术语被学术界正式接纳,也确立了它在人机交互、信息检索、机器学习三个领域之间的交叉地位。换句话说,从这一年开始,"做推荐系统"才成为一件可以在学术会议上光明正大讲的事。
2003 — Amazon 的 Item-to-Item CF(Linden, Smith, York)
Amazon 的工程师 Linden 等人在 *IEEE Internet Computing* 上发表了一篇工程性极强的论文,介绍了他们当时线上正在跑的 Item-based Collaborative Filtering 系统。这篇论文几乎定义了"工业级推荐系统的样子"——可扩展、可解释、可解释为"购买了 X 的用户也购买了 Y"。Amazon 的"相关推荐"模块至今仍在使用这套思路的变种。
2006 — Netflix Prize 开赛(100 万美元)
2006 年 10 月,Netflix 公开了一亿条匿名电影评分数据,悬赏 100 万美元给能把 RMSE 比自家算法(Cinematch)提升 10% 的团队。这场比赛是推荐系统史上最具标志性的事件——它把矩阵分解、SVD、隐语义模型、RBM(受