1. DSSM模型的原理简介

DSSM模型的全称是Deep Structured Semantic Model,由微软研究院开发,利用深度神经网络把文本(句子,Query,实体等)表示成向量,应用于文本相似度匹配场景下的一个算法。

DSSM模型在信息检索、文本排序、问答、图片描述、及机器翻译等中有广泛的应用。该模型是为了衡量搜索的关键词和被点击的文本标题之间的相关性。DSSM模型的原理比较简单,通过搜索引擎里Query和Document的海量的点击曝光日志,用DNN深度网络把Query和Document表达为低维语义向量,并通过余弦相似度来计算两个语义向量的距离,最终训练出语义相似度模型。该模型既可以用来预测两个句子的语义相似度,又可以获得某句子的低维语义Embedding向量。

图(1)DSSM模型的网络结构图

DSSM模型的整体结构图如图(1)所示,Q代表Query信息,D表示Document信息。

(1)Term Vector:表示文本的Embedding向量;

(2)Word Hashing技术:为解决Term Vector太大问题,对bag-of-word向量降维;

(3)Multi-layer nonlinear projection:表示深度学习网络的隐层;

其中:

表示第  层的权值矩阵, [公式] 表示第 [公式] 层的bias项。

用 tanh 作为隐层和输出层的激活函数:

(4)Semantic feature :表示Query和Document 最终的Embedding向量;

(5)Relevance measured by cosine similarity:表示计算Query与Document之间的余弦相似度;即:

(6)Posterior probability computed by softmax:表示通过Softmax 函数把Query 与正样本Document的语义相似性转化为一个后验概率;即:

其中:

为 Softmax 的平滑因子,  为Query下的正样本, [公式] 为Query的随机采取的负样本, [公式] 为Query下的整个样本空间。在训练阶段,通过极大似然估计,最小化损失函数:

2. DSSM 模型在推荐召回环节的应用

(2.1)DSSM 模型在推荐召回环节的结构

DSSM 模型的最大特点就是 Query 和 Document 是两个独立的子网络,后来这一特色被移植到推荐算法的召回环节,即对用户端(User)和物品端(Item)分别构建独立的子网络塔式结构。该方式对工业界十分友好,两个子网络产生的 Embedding 向量可以独自获取及缓存。目前工业界流行的 DSSM 双塔网络结构如图(2)所示。

图(2)工业界 DSSM 双塔模型结构图

双塔模型两侧分别对(用户,上下文)和(物品)进行建模,并在最后一层计算二者的内积。

其中:

(1)  为(用户,上下文)的特征,  为(物品)的特征;

(2)  表示(用户,上下文)最终的 Embedding 向量表示,  表示(物品)最终的 Embedding 向量表示;

(3)  表示(用户,上下文)和(物品)的余弦相似度。

(2.2)候选集合召回

当模型训练完成时,物品的 Embedding 是可以保存成词表的,线上应用的时候只需要查找对应的 Embedding 即可。因此线上只需要计算 (用户,上下文) 一侧的 Embedding,基于 Annoy 或 Faiss 技术索引得到用户偏好的候选集。

(2.3)应用Trick

(1)对双塔两侧输出的Embedding进行L2标准化;

(2)对于内积计算的结果,除以一个固定的超参。

超参的设定可以通过实验结果的召回率或者精确率进行微调。除以超参的效果如下,可以看到Softmax的效果更加明显。


下面使用一个简单的数据集,实践一下DSSM召回模型。该模型的实现主要参考:python软件的DeepCtr和DeepMatch模块。

1. 数据处理

(1.1)加载数据

samples.txt 数据可以从百度网盘下载:

链接: https://pan.baidu.com/s/1eM4q61tSrPLurQYxC29vbg 提取码: 1mjz

import pandas as pd
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_splitfrom keras.utils import plot_model
samples_data = pd.read_csv("samples.txt", sep="\t", header = None)
samples_data.columns = ["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id", "label"]samples_data.head()

本示例中包含:7个特征。

  • user端特征有5个,分别为["user_id", "gender", "age", "hist_movie_id", "hist_len"];

user_id 为 用户ID特征,离散特征,从1-3表示;
gender 为 用户性别特征,离散特征,从1-2表示;
age 为 用户年龄特征,离散特征,从1-3表示;
hist_movie_id 为 用户观看的movie序列特征,根据观看的时间倒排,即最新观看的movieID排在前面;
hist_len 为 用户观看的movie序列长度特征,连续特征;

  • movie端特征有2个,为 ["movie_id", "movie_type_id"];

movie_id 为 movieID特征,离散特征,从1-208表示;
movie_type_id 为 movie类型ID特征,离散特征,从1-9表示;

(1.2)打乱数据集

samples_data = shuffle(samples_data)X = samples_data[["user_id", "gender", "age", "hist_movie_id", "hist_len", "movie_id", "movie_type_id"]]
y = samples_data["label"]

(1.3)转换数据存储格式

train_model_input = {"user_id": np.array(X["user_id"]), \"gender": np.array(X["gender"]), \"age": np.array(X["age"]), \"hist_movie_id": np.array([[int(i) for i in l.split(',')] for l in X["hist_movie_id"]]), \"hist_len": np.array(X["hist_len"]), \"movie_id": np.array(X["movie_id"]), \"movie_type_id": np.array(X["movie_type_id"])}train_label = np.array(y)

2. 构建模型

(2.1)统计每个离散特征的词频量,构造特征参数

import pandas as pd
from deepctr.inputs import SparseFeat, VarLenSparseFeat
from sklearn.preprocessing import LabelEncoder
from tensorflow.python.keras.models import Model
from deepmatch.models import *embedding_dim = 32
SEQ_LEN = 50
user_feature_columns = [SparseFeat('user_id', max(samples_data["user_id"])+1, embedding_dim),SparseFeat("gender", max(samples_data["gender"])+1, embedding_dim),SparseFeat("age", max(samples_data["age"])+1, embedding_dim),VarLenSparseFeat(SparseFeat('hist_movie_id', max(samples_data["movie_id"])+1, embedding_dim,embedding_name="movie_id"), SEQ_LEN, 'mean', 'hist_len'),]item_feature_columns = [SparseFeat('movie_id', max(samples_data["movie_id"])+1, embedding_dim), SparseFeat('movie_type_id', max(samples_data["movie_type_id"])+1, embedding_dim)]

(2.2)构建模型

from deepctr.inputs import build_input_features, combined_dnn_input, create_embedding_matrix
from deepctr.layers.core import PredictionLayer, DNN
from tensorflow.python.keras.models import Model
from deepmatch.inputs import input_from_feature_columns
from deepmatch.layers.core import Similaritydef DSSM(user_feature_columns, item_feature_columns, user_dnn_hidden_units=(64, 32),item_dnn_hidden_units=(64, 32),dnn_activation='tanh', dnn_use_bn=False,l2_reg_dnn=0, l2_reg_embedding=1e-6, dnn_dropout=0, init_std=0.0001, seed=1024, metric='cos'):embedding_matrix_dict = create_embedding_matrix(user_feature_columns + item_feature_columns, l2_reg_embedding,init_std, seed,seq_mask_zero=True)user_features = build_input_features(user_feature_columns)user_inputs_list = list(user_features.values())user_sparse_embedding_list, user_dense_value_list = input_from_feature_columns(user_features,user_feature_columns,l2_reg_embedding, init_std, seed,embedding_matrix_dict=embedding_matrix_dict)user_dnn_input = combined_dnn_input(user_sparse_embedding_list, user_dense_value_list)item_features = build_input_features(item_feature_columns)item_inputs_list = list(item_features.values())item_sparse_embedding_list, item_dense_value_list = input_from_feature_columns(item_features,item_feature_columns,l2_reg_embedding, init_std, seed,embedding_matrix_dict=embedding_matrix_dict)item_dnn_input = combined_dnn_input(item_sparse_embedding_list, item_dense_value_list)user_dnn_out = DNN(user_dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout,dnn_use_bn, seed, )(user_dnn_input)item_dnn_out = DNN(item_dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout,dnn_use_bn, seed)(item_dnn_input)score = Similarity(type=metric)([user_dnn_out, item_dnn_out])output = PredictionLayer("binary", False)(score)model = Model(inputs=user_inputs_list + item_inputs_list, outputs=output)model.__setattr__("user_input", user_inputs_list)model.__setattr__("item_input", item_inputs_list)model.__setattr__("user_embedding", user_dnn_out)model.__setattr__("item_embedding", item_dnn_out)return model

(2.3)编译模型及训练模型

model = DSSM(user_feature_columns, item_feature_columns)
model.compile(optimizer='adagrad', loss="binary_crossentropy", metrics=['accuracy'])history = model.fit(train_model_input, train_label,batch_size=256, epochs=10, verbose=1, validation_split=0.2, )

训练过程如图所示:

DSSM模型的原理简介,预测两个句子的语义相似度相关推荐

  1. matlab源代码 语义相似度计算,如何计算两个句子之间的相似度(句法和语义)...

    我应该每次取两个句子并计算它们是否相似.我的意思是,在语法和语义上都是这样.如何计算两个句子之间的相似度(句法和语义) INPUT1:奥巴马签署法律.奥巴马签署了一项新法律. INPUT2: 总线停在 ...

  2. python 句子相似度 库_利用python语句的word2vec查找两个句子之间的相似度

    我想用word2vectors计算两个句子之间的相似度,我试图得到一个句子向量的向量,这样我就可以计算出一个句子向量的平均值来找到余弦相似度.我试过这个代码,但它不起作用.它给出的输出是带有一的句子向 ...

  3. python 两个word文档之间的相似度_如何用 word2vec 计算两个句子之间的相似度?

    现在是2018年7月,在这里总结这个问题下已有的答案,并补充一些2017年以来这方面研究的新进展. 从大类上分,计算句子相似度的方法可以分为两类: 1)无监督的方法,即不使用额外的标注数据,常用的方法 ...

  4. DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算

    在NLP领域,语义相似度的计算一直是个难题:搜索场景下query和Doc的语义相似度.feeds场景下Doc和Doc的语义相似度.机器翻译场景下A句子和B句子的语义相似度等等.本文通过介绍DSSM.C ...

  5. 【深度学习】DSSM模型介绍(1)

    DSSM (Deep Structured Semantic Models)用于文本相似度匹配场景,是为了平衡搜索的关键词,和被点击的文本标题之间的相关性. 论文地址:https://www.micr ...

  6. 深度学习解决NLP问题:语义相似度计算——DSSM

    tongzhou 转载请注明出处: http://blog.csdn.net/u013074302/article/details/76422551 导语 在NLP领域,语义相似度的计算一直是个难题: ...

  7. linux设备驱动程序架构的研究,Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介)...

    Linux设备驱动程序学习(12) -Linux设备模型(底层原理简介) 以<LDD3>的说法:Linux设备模型这部分内容可以认为是高级教材,对于多数程序作者来说是不必要的.但是我个人认 ...

  8. 复现计算机论文模型,深度学习模型复现难?看看这篇句子对模型的复现论文

    原标题:深度学习模型复现难?看看这篇句子对模型的复现论文 在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 ...

  9. dcc-garch matlab,dcc-garch原理简介和模型实现

    一.原理 DCC-GARCH(DynamicConditional Corelational Autoregressive Conditional Heteroscedasticity Model)用 ...

  10. AI:人工智能领域算法思维导图集合之有监督学习/无监督学习/强化学习类型的具体算法简介(预测函数/优化目标/求解算法)、分类/回归/聚类/降维算法模型选择思路、11类机器学习算法详细分类之详细攻略

    AI:人工智能领域算法思维导图集合之有监督学习/无监督学习/强化学习类型的具体算法简介(预测函数/优化目标/求解算法).分类/回归/聚类/降维算法模型选择思路.11类机器学习算法详细分类(决策树/贝叶 ...

最新文章

  1. 学习全基因组测序数据分析2:FASTA和FASTQ
  2. 实战:遇到HTM的文件图标丢失的问题
  3. 博图程序需要手动同步_贴吧求助帖博图实例单按钮控制灯的程序
  4. pythonnone用法_python中None返回值如何使用?
  5. 程序员啊程序员...济南昊锐科技
  6. 【ssh登陆问题】no matching cipher found / no matching key exchange method found
  7. c++primer 第2章 书上例子 资料截图等
  8. python ca模块_python学习之模块-模块(五)
  9. [转载] Java中的abstract关键字
  10. Linux入门相关基础知识
  11. 2021-1-28Linux学习纪要
  12. OCR图像识别与汽车后市场
  13. 图论(Tarjan算法与无向图)
  14. 软考——中级软件设计师备考建议
  15. 免费高效的WhatsApp助手
  16. DataGridView使用技巧十二:DataGridView Error图标表示的设定
  17. word文档解密方法
  18. 远程桌面3389加固
  19. 更改Pycharm的配置文件的存放路径
  20. Unity实现签到系统

热门文章

  1. 利用反射获取程序集下所有符合条件的类及其属性
  2. 关于三种主流WEB架构的思考
  3. 让IE6支持min-width和max-width的方法
  4. 利用HttpOnly来防御xss攻击
  5. 基于Berkeley DB实现的持久化队列
  6. Win2008 R2 VDI动手实验系列之六:远程桌面虚拟机配置
  7. 6. Keras-RNN应用
  8. python接口自动化测试框架_Python3+Requests+Excel完整接口自动化测试框架的实现
  9. oracle创建默认序列号,PLS-00103:为序列号oracle创建触发器(PLS-00103: Create trigger for sequence number oracle)...
  10. 浅析单调递增子序列问题(LIS)