【推荐系统】从原理到落地:重读 Wide & Deep 与工程避坑指南
前言:
在推荐系统领域,Google 2016年提出的 Wide & Deep 模型就像是“程咬金的三板斧”,虽不再是最新颖的架构,但绝对是业界最抗打的 Baseline。
一、 灵魂拷问:为什么非要“左右互搏”?
Wide & Deep 的核心哲学,在于解决推荐系统两个看似矛盾的目标:记忆性(Memorization) 与 泛化性(Generalization) 。
1. 记忆性(Wide侧):守住“基本盘”
Wide 部分通常是一个线性模型(Linear Model)。它的性格像个“老古董”,非常擅长死记硬背。
- 逻辑:如果历史数据里大家都买“手机+手机壳”,那我就记住这个规则。
- 输入:高维稀疏特征,以及人工构造的交叉特征(Cross Product Transformation)。
- 作用:保证模型对高频共现的特征组合有极高的准确率,兜底效果极佳。
2. 泛化性(Deep侧):探索“新大陆”
Deep 部分是前馈神经网络(DNN)。它的性格像个“探险家”,擅长举一反三。
- 逻辑:虽然没见过“汉堡+可乐”,但因为Embedding层发现“汉堡”和“炸鸡”很像,而“炸鸡+可乐”很火,所以推测“汉堡+可乐”也是好搭配。
- 输入:稠密向量(Embeddings)和连续值。
- 作用:解决数据稀疏和冷启动问题,挖掘长尾与潜在兴趣。
结论:去掉 Wide 行不行?不行! 纯 Deep 模型容易过度拟合头部热门数据(Over-generalize),导致推荐结果千篇一律。Wide 侧就是为了给**长尾(Long-tail)**特征提供保障的。
二、 工程避坑:数值特征的“拼接惨案”
在 Deep 侧的实现中,最常见的一个工程问题是:怎么处理数值型特征(如价格、播放时长、年龄)?
“简单啊!类别特征 Embedding 出来是 (Batch, 16),数值特征是 (Batch, 1),直接拼起来变成 17 维输进去不就完了?”
千万别这么干!这里有两个大坑:
坑点 1:量纲毁灭
Embedding 经过初始化和归一化,数值通常在 或更小。而原始数值特征(比如播放量)可能是 1000、10000。
如果直接拼接,数值特征的大梯度会瞬间主导网络更新,导致 Embedding 层根本学不动,Loss 剧烈震荡。
坑点 2:代码报错(Tensor 维度对齐)
很多同学写代码时,直接 torch.cat([emb, num], dim=1) 报错,原因是维度不对。
- Embedding 是二维矩阵
[Batch_Size, 16] - DataLoader 读出来的数值通常是一维向量
[Batch_Size]
✅ 正确的工程姿势(PyTorch版):
Python
import torch
import torch.nn as nn
# 假设 Batch Size = 4
emb_feature = torch.randn(4, 16) # [4, 16]
raw_dense = torch.tensor([0.5, 0.8, 0.1, 0.3]) # [4] -> 必须先归一化!
# 1. 维度对齐 (关键!)
# 不能直接拼,必须先把“线”立起来变成“矩阵”
dense_ready = raw_dense.unsqueeze(1) # [4, 1]
# 2. 拼接
input_tensor = torch.cat([emb_feature, dense_ready], dim=1) # [4, 17]
# 3. 进阶优化 (推荐)
# 工业界更推荐把数值特征也离散化(Bucketize)成ID,
# 或者过一层 MLP 映射到和 Embedding 一样的维度再拼。
三、 幕后功臣:为什么优化器要用 FTRL?
Wide & Deep 的 Paper 里藏着一个核心细节:它使用了联合训练(Joint Training),但 Wide 侧和 Deep 侧用了不同的优化器。
- Deep 侧:使用 AdaGrad 或 Adam。为了适应神经网络的梯度特性。
- Wide 侧:必须使用 FTRL。
为什么要用 FTRL?
Wide 部分面对的是亿级别的稀疏特征(ID交叉)。我们希望模型训练完后,绝大部分不重要的权重 严格等于 0(稀疏解)。
普通的 SGD 加上 L1 正则化,算出来的 往往是 这种极小值,而不是 0。计算机依然要分配内存存它,这对在线推理服务(Serving)的内存是灾难性的。
FTRL (Follow-the-Regularized-Leader) 就像一个严格的守门员。它利用累积梯度和 L1 正则项的阈值机制,强行把那些贡献度(累积梯度)不够大的特征权重截断为 0。
一句话总结:FTRL 可以在保证精度的前提下,帮你的 Wide 模型“瘦身” 90% 以上,是处理大规模稀疏数据的神兵利器。
四、 总结与展望
Wide & Deep 虽然结构简单,但它开启了推荐系统 “记忆+泛化” 的双塔时代。
- 如果你想魔改 Wide 侧:把 LR 换成 FM,自动做二阶交叉,就变成了 DeepFM。
- 如果你想魔改 Deep 侧:引入 Attention 机制,关注用户历史行为序列,就变成了 DIN (Deep Interest Network) 。
但无论怎么变, “特征如何处理(归一化/离散化/拼接)” 和 “如何利用优化器产生稀疏解” 永远是算法工程师必须掌握的基本功。