推荐系统学习笔记3:Wide&Deep模型
Keep Team Lv4

推荐系统学习笔记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
3
4
5
6
7
8
9
10
11
12
输入特征

├───────────────┐
│ │
Wide部分 Deep部分
(线性模型) (深度神经网络)
│ │
└───────────────┘

联合输出层

预测结果

2.2 Wide部分

Wide部分本质上是一个广义线性模型:
$$
y_{wide} = \mathbf{w}^T \mathbf{x} + b
$$

特征设计

  1. 原始特征:用户安装的应用、用户人口统计学特征等
  2. 交叉特征:人工设计的特征组合,如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函数,用于二分类任务(如点击率预测)。

联合训练的优势

  1. 端到端优化:两部分同时更新,学习互补的表示
  2. 避免集成开销:相比模型集成,参数量更少,推理更快
  3. 自动特征权重:模型自动学习宽深两部分的重要性

3. 模型实现细节

3.1 特征工程

3.1.1 Wide部分特征

  1. 用户特征:用户ID、人口统计学信息、历史行为
  2. 上下文特征:时间、位置、设备
  3. 交叉特征:用户-物品交互特征、物品-物品关联特征

3.1.2 Deep部分特征

  1. 高维稀疏特征:使用嵌入层降维
  2. 连续特征:标准化或分桶处理
  3. 序列特征:用户历史行为序列

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模型支持数据并行训练:

  1. 参数服务器架构:Wide部分参数存储在参数服务器,Deep部分参数存储在worker节点
  2. 异步更新:提高训练速度,但可能影响收敛性
  3. 模型并行:将大模型切分到多个设备

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需要向用户推荐他们可能感兴趣的应用。挑战包括:

  1. 海量物品:超过百万个应用
  2. 稀疏交互:每个用户只与少量应用交互
  3. 冷启动:新应用缺乏历史数据
  4. 实时性:用户兴趣随时间变化

5.2 特征设计

5.2.1 用户特征

  • 已安装应用
  • 人口统计学信息
  • 历史搜索和浏览记录

5.2.2 应用特征

  • 应用类别
  • 开发者信息
  • 用户评价和评分

5.2.3 上下文特征

  • 时间(小时、星期几)
  • 设备类型
  • 地理位置

5.2.4 交叉特征

  • 用户已安装应用与候选应用的组合
  • 用户人口统计学与应用类别的组合

5.3 系统架构

1
2
3
4
5
6
7
8
9
10
用户请求


特征提取


模型服务(Wide&Deep)


候选生成 → 排序 → 过滤 → 最终推荐

5.4 效果评估

在A/B测试中,Wide&Deep模型相比纯Wide模型(逻辑回归):

  • 应用下载量:显著提升
  • 用户参与度:提高
  • 新应用发现:改善冷启动问题

6. 实践指南

6.1 何时使用Wide&Deep

适合场景:

  1. 同时需要记忆和泛化:既有频繁模式,又需要发现新关联
  2. 特征类型多样:既有稀疏类别特征,又有稠密连续特征
  3. 数据规模大:能够支持分布式训练

不适合场景:

  1. 特征交互简单:线性模型已足够
  2. 数据量小:深度部分容易过拟合
  3. 实时性要求极高:相比纯线性模型推理速度慢

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 特征重要性分析

通过分析模型权重,可以发现:

  1. Wide部分:交叉特征权重高,对应明确的业务规则
  2. Deep部分:嵌入向量捕获了语义相似的聚类

8. 总结与展望

8.1 Wide&Deep的核心贡献

  1. 混合架构:首次将线性模型和深度神经网络有效结合
  2. 记忆与泛化:明确区分并平衡两种能力
  3. 工业级实践:在超大规模系统中验证了可行性
  4. 开源实现:推动了业界应用

8.2 局限性

  1. 特征工程依赖:仍然需要设计交叉特征
  2. 超参数敏感:需要仔细调优平衡两部分
  3. 解释性有限:Deep部分的决策过程不透明

8.3 未来方向

  1. 自动化特征工程:使用AutoML技术自动发现重要特征交互
  2. 动态架构:根据数据分布动态调整Wide和Deep的权重
  3. 多模态扩展:整合文本、图像等多媒体特征
  4. 可解释性增强:结合注意力机制提供推荐理由

8.4 对从业者的启示

  1. 从业务出发:根据业务需求决定记忆和泛化的侧重
  2. 迭代优化:从简单模型开始,逐步增加复杂度
  3. 关注效率:在效果和计算成本之间权衡
  4. 持续学习:跟踪最新研究,但不过早追求复杂模型

Wide&Deep模型是推荐系统发展历程中的一个重要里程碑。它展示了如何将传统机器学习与现代深度学习相结合,在记忆与泛化之间找到平衡点。这种混合架构的思想对后续推荐模型的设计产生了深远影响。