推荐系统笔记 01:推荐系统概述
这一篇先整理推荐系统的整体框架。
推荐系统看起来是在回答一个很简单的问题:
这个用户接下来可能喜欢什么?
但真正落到工业系统里,它不只是一个模型问题。它同时是数据问题、检索问题、排序问题、评估问题,也是一个非常强的工程系统问题。
比如短视频、广告、电商、新闻流、音乐、论文推荐,它们表面上都在推荐 item,但目标并不完全一样:
- 短视频可能更关心观看时长、完播、互动。
- 广告可能更关心点击、转化、付费、长期价值。
- 电商可能更关心点击、加购、购买、GMV。
- 内容平台还要考虑多样性、新鲜度、创作者生态。
所以推荐系统不是简单地“预测用户喜欢什么”,而是在一个很大的候选空间里,尽量把用户、item、上下文和业务目标同时对齐。
1. 推荐系统为什么需要分阶段
如果平台里有几千万甚至几亿个 item,不可能对每个用户把所有 item 都拿出来打分。
因此推荐系统通常会拆成多阶段:
1 | |
每一层解决的问题不一样。
召回(retrieval) 负责从海量 item 中快速找出几百到几千个候选。它更看重速度和覆盖率。
排序(ranking) 负责对候选 item 做更精细的打分。这里模型可以更复杂,因为候选数量已经小很多。
重排(reranking) 负责考虑列表级约束,比如多样性、重复内容、广告频控、内容安全、展示策略等。
可以粗略理解成:
召回解决“有没有可能相关”,排序解决“谁更应该排前面”,重排解决“整个列表看起来是否合理”。
2. 推荐系统和普通分类问题的区别
很多推荐模型最后看起来都是二分类。
比如 CTR 预测:
给定用户、item、上下文,预测用户是否点击。
形式上确实像分类问题:
ŷ = fθ(u,i,c)
其中 u 是用户特征,i 是 item 特征,c 是上下文特征。
但推荐系统和普通分类有几个明显区别。
第一,样本不是独立同分布的。用户的兴趣会变,item 的热度会变,平台策略也会变。今天的点击分布不一定能代表明天。
第二,曝光本身有偏。模型只能从已经被系统展示过的 item 上看到反馈。没有展示的 item,不代表用户不喜欢,只是系统没给机会。
第三,负样本很复杂。用户没点一个广告,可能是不感兴趣,也可能是没看到,也可能是位置太差,也可能是当时没有购买意愿。
第四,优化目标不止一个。点击率高不一定转化率高,短期收益高不一定长期体验好。
这也是为什么推荐系统里会有很多看起来“不像机器学习教材”的东西:负采样、曝光校正、位置偏置、延迟转化、多目标学习、冷启动、探索利用。
3. 显式反馈和隐式反馈
推荐系统的反馈大致可以分成两类。
显式反馈(explicit feedback) 是用户主动表达的偏好,比如评分、收藏、点赞。
隐式反馈(implicit feedback) 是用户行为里暗含的偏好,比如点击、观看、停留、购买、跳出。
早期推荐系统里经常用评分矩阵,比如 MovieLens 这种电影评分数据。用户给电影打 1 到 5 分,模型要预测用户对未评分电影的评分。
但工业推荐里更多是隐式反馈。
比如广告场景里,用户对广告的反馈可能是:
- 是否曝光
- 是否点击
- 是否转化
- 转化金额
- 是否屏蔽
- 是否重复点击
隐式反馈的麻烦在于它更噪。
一个用户点击了某个 item,不一定真的喜欢,可能是标题党。一个用户没点击,也不一定讨厌,可能只是没注意到。推荐系统要从这些很脏的行为里学出稳定偏好。
4. 协同过滤:从用户和 item 的关系开始
推荐系统里最经典的思想是协同过滤(collaborative filtering)。
它的核心直觉很简单:
如果两个用户过去喜欢的东西相似,那么他们未来可能也会喜欢相似的东西。
或者换一个角度:
如果两个 item 经常被同一批用户喜欢,那么它们可能是相似 item。
基于用户的协同过滤会找相似用户,基于 item 的协同过滤会找相似 item。
举个简单例子:
- 用户 A 喜欢《星际穿越》《盗梦空间》《信条》
- 用户 B 喜欢《星际穿越》《盗梦空间》
- 那么系统可能会把《信条》推荐给用户 B
这个例子很朴素,但它抓住了推荐系统最核心的东西:很多时候我们不是先理解 item 的内容,而是先利用用户行为形成的共现关系。
协同过滤的问题也很明显:
- 新用户没有历史行为,存在冷启动的问题
- 新 item 没有交互记录,冷启动困难。
- 用户和 item 矩阵极其稀疏,在这个共现矩阵里大部分都是0.
- 相似度计算在大规模系统里不efficient。
这些问题后来推动了矩阵分解、embedding、双塔召回、图推荐和深度排序模型的发展。
5. 矩阵分解和 embedding
矩阵分解可以看成协同过滤的一个更参数化版本。
假设有一个用户-item 交互矩阵。矩阵里的每个元素表示用户对 item 的偏好。矩阵分解会给每个用户和每个 item 学一个向量:
r̂ui = pu⊤qi
其中 pu 是用户向量,qi 是 item 向量。
如果两个向量内积大,就说明模型认为这个用户更可能喜欢这个 item。
这个思想后来几乎变成了推荐系统的基本语言:用户、item、类别、作者、广告主、query、上下文,都可以先变成 embedding,再做匹配或排序。
但 embedding 本身不是答案。真正的问题是:
- 这些 embedding 从哪里来?
- 用什么行为训练?
- 是否只用 ID,还是加入内容特征?
- 新 item 没有历史行为时怎么办?
- embedding 是否会记住训练集里的噪声?
这也是后来语义 ID、生成式推荐、冷启动优化这些方向会出现的原因。
6. 召回:先把候选找出来
召回阶段的目标是快速从海量 item 中找出可能相关的一小批候选。
常见召回方式包括:
- 热门召回:给用户一些当前热门 item。
- 协同过滤召回:根据相似用户或相似 item 找候选。
- 双塔召回:分别编码用户和 item,用向量相似度检索。
- 序列召回:根据用户最近行为预测下一个可能交互的 item。
- 多路召回:多个召回通道并行,每个通道覆盖不同兴趣。
双塔模型可以写成:
s(u,i) = fθ(u)⊤gϕ(i)
用户塔输出用户向量,item 塔输出 item 向量,然后通过向量检索找 top-k。
双塔的优点是快。item 向量可以离线算好,线上只需要算用户向量,然后做 ANN 检索。
但双塔也有缺点。用户和 item 很早就被分开编码,复杂交叉特征表达不够强。所以它更适合召回,不太适合最终精排。
7. 排序:真正决定谁排前面
排序阶段会使用更丰富的特征。
一个广告排序模型可能会看:
- 用户 ID、年龄段、地域、设备、历史行为
- 广告 ID、广告主、行业、素材、商品属性
- 上下文时间、位置、场景、请求来源
- 用户和广告的交叉特征
- 用户行为序列和候选广告之间的匹配程度
早期排序模型可能是 LR、GBDT、FM、Wide & Deep、DeepFM。
后来推荐排序模型越来越强调两件事:
第一,特征交叉。不是单独看用户,也不是单独看 item,而是看“这个用户在这个场景下对这个 item 是否感兴趣”。
第二,序列兴趣。用户最近做了什么,往往比静态画像更重要。
比如用户最近连续浏览露营装备,那么给他推荐帐篷、睡袋、户外炉具可能比推荐他长期喜欢的电子产品更有效。
8. 序列推荐:用户兴趣不是静态画像
序列推荐把用户历史行为看成一个时间序列。
最简单的想法是用最近 K 个行为预测下一个 item。
早期可以用 Markov Chain、RNN、GRU。后来 SASRec 把 self-attention 引入序列推荐,让模型直接从历史行为里挑出对当前预测最相关的部分。
SASRec 的一个重要直觉是:
用户历史里不是所有行为都同等重要,模型应该自己学会关注哪些行为。
比如用户过去一年买过手机壳、耳机、键盘、显示器。现在他看了相机包,那么历史里的“数码配件”可能相关,但“键盘”未必相关。
再往后,DIN / DIEN / BST / HSTU 这类模型都在解决类似问题:用户兴趣会随时间变化,行为序列很长,历史里既有长期偏好,也有短期意图。
9. 广告推荐:CTR 只是开始
广告推荐比普通内容推荐更复杂,因为它通常不只优化点击。
常见目标包括:
- CTR:点击率
- CVR:转化率
- CTCVR:点击后转化概率和整体转化概率
- GMV / revenue:商业收益
- ROI:广告主投入产出
- 用户体验:不能只推容易点击但质量差的广告
这会带来多目标建模。
比如一个广告 CTR 很高,但用户点进去后很少购买;另一个广告 CTR 一般,但转化率很高。到底谁应该排前面,要看业务目标。
广告推荐还会遇到延迟反馈。用户可能今天点击广告,几天后才购买。训练时如果直接把“暂时没转化”当负样本,就会污染标签。
所以工业广告推荐里,模型结构重要,但数据定义、标签定义、样本构造、评估协议同样重要。
10. 生成式推荐为什么出现
传统推荐通常是 retrieve-and-rank:
1 | |
生成式推荐想换一个角度:
不再只是在候选集合里打分,而是让模型直接生成下一个 item 或 item 的语义 ID。
这和语言模型很像。语言模型根据前文生成下一个 token,生成式推荐根据用户历史行为生成下一个 item token。
但 item 不是自然语言 token。item ID 高基数、变化快、冷启动严重。所以很多生成式推荐工作会引入 semantic ID:先把 item 映射成一串离散 code,再让模型生成这串 code。
这也是 TAAC2025 这类赛题值得关注的地方。它不是把推荐系统包装成大模型,而是在尝试把“推荐什么”转成“生成什么”的问题。
11. 补充说明
现在的推荐系统有两条半主流赛道
(长)序列建模 用户可能会有很长的交互历史,如何用到这个交互序列里的信息,捕捉用户长时间的兴趣与变化是这个方向的关键。
特征交叉 提升模型最简单的方式就是构建特征,但是如何让不同的特征进行交互,构建特征高纬度下的信息也很关键。
生成式推荐 包括但不限于sid,端到端推荐模型,生成式召回/排序等方向。
参考
- UCSD CSE158/258: Data Mining课程
- 王树森推荐系统 (b站)
- Recommender Systems with Generative Retrieval