推荐系统
本页介绍推荐系统(Recommender System)——互联网最赚钱的 AI 应用之一。淘宝、抖音、Netflix、YouTube,它们的核心竞争力都建立在推荐系统之上。推荐系统不是单一算法,而是一套从数据到策略的完整工程体系。它横跨传统 ML(协同过滤、矩阵分解)与深度学习(Wide & Deep、DIN),是经典方法与深度学习结合最紧密的领域之一。
推荐系统的本质就是一句话:猜你喜欢什么,然后推给你。但”猜”的方式经历了三代演进:
- 协同过滤 CF = “喜欢相似物品的人会喜欢相似的物品”:你买了 A 和 B,另一个用户也买了 A、B 还买了 C——系统就猜你可能也喜欢 C。不关心物品本身是什么,只看行为规律。分为 user-based(找相似用户)和 item-based(找相似物品)两条路。
- 矩阵分解 MF = 把稀疏矩阵拆成两个矮矩阵:用户-物品的交互矩阵非常稀疏(你只看过 Netflix 万分之一的电影),矩阵分解把每个用户和每个物品各自压缩成一个低维向量,用向量点积预测你没看过的电影评分——这就是 Netflix Prize 百万美元大赛的核心方法。
- 内容推荐 = 看物品本身的特征:你喜欢科幻片,系统就给你推更多科幻片。基于物品的类别、标签、描述文本等特征做匹配,不依赖其他用户行为——好处是没有冷启动问题,缺点是推荐结果容易同质化。
- 深度学习推荐 = “记记忆 + 学泛化”:Wide & Deep 模型同时做两件事——Wide 部分记住”买了奶粉的人常买尿布”这种关联规则,Deep 部分学习特征之间的泛化组合。DeepFM、DIN 等模型都是这个思路的延伸。
1. 协同过滤的相似度计算
Section titled “1. 协同过滤的相似度计算”协同过滤的核心是相似度度量。给定两个用户(或物品)的评分向量,常用余弦相似度(Cosine Similarity)衡量它们的接近程度:
其中 和 分别是用户 和 的评分向量。值域为 ,值越大表示越相似。预测用户 对物品 的评分时,item-based CF 的公式为:
其中 是与物品 最相似的 个物品集合, 是用户 对物品 的已知评分。直觉是:和你喜欢的物品越相似的物品,你越可能也喜欢。
2. 矩阵分解:从直觉到数学
Section titled “2. 矩阵分解:从直觉到数学”2.1 问题定义
Section titled “2.1 问题定义”设用户-物品评分矩阵 ( 个用户, 个物品),其中大部分元素缺失(未观测)。矩阵分解的目标是找到用户隐向量矩阵 和物品隐向量矩阵 ( 为隐因子维度),使得:
每个用户被表示为一个 维向量 ,每个物品也是一个 维向量 ,预测评分就是两者点积。 维空间可以理解为”隐藏的兴趣维度”——比如电影在”严肃↔娱乐""男性向↔女性向”等维度上的坐标。
2.2 损失函数
Section titled “2.2 损失函数”只对已观测的评分 (已知评分集合)最小化误差,并加 L2 正则化防止过拟合:
其中 是正则化系数,控制隐向量范数不要太大(避免对少数观测过拟合)。
2.3 求解方法一:梯度下降(SGD)
Section titled “2.3 求解方法一:梯度下降(SGD)”对每个观测评分 ,预测误差为 ,参数更新规则为:
其中 是学习率。SGD 每次只看一个样本,实现简单、易于并行化,是工业界最常用的训练方式。
2.4 求解方法二:交替最小二乘法(ALS)
Section titled “2.4 求解方法二:交替最小二乘法(ALS)”SGD 逐样本更新,适合隐式反馈等大数据场景。但有时我们更想要批量优化——这就是 ALS(Alternating Least Squares,交替最小二乘法)。
ALS 的核心思想:虽然 和 联合优化是非凸问题(有多个局部最优),但固定其中一个矩阵,对另一个矩阵的优化就变成了凸的最小二乘问题,可以直接求解析解。交替进行:
步骤 1:固定 ,对每个用户 求解:
步骤 2:固定 ,对每个物品 求解:
反复迭代直到收敛。
ALS 的优势:
- 天然可并行——每个用户/物品的更新互相独立,适合 Spark 等分布式框架。
- 对隐式反馈(只有点击/没有评分)友好——通过加权 ALS(Weighted ALS)可以优雅处理”未观测”不等于”不喜欢”的问题。
- 无需调学习率,收敛行为更可预测。
2.5 加入偏置项
Section titled “2.5 加入偏置项”不同用户评分尺度不同(有人全给 4-5 星,有人全给 2-3 星),不同物品整体评分也不同。加入偏置项提升模型表达能力:
其中 是全局平均分, 是用户偏置(打分偏高/偏低), 是物品偏置(本身口碑好/差)。
2.6 隐式反馈与 Weighted ALS
Section titled “2.6 隐式反馈与 Weighted ALS”显式评分(星级)很稀疏,而隐式反馈(点击、浏览、购买)数据量巨大。隐式反馈的特点是:只有”有行为”和”无行为”,没有”负评分”。Koren 等人提出的加权方案:用置信度 ( 是交互频次)对正反馈加权,对未观测赋予低权重而非负标签。这使得 ALS 成为处理隐式反馈的标准方法。
3. FM 与 DeepFM
Section titled “3. FM 与 DeepFM”因子分解机(Factorization Machines, FM) 解决的是高维稀疏特征下的二阶特征交叉问题。在线性回归 的基础上,FM 为每个特征学习一个 维隐向量 ,用向量点积替代参数化的交叉权重:
FM 的妙处在于:即使两个特征从未在训练数据中同时出现,只要它们各自与其他特征共现过,隐向量仍能学到有意义的交叉关系。
DeepFM 将 FM 与深度神经网络并行组合:FM 部分负责低阶特征交叉(二阶),DNN 部分负责高阶特征交叉(三阶及以上),两者共享输入嵌入层(embedding),无需人工特征工程。
4. Wide & Deep Learning
Section titled “4. Wide & Deep Learning”Google 在 2016 年提出的 Wide & Deep 模型,推荐系统深度学习时代的标志性架构。核心思想是记忆(memorization)与泛化(generalization)的联合学习:
- Wide 部分:广义线性模型 ,其中 是交叉积变换(cross-product transformation),用于捕获”买了奶粉→常买尿布”这类共现规则。Wide 部分擅长记忆频繁出现的特征组合。
- Deep 部分:多层前馈神经网络,输入是嵌入后的稠密向量 ,通过多层非线性变换学习特征的泛化组合,对未见过的新组合也有预测能力。
- 联合训练:两部分输出加权求和后通过 sigmoid 输出概率,反向传播同时更新两部分参数。
为什么需要记忆和泛化? 纯 Wide 模型(如 LR + 特征交叉)对高频模式记忆精准但无法泛化到新组合;纯 Deep 模型能泛化但可能对低频但重要的规则记忆不够。两者结合兼得优势。
5. DIN 与 DIEN:兴趣建模的飞跃
Section titled “5. DIN 与 DIEN:兴趣建模的飞跃”5.1 DIN(Deep Interest Network)
Section titled “5.1 DIN(Deep Interest Network)”阿里在 2018 年提出的 DIN(Deep Interest Network)解决了推荐系统中的核心问题:用户的兴趣是多样化的,不同的候选物品应该激活用户不同的兴趣。
传统深度推荐模型(如 Youtube DNN)将用户所有历史行为(点击过的商品)编码成一个固定长度的向量,不管要推荐什么商品,都用这个向量去预测。但一个用户的购物车里可能同时有奶粉、手机壳、猫粮——推荐手机时应该关注他点击过的电子产品,推荐猫粮时应该关注宠物用品。
DIN 引入目标级注意力机制(Target-aware Attention):给定候选物品 ,用户行为序列中每个历史物品 的注意力权重 由候选物品和历史物品共同决定:
其中 是注意力打分函数(如内积或 MLP), 是历史物品的嵌入, 是候选物品的嵌入。最终用户兴趣表示为 ——与候选物品相关的历史行为被放大,无关的被抑制。
5.2 DIEN(Deep Interest Evolution Network)
Section titled “5.2 DIEN(Deep Interest Evolution Network)”DIN 的升级版 DIEN(2019)进一步建模用户兴趣随时间的演化过程。用户兴趣不是静态的,而是随时间动态变化的——今天对数码感兴趣,下周可能转向母婴。
DIEN 在 DIN 基础上加入 GRU(门控循环单元)序列建模兴趣演化:
- 兴趣抽取层:用 GRU 从用户行为序列中抽取每步的隐藏状态,表示该时刻的兴趣。
- 兴趣演化层:加入 AUGRU(Attention-based Update GRU),用注意力权重控制兴趣的演化方向——只有与目标相关的兴趣变化才被传递。
DIN/DIEN 的核心洞察:推荐不是”理解用户”这一静态问题,而是”理解用户在特定上下文下的当前兴趣”这一动态问题。
用户-物品矩阵与协同过滤
Section titled “用户-物品矩阵与协同过滤”推荐系统的核心数据结构是用户-物品交互矩阵(评分/点击/购买):
矩阵中大量”?”是未知评分——推荐系统的任务就是预测这些空缺值,然后把预测评分最高的推荐给用户。
矩阵分解示意图
Section titled “矩阵分解示意图”个用户、 个物品、 维隐因子()。两个矮矩阵的乘积近似填满原稀疏矩阵的空缺。
Wide & Deep 架构
Section titled “Wide & Deep 架构”Wide 部分捕获低阶共现规则(记忆),Deep 部分学习高阶非线性组合(泛化),联合训练兼顾两者。
DIN 注意力机制
Section titled “DIN 注意力机制”推荐蓝牙耳机时,用户之前点击的”耳机”获得最高注意力权重(0.65),而”奶粉""猫粮”被抑制——这就是目标级注意力。
现代推荐系统架构
Section titled “现代推荐系统架构”工业级推荐系统通常分为召回和排序两阶段:
为什么分阶段?直接对百万物品逐一精排太慢。先用轻量级算法(召回)快速筛出候选集,再用复杂模型(排序)精选——这是工程效率与模型精度的平衡。
Item-based 协同过滤(纯 numpy 手写)
Section titled “Item-based 协同过滤(纯 numpy 手写)”import numpy as np
# 用户-物品评分矩阵(0 表示未评分),5 个用户 × 4 部电影ratings = np.array([ [5, 3, 0, 1], # 用户 0 [4, 0, 0, 1], # 用户 1 [1, 1, 0, 5], # 用户 2 [1, 0, 0, 4], # 用户 3 [0, 1, 5, 4], # 用户 4])
# 计算物品间余弦相似度(item-based CF 核心)norm = ratings / np.linalg.norm(ratings, axis=0, keepdims=True)sim = (ratings.T @ ratings) / (norm.T @ norm) # 物品相似度矩阵np.fill_diagonal(sim, 0) # 对角线置零,排除自身
# 预测:用户 0 对电影 2 的评分 = 其他物品评分加权平均user, item = 0, 2pred = (ratings[user] @ sim[:, item]) / sim[ratings[user] > 0, item].sum()print(f"用户 {user} 对电影 {item} 的预测评分: {pred:.2f}")# 输出示例: 用户 0 对电影 2 的预测评分: 2.85矩阵分解手写 SGD 训练(纯 numpy)
Section titled “矩阵分解手写 SGD 训练(纯 numpy)”import numpy as np
# 小型评分矩阵: 4 个用户 × 5 个物品,0 表示未评分R = np.array([ [5, 3, 0, 1, 0], [4, 0, 0, 1, 0], [1, 1, 0, 5, 4], [0, 1, 5, 4, 5],])
m, n = R.shapeK = 3 # 隐因子维度lr = 0.01 # 学习率reg = 0.1 # 正则化系数epochs = 500
# 随机初始化用户矩阵 P 和物品矩阵 Qnp.random.seed(42)P = np.random.normal(scale=0.1, size=(m, K))Q = np.random.normal(scale=0.1, size=(n, K))
# 只对已观测评分 (R > 0) 做 SGD 更新for epoch in range(epochs): for u in range(m): for i in range(n): if R[u, i] == 0: continue error = R[u, i] - P[u] @ Q[i] # 预测误差 P[u] += lr * (error * Q[i] - reg * P[u]) # 更新用户向量 Q[i] += lr * (error * P[u] - reg * Q[i]) # 更新物品向量
# 预测完整矩阵R_hat = P @ Q.Tprint("预测评分矩阵:\n", R_hat.round(2))# 用户 0 对物品 2 的预测: R_hat[0, 2] ≈ 2.73# 用户 1 对物品 1 的预测: R_hat[1, 1] ≈ 1.95使用 Surprise 库做矩阵分解
Section titled “使用 Surprise 库做矩阵分解”from surprise import Dataset, SVD, accuracyfrom surprise.model_selection import train_test_split
# 加载 MovieLens 评分数据集(首次运行自动下载)data = Dataset.load_builtin("ml-100k")trainset, testset = train_test_split(data, test_size=0.2, random_state=42)
# 矩阵分解(SVD),正是 Netflix Prize 的核心方法model = SVD(n_factors=50, random_state=42)model.fit(trainset)
# 评估预测精度predictions = model.test(testset)print(f"RMSE: {accuracy.rmse(predictions, verbose=False):.4f}")# 输出示例: RMSE: 0.9364ALS 处理隐式反馈(implicit 库)
Section titled “ALS 处理隐式反馈(implicit 库)”import numpy as npimport implicitfrom scipy.sparse import csr_matrix
# 模拟隐式反馈数据(用户-物品交互次数)# 矩阵值 = 交互频次(点击/购买次数),0 表示无交互interactions = np.array([ [5, 3, 0, 0, 1], [4, 0, 0, 1, 0], [1, 1, 0, 5, 4], [0, 1, 5, 4, 5], [3, 0, 4, 0, 2],])mat = csr_matrix(interactions, dtype=np.float64)
# 训练 ALS 模型(隐式反馈专用)model = implicit.als.AlternatingLeastSquares( factors=10, regularization=0.1, iterations=20, random_state=42)model.fit(mat)
# 为用户 0 推荐 Top-3 物品(排除已交互的)user_items = mat.T.tocsr() # implicit 需要 item-user 格式recommendations = model.recommend(userid=0, user_items=user_items, N=3)print(f"用户 0 的推荐: {recommendations}")# 输出示例: [(2, 0.82), (4, 0.65), (3, 0.43)]- User-based vs Item-based:用户量远大于物品量时(如电商:亿级用户 vs 百万商品)→ item-based CF 更高效,物品相似度矩阵可离线预计算;社交场景(用户和物品量都大)→ 矩阵分解更合适。
- 冷启动问题:新用户没有行为、新物品没有评分,协同过滤无法推荐。解决策略:新用户用内容推荐或热门推荐填充,新物品用基于内容的匹配,等积累数据后再切换协同过滤。
- 隐式反馈优于显式评分:用户很少主动评分,但点击、浏览、停留时长等隐性行为数据量巨大——现代推荐系统主要基于隐式反馈建模。
- 评估指标:离线用 RMSE/MAE(评分预测)、Precision@K/Recall@K(Top-N 推荐);最终以线上 A/B 测试的点击率、转化率、留存率为准。
- 特征工程是深度学习推荐的关键:Wide & Deep、DeepFM 等模型需要大量人工特征(用户画像、物品属性、上下文特征、交叉特征),模型架构只是冰山一角。
- SGD vs ALS 的选择:SGD 适合显式评分场景、实现简单、逐样本更新;ALS 适合隐式反馈、天然并行(Spark MLlib 内置)、收敛行为稳定。工业实践中两种方法都广泛使用。
- 负采样(Negative Sampling):隐式反馈中未点击的物品不一定是”不喜欢”——可能只是没看到。训练时通常对未交互物品做负采样(随机取一小部分作为负样本),而非将所有未交互视为负样本。
- 多目标排序:现代推荐系统不只优化点击率,还同时优化点赞率、完播率、评论率、分享率等——多任务学习(MMoE 架构)是工业界标配。
- 电商商品推荐 → 淘宝/亚马逊:“猜你喜欢""购买了此商品的顾客还购买了""看了又看”——协同过滤是这些功能的底层逻辑。Amazon 早期论文中提出的 item-based CF 是推荐系统的经典工作。
- 短视频/视频推荐 → 抖音/TikTok/YouTube/Netflix:抖音的推荐核心是多目标排序(点赞+完播+评论+分享),Netflix 的推荐驱动了 80% 以上的观看时长——推荐质量直接决定平台的用户留存。
- 广告精准投放 → Facebook/Google/腾讯广告:推荐系统本质上是在做”用户-广告”匹配,预测用户点击广告的概率(CTR),决定广告展示和出价——这是千亿级数字广告产业的核心引擎。
- 音乐推荐 → Spotify/网易云音乐:“每日推荐""私人 FM”根据用户听歌历史和音频特征(节奏、音色、情感)综合推荐,Spotify 的 Discover Weekly 是推荐系统最成功的产品案例之一。
- 新闻资讯推荐 → 今日头条/Google News:新闻有时效性,推荐系统需要在”兴趣匹配”和”新鲜度”之间平衡,还要处理用户兴趣随时间的漂移。
典型类库与工具
Section titled “典型类库与工具”| 类库 | 语言 | 说明 |
|---|---|---|
| Surprise | Python | 专用推荐系统库,提供 SVD、KNN 等经典 CF 算法 |
| LightFM | Python | 混合推荐库,支持协同过滤 + 内容特征融合 |
| implicit | Python | 针对隐式反馈(点击/购买)的快速 CF 库,内置 ALS 和 BPR |
| TensorFlow Recommenders | Python | Google 的深度学习推荐系统库,内置双塔、Wide & Deep |
| DeepCTR | Python | 专注 CTR 预估的深度学习库,内置 DeepFM/WDL/DIN 等 |
| Faiss | C++/Python | 向量近似最近邻检索库,推荐召回阶段的核心工具 |
| PyTorch BigGraph | Python | Facebook 开源的大规模图嵌入库,适合知识图谱推荐 |
| Spark MLlib | Scala/Python | 内置 ALS 算法,工业界大规模推荐系统的分布式训练选择 |
| 术语 | 英文 | 解释 |
|---|---|---|
| 协同过滤 | Collaborative Filtering (CF) | 基于用户行为相似性做推荐的方法,分 user-based 和 item-based |
| 矩阵分解 | Matrix Factorization (MF) | 将稀疏用户-物品矩阵分解为低维用户/物品隐向量 |
| 交替最小二乘法 | Alternating Least Squares (ALS) | 交替固定一个矩阵、优化另一个矩阵的矩阵分解求解法,天然可并行 |
| 冷启动 | Cold Start | 新用户或新物品缺乏交互数据导致无法推荐的难题 |
| 召回 | Recall/Candidate Generation | 从海量物品中快速筛选候选集的推荐第一阶段 |
| 排序 | Ranking | 对候选集精排打分,输出最终 Top-N 推荐结果 |
| 隐式反馈 | Implicit Feedback | 点击、浏览、停留等非评分行为,数据量大但含噪音 |
| 点击率 | CTR (Click-Through Rate) | 用户点击广告/推荐项的概率,推荐与广告的核心指标 |
| Wide & Deep | Wide & Deep Learning | Google 提出的记忆+泛化联合推荐模型架构 |
| 因子分解机 | Factorization Machine (FM) | 用隐向量点积学习二阶特征交叉的模型 |
| 注意力机制 | Attention Mechanism | 根据目标动态分配不同权重的机制,DIN 用它实现目标级兴趣激活 |
| 嵌入层 | Embedding Layer | 将稀疏 ID 特征映射为稠密低维向量的神经网络层 |
| 负采样 | Negative Sampling | 从未交互物品中采样一部分作为负样本,处理隐式反馈中”无交互≠不喜欢”的问题 |
- 协同过滤谱系:GroupLens(1994,最早的自动化推荐系统)→ item-based CF(Sarwar 2001)→ 矩阵分解(Koren 的 SVD++,Netflix Prize 2006–2009 冠军方法核心)。Netflix Prize 百万美元大赛是推荐系统领域的里程碑事件。
- 矩阵分解谱系:SVD(Koren 2008, Matrix Factorization Techniques for Recommender Systems)→ 隐式反馈 MF(Hu, Koren & Volinsky 2008, Weighted ALS)→ SVD++(加入隐式反馈信号)→ timeSVD++(加入时间漂移因子)。
- 深度学习推荐谱系:YouTube DNN(Covington 2016,双塔召回)→ Wide & Deep(Cheng 2016,Google)→ DeepFM(Guo 2017,FM + DNN)→ DIN(Zhou 2018,阿里,引入注意力机制建模用户兴趣多样性)→ DIEN(Zhou 2019,加入兴趣演化建模)→ DLRM(Facebook,工业级深度推荐模型)。
- 推荐系统与经典 ML 的关系:协同过滤本质是 k-NN(见监督学习)在用户-物品矩阵上的应用;矩阵分解本质是线性代数(SVD)与优化的结合——推荐系统是传统 ML 方法在工业界最成功的落地之一。
- 前沿方向(2024–2025):
- LLM 驱动的推荐(LLM-based Recommendation):用大语言模型理解用户兴趣和物品语义,实现自然语言对话式推荐。P5(Geng 2022)将推荐任务统一为 prompt 格式;Chat-REC(Gao 2023)用 ChatGPT 做推荐推理。2024-2025 年研究热点包括 LLM 作为推荐系统的排序器/生成器、LLM 增强冷启动推荐。
- 生成式推荐(Generative Recommendation):不再从固定物品库中”检索”,而是直接”生成”推荐列表。Meta 的 Generative Recommenders(2024)用生成模型统一召回和排序,在短视频推荐上取得显著提升。
- 图神经网络推荐(Graph Neural Network for RecSys):LightGCN(He 2020)在用户-物品二部图上做图卷积,学习更高阶的协同信号;2024 年的研究方向包括动态图推荐和异构图推荐。
- 多任务学习排序:MMoE(Ma 2018)和 PLE(Tang 2020)是工业界多目标排序的标准架构,同时优化点击、点赞、完播等多个目标。
- 强化学习推荐:将推荐建模为序列决策问题,平衡短期点击与长期用户满意度。2024-2025 年方向包括离线强化学习推荐和 LLM 辅助的策略探索。
- Action-Based RecSys:2024-2025 年的前沿趋势是从”预测点击”走向”理解和激发用户行动”——不只是推荐物品,而是推荐会引发用户深度参与的内容组合。