实用指南:【第五章:计算机视觉-项目实战之推荐/广告系统】1.推荐系统基础与召回算法-(6)召回算法之u2i: FM、deepFM、召回双塔原理精讲与实战
2025-11-16 16:34 tlnshuju 阅读(0) 评论(0) 收藏 举报第五章:计算机视觉-项目实战之推荐/广告系统
第一部分:推荐系统基础与召回算法
第六节:召回算法之u2i: FM、deepFM、召回双塔原理精讲与实战
一、u2i召回简介:目标是“理解用户”
如果说上一节 i2i(item-to-item)召回的思想是:
“看你喜欢的内容,预测你还会喜欢什么相似内容”
那么 u2i(user-to-item)召回则换了角度:
“从用户特征出发,直接召回适合他的物品 embedding”
区别是:
| 类别 | 输入 | 本质建模对象 | 适用场景 |
|---|---|---|---|
| i2i | item → item | 物品相似度 | 适合强序列场景 |
| u2i | user → item | 用户兴趣向量 | 个性化、用户中心推荐 |
u2i 的核心问题 = 如何构建 user embedding,并与 item embedding 匹配
因此,本节我们学习的三个模型可视为渐进关系:
| 模型 | 目标 |
|---|---|
| FM | 建立特征交互(user–item 特征点击概率) |
| DeepFM | 用深度学习增强特征建模能力 |
| Two-Tower(双塔召回) | 将 user 和 item 映射到同一向量空间,用向量相似度召回 |
最后落地到行业主流召回结构:
u_embedding → ANN 向量检索 → 召回 item topK
二、FM 原理讲解:特征交叉的精髓
FM(Factorization Machines)是点击率模型中最经典的特征交叉模型,公式非常关键:
解释:
| 项目 | 含义 |
|---|---|
| 偏置 | |
| 所有特征的一阶贡献 | |
| 所有特征对的二阶组合(FM的核心) |
在推荐系统中,FM特别适合表达:
| 特征交互示例 | 意义 |
|---|---|
| (用户性别, 类目) | 男性更喜欢数码 |
| (城市, 价格区间) | 一线城市偏高价位 |
优点:可解释性强、对稀疏特征友好
缺点:表达能力有限,不够深
三、DeepFM:FM + DNN 的强强联合
为提升建模能力,DeepFM提出结构:
→ FM(显式特征交叉)
Input →
→ DNN(隐式高阶交叉)
输出 CTR / 点击概率:
优点: 可拟合复杂兴趣
行业事实:现在主流 CTR/召回模型仍由 DeepFM 演化而来
但 DeepFM仍不是召回最适合模型 —— 因为召回的核心是 向量相似,而不是概率排序
这就引出了工业界真正最常用的召回模型:
四、Two-Tower(召回双塔模型):工业主流 u2i之王
Two-Tower结构示意:
┌───────────────┐
│ User Tower │ → user_embedding
user → │ DNN / MLP │
└───────────────┘
│ dot/cosine
┌───────────────┐
item → │ Item Tower │ → item_embedding
│ DNN / MLP │
└───────────────┘
训练目标:
即:
拉近用户与正样本的向量
推开用户与负样本向量
推理阶段非常高效:
召回 = ANN( user_embedding ) → topK item
优点(工程面试要点)
| 优点 | 解释 |
|---|---|
| 召回高效 | 向量检索 O(logN),适配 Milvus / Faiss |
| 冷启动友好 | 靠特征而非行为 |
| 可扩展 | 可插入 Transformer、注意力、多兴趣网络 |
五、双塔召回完整实战代码(可直接运行)
import torch
import torch.nn as nn
import torch.nn.functional as F
class TwoTowerModel(nn.Module):
def __init__(self, user_dim, item_dim, embed_dim):
super().__init__()
self.user_tower = nn.Sequential(
nn.Linear(user_dim, 128),
nn.ReLU(),
nn.Linear(128, embed_dim)
)
self.item_tower = nn.Sequential(
nn.Linear(item_dim, 128),
nn.ReLU(),
nn.Linear(128, embed_dim)
)
def forward(self, user, item):
u = F.normalize(self.user_tower(user))
i = F.normalize(self.item_tower(item))
score = torch.sum(u * i, dim=-1)
return score
训练损失采用 对比损失 / 负样本采样 NCE:
loss = - torch.log_softmax(pos_score - neg_score, dim=-1).mean()
六、本节总结
| 模型 | 在召回的作用 |
|---|---|
| FM | 做特征交互 |
| DeepFM | 提升模型表达能力 |
| Two-Tower | 真正用于 ANN 向量召回(工业主流) |
一句话总结:
i2i学相似,u2i学兴趣 — i2i补召回覆盖,u2i做主召回路径,双塔是工业标准
浙公网安备 33010602011771号