Wide&Deep是Google在2016年提出的推荐模型架构,核心思想是将记忆能力(Wide)和泛化能力(Deep)结合。Wide部分用LR+交叉特征捕捉已知的强规则,Deep部分用MLP学习高阶特征交叉,两者联合训练取长补短。
| 维度 | Wide部分 | Deep部分 |
|---|---|---|
| 模型 | LR + 交叉特征 | 多层MLP |
| 能力 | 记忆(Memorization) | 泛化(Generalization) |
| 优势 | 捕捉强规则、可解释 | 学习高阶交叉、自动特征 |
| 劣势 | 需手工设计交叉 | 可能过度泛化 |
| 适用 | 稀疏特征、强规则 | 稠密特征、隐含模式 |
Wide&Deep开创了"记忆+泛化"的深度推荐范式,后续的DeepFM、DCN等都延续了这一思想。
ŷ = σ(w_wide^T·x_wide + w_deep^T·a_deep + b)
Wide和Deep的输出相加后通过sigmoid
y_wide = w₀ + Σwᵢxᵢ + Σwᵢⱼxᵢxⱼ
线性模型 + 手工交叉特征
a⁽ˡ⁺¹⁾ = ReLU(W⁽ˡ⁾·a⁽ˡ⁾ + b⁽ˡ⁾)
多层全连接网络
import numpy as np
np.random.seed(42)
print("="*60+"\n深度推荐模型(Wide&Deep)\n"+"="*60)
n_samples=800;n_features=15
X=np.random.randn(n_samples,n_features)
true_w=np.random.randn(n_features)
true_cross=np.random.randn(5)
y=X@true_w
for i in range(5):y+=true_cross[i]*X[:,i*3]*X[:,i*3+1]
y=(y>np.median(y)).astype(float)
print(f"样本数:{n_samples} 特征数:{n_features} 正例率:{y.mean():.2%}")
# 划分训练/测试
split=600
X_train,X_test=X[:split],X[split:]
y_train,y_test=y[:split],y[split:]
def sigmoid(x):return 1/(1+np.exp(-np.clip(x,-500,500)))
# Wide部分(LR+交叉特征)
print("\n--- Wide部分 ---")
cross_train=np.column_stack([X_train[:,i*3]*X_train[:,i*3+1]for i in range(5)])
cross_test=np.column_stack([X_test[:,i*3]*X_test[:,i*3+1]for i in range(5)])
X_wide_train=np.column_stack([X_train,cross_train])
X_wide_test=np.column_stack([X_test,cross_test])
w_wide=np.zeros(X_wide_train.shape[1]);b_wide=0
for ep in range(100):
pred=sigmoid(X_wide_train@w_wide+b_wide)
err=pred-y_train
w_wide-=0.01*(X_wide_train.T@err/split+0.01*w_wide)
b_wide-=0.01*np.mean(err)
if(ep+1)%25==0:
loss=-np.mean(y_train*np.log(pred+1e-10)+(1-y_train)*np.log(1-pred+1e-10))
print(f" Wide Epoch{ep+1}:Loss={loss:.4f}")
pred_wide=sigmoid(X_wide_test@w_wide+b_wide)
acc_wide=np.mean((pred_wide>0.5)==y_test)
auc_wide=np.mean(pred_wide[y_test==1]>pred_wide[y_test==0])
print(f"Wide ACC={acc_wide:.4f} AUC={auc_wide:.4f}")
# Deep部分(3层MLP)
print("\n--- Deep部分 ---")
def relu(x):return np.maximum(0,x)
def relu_grad(x):return(x>0).astype(float)
h1,h2=32,16
W1=np.random.randn(n_features,h1)*0.01;b1=np.zeros(h1)
W2=np.random.randn(h1,h2)*0.01;b2=np.zeros(h2)
W3=np.random.randn(h2,1)*0.01;b3=0
for ep in range(100):
z1=X_train@W1+b1;a1=relu(z1)
z2=a1@W2+b2;a2=relu(z2)
z3=a2@W3+b3;pred=sigmoid(z3.flatten())
err=pred-y_train
loss=-np.mean(y_train*np.log(pred+1e-10)+(1-y_train)*np.log(1-pred+1e-10))
# 反向传播
d3=err[:,None]/split
dW3=a2.T@d3+0.01*W3;db3=np.mean(d3)
d2=(d3@W3.T)*relu_grad(z2)
dW2=a1.T@d2+0.01*W2;db2=np.mean(d2,axis=0)
d1=(d2@W2.T)*relu_grad(z1)
dW1=X_train.T@d1+0.01*W1;db1=np.mean(d1,axis=0)
W1-=0.01*dW1;b1-=0.01*db1
W2-=0.01*dW2;b2-=0.01*db2
W3-=0.01*dW3;b3-=0.01*db3
if(ep+1)%25==0:print(f" Deep Epoch{ep+1}:Loss={loss:.4f}")
z1=X_test@W1+b1;a1=relu(z1);z2=a1@W2+b2;a2=relu(z2)
pred_deep=sigmoid((a2@W3+b3).flatten())
acc_deep=np.mean((pred_deep>0.5)==y_test)
auc_deep=np.mean(pred_deep[y_test==1]>pred_deep[y_test==0])
print(f"Deep ACC={acc_deep:.4f} AUC={auc_deep:.4f}")
# Wide&Deep联合
print("\n--- Wide&Deep联合 ---")
alpha=0.5
pred_combined=sigmoid(alpha*np.log(pred_wide+1e-10)+(1-alpha)*np.log(pred_deep+1e-10))
acc_wd=np.mean((pred_combined>0.5)==y_test)
auc_wd=np.mean(pred_combined[y_test==1]>pred_combined[y_test==0])
print(f"Wide&Deep ACC={acc_wd:.4f} AUC={auc_wd:.4f}")
# 对比
print(f"\n{'模型':<15}{'ACC':<10}{'AUC':<10}")
print("-"*35)
print(f"{'Wide(LR+cross)':<15}{acc_wide:<10.4f}{auc_wide:<10.4f}")
print(f"{'Deep(MLP)':<15}{acc_deep:<10.4f}{auc_deep:<10.4f}")
print(f"{'Wide&Deep':<15}{acc_wd:<10.4f}{auc_wd:<10.4f}")
✅ 验证通过
本课代码涵盖了从数据生成、模型训练到效果评估的完整流程。以下是关键步骤的详细解读:
代码设计原则:简洁可读、关键步骤有注释、结果可复现(固定随机种子)。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.8+ | 推荐3.10版本 |
| NumPy | 1.21+ | 核心数值计算库 |
| SciPy | 1.7+ | 统计检验(部分课程) |
本课是第8课:深度推荐模型(Wide & Deep),属于特征与模型阶段。我们系统学习了本课的核心概念、数学原理和代码实现,并通过实机运行验证了算法的正确性。
练习1:修改Deep部分层数/隐藏单元数,观察AUC变化
练习2:实现DeepFM(用FM替换Wide部分)
练习3:实现DCN的Cross Network
练习4:用不同alpha融合Wide和Deep,找最优权重
| 公司 | 场景 | 核心技术 |
|---|---|---|
| 字节跳动 | 抖音/TikTok | 多目标排序+实时特征+双塔召回 |
| 阿里巴巴 | 淘宝推荐 | DIN/DIEN序列模型+MIND多兴趣 |
| 腾讯 | 微信看一看 | DeepFM+图神经网络召回 |
| 美团 | 本地生活推荐 | 多场景多目标+时空特征 |
| Netflix | 视频推荐 | 矩阵分解+深度学习混合 |
✅ 理解Wide&Deep的记忆+泛化设计思想
✅ 掌握Wide部分和Deep部分的作用
✅ 实现简化版Wide&Deep并评估
✅ 理解深度推荐模型的演进路线