深度学习推荐系统 - Part 1:前深度学习时代
这篇笔记整理自王喆《深度学习推荐系统》第一部分,主要记录推荐系统的意义与逻辑框架、召回/排序/补充策略的模型分层,以及前深度学习时代的传统推荐模型——协同过滤、矩阵分解、逻辑回归、因子分解机(FM/FFM)、GBDT+LR 与 LS-PLM 等内容。它既是阅读该书的章节索引,也可以作为之后进入深度学习推荐模型前的传统方法回顾。
书目信息
| 项目 | 内容 |
|---|---|
| 书名 | 深度学习推荐系统 |
| 作者 | 王喆 |
| 出版社 | 电子工业出版社(博文视点出品) |
| 丛书 | 博文视点AI系列 |
| 出版时间 | 2020年3月 |
| ISBN | 9787121384646 |
| 页数 | 304页(16开,平装) |
| 定价 | 108元 |
| 分类 | TP181(机器学习) |
第1章 互联网的增长引擎——推荐系统
1. 推荐系统的意义
- 用户角度:在用户需求并不十分明确的情况下进行信息过滤
- 公司角度:解决产品能够最大限度地吸引用户、留存用户、增加粘性、提高用户转化率的问题
2. 推荐系统的逻辑框架
- 用户 $U$ (User)
- 特定场景 $C$ (Context)
- 特定候选物品 $I$ (Item)
- 构建函数 $f(U,I,C)$ 预测用户对特定候选物品的喜好程度
3. 推荐系统的模型部分
- 召回层 :利用高效的召回规则、算法或简单的模型快速召回用户可能感兴趣的物品
- 排序层 :利用排序模型对初筛的候选集进行精排序
- 补充策略与算法层 :也称“再排序层”,为兼顾结果的“多样性”“流行度”“新鲜度”等指标,结合一些补充的策略和算法对推荐列表进行一定的调整,形成最终用户可见的推荐列表
第2章 前深度学习时代
传统推荐模型
1. 回顾前深度学习时代模型的原因
- 协同过滤(CF)、逻辑回归(LR)、因子分解机(FM)等传统推荐模型仍然凭借其可解释性强、硬件环境要求低、易于快速训练和部署等不可替代的优势,拥有大量使用的应用场景
- 传统推荐模型是深度学习推荐模型的基础
2. 传统推荐模型的演化关系

图 2-1 传统推荐模型的演化关系图。
- 协同过滤算法族
- 逻辑回归模型族
- 因子分解机模型族
- 组合模型
协同过滤 (Collaborative Filtering, CF)
1. 核心思想
- 协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程
- 一个用户的推荐结果不仅由他自己的历史决定,还利用了其他用户产生的交互信息
2. 形式化定义
设:
- 用户集合 $U={u_1,u_2,\dots,u_m}$
- 物品集合 $I={i_1,i_2,\dots,i_n}$
- 用户—物品交互矩阵 $R\in \mathbb{R}^{m\times n}$
其中 $r_{ui}$ 表示用户 $u$ 对物品 $i$ 的偏好,比如: - 显式反馈:评分 1~5
- 隐式反馈:点击、购买、观看、收藏等
但实际中只有一部分 $r_{ui}$ 是已知的。设已观察到的交互集合为
那么协同过滤的核心任务就是:
\[\text{根据 } \{r_{ui}:(u,i)\in\Omega\} \text{ 预测未知的 } r_{ui}\]即学习一个函数:
\[\hat r_{ui}=f(u,i\mid R_{\Omega})\]其中 $\hat r_{ui}$ 是用户 $u$ 对物品 $i$ 的预测偏好。
3. 三种相似度计算
[!note] 1)余弦相似度
\[\operatorname{sim}(i,j)=\cos(i,j)=\frac{i\cdot j}{\|i\|\|j\|}\]
余弦相似度(Cosine Similarity)通过计算两个用户评分向量之间的夹角衡量相似程度。夹角越小,相似度越高。
[!note] 2)皮尔逊相关系数
\[\operatorname{sim}(i,j)=\frac{\sum_{p\in P}(R_{i,p}-\bar R_i)(R_{j,p}-\bar R_j)}{\sqrt{\sum_{p\in P}(R_{i,p}-\bar R_i)^2}\sqrt{\sum_{p\in P}(R_{j,p}-\bar R_j)^2}}\]
皮尔逊相关系数(Pearson Correlation)通过减去用户自身的平均评分,降低不同用户评分习惯带来的偏差。其中:
- $R_{i,p}$:用户 $i$ 对物品 $p$ 的评分
- $\bar R_i$:用户 $i$ 的平均评分
- $P$:参与相似度计算的物品集合
[!note] 3) 基于物品平均分的修正相似度
\[\operatorname{sim}(i,j)=\frac{\sum_{p\in P}(R_{i,p}-\bar R_p)(R_{j,p}-\bar R_p)}{\sqrt{\sum_{p\in P}(R_{i,p}-\bar R_p)^2}\sqrt{\sum_{p\in P}(R_{j,p}-\bar R_p)^2}}\]
还可以减去物品自身的平均评分,以降低不同物品整体评分水平差异的影响:其中 $\bar R_p$ 表示物品 $p$ 获得的平均评分。
4. 基于用户的协同过滤(UserCF)
- 根据上述相似度计算获得TOP $n$ 相似用户,假设:
目标用户与其相似用户的喜好是类似的
- 利用用户相似度和相似用户的评价的加权平均获得目标用户的评价预测,即基于用户相似度的评分预测:
用户 $u$ 对物品 $p$ 的预测评分:
\[R_{u,p}=\frac{\sum_{s\in S}(W_{u,s}\cdot R_{s,p})}{\sum_{s\in S}W_{u,s}}\]其中:
- $W_{u,s}$:用户 $u$ 与用户 $s$ 之间的相似度权重
- $R_{s,p}$:用户 $s$ 对物品 $p$ 的评分
- $S$:与用户 $u$ 相似的用户集合
[!problem] UserCF的缺点
- 用户数远大于物品数,用户相似度矩阵存储开销大切增长速率快
- 用户的历史数据向量数据非常稀疏,对于记录较少的用户其找到相似用户的准确度非常低
5. 基于物品的协同过滤(ItemCF)
- 定义:基于物品相似度进行推荐的协同过滤算法,通过计算共现矩阵中物品列向量的相似度得到物品相似度矩阵,再根据用户历史正反馈物品寻找相似物品并进行排序推荐
- 具体步骤:
- 根据历史数据构建 $m\times n$ 的共现矩阵,其中用户为行、物品为列
- 计算共现矩阵两两列向量间的相似度,构建 $n\times n$ 的物品相似度矩阵
- 获取用户历史行为中的正反馈物品列表
- 对历史正反馈物品寻找 Top-$k$ 相似物品,组成相似物品集合
- 根据相似度分值排序,生成最终推荐列表
- 预测公式:如果一个物品与多个历史正反馈物品相似,则最终得分为多个相似度的累加:
其中:
- $H$:目标用户的正反馈物品集合
- $w_{p,h}$:物品 $p$ 与物品 $h$ 的相似度
- $R_{u,h}$:用户 $u$ 对物品 $h$ 的已有评分
[!question] 协同过滤的缺点
- 热门的物品具有很强的头部效应,容易跟大量物品产生相似性
- 尾部的物品由于特征向量稀疏,很少与其他物品产生相似性,导致很少被推荐
6. 矩阵分解算法
矩阵分解(Matrix Factorization)用于将用户-物品评分矩阵分解为两个低维矩阵:
\[R \approx UV\]其中:
- $R$:用户-物品评分矩阵
- $U$:用户隐向量矩阵
- $V$:物品隐向量矩阵
- $k$:隐向量维度
若 $R$ 为 $m\times n$ 矩阵,则:
\[U\in \mathbb{R}^{m\times k},\qquad V\in \mathbb{R}^{k\times n}\]用户 $u$ 对物品 $i$ 的预测评分为:
\[\hat r_{ui}=q_i^Tp_u\]其中:
- $p_u$:用户 $u$ 的隐向量
- $q_i$:物品 $i$ 的隐向量
核心思想:
用低维隐向量表示用户兴趣和物品特征,再通过两者的内积预测评分。
- $k$ 越小,模型越简单、泛化能力较强;
- $k$ 越大,表达能力更强,但计算复杂度和过拟合风险也会增加。
7. 矩阵分解的求解
矩阵分解主要有三种方法:
- 特征值分解:只能用于方阵,不适合用户-物品矩阵
- 奇异值分解(SVD)
- 梯度下降(GD)
(1)奇异值分解(SVD)
对于 $m\times n$ 矩阵 $M$:
\[M=U\Sigma V^T\]其中:
- $U$:$m\times m$ 正交矩阵
- $V$:$n\times n$ 正交矩阵
- $\Sigma$:$m\times n$ 对角矩阵
保留最大的 $k$ 个奇异值,可得到低维近似:
\[M\approx U_{m\times k}\Sigma_{k\times k}V_{k\times n}^T\]SVD 的缺点:
- 要求原始矩阵稠密,而用户-物品矩阵通常十分稀疏
- 计算复杂度高,不适合大规模互联网数据
(2) 梯度下降求解
用户 $u$ 对物品 $i$ 的预测评分:
\[\hat r_{ui}=q_i^Tp_u\]通过最小化真实评分与预测评分的误差求解:
\[\min_{q^*,p^*}\sum_{(u,i)\in K}(r_{ui}-q_i^Tp_u)^2\]其中 $K$ 为已有用户评分的样本集合。
(3) 正则化 (Regularization)
为减少过拟合,在损失函数中加入正则项:
\[\min_{q^*,p^*}\sum_{(u,i)\in K}(r_{ui}-q_i^Tp_u)^2+\lambda(\|q_i\|^2+\|p_u\|^2)\]- $\lambda$:正则化系数
- $\lambda$ 越大,限制越强
- 正则化可以降低过拟合,使模型更加稳定
(4) 梯度下降过程
- 确定目标函数
- 对 $q_i$、$p_u$ 求偏导
- 沿梯度方向更新参数
- 达到最大迭代次数或损失低于阈值时停止
训练完成后得到用户和物品的隐向量,通过 $q_i^Tp_u$ 预测用户对各物品的评分,并排序生成推荐列表。
8. 打分偏差的消除
不同用户的打分习惯不同,不同物品的平均评分也存在差异,因此矩阵分解中通常加入用户偏差和物品偏差。
预测评分:
\[\hat r_{ui}=\mu+b_u+b_i+q_i^Tp_u\]其中:
- $\mu$:全局平均评分
- $b_u$:用户 $u$ 的评分偏差
- $b_i$:物品 $i$ 的评分偏差
- $q_i^Tp_u$:用户与物品隐向量的匹配程度
加入偏差后的目标函数
\[\min \sum_{(u,i)\in K}(r_{ui}-\mu-b_u-b_i-p_u^Tq_i)^2+\lambda(\|p_u\|^2+\|q_i\|^2+b_u^2+b_i^2)\]其中正则化项用于减少过拟合。
9. 矩阵分解的优点和局限
- 泛化能力强
- 空间复杂度低
- 更好的扩展性和灵活性
- 不方便加入用户、物品和上下文相关的特征
逻辑回归 (Logistic Regression, LR)
相比协同过滤和矩阵分解,逻辑回归将推荐看作二分类问题:
- 正样本:用户点击、观看等正反馈行为
- 负样本:用户未产生正反馈的样本
模型预测用户产生正反馈的概率,例如点击率 CTR(Click Through Rate),再根据概率排序生成推荐列表。
1. 基于逻辑回归模型的推荐流程
- 特征处理:将用户年龄、性别、物品属性、物品描述、时间、地点等转化为数值型特征向量
- 模型训练:以点击率等指标为优化目标,利用已有样本训练逻辑回归模型
- 在线预测:将用户和候选物品的特征输入模型,预测用户点击该物品的概率
- 排序推荐:根据预测的点击概率从高到低排序,得到最终推荐列表
核心流程:
\[特征提取 \rightarrow 逻辑回归预测 \rightarrow 点击概率 \rightarrow 排序推荐\]核心:利用用户、物品及上下文特征预测用户产生正反馈的概率。
2. 逻辑回归模型的数学形式
逻辑回归的推断过程:
- 将特征向量作为输入:
- 为每个特征赋予权重:
计算加权和:
\[z=w^Tx+b\]- 将 $z$ 输入 Sigmoid 函数:
Sigmoid 将结果映射到 $0\sim1$,可作为用户产生正反馈的概率。
因此逻辑回归模型为:
\[f(x)=\frac{1}{1+e^{-(w^Tx+b)}}\]其中:
- $x$:特征向量
- $w$:特征权重
- $b$:偏置项
- $f(x)$:预测概率
模型训练的主要目标是学习合适的 $w$ 和 $b$。
3. 逻辑回归模型的训练方法
逻辑回归常用梯度下降法进行训练,其目标是找到使损失函数最小的参数。
1. 梯度下降
梯度表示函数增长最快的方向,因此:
- 沿梯度方向移动 → 函数值增大
- 沿负梯度方向移动 → 函数值减小
梯度下降不断沿负梯度方向更新参数,直到找到局部最小值。
2. 逻辑回归的样本概率
对于样本 $x$:
\[P(y=1|x;w)=f_w(x)\] \[P(y=0|x;w)=1-f_w(x)\]合并为:
\[P(y|x;w)=(f_w(x))^y(1-f_w(x))^{1-y}\]其中 $y\in{0,1}$。
3. 损失函数
通过最大似然估计,并取负对数,可得到逻辑回归的损失函数:
\[J(w)=-\frac{1}{m}\sum_{i=1}^{m}\left[y^i\log f_w(x^i)+(1-y^i)\log(1-f_w(x^i))\right]\]训练目标:
\[\boxed{\min J(w)}\]即让预测结果尽可能接近真实标签。
4. 梯度与参数更新
对参数 $w_j$ 求偏导:
\[\frac{\partial J(w)}{\partial w_j}=\frac{1}{m}\sum_{i=1}^{m}(f_w(x^i)-y^i)x_j^i\]利用梯度下降更新参数:
\[w_j\leftarrow w_j-\gamma\frac{1}{m}\sum_{i=1}^{m}(f_w(x^i)-y^i)x_j^i\]其中 $\gamma$ 为学习率。
4. 逻辑回归模型的优势和局限
- 数字含义上的支撑
- 可解释性强
- 工程化的需要
局限 : 表达能力不强,无法进行特征交叉、特征筛选等操作
因子分解机 (Factorization Machine, FM)
1. POLY2模型
POLY2 用于自动进行二阶特征交叉,避免人工组合特征。
其数学形式为:
\[\phi_{\text{POLY2}}(w,x)=\sum_{j_1=1}^{n}\sum_{j_2=j_1+1}^{n}w_{h(j_1,j_2)}x_{j_1}x_{j_2}\]其中:
- $x_{j_1},x_{j_2}$:两个不同特征
- $w_{h(j_1,j_2)}$:该特征组合对应的权重
POLY2 会对所有特征进行两两交叉:
\[x_1x_2,\ x_1x_3,\ x_2x_3,\dots\]本质上仍然是线性模型,训练方式与逻辑回归类似。
缺点
- 数据稀疏问题:类别特征经过 one-hot 后本身已经非常稀疏,再进行两两交叉会使特征更加稀疏,很多交叉特征缺少足够样本训练
- 参数量过大:$n$ 个特征两两交叉后,参数数量接近 $O(n^2)$,因此特征数量较大时,训练成本很高
2. 因子分解机(FM)
FM(Factorization Machine)用于解决 POLY2 中特征交叉稀疏、参数量过大的问题。
FM 的二阶部分:
\[\phi_{FM}(w,x)=\sum_{j_1=1}^{n}\sum_{j_2=j_1+1}^{n}(w_{j_1}\cdot w_{j_2})x_{j_1}x_{j_2}\]其中:
- $w_j$:特征 $j$ 的隐向量
- $w_{j_1}\cdot w_{j_2}$:两个特征隐向量的内积,作为交叉特征的权重
与 POLY2 的区别
POLY2 为每一对特征组合直接学习一个独立权重:
\[w_{h(j_1,j_2)}\]FM 则为每个特征学习一个 $k$ 维隐向量,再通过:
\[w_{j_1}\cdot w_{j_2}\]计算特征交叉权重。
因此参数量由 $O(n^2)$ 降低为 $O(nk)$,其中 $n\gg k$。
FM 的优势
- 缓解数据稀疏问题:即使某两个特征没有同时出现,也可以利用各自从其他样本中学到的隐向量估计它们的交叉关系
- 泛化能力更强:POLY2 只能学习训练集中出现过的具体特征组合,而 FM 可以预测未出现过的组合
- 参数和计算量更小:将 $n^2$ 级别参数降低到 $nk$ 级别
3. 域感知因子分解机 (FFM)
FFM(Field-aware Factorization Machine)是在 FM 基础上引入特征域(Field) 概念的模型。
FFM 的二阶部分为:
\[\phi_{FFM}(w,x)=\sum_{j_1=1}^{n}\sum_{j_2=j_1+1}^{n}\left(w_{j_1,f_2}\cdot w_{j_2,f_1}\right)x_{j_1}x_{j_2}\]其中:
- $f_1$:特征 $j_1$ 所属的域
- $f_2$:特征 $j_2$ 所属的域
- $w_{j_1,f_2}$:特征 $j_1$ 面对域 $f_2$ 时使用的隐向量
- $w_{j_2,f_1}$:特征 $j_2$ 面对域 $f_1$ 时使用的隐向量
Field 的含义
Field 表示一组属于同一类的特征。
[!example] Field 的例子
- 用户性别
- 商品类别
- 广告主
- 发布渠道
一个 Field 中通常包含多个 one-hot 特征。
与 FM 的区别
FM 中,每个特征只有一个隐向量:
\[w_j\]FFM 中,每个特征针对不同 Field 都有不同的隐向量:
\[w_{j,f}\]因此:
\[\boxed{FM:一个特征一个隐向量}\] \[\boxed{FFM:一个特征在不同 Field 下使用不同隐向量}\]参数与复杂度
假设:
- 特征数量为 $n$
- Field 数量为 $f$
- 隐向量维度为 $k$
则 FFM 需要学习的参数量约为:
\[O(nkf)\]其二阶交叉计算复杂度约为:
\[O(kn^2)\]相比 FM,FFM:
- 表达能力更强
- 能利用特征所属 Field 的信息
- 参数量和计算复杂度更高
GBDT+LR
GBDT+LR 的核心思想是:
利用 GBDT 自动完成特征选择和特征组合,再将生成的新特征输入 LR 进行 CTR 预测。
整体流程:
\[原始特征 \rightarrow GBDT \rightarrow 叶子节点特征 \rightarrow LR \rightarrow CTR预测\]GBDT 和 LR 通常分开训练:
- GBDT:负责特征工程
- LR:负责最终分类/CTR 预测
1. GBDT 原理与特征工程
GBDT 基本原理
GBDT(Gradient Boosting Decision Tree)由多棵回归树组成。
最终预测结果是所有子树结果之和:
\[D(x)=d_{\text{tree1}}(x)+d_{\text{tree2}}(x)+\cdots\]GBDT 按顺序逐棵生成决策树。
假设已经有 3 棵树:
\[D(x)=d_{\text{tree1}}(x)+d_{\text{tree2}}(x)+d_{\text{tree3}}(x)\]下一棵树主要学习当前预测结果与真实结果之间的残差:
\[R(x)=f(x)-D(x)\]使加入新树后:
\[D(x)+d_{\text{tree4}}(x)\]更加接近真实目标函数 $f(x)$。
因此,GBDT 的核心过程可以理解为:
\[已有预测 \rightarrow 计算残差 \rightarrow 新树拟合残差 \rightarrow 不断叠加\]为什么可以做特征工程
决策树每个节点的分裂过程相当于进行一次特征选择,多个节点组成的路径则形成了特征组合。
因此 GBDT 能自动完成:
- 特征选择
- 非线性特征组合
- 高阶特征交叉
避免大量人工特征工程。
2. GBDT 特征转换
训练好 GBDT 后,可以利用其叶子节点将原始特征转换为新的离散特征。
特征转换过程
对于每一棵决策树:
- 样本最终会落入某个叶子节点;
- 将该叶子节点记为 1;
- 其他叶子节点记为 0;
- 得到该棵树对应的 one-hot 特征向量。
例如某棵树有 4 个叶子节点,样本落入第 3 个:
\[[0,0,1,0]\]将所有树生成的向量连接起来:
\[\boxed{新特征 = Tree_1特征 \oplus Tree_2特征 \oplus \cdots}\]最终得到一个新的高维离散特征向量,作为后续 LR 的输入。
特征交叉能力
决策树的一条路径包含多个节点分裂,因此实际上完成了多个特征的组合。
树的深度决定了特征交叉的阶数。
例如深度为 4 时,需要经过 3 次节点分裂,因此叶子节点可以表示三阶特征组合。
特点
GBDT 的优势:
- 自动进行特征选择;
- 自动进行高阶特征交叉。
缺点:
- 容易产生过拟合;
- 转换成叶子节点后,会损失部分原始特征的数值信息。
因此不能简单认为 GBDT 的特征交叉能力一定优于 FM / FFM,实际效果需要结合数据和模型调试判断。
LS-PLM
LS-PLM(Large Scale Piece-wise Linear Model,大规模分段线性模型),也称 MLR(Mixed Logistic Regression,混合逻辑回归)。
核心思想:
先把样本划分到多个不同区域,再在每个区域中使用逻辑回归进行 CTR 预测。
可以看作是对普通逻辑回归的扩展:
\[LR \rightarrow 多个局部LR模型\]1. LS-PLM模型结构与原理
模型结构
LS-PLM 由两部分组成:
- 分片模型:使用 Softmax 判断样本属于各个分片的概率
- 局部 LR 模型:每个分片对应一个 LR 模型,预测该分片中的 CTR
最终预测结果:
\[f(x)=\sum_{i=1}^{m}\pi_i(x)\eta_i(x)\]其中:
\[\pi_i(x)=\frac{e^{u_i\cdot x}}{\sum_{j=1}^{m}e^{u_j\cdot x}}\]表示样本属于第 $i$ 个分片的概率;
\[\eta_i(x)=\frac{1}{1+e^{-w_i\cdot x}}\]表示第 $i$ 个 LR 模型的预测结果。
因此:
\[f(x)=\sum_{i=1}^{m}\frac{e^{u_i\cdot x}}{\sum_{j=1}^{m}e^{u_j\cdot x}}\cdot\frac{1}{1+e^{-w_i\cdot x}}\]分片数 $m$
$m$ 表示局部模型的数量:
- $m=1$:退化为普通逻辑回归
- $m$ 越大:模型表达能力越强
- 但参数量和训练成本也越高
核心理解
\[\boxed{\text{Softmax负责"分片"}+\text{LR负责"片内预测"}}\]LS-PLM 通过多个局部线性模型的组合,使整体模型具备更强的非线性表达能力。
2. LS-PLM模型的优点
- 端到端的非线性学习能力
- 模型的稀疏性强