DSSM的细节

word hashing

word hashing方法是用来减少输入向量的维度,该方法基于字母的n-gram。给定一个单词(good),我们首先增加词的开始和结束部分(#good#),然后将该词转换为字母n-gram的形式(假设为trigrams:#go,goo,ood,od#)。最后该词使用字母n-gram的向量来表示。

这种方法的问题在于有可能造成冲突,因为两个不同的词可能有相同的n-gram向量来表示, 但经统计发现冲突很小。与原始的ont-hot向量表示的词典大小相比,word hashing明显降低了向量表示的维度。

DSSM的输入层,是把1个句子的multi-hot向量,转成1个3-gram的multi-hot的向量,达到降维目的,其实也是bag-of-words,忽略了词之间的顺序。

 

负例样本,就是在该query检索出来的样本里,没有被点击的样本(最后一个点击样本之前的才算进去);是不是该正例所在的query,还是所有同样query里的,就不清楚了。。。原文说,负例的采样方式(1正4负),对最终效果的影响不大。我们公司肯定是用的该query展示而未点击过的样本,而不是和该query无关的样本,为的是在高质量的召回doc里强化更语义相关的doc,属于精化。

 

损失函数:最大化{经过softmax之后,Q和D+的相似度}   (Q和D-的相似度是分母,最小化分母就等价于最大化分子了)

论文中说需要挑出点击和曝光置信度比较高且资源热度也比较高的作为训练样本,这样就过滤了 80%的长尾 query 和 Title 结果对

从对比实验看出,效果提升主要来自:1.弱监督信息的引入(click, non-click);2.word-hashing降维; 3.三个隐藏层;

 

优点:

  • 解决了LSA、LDA、Autoencoder等方法存在的一个最大的问题:字典爆炸(导致计算复杂度非常高),因为在英文单词中,词的数量可能是没有限制的,但是字母n-gram的数量通常是有限的
  • 基于词的特征表示比较难处理新词(未登录词, out-of-vocabulary),字母的n-gram可以有效表示,鲁棒性较强
  • 使用有监督方法,优化语义embedding的映射问题
  • 省去了人工的特征工程

缺点:

  • word hashing可能造成冲突
  • DSSM采用了词袋模型,损失了上下文信息
  • 在排序中,搜索引擎的排序由多种因素决定,由于用户点击时doc的排名越靠前,点击的概率就越大,如果仅仅用点击来判断是否为正负样本,噪声比较大,难以收敛; (可以把位置因素考虑进去,靠前的正例降权,靠前的负例加权)

对于中文而言,处理方式与英文有很多不一样的地方。中文往往需要进行分词,但是我们可以仿照英文的处理方式,将中文的最小粒度看作是单字(在某些文献里看到过用偏旁部首,笔画,拼音等方法)。因此,通过这种word hashing方式,可以将向量空间大大降低。

 

和RankNet的区别:

RankNet是pair-wise的,也就是<Q,D+>和<Q,D->两个相似度的差值,输入sigmoid,得到“胜出"概率,极大似然(交叉熵损失);

DSSM是1个<Q,D+>和4个<Q,D->这些相似度,经过softmax,最大化<Q,D+>相似度的label是1的概率;

 

C-DSSM

最后基于卷积的模型,要比原始的模型好10%左右,所以需要思考,为什么一个卷积的引入,就会造成这么大的性能提升?

1. Bag of Words算法是有问题的,单词之间的相关性,句法等相关,都因为求了一个Set操作,被消失殆尽,所以作者引入了卷积,这样卷积核就可以看到3个单词,捕捉到3个单词之间的相关性。

2. Maxpooling,这种pooling方式确实可以保证最后任务相关层的特征信息最有用话,因为这个神经元之间是激活-响应的关心,肯定是激活得越大,证明该神经元约起作用,如果使用AveragePooling可能会因为神经元太多,把一些有用的信息平均掉

C-DSSM卷积操作仍然有很大的提升空间,因为一层的卷积只能看到3个单词,这仍然有问题,句子的信息仍然没有捕捉到,说到底是感受野的问题,这个地方可以通过多层的卷积解决。

 

百度SimNet

2013年,用了WordEmbedding做输入!

用了句子-句子匹配度矩阵做卷积输入!

 

百度最近技术

### 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值