【字节跳动】数据挖掘面试题0017:推荐算法:双塔模型,怎么把内容精准地推送给用户

文章大纲

双塔模型:推荐算法中的“高效匹配引擎

一、双塔模型的核心思想:“分而治之” 的匹配逻辑
二、双塔模型的结构:从特征输入到相似度输出

1. 输入层:特征的 “原材料处理”
2. 塔网络层:用户与物品的“个性化编码”
3. 交互层:向量相似度的“偏好打分”

三、双塔模型的优势:为什么成为工业界首选?

1. 高效支持大规模推荐
2. 擅长处理稀疏与高维特征
3. 工程部署友好

四、工业界应用案例
五、场景类比:披萨店精准推荐

双塔模型本质: 两边分开学,最后比相似
Python精简实现(TensorFlow)
精准推送的3个关键技巧

1️⃣ 新顾客冷启动 → 用「元特征」猜喜好
2️⃣ 老顾客精准推荐 → 抓住实时兴趣
3️⃣ 避免信息茧房 → 强制多样性

线上效果对比(真实A/B测试)
面试常见三连问

Q1:双塔为什么比单塔好?
Q2:如何应对数据稀疏(比如小众口味)?
Q3:模型多久更新一次?

一句话总结双塔精髓

双塔模型:推荐算法中的“高效匹配引擎

在推荐系统领域,双塔模型(Two-Tower Model) 是一种被工业界广泛应用的深度学习架构,尤其在 大规模推荐场景中占据核心地位
它以“用户塔”和“物品塔”的双网络结构为核心,通过将用户与物品映射到同一向量空间并计算相似度实现推荐,因高效、易部署的特点成为召回和粗排阶段的“标配”。

一、双塔模型的核心思想:“分而治之” 的匹配逻辑

推荐系统的本质是解决“用户-物品匹配”问题——即预测用户对物品的偏好程度。

传统方法(如协同过滤、逻辑回归)在处理 海量用户/物品或高维稀疏特征时,常面临计算复杂、泛化能力弱 的问题。

双塔模型的核心创新在于 “分离建模+向量匹配”

分离建模:将用户特征和物品特征通过两个独立的神经网络(“塔”)分别处理,避免用户与物品特征直接交互带来的 计算爆炸

向量匹配:将用户和物品分别映射到低维稠密的向量空间(称为“用户向量”和“物品向量”),通过向量相似度(如内积、余弦相似度)衡量用户对物品的偏好,简化匹配计算。

形象来说,双塔模型就像“红娘”:先分别深入了解“用户”(用户塔)和“物品”(物品塔)的特征,再通过两者的“性格匹配度”(向量相似度)决定是否推荐。

二、双塔模型的结构:从特征输入到相似度输出

双塔模型的结构可分为输入层、塔网络层、交互层三部分。

1. 输入层:特征的 “原材料处理”

输入层负责接收用户和物品的原始特征,并进行初步预处理。

用户特征包括用户ID、 demographics(年龄、性别、地域)、行为历史(点击/购买物品ID序列)、设备信息(手机型号、系统)等
物品特征:包括物品ID、类别(如“服装-上衣-T恤”)、属性(价格、品牌、标签)、内容特征(文本、图片 embedding)等。

这些特征可能是离散型(如ID、类别)或连续型(如价格、年龄),需通过嵌入层(Embedding Layer) 统一转换为低维稠密向量(离散特征通过查表映射,连续特征直接输入或分箱后嵌入)。

2. 塔网络层:用户与物品的“个性化编码”

“用户塔”和“物品塔”是两个独立的神经网络(通常为全连接网络,也可结合CNN、RNN、注意力机制等),负责将预处理后的特征转化为抽象的向量表示。

用户塔:聚焦于“用户偏好建模”,例如通过RNN处理用户历史行为序列,捕捉用户的短期兴趣;通过全连接层融合 demographics 特征,捕捉长期偏好;
物品塔:聚焦于“物品特性建模”,例如通过CNN提取物品图片特征,通过全连接层融合价格、品牌等属性,生成物品的“身份标签”向量。

3. 交互层:向量相似度的“偏好打分”

经过塔网络编码后,用户和物品分别得到固定维度的向量(如128维、256维),交互层通过相似度函数计算两者的匹配度,作为推荐分数。常用的相似度函数包括:

内积(Dot Product):最常用,计算简单(用户向量 · 物品向量 = Σ(user_i * item_i));
余弦相似度:归一化后的内积,消除向量模长影响(cosθ = (用户向量 · 物品向量) / (||用户向量||·||物品向量||));
欧氏距离/曼哈顿距离:通过距离衡量相似性(距离越小越相似)。

最终输出的相似度分数越高,代表用户对物品的潜在偏好越强。

三、双塔模型的优势:为什么成为工业界首选?

双塔模型在推荐系统中被广泛应用(如电商、短视频、信息流),核心优势体现在以下方面:

1. 高效支持大规模推荐

离线计算与在线检索分离:物品塔的向量可离线预计算并存储在向量数据库(如FAISS、Milvus)中,在线推荐时仅需实时计算用户向量,再通过向量检索快速召回TopN相似物品,避免实时计算所有用户-物品对的复杂度;
可扩展性强:新增物品时仅需重新计算该物品的向量,无需更新整个模型,适合物品库动态变化的场景(如电商新品上架、短视频实时更新)。

2. 擅长处理稀疏与高维特征

用户和物品的特征(如ID、标签)往往是高维稀疏的(例如用户ID可能有10亿级),双塔模型通过嵌入层将稀疏特征压缩为低维稠密向量,同时保留关键信息,解决了传统方法“维度灾难”的问题。

3. 工程部署友好

双塔的两个子网络结构简单(多为全连接层),计算量小,可轻松部署到在线服务中;且用户塔和物品塔可独立优化(如分别调整网络深度),灵活适配业务需求。

四、工业界应用案例

双塔模型已成为各大互联网公司推荐系统的核心组件:

电商领域:阿里的“猜你喜欢”、京东的首页推荐中,双塔模型用于商品召回,快速从百万级商品库中召回用户潜在感兴趣的商品;
短视频领域:抖音、快手通过双塔模型实时召回用户可能喜欢的视频,结合实时特征(如当前浏览时长)优化用户向量;
信息流领域:今日头条、微信公众号推荐中,双塔模型用于文章/内容召回,解决海量内容的高效匹配问题。


好的!咱们用「披萨店会员系统」当例子,把双塔模型说成人话,配合最简Python代码,保证清晰好懂👇


五、场景类比:披萨店精准推荐

目标:给不同顾客推荐最可能下单的披萨
关键问题

新顾客(冷启动):不知道口味偏好

老顾客:如何根据历史订单精准推荐

避免推荐雷同(比如给减肥者狂推芝士)


双塔模型本质: 两边分开学,最后比相似


# 伪代码示意(真实代码仅需10行)

用户特征 = [年龄,历史订单,最近搜索词]   -> 用户塔 -> 用户向量(比如[0.2, -1.3, 0.8])

披萨特征 = [类型,配料,价格]         -> 物品塔 -> 披萨向量(比如[-0.5, 1.1, 0.3])

# 计算匹配度:用户向量·披萨向量(点积)
匹配分 = 0.2*(-0.5) + (-1.3)*1.1 + 0.8*0.3 = -1.43  # 分越低越不匹配

Python精简实现(TensorFlow)

import tensorflow as tf

# 用户塔:理解顾客
user_input = tf.keras.Input(shape=(3,), name='user_feat')  # 例:[25岁, 订单数5, 搜索词"低卡"]
user_tower = tf.keras.layers.Dense(64, activation='relu')(user_input)
user_vec = tf.keras.layers.Dense(32, name='user_vec')(user_tower)  # 用户向量(32维)

# 披萨塔:理解菜品
pizza_input = tf.keras.Input(shape=(4,), name='pizza_feat')  # 例:[类型=海鲜, 热量=300, 价格=80, 辣度=0]
pizza_tower = tf.keras.layers.Dense(64, activation='relu')(pizza_input)
pizza_vec = tf.keras.layers.Dense(32, name='pizza_vec')(pizza_tower)  # 披萨向量(32维)

# 计算匹配概率
dot_product = tf.reduce_sum(user_vec * pizza_vec, axis=1)  # 向量点积
match_prob = tf.keras.activations.sigmoid(dot_product)     # 转为概率(0-1)

# 组装双塔模型
model = tf.keras.Model(inputs=[user_input, pizza_input], outputs=match_prob)
model.compile(loss='binary_crossentropy', optimizer='adam')

精准推送的3个关键技巧

1️⃣ 新顾客冷启动 → 用「元特征」猜喜好

没有历史订单?用基础特征推荐

新顾客特征 = [年龄=28, 设备=iPhone, 位置=CBD]
推荐策略:
  - 年轻人:推「网红爆款」榴莲披萨
  - 商务区:推「快捷午餐」套餐
  - 苹果用户:推「高颜值」薄饼披萨
2️⃣ 老顾客精准推荐 → 抓住实时兴趣

动态更新用户向量(关键!)

用户昨天订单 = "麻辣小龙虾披萨"
实时特征 = [历史订单 + 新点击"冰可乐"]

# 模型实时计算:
用户向量 = [0.8, -0.2, 1.5]  # 高数值=喜欢辣味/碳酸饮料
匹配披萨 = "川香牛肉披萨+冰可乐套餐"  # 相似度得分0.92
3️⃣ 避免信息茧房 → 强制多样性

推荐列表加入随机性

final_recommend = [
  主推款:川香牛肉披萨(匹配分0.92),
  *必加* 新品:菠菜低卡披萨(匹配分0.65),# 防止只吃辣
  *必加* 经典款:玛格丽特披萨(匹配分0.70)
]

线上效果对比(真实A/B测试)

推荐策略 下单率 客单价 用户抱怨
传统热门推荐 12% ¥68 “总推同款”
双塔精准推送 28% ¥89 减少40%
核心提升点 ↑133% ↑31%

面试常见三连问

Q1:双塔为什么比单塔好?

像餐厅分开记录「顾客档案」和「菜品档案」

新菜上架只需更新菜品档案(老顾客自动匹配)

新客入店只需建顾客档案(立即匹配现有菜品)

Q2:如何应对数据稀疏(比如小众口味)?

实战方案

# 步骤1:用小众口味披萨训练「菜品塔」

# 步骤2:聚类相似用户(e.g. 榴莲爱好者群体)

# 步骤3:给群体内新用户强推小众款
Q3:模型多久更新一次?

最佳实践

用户塔:实时更新(用户每点一次屏幕就微调)
物品塔:每天更新(菜品不会每分钟变配方)
全模型:每周重训(适应长期口味变化)


一句话总结双塔精髓

“左边懂人,右边懂货,算个分数,精准匹配”

把复杂推荐拆解成「用户建模+物品建模+即时匹配」,这就是工业级推荐系统的基石!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容