推荐系统学习笔记3:Wide&Deep模型——记忆与泛化的平衡艺术
Wide&Deep模型是Google在2016年提出的一种混合推荐模型,它巧妙地将线性模型(Wide部分)和深度神经网络(Deep部分)结合在一起,同时具备了记忆(memorization)和泛化(generalization)的能力。该模型在Google Play应用推荐中取得了显著成功,并成为工业界推荐系统的经典架构之一。
1. 记忆与泛化的权衡
1.1 记忆(Memorization)
记忆指的是模型从历史数据中学习频繁共现的特征组合的能力。例如:
- 用户安装了”王者荣耀”,很可能也会安装”和平精英”
- 用户搜索了”iPhone 15”,很可能点击”iPhone 15手机壳”
记忆的优势:
- 学习明确的、可解释的特征规则
- 对频繁出现的模式预测准确
- 充分利用历史数据中的强信号
记忆的局限性:
- 只能学习训练数据中出现过的模式
- 难以发现潜在的新关联
- 容易过拟合稀疏特征组合
1.2 泛化(Generalization)
泛化指的是模型发现新特征组合、推广到未见模式的能力。例如:
- 通过用户年龄、性别、地理位置等特征的组合,预测对新应用的偏好
- 通过物品类别的嵌入表示,发现潜在的语义关联
泛化的优势:
- 能够发现潜在的、未观察到的特征关联
- 对稀疏特征有一定的预测能力
- 模型更简洁,参数共享
泛化的局限性:
- 可能学习到虚假的相关性
- 对低频特征组合的预测可能不准确
- 可解释性较差
1.3 Wide&Deep的设计哲学
Wide&Deep模型的核心思想是:
- Wide部分:负责记忆,学习频繁出现的特征交互
- Deep部分:负责泛化,学习特征的深层表示和潜在交互
- 联合训练:两部分同时训练,共享损失函数,实现优势互补
2. Wide&Deep模型架构
2.1 整体架构
1 | 输入特征 |
2.2 Wide部分
Wide部分本质上是一个广义线性模型:
$$
y_{wide} = \mathbf{w}^T \mathbf{x} + b
$$
特征设计:
- 原始特征:用户安装的应用、用户人口统计学特征等
- 交叉特征:人工设计的特征组合,如
user_installed_app=netflix & impression_app=pandora
交叉特征的重要性:
交叉特征通过外积变换生成,能够显式地捕获特征交互。例如,在推荐系统中:
AND(user_installed_app=netflix, impression_app=spotify):捕捉应用之间的关联AND(user_age_bracket=20-30, user_gender=female, impression_category=music):捕捉用户画像与类别的关联
特征变换:
$$
\phi_k(\mathbf{x}) = \prod_{i=1}^d x_i^{c_{ki}}, \quad c_{ki} \in {0, 1}
$$
其中$c_{ki}$表示特征i是否出现在第k个交叉特征中。
2.3 Deep部分
Deep部分是一个前馈神经网络,用于学习特征的稠密表示和深层交互。
输入层:
- 类别特征:通过嵌入层转换为稠密向量
- 连续特征:直接输入或经过标准化
嵌入层:
对于每个稀疏类别特征:
$$
\mathbf{e}i = \mathbf{W}{embed}^i \mathbf{x}_i
$$
嵌入维度通常为$O(10)$到$O(100)$维。
连接层:
将所有嵌入向量和连续特征拼接:
$$
\mathbf{a}^{(0)} = [\mathbf{e}_1^T, \mathbf{e}_2^T, \dots, \mathbf{e}m^T, \mathbf{x}{cont}^T]^T
$$
隐藏层:
$$
\mathbf{a}^{(l)} = f(\mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}), \quad l = 1, \dots, L
$$
其中$f$通常是ReLU激活函数。
2.4 联合训练与输出
Wide部分和Deep部分的输出通过加权求和组合:
$$
P(Y=1|\mathbf{x}) = \sigma(\mathbf{w}{wide}^T \mathbf{x} + \mathbf{w}{deep}^T \mathbf{a}^{(L)} + b)
$$
其中$\sigma$是sigmoid函数,用于二分类任务(如点击率预测)。
联合训练的优势:
- 端到端优化:两部分同时更新,学习互补的表示
- 避免集成开销:相比模型集成,参数量更少,推理更快
- 自动特征权重:模型自动学习宽深两部分的重要性
3. 模型实现细节
3.1 特征工程
3.1.1 Wide部分特征
- 用户特征:用户ID、人口统计学信息、历史行为
- 上下文特征:时间、位置、设备
- 交叉特征:用户-物品交互特征、物品-物品关联特征
3.1.2 Deep部分特征
- 高维稀疏特征:使用嵌入层降维
- 连续特征:标准化或分桶处理
- 序列特征:用户历史行为序列
3.2 嵌入层优化
共享嵌入:对于相同的特征字段(如应用ID),在不同位置使用相同的嵌入矩阵,减少参数量并提高泛化能力。
嵌入初始化:
- 随机初始化
- 预训练初始化(如使用矩阵分解得到的隐向量)
嵌入维度选择:
- 高频特征:较高维度(32-128)
- 低频特征:较低维度(8-16)
3.3 训练技巧
3.3.1 损失函数
对于点击率预测任务,使用对数损失:
$$
\mathcal{L} = -\frac{1}{N} \sum_{i=1}^N [y_i \log \hat{y}_i + (1 - y_i) \log(1 - \hat{y}_i)]
$$
3.3.2 正则化
- L1正则化:促进稀疏性,适合Wide部分
- L2正则化:防止过拟合,适合Deep部分
- Dropout:在Deep部分的隐藏层使用,提高泛化能力
3.3.3 优化算法
- FTRL(Follow-the-Regularized-Leader):适合Wide部分,处理稀疏特征效果好
- AdaGrad:适合Deep部分,自适应学习率
3.4 分布式训练
Wide&Deep模型支持数据并行训练:
- 参数服务器架构:Wide部分参数存储在参数服务器,Deep部分参数存储在worker节点
- 异步更新:提高训练速度,但可能影响收敛性
- 模型并行:将大模型切分到多个设备
4. Wide&Deep的变体与扩展
4.1 Deep&Cross Network(DCN)
DCN在Deep部分增加了交叉网络,显式地学习特征交叉:
$$
\mathbf{x}_{l+1} = \mathbf{x}_0 \mathbf{x}_l^T \mathbf{w}_l + \mathbf{b}_l + \mathbf{x}_l
$$
4.2 Wide&Deep with Attention
引入注意力机制,动态调整不同特征的重要性:
$$
\alpha_i = \frac{\exp(\mathbf{v}^T \tanh(\mathbf{W} \mathbf{h}_i))}{\sum_j \exp(\mathbf{v}^T \tanh(\mathbf{W} \mathbf{h}_j))}
$$
4.3 Multi-task Wide&Deep
同时优化多个相关任务,如点击率预测和转化率预测:
$$
\mathcal{L} = \lambda_{ctr} \mathcal{L}{ctr} + \lambda{cvr} \mathcal{L}_{cvr}
$$
5. 在Google Play的应用
5.1 问题背景
Google Play需要向用户推荐他们可能感兴趣的应用。挑战包括:
- 海量物品:超过百万个应用
- 稀疏交互:每个用户只与少量应用交互
- 冷启动:新应用缺乏历史数据
- 实时性:用户兴趣随时间变化
5.2 特征设计
5.2.1 用户特征
- 已安装应用
- 人口统计学信息
- 历史搜索和浏览记录
5.2.2 应用特征
- 应用类别
- 开发者信息
- 用户评价和评分
5.2.3 上下文特征
- 时间(小时、星期几)
- 设备类型
- 地理位置
5.2.4 交叉特征
- 用户已安装应用与候选应用的组合
- 用户人口统计学与应用类别的组合
5.3 系统架构
1 | 用户请求 |
5.4 效果评估
在A/B测试中,Wide&Deep模型相比纯Wide模型(逻辑回归):
- 应用下载量:显著提升
- 用户参与度:提高
- 新应用发现:改善冷启动问题
6. 实践指南
6.1 何时使用Wide&Deep
适合场景:
- 同时需要记忆和泛化:既有频繁模式,又需要发现新关联
- 特征类型多样:既有稀疏类别特征,又有稠密连续特征
- 数据规模大:能够支持分布式训练
不适合场景:
- 特征交互简单:线性模型已足够
- 数据量小:深度部分容易过拟合
- 实时性要求极高:相比纯线性模型推理速度慢
6.2 实现注意事项
6.2.1 特征选择
- Wide部分:选择强信号特征和重要交叉特征
- Deep部分:选择适合嵌入表示的类别特征
6.2.2 模型大小平衡
- Wide部分过大:容易过拟合,训练慢
- Deep部分过深:梯度消失,难以训练
- 平衡点需要通过实验确定
6.2.3 超参数调优
- 学习率:Wide和Deep部分可能需要不同的学习率
- 正则化强度:控制记忆和泛化的平衡
- 隐藏层大小:影响模型容量
6.3 常见问题与解决
6.3.1 训练不稳定
- 问题:Wide和Deep部分学习速度不一致
- 解决:使用不同的优化器或学习率
6.3.2 过拟合
- 问题:Wide部分记住了噪声
- 解决:增加L1正则化,减少交叉特征数量
6.3.3 推理延迟
- 问题:Deep部分增加计算开销
- 解决:模型压缩、量化、蒸馏
7. 实验与分析
7.1 对比实验
在公开数据集上的表现:
| 模型 | AUC | LogLoss | 训练时间 | 推理延迟 |
|---|---|---|---|---|
| 逻辑回归(纯Wide) | 0.765 | 0.452 | 1.0x | 1.0x |
| 深度神经网络(纯Deep) | 0.782 | 0.438 | 3.2x | 2.5x |
| Wide&Deep | 0.791 | 0.431 | 3.5x | 2.6x |
7.2 消融实验
| 配置 | AUC | 说明 |
|---|---|---|
| 完整Wide&Deep | 0.791 | 基准 |
| 无交叉特征 | 0.783 | Wide部分记忆能力下降 |
| 浅层Deep(2层) | 0.787 | 泛化能力不足 |
| 分别训练 | 0.785 | 缺乏协同优化 |
7.3 特征重要性分析
通过分析模型权重,可以发现:
- Wide部分:交叉特征权重高,对应明确的业务规则
- Deep部分:嵌入向量捕获了语义相似的聚类
8. 总结与展望
8.1 Wide&Deep的核心贡献
- 混合架构:首次将线性模型和深度神经网络有效结合
- 记忆与泛化:明确区分并平衡两种能力
- 工业级实践:在超大规模系统中验证了可行性
- 开源实现:推动了业界应用
8.2 局限性
- 特征工程依赖:仍然需要设计交叉特征
- 超参数敏感:需要仔细调优平衡两部分
- 解释性有限:Deep部分的决策过程不透明
8.3 未来方向
- 自动化特征工程:使用AutoML技术自动发现重要特征交互
- 动态架构:根据数据分布动态调整Wide和Deep的权重
- 多模态扩展:整合文本、图像等多媒体特征
- 可解释性增强:结合注意力机制提供推荐理由
8.4 对从业者的启示
- 从业务出发:根据业务需求决定记忆和泛化的侧重
- 迭代优化:从简单模型开始,逐步增加复杂度
- 关注效率:在效果和计算成本之间权衡
- 持续学习:跟踪最新研究,但不过早追求复杂模型
Wide&Deep模型是推荐系统发展历程中的一个重要里程碑。它展示了如何将传统机器学习与现代深度学习相结合,在记忆与泛化之间找到平衡点。这种混合架构的思想对后续推荐模型的设计产生了深远影响。