双塔模型
双塔模型(Two-Tower Model)是一种广泛应用于推荐系统、信息检索和自然语言处理等领域的深度学习架构,其核心思想是通过两个独立的神经网络(用户塔和物品塔)分别学习用户和物品的嵌入表示(Embedding),再通过相似度计算实现高效匹配。以下从原理、结构、应用到优化进行全面解析:
🧠 一、核心思想与背景
- 设计动机
- 高效匹配:传统推荐需实时计算用户与所有物品的交互,计算成本高;双塔模型通过预计算物品向量(离线)和实时计算用户向量(在线),结合近似最近邻(ANN)检索,实现毫秒级响应。
- 特征解耦:用户特征(如历史行为、画像)与物品特征(如类别、标签)独立处理,支持模块化扩展和并行计算。
- 语义对齐:将用户和物品映射到同一语义空间,通过向量相似度(如余弦、点积)量化匹配度。
- 发展脉络 源于微软2013年提出的DSSM(Deep Structured Semantic Model),用于搜索场景的Query-Document语义匹配,后扩展至推荐系统召回层。
🏗️ 二、模型架构详解
1. 基础结构
组件 | 用户塔 | 物品塔 |
---|---|---|
输入特征 | 用户ID、历史行为、画像属性、上下文等 | 物品ID、类别、标签、内容特征等 |
特征处理 | Embedding层 + 多层全连接(MLP) | Embedding层 + 多层全连接(MLP) |
输出 | 用户嵌入向量(如128维) | 物品嵌入向量(维度与用户向量一致) |
相似度计算 | 点积(内积)或余弦相似度 |
示例公式:
- 用户向量:
u = f_{\theta}(x_{\text{user}})
- 物品向量:
v = g_{\phi}(y_{\text{item}})
- 匹配分数:
s = \langle u, v \rangle
(点积)或s = \frac{\langle u, v \rangle}{\|u\| \|v\|}
(余弦相似度)。
2. 训练过程
损失函数:
- 交叉熵损失:将匹配问题转化为二分类任务(正样本 vs 负样本)。
- 对比损失(如InfoNCE):拉近正样本对距离,推远负样本对距离。
负采样策略:
策略 方法 优缺点 随机采样 从全局物品中随机选择 简单,但正负样本差异过大易降低难度 曝光未点击 使用曝光但未点击的样本 贴近业务,但引入位置偏差 Hard负例挖掘 混合随机负例+召回失败的困难样本 提升模型区分力,需额外计算
🌐 三、应用场景
- 推荐系统召回层
- 从亿级物品库中筛选千级候选集,如YouTube DNN、阿里EGES。
- 信息检索
- 搜索Query与文档的语义匹配(如DSSM)。
- 自然语言处理
- 文本相似度计算(如句子BERT)、问答匹配。
- 跨模态检索
- 图文匹配(如CLIP)、视频-文本检索。
⚙️ 四、工业实践关键点
- 线上部署流程
- 离线阶段:预计算所有物品向量,存入ANN库(如Faiss、HNSW)。
- 在线阶段:实时计算用户向量 → ANN检索Top-K物品 → 送入精排模型。
- 效果优化技巧
- 特征增强:
- 用户侧:加入实时行为序列(如Transformer编码)。
- 物品侧:融合多模态特征(如图像Embedding)。
- 结构改进:
- SENet双塔:引入注意力机制动态加权特征重要性。
- 多兴趣召回:如MIND模型生成多个用户兴趣向量。
- 训练策略:
- 知识蒸馏:用复杂教师模型指导双塔学习交叉特征。
- 温度系数调整:软化Softmax分布提升困难样本学习。
- 特征增强:
⚖️ 五、优缺点分析
优势 | 局限性 |
---|---|
✅ 高效性:物品向量离线预计算,线上仅需用户向量计算 + ANN检索 | ❌ 特征交互不足:用户-物品细粒度特征交叉缺失(如组合特征) |
✅ 易扩展:用户/物品塔独立更新,支持冷启动(如新物品离线编码) | ❌ 冷启动问题:新用户/物品缺乏行为数据,向量质量低 |
✅ 低延迟:相似度计算简单,适合大规模实时场景 | ❌ 负采样偏差:随机采样易打压热门物品,Hard采样依赖策略 |
💻 六、代码实现示例(PyTorch简化版)
import torch
import torch.nn as nn
class TwoTowerModel(nn.Module):
def __init__(self, user_dim, item_dim, hidden_dim, output_dim):
super().__init__()
# 用户塔:MLP网络
self.user_tower = nn.Sequential(
nn.Linear(user_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, output_dim)
)
# 物品塔:MLP网络
self.item_tower = nn.Sequential(
nn.Linear(item_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, output_dim)
)
def forward(self, user_feat, item_feat):
user_emb = self.user_tower(user_feat) # 用户向量
item_emb = self.item_tower(item_feat) # 物品向量
similarity = torch.cosine_similarity(user_emb, item_emb, dim=1) # 余弦相似度
return similarity
# 训练示例
model = TwoTowerModel(user_dim=10, item_dim=20, hidden_dim=64, output_dim=32)
loss_fn = nn.BCEWithLogitsLoss() # 二分类损失
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
🔮 七、总结与展望
双塔模型凭借效率与架构简洁性,成为召回层的工业标准方案。未来优化方向包括:
- 特征交叉增强:通过生成式交互(如物品塔生成用户特征)引入细粒度交叉。
- 多目标融合:联合优化点击率、时长、多样性等目标。
- 动态索引更新:解决物品向量时效性问题(如实时增量训练)。
双塔模型是效果与效率的平衡典范,虽在特征交互上存在局限,但通过结构创新(如SENet、多兴趣塔)和训练策略(蒸馏、Hard采样),仍持续推动推荐系统的演进。
ANN
在双塔模型(Dual-Tower Model)中,ANN(Approximate Nearest Neighbor,近似最近邻搜索) 是一种核心的加速检索技术,用于高效匹配用户向量与海量物品向量。其核心目标是在牺牲少量精度的情况下,大幅提升向量相似度计算的效率,解决大规模推荐场景的实时性挑战。以下是详细解析:
🔍 一、ANN在双塔模型中的作用
- 解决计算瓶颈
双塔模型将用户和物品映射到同一向量空间(如128维向量),线上需实时计算用户向量与亿级物品向量的相似度。若暴力计算(Brute-force)所有内积,时间复杂度为
O(Nd)
(N
为物品数,d
为向量维度),无法满足毫秒级响应。 ANN替代方案:通过索引压缩和近似算法,将复杂度降至O(\log N)
级别。 - 部署流程整合
- 离线阶段:预计算所有物品向量,构建ANN索引(如Faiss、HNSW库)。
- 在线阶段:实时生成用户向量 → ANN检索Top-K相似物品 → 返回候选集给排序层。
⚙️ 二、ANN的核心技术原理
ANN通过以下技术实现效率与精度的平衡:
技术方向 | 代表方法 | 原理 | 适用场景 |
---|---|---|---|
向量索引压缩 | PQ(Product Quantization) | 将高维向量切分为子向量,分别聚类量化,用码本近似表示原始向量,减少内存占用。 | 十亿级向量,内存受限场景 |
空间划分 | IVF(Inverted File) | 对物品向量聚类(如K-means),仅搜索查询向量所属簇及邻近簇的样本,减少计算量。 | 中等规模数据(千万级) |
图结构检索 | HNSW(Hierarchical Navigable Small World) | 构建分层图结构,每层用跳表连接近邻节点,实现对数级搜索复杂度。 | 高精度要求,百毫秒内响应 |
硬件加速 | GPU/SIMD指令优化 | 利用并行计算(如Faiss的GPU版)加速向量运算。 | 高并发在线服务 |
🛠️ 三、工业实践中的关键优化
- 精度与速度权衡
- 调整参数:例如HNSW中增加“efSearch”(搜索邻节点数)可提升召回率,但增加延迟。
- 多阶段检索:先IVF粗筛→ HNSW精排,兼顾效率和准确性。
- 冷启动与动态更新
- 增量索引:新物品加入时,局部更新ANN索引(如Faiss的
add_with_ids
)。 - 量化误差补偿:对长尾物品采用更高量化位数(如PQ的8bit→12bit)。
- 增量索引:新物品加入时,局部更新ANN索引(如Faiss的
- 偏差修正
双塔模型因负采样偏差易打压热门物品,ANN需结合权重校正:
s_{\text{corrected}} = \langle u, v \rangle - \beta \cdot \log(p_{\text{item}})
其中p_{\text{item}}
为物品曝光概率,\beta
为调节系数。
⚖️ 四、ANN的局限性及应对
问题 | 原因 | 解决方案 |
---|---|---|
精度损失 | 近似算法忽略部分候选向量 | 提升召回量(Top-K → Top-2K),后接精排 |
索引更新延迟 | 全量索引重建耗时(小时级) | 增量更新 + 分布式索引(如Elasticsearch) |
高维向量性能下降 | “维度灾难”导致距离区分度降低 | 降维(PCA)或特征选择 |
💎 五、总结
ANN是双塔模型能落地工业界的核心引擎,通过算法与工程的协同优化(如量化、图索引、硬件加速),实现亿级候选集的毫秒级召回。尽管存在精度损失和更新延迟等问题,但其在效率与效果的平衡性上尚无成熟替代方案。未来演进方向包括:
- 混合索引:结合树结构(如TDM)与向量检索,增强特征交叉能力;
- 学习型索引:用神经网络预测向量分布,优化检索路径。
双塔+ANN的本质是“空间换时间”,其设计哲学体现了工业系统对规模与实时的极致追求。
ANN & Elasticsearch
双塔模型的ANN(近似最近邻)检索是其实现高效推荐的核心环节,而Elasticsearch在特定场景下可以作为实现工具之一,但需结合其能力边界进行选型。以下是详细解析:
🛠️ 一、双塔模型ANN检索的通用实现方式
1. 专用ANN库(主流方案)
双塔模型通常依赖高效ANN库处理海量向量检索,主要工具包括:
- FAISS(Meta开源):
- 核心优化:通过向量压缩(如PQ乘积量化)和空间划分(如IVF倒排索引)减少计算量,支持十亿级向量毫秒级检索。
- 硬件加速:利用GPU并行计算和SIMD指令优化,提升吞吐量(如每秒处理百万级查询)。
- HNSW(层级导航小世界图):
- 优势:以图结构实现高召回率与低延迟平衡,适合百维以上高维向量。
- 应用场景:微软Bing、京东推荐系统均采用HNSWLib库。
2. 分布式ANN系统
- Milvus:专为向量设计的分布式系统,支持自动分片、水平扩展,适合超大规模候选集(如10亿+物品)。
- Vespa:整合排序与检索,支持实时更新,适用于动态候选池场景(如新闻推荐)。
⚙️ 二、Elasticsearch在双塔模型中的应用可行性
1. Elasticsearch的向量检索能力
- 支持版本:7.x+ 引入
dense_vector
字段类型,8.x+ 优化HNSW索引。 - 核心功能:
- 支持余弦相似度、点积、欧氏距离等计算。
- 通过
knn_search
接口实现近似检索,结合倒排索引实现混合查询(如文本+向量联合检索)。
2. 适用场景与局限
维度 | 适合场景 | 局限性 |
---|---|---|
数据规模 | 千万级向量(单集群) | 十亿级需分片,扩展成本高 |
实时性 | 近实时更新(1s级延迟) | 低延迟场景(<10ms)不如FAISS |
功能整合 | 需同时处理文本/结构化过滤(如商品分类+向量检索) | 纯向量检索效率低于专用ANN库 |
精度控制 | HNSW参数可调(ef_construction控制召回率) | 量化压缩支持弱,高精度需更高资源 |
典型用例:
- 电商混合检索:用户输入文本“透气运动鞋”,ES先通过倒排索引筛选运动鞋类目,再用向量检索匹配用户Embedding。
- 内容平台:结合用户画像(结构化数据)和兴趣向量综合排序。
🔧 三、工业级实践中的技术选型建议
1. 选型决策树
graph TD
A[候选集规模] -->|小于1亿| B(是否需要混合查询?)
A -->|大于1亿| C[FAISS/Milvus]
B -->|是| D[Elasticsearch]
B -->|否| E[FAISS/HNSWLib]
D --> F[结合文本过滤]
E --> G[纯向量检索]
2. 混合架构(平衡性能与功能)
- 方案设计:
- 召回层:用FAISS处理纯向量检索,返回Top 1000候选。
- 粗排层:将候选集输入Elasticsearch,结合业务规则(如地域、价格)和向量分二次排序。
- 案例: 美团推荐系统采用FAISS召回 + ES粗排,吞吐量提升3倍的同时支持复杂过滤。
💡 四、总结:Elasticsearch的定位与优化方向
- 定位:适合中小规模候选集或需多模态检索的场景,尤其在已有ES生态的系统中可降低运维复杂度。
- 优化方向:
- 升级至8.x+版本,启用HNSW索引并调优
ef_search
参数。 - 对高频更新字段(如动态用户向量)采用分片预热策略减少延迟。
- 升级至8.x+版本,启用HNSW索引并调优
- 替代方案: 超大规模场景首选FAISS(性能)或Milvus(扩展性),需牺牲部分文本检索灵活性。
在技术选型时,需在效果(召回率/延迟)、工程成本(维护/扩展) 和业务需求(是否需文本混合查询) 三者间权衡。若强依赖于多条件过滤,ES是合理选择;若追求极致性能,专用ANN库仍是首选。
FAISS
以下是对FAISS(Facebook AI Similarity Search)的详细介绍,涵盖其核心原理、技术特性、应用场景及使用方法,内容综合自多篇权威技术文档:
🔍 一、FAISS 概述
FAISS 是由 Facebook AI Research 开发的开源库,专为大规模向量相似性搜索与聚类设计。其核心目标是解决高维向量数据的快速检索问题,支持十亿级向量的毫秒级查询,广泛应用于推荐系统、图像检索、自然语言处理等领域。
⚙️ 二、核心技术原理
1. 索引结构
FAISS 通过高效索引结构加速搜索,主要分为两类:
- 基础索引:
IndexFlatL2
/IndexFlatIP
:基于欧氏距离(L2)或内积(IP)的暴力搜索,精度高但计算成本高。
- 优化索引:
- IVF(Inverted File):
- 先对向量聚类(如 K-means),将数据划分到
nlist
个桶中。 - 搜索时仅扫描最近邻的
nprobe
个桶,显著减少计算量(如从全国找人→按省份查找)。
- 先对向量聚类(如 K-means),将数据划分到
- PQ(Product Quantization):
- 将高维向量分割为
m
个子空间,对每个子空间独立量化(如 128 维向量切分为 4 段,每段聚类为 256 类)。 - 向量压缩至
m
字节存储(压缩率超 2000 倍),通过查表法快速计算近似距离。
- 将高维向量分割为
- HNSW(Hierarchical Navigable Small World):
- 基于图结构的层级索引,平衡检索速度与召回率。
- IVF(Inverted File):
2. 距离计算
支持多种相似度度量:
- 欧氏距离(L2):
d = ||x - y||²
- 内积(IP):
d = x·y
- 余弦相似度:通过归一化转化为内积计算。
3. 性能优化
- GPU 加速:支持多 GPU 并行计算,提升大规模数据吞吐量。
- 内存管理:优化二进制数据存储,减少 JVM GC 开销。
📊 三、索引类型对比
索引类型 | 适用场景 | 优势 | 局限 |
---|---|---|---|
IndexFlatL2 | 小规模数据(<1M) | 100% 召回率 | 计算复杂度 O(N·D) |
IndexIVFFlat | 中等规模数据(1M-100M) | 速度提升 10-100 倍 | 精度依赖聚类质量 |
IndexIVFPQ | 超大规模数据(>100M) | 内存占用低,支持十亿级向量 | 量化引入误差 |
HNSW | 高召回率需求场景 | 无需训练,动态插入数据 | 内存占用较高 |
🌐 四、应用场景
- 推荐系统:
- 基于用户/物品向量(如双塔模型输出),实时检索相似商品。
- 图像与视频检索:
- 提取 ResNet 特征向量,搜索相似图片(如电商以图搜图)。
- 自然语言处理:
- 文本语义匹配:通过句向量(如 BERT Embedding)查找相似文档。
- 生物信息学:
- DNA 序列特征向量匹配,加速基因相似性分析。
🛠️ 五、使用流程与代码示例
1. 安装
# CPU 版本
pip install faiss-cpu
# GPU 版本
pip install faiss-gpu
2. 核心步骤
import faiss
import numpy as np
# 生成示例数据(10k个128维向量)
dim = 128
data = np.random.random((10000, dim)).astype('float32')
# 创建 IVF + PQ 索引
nlist = 100 # 聚类中心数
quantizer = faiss.IndexFlatL2(dim)
index = faiss.IndexIVFPQ(quantizer, dim, nlist, 4, 8) # 4段量化,每段8bit
# 训练并添加数据
index.train(data)
index.add(data)
# 查询(1个128维向量)
query = np.random.random((1, dim)).astype('float32')
k = 5 # 返回Top5
distances, indices = index.search(query, k)
print("相似向量索引:", indices)
print("距离:", distances)
⚠️ 六、性能调优建议
- 参数权衡:
nlist
(聚类数)↑ → 搜索速度↑,但训练时间↑。nprobe
(扫描桶数)↑ → 召回率↑,但延迟↑。
- 硬件利用:
- 十亿级数据选择 GPU 版本 + IVF_PQ 索引。
- 混合索引:
- 结合 HNSW + IVF(如
IndexHNSWFlat
),平衡速度与精度。
- 结合 HNSW + IVF(如
💡 七、与LangChain集成案例
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# 创建FAISS向量库
documents = ["FAISS是高效向量检索库", "推荐系统依赖相似性搜索"]
vector_db = FAISS.from_texts(documents, embeddings)
# 相似文本检索
query = "如何加速向量搜索?"
results = vector_db.similarity_search(query, k=2)
print(results[0].page_content) # 输出最相关文本
✅ 八、总结
FAISS 的核心价值在于:
- 高效性:通过 IVF/PQ/HNSW 等索引,实现十亿级向量的毫秒级检索。
- 灵活性:支持多类索引、距离度量及 GPU 加速,适配不同场景。
- 易集成:提供 Python/C++ API,无缝对接深度学习框架(如 PyTorch)和 AI 应用(如 LangChain)。
未来方向包括云原生部署优化(Kubernetes 支持)和跨模态检索增强(图索引融合),持续推动大规模相似性搜索的技术边界。
模型训练
双塔模型的训练过程是构建高效召回系统的核心,其关键在于通过独立编码的用户塔和物品塔生成语义向量,并优化它们的相似度计算。以下是双塔模型训练的完整流程与技术细节,结合工业级实践策略:
🔧 一、训练样本构建:正负样本设计与采样策略
1. 样本结构
- 三元组格式:每个训练样本包含
(用户特征, 正样本物品, 负样本物品)
- 正样本:用户明确反馈行为(如点击、购买)的物品
- 负样本:需区分类型以解决样本偏差问题:
- 简单负样本:全局随机采样(全体物品均匀抽样),模拟未被曝光的候选集
- 困难负样本:被召回但被粗排/精排淘汰的物品(接近用户兴趣但未转化)
- Batch内负样本:同一训练批次中其他用户的正样本物品(高效且增强对比性)
2. 采样优化技术
- 热门打压:对高频物品降采样(概率公式:
p_{\text{降采样}} \propto \text{点击次数}^{-0.75}
),避免正样本被头部物品主导 - 冷门过采样:对长尾物品复制样本,平衡数据分布
- 混合负采样:组合全局随机样本 + Batch内样本,兼顾分布一致性和难度
⚙️ 二、模型训练方法:三种范式对比
训练方式 | 输入结构 | 损失函数 | 适用场景 |
---|---|---|---|
Pointwise | 单用户+单物品 | 二元交叉熵:鼓励正样本相似度→1,负样本→-1 | 简单二分类任务 |
Pairwise | 用户+正物品+负物品 | 铰链损失:\max(0, \text{cos}(a,b^-) - \text{cos}(a,b^+) + \text{margin}) | 强调正负样本区分度 |
Listwise | 用户+1正样本+N负样本 | Softmax交叉熵:最大化正样本概率 s^+ = \frac{e^{\text{cos}(a,b^+)}}{\sum e^{\text{cos}(a,b_i)}} | 多分类任务,工业主流方案 |
Listwise训练详解(以N=4为例):
- 用户向量
a
与正样本b^+
计算余弦相似度\text{cos}(a,b^+)
- 与4个负样本计算
\text{cos}(a,b_1^-)
到\text{cos}(a,b_4^-)
- Softmax输出5个概率值
[s^+, s_1^-, ..., s_4^-]
- 损失函数:
L = -\log s^+
,通过梯度下降同时拉高s^+
并压低s_i^-
✅ 工业选择:Listwise因更接近召回场景(1正 vs 海量负样本)成为主流,Google/Youtube等均采用此方案
🎯 三、损失函数与优化目标
- 核心目标:
\max \text{cos}(a, b^+) \quad \text{and} \quad \min \text{cos}(a, b^-)
即拉近用户与正样本距离,推远用户与负样本距离 - 进阶优化:
- 对比损失(Contrastive Loss):直接最大化
\text{cos}(a,b^+) - \text{cos}(a,b^-)
的差值 - 温度系数调节:Softmax中加入温度参数
\tau
控制分布尖锐度:s^+ = \frac{e^{\text{cos}(a,b^+)/\tau}}{\sum e^{\text{cos}(a,b_i)/\tau}}
- 对比损失(Contrastive Loss):直接最大化
🛠️ 四、工程实现关键技术
1. 特征编码设计
- 用户塔输入:用户ID、历史行为序列、画像标签(如性别、地域)
- 物品塔输入:物品ID、类目、文本描述(通过BERT提取)
- 动态特征注入:用户实时点击序列通过GRU编码,增强短期兴趣捕捉
2. 并行化与加速
- 负样本共享:Batch内所有用户共享同一组负样本,减少计算量
- 混合精度训练:FP16加速反向传播,吞吐提升2倍
3. 模型更新策略
更新类型 | 频率 | 更新内容 | 优势 |
---|---|---|---|
全量更新 | 天级(T+1) | 用户塔/物品塔全部参数 | 数据分布更全局无偏 |
增量更新 | 小时级 | 仅用户ID Embedding参数 | 实时捕捉兴趣漂移 |
⚠️ 关键结论:纯增量更新会导致分布偏差(如午间数据偏向办公场景),必须与全量更新协同
🚀 五、前沿优化方向
- 多模态融合
- 物品塔集成图像特征(ResNet编码)与文本特征,提升跨模态检索能力
- 蒸馏学习
- 用精排模型(Teacher)输出软标签指导双塔训练,增强Embedding信息密度
- 图神经网络结合
- 用户-物品交互图注入双塔,通过GNN生成高阶关系感知的向量
💎 总结:训练流程的工业级实践
- 数据准备 → 2. 混合负采样 → 3. Listwise多分类训练 → 4. 全量/增量协同更新 效果天花板:负样本设计 > 模型结构优化(如DNN层数) 典型指标:Recall@K 提升15%~20%,响应时间下降30%(参考Netflix实践)
工业系统中(如Google Play),该流程支持十亿级物品召回,未来演进将聚焦端到端训练-检索联合优化及无偏采样理论。
冷启动
在推荐系统完全缺乏用户行为数据和物品交互记录的情况下(即“系统冷启动”),需通过外部信息注入、人工规则设计及主动交互策略来破冰。以下是针对不同冷启动类型的解决方案分类及具体实施方法:
🧊 一、系统冷启动(零数据)
当整个系统无任何历史数据时,核心策略是构建基础推荐逻辑:
- 人工规则与热门推荐
- 全局热门榜:推荐全平台最热门内容(如“24小时热播榜”“新书畅销榜”)。
- 场景化榜单:按时间(早间新闻)、地点(本地生活服务)、事件(节日专题)等维度细分热门内容。
- 示例:电商平台默认推荐纸巾、手机壳等高复购日用品;视频平台首页推送院线新片。
- 专家知识注入
- 人工标注:由领域专家或编辑团队标注物品的关键属性(如电影类型、商品类目),构建物品知识图谱雏形。
- 规则库设计:例如“女性用户首次登录→美妆护肤类目优先”“学生用户→学习工具推荐”。
- 内容特征提取
- 文本处理:用TF-IDF或BERT提取物品描述的关键词,构建内容向量(如新闻标题→政治/娱乐分类)。
- 多模态分析:通过CV模型提取图像/视频特征(如服装风格、场景类型),用于相似物品聚类。
👤 二、用户冷启动(新用户无行为)
针对新用户,需快速构建兴趣画像:
- 注册信息利用
- 人口统计学推荐:根据性别、年龄、地域推荐群体偏好内容(如20岁男性→电竞设备;一线城市女性→轻奢品牌)。
- 第三方数据整合:通过微信/微博登录获取社交画像(如豆瓣书影音数据→推荐类似文艺内容)。
- 主动兴趣采集
- 启动页标签选择:让用户勾选兴趣标签(如“科技”“旅行”“美食”),直接生成初始推荐池。
- 物品反馈机制:展示10-20个高区分度物品(如争议性电影、小众音乐),根据用户评分调整推荐方向。
- 示例:今日头条首次启动时让用户选择3个兴趣领域;Pinterest的“兴趣板”创建引导。
- 设备与环境信号
- 安装应用列表:读取手机应用推断兴趣(安装健身APP→推荐运动装备)。
- LBS场景适配:根据GPS定位推荐本地服务(如上海用户→迪士尼攻略)。
📦 三、物品冷启动(新物品无曝光)
对新物品,关键是找到潜在兴趣用户:
- 内容相似性匹配
- 属性关联:利用物品元数据(作者、品牌、标签)匹配相似老物品,推荐给喜欢老物品的用户。 例:新上架科幻小说→推荐给“《》读者”。
- 嵌入向量化:用预训练模型(如ResNet、BERT)生成物品特征向量,在向量空间检索相似物品受众。
- 探索式曝光策略
- Bandit算法:用ε-greedy或Thompson Sampling动态分配流量,平衡新物品探索与效果优化。 例:新歌上线→随机曝光给5%用户,根据点击率调整后续推荐量。
- 社交裂变触发:结合邀请机制(如“分享解锁专属推荐”),利用用户社交链扩散新物品。
⚙️ 四、混合策略与工程优化
- 分层推荐架构
- 冷启动专用通道:独立处理新用户/物品请求,避免与成熟推荐混用同一模型。
- 流量分配机制:新用户80%流量走冷启动策略,20%走协同过滤,随行为数据增长动态调整比例。
- 快速数据闭环
- 实时行为埋点:点击、停留时长等行为实时录入,24小时内迭代初始推荐。
- 小样本学习:用Meta-Learning或迁移学习,基于少量行为优化冷启动模型(如MAML算法)。
💎 关键设计原则
策略 | 适用场景 | 优势 | 局限性 |
---|---|---|---|
人工规则+热门 | 系统冷启动 | 零数据可用、实现简单 | 无个性化、长尾覆盖差 |
内容特征匹配 | 物品冷启动 | 不依赖行为数据、可解释性强 | 依赖物品元数据质量 |
主动兴趣采集 | 用户冷启动 | 用户参与度高、画像精准 | 依赖用户配合意愿 |
Bandit算法 | 用户/物品冷启动 | 动态平衡探索与利用、自适应优化 | 初期效果波动大 |
冷启动阶段核心目标是快速积累种子数据,通常1-2周内需过渡到协同过滤或深度学习模型。工业级实践中,达观智能推荐系统通过“规则兜底+实时反馈优化”组合策略,实现新用户首周留存率提升40%。
Embedding 输入
双塔模型通过用户塔和物品塔的独立特征处理实现高效推荐,其输入特征设计直接影响模型的表达能力与效果。以下是用户塔和物品塔输入特征的详细分类及工业实践要点:
🧑 一、用户塔的输入特征
用户塔的核心任务是动态捕捉用户兴趣,输入特征分为三类:
1. 静态属性特征
- 人口统计学信息:性别、年龄、地域、职业等。
- 注册信息:会员等级、注册渠道、设备类型(iOS/Android)。
- 长期画像标签:通过历史行为聚类生成的标签(如“科技爱好者”“母婴人群”)。
2. 动态行为序列
- 显式反馈:点击、购买、收藏、评分等行为对应的物品ID序列。
- 隐式反馈:停留时长、页面滚动深度、搜索关键词。
- 时间衰减加权:近期行为赋予更高权重(如指数衰减:
w = e^{-\lambda t}
)。
3. 上下文特征
- 实时环境信号:当前时间(工作日/周末)、GPS位置、网络环境。
- 场景状态:是否在促销活动页、是否处于搜索流程中。
✅ 工业实践优化:
- 行为序列通过Transformer或GRU编码为定长向量;
- 稀疏特征(如用户ID)需嵌入层(Embedding) 映射为稠密向量。
📦 二、物品塔的输入特征
物品塔的目标是精准表征物品属性与价值,输入特征包括:
1. 基础属性特征
- 类别与标签:商品类目(如“电子产品-手机”)、人工标注标签(如“复古风”“有机食品”)。
- 物理属性:价格、品牌、颜色、尺寸、库存状态。
- 多模态内容特征:
- 文本:标题、描述 → 通过BERT提取语义向量;
- 图像/视频:封面图 → 通过ResNet提取视觉特征。
2. 动态统计特征
- 热度指标:点击率(CTR)、转化率(CVR)、近期销量。
- 上下文关联:季节相关性(如羽绒服在冬季权重提升)、地域偏好(如火锅底料在川渝地区更热门)。
3. 关系图谱特征
- 协同过滤信号:相似物品的Embedding均值(如“喜欢物品A的用户也喜欢B”)。
- 知识图谱关联:作者、品牌、供应链上下游信息。
✅ 工业实践优化:
- 长文本特征需截断或池化(如平均池化)压缩维度;
- 动态特征需小时级更新(如Flink实时计算CTR)。
⚙️ 三、特征处理与工程技巧
1. 特征编码方式
特征类型 | 编码方法 | 示例 |
---|---|---|
高维离散特征 | Embedding层降维 | 用户ID → 32维向量 |
数值特征 | 分桶(Bucketization) | 年龄分段:0-18, 19-30, 31-45 |
多值特征 | 加权平均或Attention聚合 | 用户历史行为序列 → 128维向量 |
2. 冷启动场景的输入替代
- 新用户:用设备ID、IP地域、安装应用列表替代缺失行为。
- 新物品:用类目均值向量、标题BERT向量替代统计特征。
⚖️ 四、用户塔与物品塔输入差异对比
维度 | 用户塔 | 物品塔 |
---|---|---|
核心目标 | 捕捉动态兴趣 | 表征静态属性 |
特征实时性 | 秒级更新(行为序列) | 天级更新(统计特征) |
冷启动依赖 | 设备/IP/人口统计替代 | 类目/文本/图像特征替代 |
特征稀疏性 | 高(行为数据稀疏) | 低(属性完备) |
💎 总结:设计原则与前沿方向
- 核心原则:
- 用户塔侧重时序行为,物品塔侧重多模态内容;
- 离线特征与实时特征需分层注入(如用户塔融合近1小时行为)。
- 工业瓶颈:
- 用户行为序列过长 → 通过Causal Attention压缩关键行为;
- 多模态特征对齐 → 使用跨模态对比学习(如CLIP)。
- 演进方向:
- 图神经网络(GNN) 注入用户-物品交互关系;
- 端到端更新:联合训练召回与排序模型,共享特征表达。
Embedding 计算
在双塔模型中,物品向量离线计算、用户向量在线计算的架构设计是为了平衡计算效率、实时性和系统资源之间的矛盾。其背后的工业逻辑可以通过以下关键点深入解析:
⚙️ 一、根本原因:效率与实时性的博弈
1. 物品侧的特性与计算逻辑
- 物品数据稳定: 物品属性(如标题、类别、标签)更新频率低(例如商品详情日均更新率<1%),向量无需频繁重算。
- 离线预计算的可行性:
- 物品库总量大(亿级),但单次预计算可复用给所有用户,边际成本趋近于0。
- 预计算结果存入向量数据库(如Faiss),离线构建索引耗时可控(小时级)。
2. 用户侧的特性与计算逻辑
- 用户行为实时变化: 用户的实时点击、搜索、加购等行为对推荐结果影响巨大(如电商场景下,用户点击某商品后需立刻推荐相关商品)。
- 在线计算的必要性: 若用户向量离线计算,则行为数据延迟导致推荐结果滞后(如离线T+1更新时,用户今天的行为明天才生效)。
📊 二、系统资源的优化分配
计算类型 | 计算频率 | 资源消耗 | 处理位置 | 数据源 |
---|---|---|---|---|
物品向量 | 低(每日1-2次) | 高(亿级物品,CPU密集型) | 离线集群 | 物品特征(ID/类目/标签等) |
用户向量 | 极高(毫秒级请求) | 中(万级QPS,需低延迟) | 在线服务器 | 画像特征 + 实时行为序列 |
- 案例对比:
- 离线计算用户向量:10亿用户 × 128维向量 × 32bit = 4.8TB存储,且无法支持实时行为。
- 在线计算用户向量:单次计算仅需10ms(轻量MLP),消耗少量CPU。
⚡ 三、在线服务性能保障
用户向量计算的关键优化
- 特征轻量化:
- 仅输入用户ID核心特征(历史行为、画像标签),避免非必要特征(如长文本描述)。
- 特征预聚合:离线生成用户行为序列Embedding(如通过Transformer编码),在线仅需简单拼接。
- 模型轻量化:
- 用户塔深度压缩:通常仅3-4层MLP(如
输入层512维→128维
),拒绝复杂结构。 - Partial Computation:模型拆分行为序列模块离线计算(如RNN编码),在线只做融合层推理。
- 用户塔深度压缩:通常仅3-4层MLP(如
- 缓存机制:
- 活跃用户向量缓存:Redis缓存最近1小时活跃用户的向量,减少重复计算。
- 实时行为写入缓存:通过Flink等流式计算引擎更新行为特征。
🌐 四、实际部署架构
graph LR
A[离线计算] --> B(物品特征ETL)
B --> C[物品塔模型]
C --> D[物品向量]
D --> E[Faiss索引构建]
E --> F[向量数据库]
G[在线服务] --> H(用户请求)
H --> I[加载用户特征]
I --> J{是否缓存?}
J -->|是| K[Redis获取用户向量]
J -->|否| L[用户塔模型实时计算]
L --> M[更新Redis缓存]
K/L --> N[Faiss ANN检索]
N --> O[Top-K物品返回]
⚖️ 五、不这样设计的灾难后果
- 用户向量离线计算的致命缺陷
- 实时性丧失:用户点击鞋类商品后,系统仍在推荐家电(行为延迟导致误推)。
- 存储爆炸:每天全量存储用户向量(如10亿用户)需PB级存储,成本不可承受。
- 物品向量在线计算的效率灾难
- 计算崩溃:每次请求需计算10亿次内积(10亿×128维=1280亿次乘法),需1万核CPU秒,完全无法实现毫秒响应。
💎 六、总结:架构设计的本质是资源分配
决策维度 | 物品向量离线 | 用户向量在线 |
---|---|---|
更新频率 | 低(日更) | 高(毫秒级) |
计算成本 | 高但可批量分摊 | 低但需极速响应 |
存储成本 | 一次存储,全局复用 | 仅缓存活跃用户 |
数据依赖 | 静态特征为主 | 强依赖实时行为 |
核心原则:将不变的计算离线化(物品),将变化的计算实时化(用户)。该架构是工业界在效率、实时性、资源成本之间的最优解,也是双塔模型能支撑亿级规模的核心基石。
Embedding 更新
在双塔模型中,用户Embedding和物品Embedding的更新机制是系统实现实时性与效果平衡的核心。以下是其更新逻辑的详细解析,结合工业实践中的全量更新、增量更新策略及前沿优化方向:
🔄 一、用户Embedding的更新:在线实时计算 + 增量微调
1. 在线实时计算(请求级更新)
- 原因:用户兴趣动态变化(如点击、搜索行为),需即时响应。
- 流程:
- 线上服务时,根据用户实时特征(历史行为序列、画像标签)输入用户塔模型,输出用户向量。
- 计算开销:仅需一次前向传播(约10ms),轻量级MLP结构支持高并发。
- 优化技术:
- 特征预聚合:历史行为序列通过Transformer离线编码,在线拼接实时行为。
- 缓存机制:Redis存储活跃用户向量,减少重复计算。
2. 增量更新(分钟/小时级)
- 目的:捕捉短期兴趣(如用户上午点击运动鞋,中午推荐需响应)。
- 实现:
- Online Learning:实时收集行为数据,流式处理生成训练样本(如TFRecord)。
- 参数更新范围:仅更新用户ID Embedding参数,冻结神经网络权重(降低工程复杂度)。
- 发布机制:增量模型参数每小时同步至线上,用户塔推理时加载新Embedding。
📦 二、物品Embedding的更新:离线全量为主 + 实时旁路更新
1. 离线全量更新(天级)
- 原因:物品特征稳定(标题、类目变更频率低),且全量计算可复用。
- 流程:
- 每日凌晨任务:用前一天数据训练模型,发布新版物品塔,生成所有物品向量。
- 向量存储:存入Faiss/Milvus等向量数据库,重建索引(耗时可控)。
- 优势:计算资源集中调度,避免线上压力。
2. 实时旁路更新(异常场景)
- 触发条件:物品特征突变(如商品下架、标题篡改)。
- 实现:
- 消息队列(如Kafka)监听物品特征变更事件,触发实时推理。
- 更新后的向量同步至向量数据库,无需重建全局索引(局部更新)。
⚖️ 三、全量更新与增量更新的协同策略
更新类型 | 频率 | 更新内容 | 数据依赖 | 工程要求 |
---|---|---|---|---|
全量更新 | 天级(T+1) | 用户塔神经网络权重、物品向量 | 全天数据(随机Shuffle) | 批处理、低实时性 |
增量更新 | 小时/分钟级 | 用户ID Embedding参数 | 实时流数据(时间顺序) | 流计算、高可用 |
协同必要性
- 全量更新不可替代:
- 增量数据按时间顺序训练,存在分布偏差(如午间数据偏向办公场景);全量数据随机Shuffle更接近全局分布。
- 增量更新补充实时性:
- 小红书实践表明:纯增量模型效果下降7%(兴趣捕捉偏差),全量+增量组合最优。
🚀 四、前沿优化方向
1. 动态特征建模
- 用户塔:引入GRU/Transformer编码实时行为序列,替代简单加权平均。
- 物品塔:加入动态统计特征(如小时级点击率),通过Flink实时计算。
2. 蒸馏学习(Distillation)
- 精排模型指导双塔:用精排模型(Teacher)的输出作为软标签,训练双塔(Student),提升Embedding信息密度。
- 效果:腾讯音乐实践中,CTR提升12%。
3. 混合索引技术
- Faiss + Elasticsearch:
- Faiss处理十亿级向量检索(<10ms),ES融合文本/规则过滤(如“运动鞋类目+用户向量”)。
💎 总结:更新机制的设计本质
- 用户侧:高频轻量(在线计算+增量微调),应对兴趣动态性。
- 物品侧:低频批量(离线全量+异常旁路),平衡计算效率与特征稳定性。
- 系统瓶颈突破:
- 增量更新仅调整Embedding参数,降低Online Learning复杂度;
- 全量更新保障全局一致性,避免实时数据偏差。
工业级推荐系统中(如小红书、美团),此架构支撑亿级用户毫秒响应,未来演进将聚焦多模态向量联合更新(如图文内容)与联邦学习下的隐私安全更新。
模型更新
在双塔模型推荐系统中,模型更新频率是平衡实时性与系统开销的关键设计,通常采用全量更新(天级)与增量更新(小时级,实际上不算模型更新)相结合的策略。以下是具体机制和工业实践细节:
🔄 一、更新机制:全量更新与增量更新协同
1. 全量更新(天级更新)
- 频率:每天凌晨执行一次。
- 流程:
- 使用前一天全天数据训练模型,在昨日模型参数基础上初始化(非随机初始化)。
- 数据打包为TFRecord格式,训练仅1个epoch(每条数据仅使用一次)。
- 训练完成后发布新的用户塔神经网络参数和全量物品向量至线上服务。
- 优点:
- 数据覆盖完整:随机打乱(shuffle)全天数据,消除时间顺序偏差。
- 更新全连接层参数:全面优化模型结构(如MLP层)。
- 适用场景:捕捉长期兴趣、修复累积偏差,是效果稳定的基础。
2. 增量更新(小时级更新)
- 频率:每小时或每几十分钟执行一次(如小红书延迟约30分钟)。
- 流程:
- 实时收集用户行为数据,流式处理生成训练样本(如Kafka→Flink)。
- 仅更新用户ID的Embedding参数,锁定神经网络其他参数(如全连接层)。
- 发布最新的用户ID Embedding表,供用户塔在线计算实时向量。
- 优点:
- 快速响应用户兴趣变化(如新闻点击、突发兴趣迁移)。
- 计算开销低:仅调整Embedding层,避免全模型重训。
- 局限:
- 数据偏差:小时级数据分布不均衡(如午间/晚间行为差异大)。
⚙️ 二、两种更新的协同逻辑
为什么必须结合?
- 全量更新修正长期偏差,但无法捕捉日内兴趣变化;
- 增量更新补充实时信号,但依赖全量模型作为基础(避免小时数据噪声放大)。
- 实验结论:纯增量更新效果显著弱于“全量+增量”组合。
工程协同流程示例:
timeline title 双塔模型更新周期(以T日为例) section T-1日 凌晨 : 全量更新:用T-2日数据训练模型 → 发布用户塔+物品向量 白天 : 增量更新:基于全量模型,每小时更新用户ID Embedding section T日 凌晨 : 全量更新:用T-1日数据训练新模型 白天 : 增量更新:基于T日凌晨的全量模型继续更新
📊 三、关键设计权衡
更新类型 | 更新内容 | 频率 | 数据范围 | 系统开销 | 效果收益 |
---|---|---|---|---|---|
全量更新 | 用户塔全参数+物品向量 | 天级(凌晨) | 全天数据(随机打乱) | 高(需重训全模型+重建向量索引) | 长期兴趣建模、模型结构优化 |
增量更新 | 用户ID Embedding(实际为用户塔输入之一) | 小时级 | 实时窗口数据 | 低(仅Embedding微调) | 实时兴趣捕捉、短期反馈响应 |
💡 工业案例:
- 小红书:全量更新每日凌晨执行,增量更新延迟约30分钟,用户兴趣刷新周期缩至1小时内。
- Google Play:混合采样(全局+Batch内负样本)支持小时级Embedding更新。
⚠️ 四、特殊场景与优化
- 新物品/新用户的处理:
- 新物品:通过天级全量更新融入物品向量库(Milvus/Faiss)。
- 新用户:增量更新无法覆盖(无历史ID Embedding),依赖静态特征(地域、设备)实时计算用户向量。
- 性能瓶颈突破:
- 物品向量预计算:全量更新时批量生成,避免线上实时推理。
- 用户向量缓存:活跃用户Embedding缓存5~10分钟,减少重复计算。
💎 总结
双塔模型更新策略需分层设计:
- 基础层:天级全量更新(🕒 凌晨执行),保障长期效果稳定;
- 加速层:小时级增量更新(⏱️ 实时流处理),捕捉兴趣动态变化;
- 协同原则:全量更新消除偏差,增量更新补充实时性,二者缺一不可。
若资源有限,可牺牲部分实时性(如仅保留天级全量更新),但会损失15%~30%的短期转化率。工业级系统通常需同时部署两种更新通道,通过“全量打底+增量增强”最大化推荐效果。
用户 ID Embedding
在双塔模型推荐系统中,“用户ID Embedding”和“用户Embedding”是相关但不同层次的概念,而增量更新中的参数更新逻辑需要结合模型架构和工程实现来理解。以下是详细解析:
🧠 一、用户ID Embedding与用户Embedding的区别
1. 用户ID Embedding
- 定义:用户ID Embedding是用户标识符(如数字ID)通过Embedding层映射得到的低维向量(例如128维)。
- 作用:仅表示用户ID这一单一特征的隐含语义,是用户塔的输入特征之一。
- 存储方式:以哈希表形式存储(
{用户ID: 向量}
),更新时直接替换表中对应值。
2. 用户Embedding
- 定义:用户Embedding是用户塔神经网络(DNN)的最终输出向量,由用户ID Embedding与其他特征(如历史行为、年龄、上下文)拼接后经多层神经网络计算生成。
- 作用:综合表征用户兴趣,用于与物品Embedding计算相似度(如点积)。
- 计算方式:需实时调用用户塔模型推理,无法直接存储。
3. 核心区别
属性 | 用户ID Embedding | 用户Embedding |
---|---|---|
来源 | Embedding层查表 | 用户塔神经网络输出 |
输入特征 | 仅用户ID | 用户ID + 其他特征(行为、上下文) |
是否可存储 | 是(哈希表) | 否(需实时计算) |
更新频率 | 小时级(增量更新) | 实时生成(依赖最新ID Embedding) |
示例: 用户ID “U123” → ID Embedding
[0.3, -0.5, ...]
(查表获取) 用户塔输入 = ID Embedding + 行为序列Embedding + 年龄 → 经DNN计算 → 用户Embedding[1.2, -0.8, ...]
。
🔧 二、增量更新的含义与流程
增量更新的核心是高频更新用户ID Embedding,而非整个用户塔。具体流程如下:
- 数据收集(实时流处理)
- 用户行为数据(点击、购买等)通过Kafka/Flink实时流入,生成训练样本。
- 训练样本构建
- 仅使用小时级窗口内的新数据(如过去30分钟),避免全量数据重算。
- 参数更新范围
- 仅更新用户ID Embedding参数:调整Embedding层中用户ID对应的向量值。
- 锁定其他参数:用户塔的全连接层(MLP)、物品塔参数、非ID特征Embedding均固定不变。
- 发布更新
- 将新用户ID Embedding表发布至线上服务(如Redis),覆盖旧值。
- 线上推理时,用户塔复用原有网络结构,但查表获取的ID Embedding已是新版本。
✅ 用户塔参数是否变化?
- 结构参数不变:全连接层的权重未更新,网络结构保持稳定。
- 仅输入特征变化:用户ID Embedding作为输入的一部分被替换,导致最终用户Embedding变化。
类比理解:用户塔是函数
f(x)
,ID Embedding是输入x
。增量更新只修改x
,不修改f
。
⚙️ 三、增量更新的工程意义
- 平衡实时性与开销
- 实时性:用户兴趣变化(如突发点击)在30分钟内影响推荐结果。
- 低开销:仅更新Embedding表(KB级数据),避免重训全模型(TB级计算)。
- 与全量更新的协同
- 全量更新(天级):修正长期偏差,优化全连接层参数。
- 增量更新(小时级):捕捉短期兴趣,调整ID向量。
- 解决冷启动问题
- 新用户首次行为后,其ID Embedding在增量更新中生成,缓解无历史数据问题。
💎 总结
- 用户ID Embedding ≠ 用户Embedding:前者是单一特征的向量,后者是综合特征的神经网络输出。
- 增量更新仅改Embedding表:用户塔结构不变,但输入特征更新使最终用户Embedding动态变化。
- 工程价值:以最小开销实现兴趣实时捕捉,是工业级系统的常见优化策略。
若用户兴趣需更高实时性(如秒级),可结合流式向量数据库(如Milvus)进一步缩短延迟。
用户 Embedding 预存
在双塔模型中,用户历史行为序列的Embedding通常需要实时生成而非预先存储,这一设计源于动态兴趣捕捉、计算效率、工程架构等多方面权衡。以下是核心原因及技术细节:
🔄 一、核心原因:动态兴趣与实时性需求
用户兴趣的实时演化
- 用户行为序列具有强时效性:一次新的点击或搜索可能瞬间改变兴趣偏好(例如用户从浏览运动鞋转向购买咖啡)。
- 存储的Embedding只能反映历史状态,无法捕捉行为序列的时序变化(如近期行为权重大于早期行为)。
- 在线生成可动态融合最新行为(如最近5分钟点击),而存储方案需频繁更新(分钟级),成本高昂且延迟较高。
上下文依赖的灵活性
用户Embedding需结合
实时上下文
(如当前时间、地理位置、设备类型)。例如:
- 工作日午间可能推荐工作餐,晚间推荐娱乐内容。
- 位置变化(如从北京到上海)需立即调整本地化推荐。
预存Embedding难以覆盖无限组合的上下文场景。
⚙️ 二、工程实现:效率与架构的权衡
- 存储成本与更新瓶颈
- 用户规模巨大:亿级用户若存储行为Embedding(如128维),需PB级存储,且需分钟级更新,分布式系统压力极大。
- 物品塔的对比:物品特征相对稳定(如商品标题、类目),可离线批量生成Embedding并存储;而用户行为变化频率高数个量级。
- 计算效率优化
- 在线轻量计算:用户塔仅需一次前向传播(约10~50ms),现代MLP网络可支持万级QPS。
- 缓存辅助策略:
- 活跃用户Embedding可缓存数分钟(如Redis),平衡实时性与计算开销。
- 新行为通过增量模型更新Embedding(如GRU序列模型),避免全量重算。
- 双塔架构的固有设计
- 双塔的核心优势是解耦用户与物品计算:
- 物品Embedding离线生成 → 存入向量数据库(如Faiss)。
- 用户Embedding在线生成 → 与物品Embedding实时计算相似度。
- 若预存用户Embedding,需解决跨场景一致性问题(如同一用户在不同上下文需不同Embedding),增加系统复杂性。
- 双塔的核心优势是解耦用户与物品计算:
🧩 三、特殊场景下的折中方案
尽管实时生成是主流方案,以下场景可能部分预存Embedding:
- 长周期兴趣画像
- 离线生成用户长期兴趣Embedding(如周级行为聚合),与实时Embedding拼接,兼顾稳定性与时效性。
- 新用户冷启动
- 无行为时使用静态特征Embedding(如地域、性别),预存于数据库。
- 高性能场景优化
- 通过模型蒸馏将复杂用户塔压缩为轻量版,预存Embedding并定期更新。
🚀 四、前沿趋势:动态与预存的融合
- 混合索引技术
- 如Google的两阶段召回:
- 第一阶段:用预存Embedding快速筛选千级候选集。
- 第二阶段:实时生成用户Embedding精排百级候选。
- 如Google的两阶段召回:
- 增量式序列建模
- 阿里ETA模型:将历史行为Embedding预存为Key,在线检索相似行为动态加权。
- 向量化实时更新
- 流式向量数据库(如Milvus 2.0):支持用户Embedding微秒级增量更新,减少全量计算。
💎 总结:实时生成的必然性
因素 | 实时生成优势 | 预存方案缺陷 |
---|---|---|
兴趣捕捉 | 动态融合最新行为与上下文 | 滞后于用户实际意图 |
计算效率 | 单次前向传播延迟可控 | 高频更新引发存储与计算瓶颈 |
架构适配性 | 契合双塔解耦设计 | 需重构为状态依赖架构 |
成本 | 节省PB级存储与更新资源 | 分布式系统维护成本高昂 |
工业实践中(如YouTube、美团),实时生成用户Embedding是平衡效果与效率的最优解。未来演进方向是轻量化序列模型(如Transformer压缩)与流式向量数据库的结合,进一步降低实时计算延迟。
历史行为序列存储
用户历史行为序列的存储方案需根据数据规模、实时性要求和系统架构综合设计,关系型数据库(如MySQL)可作为一种选择,但在大规模推荐系统中往往并非最优解或唯一存储方式。以下是不同场景下的存储策略及技术对比:
🗄️ 一、关系型数据库的应用场景
中小规模系统
表结构设计(如MySQL):
CREATE TABLE user_behavior ( user_id INT, item_id VARCHAR(255), behavior_type ENUM('click', 'purchase', 'view'), timestamp DATETIME, INDEX (user_id, timestamp) -- 加速用户行为查询 );
适用性:
- 数据量小于千万级时,读写性能可满足需求;
- 支持事务操作(如行为记录的原子写入);
- 可通过SQL直接关联用户画像表(如年龄、性别)。
冷启动或简单业务
- 用户浏览历史等低频访问数据,可直接存于
history
表(结构见)。
- 用户浏览历史等低频访问数据,可直接存于
⚡ 二、关系型数据库的局限性及替代方案
当数据量庞大(如亿级行为记录)或需高并发读写时,关系型数据库面临瓶颈:
- 性能问题:
- 频繁的
INSERT
操作(如每秒万级点击)可能导致锁表延迟; - 长行为序列查询(如用户最近1000次行为)响应慢(需扫描大量行)。
- 频繁的
- 扩展性不足:
- 分库分表复杂度高,难以应对数据量指数增长。
✅ 工业级替代方案
存储类型 | 代表技术 | 适用场景 | 优势 |
---|---|---|---|
键值数据库 | Redis | 实时行为缓存(如最近20次点击) | 读写性能微秒级,支持丰富数据结构 |
列式数据库 | HBase, Cassandra | 超大规模行为日志(日增TB级) | 高吞吐写入,水平扩展性强 |
向量数据库 | Milvus, Faiss | 行为序列的嵌入向量存储(用于召回) | 支持ANN检索,加速相似行为匹配 |
搜索引擎 | Elasticsearch | 多维度行为查询(如“某时段购买过某类物品”) | 倒排索引优化复杂过滤 |
案例:
- 电商平台通常用Redis缓存实时行为(如购物车),用HBase存储全量日志;
- 推荐系统的召回层依赖向量数据库存储行为序列的Embedding。
🔧 三、混合架构:关系型与非关系型协同
实际系统常采用分层存储策略:
- 实时层(<1秒延迟):
- Redis Streams/Kafka:缓存用户最新行为,供在线模型实时消费。
- 服务层(亚秒级响应):
- Elasticsearch:索引近30天行为,支持快速查询。
- 存储层(分钟级延迟):
- HDFS/数据湖:存储原始日志,用于离线训练(如生成双塔模型样本)。
- 备份层(低优先级):
- MySQL:归档重要行为(如购买记录)用于对账或审计。
💡 四、选择依据:何时用关系型数据库?
因素 | 适合关系型数据库 | 适合非关系型存储 |
---|---|---|
数据规模 | < 千万条记录 | > 亿条记录 |
读写峰值 | < 5k QPS | > 50k QPS |
查询复杂度 | 简单条件过滤 | 多维度聚合或向量检索 |
行为序列长度 | 平均 < 100条/用户 | 平均 > 1000条/用户 |
实时性要求 | 容忍秒级延迟 | 需毫秒级响应 |
决策建议:
- 初创项目可直接用MySQL简化架构;
- 成熟系统需通过分片+异步落盘降低压力:Redis缓存实时数据 → 批量写入HBase。
🚀 五、前沿实践:向量化行为序列
在深度推荐系统中(如双塔模型),行为序列存储正发生变革:
- 行为Embedding化:
- 用GRU/Transformer编码用户行为序列为固定维向量(如128维),替代原始ID序列。
- 存储优化:
- 向量数据库存储用户行为Embedding,减少I/O开销(1个向量替代千次行为查询)。
- 更新机制:
- 用户塔模型实时推理生成新Embedding,增量更新至缓存(如Redis),全量更新至向量库(如Milvus)。
💎 总结
用户历史行为序列可存于关系型数据库,但仅适用于轻量级场景;高并发、大规模系统中需结合实时缓存+列式存储+向量数据库构建混合架构。未来趋势是将原始行为转化为稠密向量,通过向量数据库实现高效检索与更新。
在双塔推荐系统中,用户历史行为序列的存储策略是平衡效果与效率的关键问题。以下是综合工业实践的技术解析:
📊 一、行为序列的存储必要性
- 长期保存原始序列的原因
- 兴趣演化分析:用户长期兴趣(如季度性消费习惯)需通过超长序列(千级至万级行为)捕捉,仅依赖Embedding无法回溯原始行为。
- 模型重训练与验证:当模型结构更新(如引入新特征)时,需原始序列重新生成Embedding,避免分布偏差。
- 多场景适配:同一行为序列在不同任务(召回/排序)中需差异化处理,原始数据支持灵活的特征工程。
- 不保存序列的例外场景
- 纯实时系统:若业务仅需短期兴趣(如新闻推荐),可依赖实时流(Kafka)缓存最近100-200条行为,过期丢弃。
- 资源极度受限:中小规模系统可能仅存储Embedding,但会损失长期兴趣建模能力。
🗄️ 二、存储位置:分级架构设计
工业系统采用分层存储以平衡访问速度与成本:
存储层 | 介质/技术 | 数据范围 | 延迟 | 典型场景 |
---|---|---|---|---|
实时层 | Redis/Kafka | 最近10-50条行为 | 毫秒级 | 用户塔在线推理 |
近线层 | Elasticsearch | 近30天行为 | 亚秒级 | 短期兴趣模型训练 |
离线层 | HBase/Cassandra | 全量历史行为 | 秒级 | 长期序列建模(如SIM) |
归档层 | HDFS/对象存储 | 全量压缩日志 | 分钟级 | 审计/重训练 |
典型流程:
- 用户新行为写入Redis流,供实时模型消费。
- 每30分钟同步至Elasticsearch,支持短期兴趣提取。
- 每日全量行为备份至HBase,构建长期序列库。
- 原始日志定期压缩存入HDFS(保留6-12个月)。
✅ 案例:
- 阿里SIM模型通过User Behavior Tree (UBT) 在HBase中按类目索引行为序列,加速类目相关检索。
- 字节LONGER模型将超长序列分块存储于分布式文件系统,训练时动态加载。
⚖️ 三、存储成本对比:序列 vs Embedding
存储空间量化分析
假设单个用户行为序列:
- 原始序列:每条行为含物品ID、时间戳、行为类型(约50字节),万级序列需 500KB/用户。
- Embedding:128维浮点数向量(512字节),仅占原始数据的0.1%。
成本差异根源:
- 原始序列需保留多维细节(时间、上下文),而Embedding是信息压缩后的稠密向量。
- 行为序列长度随用户持续增长,Embedding维度固定。
工业级优化策略
- 序列压缩:
- 丢弃低频行为(如间隔超180天的非关键交互)。
- 聚合相似行为(如连续点击同品类商品合并为一次)。
- Embedding复用:
- 物品Embedding全局共享,避免重复存储。
- 用户Embedding按天缓存,减少实时计算压力。
💡 取舍逻辑: 虽然原始序列存储成本高 100~1000倍,但其提供数据灵活性与兴趣可解释性,在效果敏感场景不可替代。
🔧 四、降低存储开销的工程技术
- 增量更新机制:
- 用户Embedding每小时增量刷新,避免重复处理全量序列。
- 向量化长期兴趣:
- 如SIM模型分两阶段处理:
- Stage1:从HBase中检索候选相关行为(Hard/Soft Search)
- Stage2:仅对百级子序列生成Attention-Embedding,避免实时处理万级数据。
- 如SIM模型分两阶段处理:
- 分布式存储优化:
- 列式存储(HBase)按时间分区,冷数据自动降级至廉价存储。
💎 结论:存储策略的核心逻辑
- 必存原始序列:长期兴趣建模、模型迭代、数据追溯需原始行为,存储于 HBase/HDFS 。
- Embedding的辅助角色:作为实时服务的轻量缓存,存于 Redis/内存数据库,空间占比不足1%但支撑90%线上流量。
- 趋势:通过检索式建模(如SIM)和序列压缩(如LONGER的令牌合并)平衡效果与成本,实现超长序列的可行部署。
最终建议:10亿级用户系统需PB级行为存储,但可通过分层+压缩降至数十TB级;若资源有限,可保留30天行为+周级Embedding,牺牲部分长期兴趣以换成本可控。
经典模型
以下是推荐系统中经典或流行的双塔模型及其核心创新点总结,结合工业实践与研究进展梳理而成:
🔍 一、经典双塔模型
- 微软 DSSM(2013)
- 核心创新:双塔结构鼻祖,首次将用户(Query)与物品(Document)通过独立DNN映射到共享语义空间,以余弦相似度衡量匹配度。
- 应用场景:搜索引擎语义匹配,后扩展至推荐召回。
- 局限:无法引入用户-物品交叉特征,依赖负采样策略(如随机采样)。
- YouTube 双塔(2019)
- 创新点:
- 流式训练:基于实时用户行为数据更新,解决数据动态性问题。
- Batch内负采样:将同一batch内其他用户的物品作为负样本,提升训练效率。
- 特征设计:用户塔融合当前观看视频(seed)与历史行为序列的Embedding均值。
- 工业价值:支撑YouTube十亿级视频召回,延迟低于50ms。
- 创新点:
- Facebook EBR(2020)
- 核心改进:
- Hard Negative Mining:混合随机负样本与召回阶段排名101-500的“困难负样本”(难以区分的负例),提升模型区分力。
- Embedding融合:多模型集成(如文本特征塔+社交特征塔),兼顾语义与社交匹配。
- 效果:召回率提升10%~15%,尤其改善长尾物品覆盖。
- 核心改进:
⚙️ 二、改进型双塔变体
- SENet 双塔
- 创新机制:在Embedding层后加入SENet模块(Squeeze-Excitation Network),动态学习特征权重,强化重要特征、抑制噪声。
- 优势:
- 缓解双塔特征交互晚导致的信息损失问题。
- 业务实测点击率提升3%~5%,ID类特征场景效果显著。
- 并联双塔(QQ浏览器)
- 结构设计:并联多个异构塔(如MLP+DCN+FM),实现多粒度特征交叉。
- 融合方式:多个用户/物品向量Hadamard积拼接后输入LR加权融合,综合不同交叉方式的优势。
- 适用场景:需强特征交互的电商/广告场景。
- 对偶增强双塔(美团)
- 交互机制:为每个用户和物品引入增强向量,训练时通过对方塔的输出隐式更新,实现跨塔信息传递。
- 效果:在保持双塔效率的同时,逼近精排模型的特征交叉能力。
- 阿里 COLD
- 突破点:舍弃双塔分离结构,直接在输入层引入用户-物品交叉特征,线上通过轻量级NN实时计算。
- 性能优化:通过特征重要性剪枝、计算图优化,实现高并发低延迟(<10ms)。
🔧 三、双塔模型的核心优化方向
优化方向 | 代表模型 | 解决的核心问题 |
---|---|---|
特征交互增强 | SENet、并联双塔 | 高层交互导致细节信息损失 |
负采样策略改进 | Facebook EBR | 随机负样本区分度低 |
训练效率提升 | YouTube 双塔 | 流数据动态更新 |
结构内生限制突破 | 阿里 COLD | 无法引入交叉特征 |
💎 总结
双塔模型因结构解耦、线上高效的特性,成为召回/粗排的主流选择。经典模型如DSSM、YouTube双塔奠定了基础框架,而改进型变体通过特征权重动态调整(SENet)、困难样本挖掘(EBR)、隐式交互(对偶增强) 等技术创新,逐步逼近精排效果。未来趋势是:在保持低延迟前提下,通过特征工程轻量化(如COLD)或多模态融合,进一步突破双塔的天花板。
注:工业系统常多模型并行(如DSSM处理文本、EBR处理社交),综合覆盖不同场景需求。实际选型需权衡效果、效率与落地成本。
Youtube DNN vs. DSSM
Youtube DNN 和 DSSM 是推荐系统中两种经典的召回模型,分别代表了 用户行为序列建模 和 双塔语义匹配 的核心思想。以下从模型原理、工程实现和应用差异三方面深入解析:
🧠 一、模型原理与结构
1. Youtube DNN
- 核心目标:预测用户的下一个点击视频(多分类任务)。
- 模型结构:
- 输入层:用户历史行为序列(50个观看视频ID、50个搜索词)、人口统计特征(性别/年龄/地域)、上下文特征(如
example age
表示视频新鲜度)。 - 特征处理:
- 行为序列通过 Embedding + Average Pooling 生成兴趣向量(例如256维);
- 静态特征直接嵌入拼接;
example age
特征设置为负数,引导模型推荐新内容。
- 网络层:三层全连接层(ReLU激活),输出用户向量
u
。
- 输入层:用户历史行为序列(50个观看视频ID、50个搜索词)、人口统计特征(性别/年龄/地域)、上下文特征(如
- 输出层:Softmax 分类层,输出百万级视频的概率分布(负采样加速训练)。
2. DSSM(Deep Structured Semantic Model)
- 核心目标:学习用户和物品的语义向量,通过余弦相似度匹配。
- 模型结构:
- 双塔设计:
- 用户塔:输入用户特征(ID、行为等),输出用户向量;
- 物品塔:输入物品特征(ID、属性等),输出物品向量。
- 表示层:每塔独立的多层DNN(如128维输出),无特征交叉。
- 匹配层:计算双塔向量的余弦相似度 → Sigmoid 输出点击概率。
- 双塔设计:
- 文本处理:
- 英文采用 Word Hashing(字母n-gram降维),中文采用字粒度或分词。
⚙️ 二、工程实现差异
维度 | Youtube DNN | DSSM |
---|---|---|
线上服务 | 存储物品向量,实时计算用户向量 + ANN检索 | 预存用户/物品向量,线上仅需余弦计算 |
特征交互 | 特征拼接后输入DNN,隐含交叉 | 双塔特征完全隔离,无显式交互 |
负采样策略 | 重要性采样(偏向热门物品) | Batch内随机采样 + 热门打压 |
冷启动处理 | 依赖 example age 和静态特征 | 依赖属性特征泛化(如物品类目) |
典型流程对比:
Youtube DNN 线上服务:
graph LR A[用户特征] --> B(用户塔DNN) B --> C[用户向量 u] C --> D{ANN检索} E[预存物品向量] --> D D --> F[Top-N召回结果]
DSSM 线上服务:
graph LR A[用户特征] --> B(用户塔DNN) --> C[预存用户向量] D[物品特征] --> E(物品塔DNN) --> F[预存物品向量] C & F --> G{余弦相似度} --> H[Top-N召回结果]
🔍 三、核心差异与适用场景
对比维度 | Youtube DNN | DSSM |
---|---|---|
兴趣建模 | 动态捕捉序列兴趣(观看/搜索历史) | 静态语义匹配(无序列建模能力) |
实时性要求 | 需实时生成用户向量(行为变化敏感) | 可离线缓存所有向量(延迟更低) |
效果 vs 效率 | 效果更优(复杂特征融合),但计算开销大 | 效率更高(工业部署友好),但精度受限 |
典型场景 | 信息流推荐(强时序行为) | 广告召回、冷启动场景 |
实验效果举例(ML-1M数据集):
召回方式 | Top-10 召回率 | Top-1000 召回率 |
---|---|---|
Youtube DNN (u2i) | 8.2% | 75.5% |
DSSM (i2i) | 10.0% | 57.2% |
💎 四、总结与选型建议
- Youtube DNN 优势:
- 适合用户行为丰富的场景(如视频/电商),能建模长期兴趣演化;
- 通过
example age
等特征提升新颖性,缓解信息茧房。
- DSSM 优势:
- 超低延迟:预存向量避免实时计算,适合亿级物品库;
- 架构解耦:双塔独立更新,支持模块化扩展(如替换物品塔为图像模型)。
创新方向:
- Youtube DNN 改进:引入注意力机制(如SASRec)替代平均池化;
- DSSM 改进:添加交叉塔特征(如谷歌双塔的交叉层)或使用Transformer增强序列建模。
两者并非互斥,工业系统常多路并行(如Youtube DNN处理行为数据 + DSSM处理冷启动),综合效果与效率。