DSSM - 双塔经典模型(微软)

本文详细介绍了DSSM(Deep Structured Semantic Models)模型在推荐系统和广告算法中的应用,特别是在召回和粗排阶段。DSSM采用双塔结构,通过MLP进行特征提取,然后计算内积或余弦相似度。在召回阶段,重点讨论了负样本构造的重要性,强调了避免样本选择偏差问题。在线推理阶段,DSSM的双塔结构允许快速的ANN检索。而在粗排阶段,与召回阶段的主要区别在于训练集和在线推理的候选集。文章还提到了DSSM无法处理user和item的交叉特征,并引用了工程实践中的观察结果。

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

  • 《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data》
  • 论文由微软发表于 CIKM-2013。DSSM被广泛用于工业界的 召回/粗排 阶段。

模型结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBZG1A6K-1684400460589)()]

  • 模型结构一目了然,非常简单,双塔结构:user侧一个塔,item一个塔,塔用的是MLP。底层各自有各自的embedding。两塔输出特征维度一致,最后做内积或cosine来计算相似度;损失函数用二分类交叉熵即可。
  • dssm的缺点也很明显:无法做user和item的交叉/交互特征。(可参考:新浪微博张俊林的尝试SENet,如何在双塔模型中做user和item的交叉/交互)

DSSM - 召回阶段用法

  • 现在工业界的推荐系统的召回阶段基本上多路召回,比如CF召回、CB召回、语义向量召回等,DSSM召回也是语义向量召回的一种。

### DSSM双塔模型架构与实现 #### 架构概述 DSSM(Deep Structured Semantic Model)是一种经典双塔模型,最初由微软提出并应用于搜索引擎领域[^2]。该模型的核心思想是通过神经网络学习查询(query)和文档(document)之间的语义相似度。具体来说,DSSM将输入的文本转换为低维向量表示,并计算它们之间的余弦相似度作为匹配分数。 #### 模型结构 DSSM的主要组成部分包括以下几个层次: 1. **Embedding 层** 输入通常是稀疏的词袋(Bag-of-Words, BoW)或字符 n-gram 特征。这些特征会被映射到密集的嵌入空间中[^3]。例如,对于单词序列 `w_1, w_2, ..., w_n`,可以将其转化为一组 one-hot 向量,再通过嵌入矩阵得到连续向量表示。 2. **隐藏层** 嵌入后的向量会经过多层全连接神经网络(Fully Connected Layers),逐步提取高层次的语义特征[^1]。每一层都会引入非线性激活函数(如 ReLU 或 tanh),从而捕捉复杂的模式关系。 3. **规范化处理** 在最终输出之前,通常会对隐含层的结果应用 L2 归一化操作,确保生成的向量长度一致,便于后续计算余弦距离[^4]。 4. **相似度计算** 查询和文档分别通过各自的塔传递后获得两个固定维度的向量 \( \vec{q} \) 和 \( \vec{d} \),接着利用如下公式衡量两者间的接近程度: \[ sim(q,d)=\frac{\vec{q}\cdot\vec{d}}{\|\vec{q}\|_{L2}\times\|\vec{d}\|_{L2}} \] #### 训练策略 针对排序任务,常采用 pairwise 方法构建训练样本集[^5]。即选取每一对包含正反馈 (clicked document) 和负反馈 (unclicked document) 的实例构成对比对子。损失函数可以选择基于 margin 的 hinge loss 或者 logistic regression 类型的形式表达如下: \[ loss=\sum_i max(0,m-sim(q,p)+sim(q,n)) \] 其中 m 表示预设的安全边界参数;p/n 分别代表正面/负面样例。 以下是 Python 实现的一个简化版本代码片段展示如何搭建这样的框架: ```python import tensorflow as tf from tensorflow.keras import layers def create_tower(input_dim, embedding_dim=128): input_layer = layers.Input(shape=(input_dim,)) embedded = layers.Embedding(input_dim=input_dim+1, output_dim=embedding_dim)(input_layer) flatten = layers.Flatten()(embedded) dense1 = layers.Dense(256, activation='relu')(flatten) dropout1 = layers.Dropout(0.5)(dense1) dense2 = layers.Dense(128, activation='tanh')(dropout1) norm = tf.math.l2_normalize(dense2, axis=-1) model = tf.keras.Model(inputs=[input_layer], outputs=[norm]) return model # Define Query Tower and Document Tower with same structure but different weights. query_input_size = vocab_size_for_queries # Replace this value accordingly. doc_input_size = vocab_size_for_documents # And replace this. query_model = create_tower(query_input_size) doc_model = create_tower(doc_input_size) # Combine both towers into a single model for training purposes. positive_doc_output = doc_model([pos_doc_inputs]) # Assume pos_doc_inputs defined elsewhere. negative_doc_output = doc_model([neg_doc_inputs]) cosine_sim_pos = tf.reduce_sum(tf.multiply(query_model.output, positive_doc_output), axis=-1) cosine_sim_neg = tf.reduce_sum(tf.multiply(query_model.output, negative_doc_output), axis=-1) margin_loss = tf.maximum(cosine_sim_neg - cosine_sim_pos + MARGIN_CONSTANT, 0.) total_loss = tf.reduce_mean(margin_loss) train_step = tf.optimizers.Adam().minimize(total_loss, var_list=query_model.trainable_variables + doc_model.trainable_variables) ``` 上述脚本定义了一个基础版的双通道网络及其相应的优化流程。实际部署时可能还需要考虑更多细节调整以及超参寻优等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

#苦行僧

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值