【PyTorch基础教程30】DSSM双塔模型(线上召回 | 模型更新)

本文介绍了召回模型的基础知识,包括point-wise、pair-wise、list-wise三种训练方式及其损失函数。重点讨论了DSSM模型,包括微软和百度版本的特点,以及其在推荐系统中的应用。模型训练和评估过程中的关键步骤如特征预处理、模型定义、模型训练和embedding召回评估也进行了详细阐述。此外,文中还探讨了双塔模型在业界的部署策略,如离线存储和在线召回,并讨论了模型更新的全量和增量方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容总结

在这里插入图片描述

  • 召回中,一般的训练方式分为三种:point-wise、pair-wise、list-wise。RecHub中用参数mode来指定训练方式,每一种不同的训练方式也对应不同的Loss。对应的三种训练方式可以参考下图,其中a表示user的embedding,b+表示正样本的embedding,b-表示负样本的embedding。
    • 前面两行是指pointwise即图例看待每个正负样本,使用二分类交叉熵
    • pairwise:每次选择一个正样本和一个负样本,使用Hinge loss或者BPR loss损失函数
    • listwise:每次选择一个正样本和多个负样本,使用softmax loss函数,其实就是多分类问题(如下图最下面的CrossEntropyLoss函数)
      在这里插入图片描述
  • 召回中样本的选择:
    • 正样本:用户点击的物品
    • 负样本:没有被召回的;召回但是被排序淘汰的;曝光但是未点击的
  • 微软DSSM奠定的基本思想:
    • 离线使用cosine优化相似度
    • 在线使用ANN向量化召回
    • 首次提出随机负采样
  • YouTube双塔的思想:
    • In-batch sampled softmax:首次提出in-batch负采样,在batch中除了item以外的所有item作为负样本
    • Sample-Bias Corrected:
      • Batch内出现的是随机采样的结果,热门物品被采样概率大,造成热门惩罚过高
      • 流式纠偏模块:通过采样频率估计采样概率(简单trick:可他通过全局被采频率代替)
  • 排序看特征,召回看样本。

在这里插入图片描述

  • 向量召回:Annoy或者Faiss向量搜索库
  • 召回的难点:
    • 样本构造不容易,比如负样本比例,负样本采样规则
    • 缺乏置信度高的离线评估指标:
      • AUC只能参考
      • Facebook:拿topk召回结果与用户实际点击做交集并计算precision、recall
      • Airbnb:看用户“实际点击”在召回结果中的平均位置
      • 多样性
    • Pytorch中没有sampled softmax:手动提前负采样一些负样本,和本次的1个正样本计算

<think>好的,我现在需要处理用户关于DSSM双塔模型及其在PyTorch实现的问题。首先,我要确认用户的需求。用户提到他们参考了一些资料,包括引用[1]、[2]、[3],这些资料涉及DSSM模型结构、双塔模型的改进以及实现中的问题。用户特别想知道如何在PyTorch中实现DSSM双塔模型。 首先,我需要回忆DSSM的基本结构。根据引用[1],DSSM使用深度神经网络(DNN)来提取查询(query)和文档(document)的语义特征,生成低维的向量表示,然后通过余弦相似度计算它们的相关性。这与传统的LSA不同,DSSM是监督学习,针对区分相关和不相关文档进行优化。 接下来,用户提到的双塔模型结构,可能在引用[2]中提到过,比如Dual Augmented Two-tower Model,这可能是对双塔的改进,比如特征交叉或注意力机制。但用户现在需要的是基础的双塔实现,所以应专注于DSSM的原始结构。 然后,用户参考了引用[3]中的实现问题,其中提到数据集的格式问题,即每个样本只有query、doc和标签,而不是显式的正负样本对。因此,在实现时可能需要调整损失函数,比如使用二分类的BCELoss,而不是成对的对比损失。 现在,我需要将这些信息整合成一个清晰的PyTorch实现步骤。首先,模型结构部分需要分为两个塔,每个塔处理query和doc,生成embedding,然后计算余弦相似度,最后用sigmoid输出概率。损失函数方面,根据引用[3],用户可能使用的是BCELoss,因为数据是二进制的相关标签。 同时,需要注意数据处理的步骤,比如如何将文本转换为词袋向量或哈希后的向量,因为DSSM原文中提到的是word hashing处理大规模词汇。但在蚂蚁金服数据集中可能已经处理好了特征,或者需要自己进行预处理。 另外,在训练过程中,每个batch应包含query和doc的输入,分别通过各自的塔,计算相似度后与标签比较。需要确保两个塔的参数是共享还是独立,根据DSSM的结构,应该是两个独立的塔,但可能在某些层有共享组件?根据引用[1],DSSM的query和document是通过不同的DNN处理,所以双塔应该是独立的。 最后,需要生成相关问题,比如模型结构优化、损失函数选择、如何处理文本输入等,这些都是用户可能进一步想了解的。 需要确保回答的结构清晰,分步骤说明实现方法,并正确引用提到的资料。同时,检查LaTeX格式是否符合要求,比如行内公式用$...$,独立公式用$$...$$,并正确使用中文回答。</think>### DSSM双塔模型PyTorch实现方法 #### 模型核心思想 DSSM(Deep Structured Semantic Models)通过双塔结构分别提取query和document的语义特征,生成低维向量表示,并通过余弦相似度衡量相关性。其核心公式为: $$ \text{相似度}(Q,D) = \cos(\mathbf{v}_Q, \mathbf{v}_D) = \frac{\mathbf{v}_Q^\top \mathbf{v}_D}{\|\mathbf{v}_Q\| \|\mathbf{v}_D\|} $$ 其中$\mathbf{v}_Q$和$\mathbf{v}_D$分别表示query和document的语义向量[^1]。 #### PyTorch实现步骤 1. **模型结构设计** ```python import torch import torch.nn as nn class DSSM(nn.Module): def __init__(self, input_dim, hidden_dims=[512, 256, 128]): super().__init__() # Query塔结构 self.query_tower = nn.Sequential( nn.Linear(input_dim, hidden_dims[0]), nn.ReLU(), nn.Linear(hidden_dims[0], hidden_dims[1]), nn.ReLU(), nn.Linear(hidden_dims[1], hidden_dims[2]) ) # Doc塔结构(对称设计) self.doc_tower = nn.Sequential( nn.Linear(input_dim, hidden_dims[0]), nn.ReLU(), nn.Linear(hidden_dims[0], hidden_dims[1]), nn.ReLU(), nn.Linear(hidden_dims[1], hidden_dims[2]) ) def forward(self, query, doc): q_embed = self.query_tower(query) # 生成query向量 d_embed = self.doc_tower(doc) # 生成doc向量 return torch.cosine_similarity(q_embed, d_embed, dim=1) # 余弦相似度 ``` 2. **数据处理要点** - 输入特征:可采用词袋向量(BOW)、TF-IDF或哈希特征(word hashing) - 样本格式:每个样本包含(query_features, doc_features, label),标签为0/1表示是否相关[^3] 3. **训练配置** ```python model = DSSM(input_dim=10000) # 假设输入维度为10000 criterion = nn.BCELoss() # 二分类交叉熵损失 optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练循环示例 for epoch in range(10): for batch in dataloader: q, d, labels = batch outputs = model(q, d) loss = criterion(torch.sigmoid(outputs), labels.float()) loss.backward() optimizer.step() optimizer.zero_grad() ``` #### 关键改进点 1. **特征交叉增强**:可在Embedding层后加入类似SENet的特征注意力机制[^2] 2. **对齐优化**:通过Category Alignment层加强语义空间对齐 3. **负采样策略**:当显式负样本缺失时,可采用in-batch负采样 #### 性能优化建议 - 使用预训练词向量初始化Embedding层 - 添加Dropout层防止过拟合(建议比例0.2-0.5) - 采用梯度裁剪(clip_value=5.0)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山顶夕景

小哥哥给我买个零食可好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值