DSSM文本匹配在语义召回中的应用
DSSM双塔模型在2013年被微软在论文Learning Deep Structured Semantic Models for Web Search using Clickthrough Data中提出,其应用途径由最初的文本匹配和搜索逐渐推广到了推荐搜索、计算广告、信息流推荐以及机器翻译等等。
一、DSSM介绍
DSSM在搜索推荐中的原理也比较简单:
- 1、获取搜索引擎中的用户搜索query和曝光doc数据,
- 2、训练过程中,首先分别构建query和doc的embedding,
- 3、其次用深度学习复杂网络构建模型的语义表示表示层,
- 4、模型的输出一般是计算query和doc的cos距离来计算语言相似度,最终获得语义模型,
- 4、线上infer阶段,首先缓存doc侧所有的embedding,然后实时query通过query测计算embedding,再与计算好的doc的embedding 计算相似度召回。
简化论文中的模型结构,我们可以把DSSM模型总共分成三层:输入层,表示层和匹配层,分别对应到上面的 2,3,4 三点。
根据表示层的不同,近年发展出了一系列DNN-DSSM,LSTM—DSSM等等,当然你也可以使用其他诸如CNN和Transformer等作为表示层网络。
在计算广告领域,query层往往还包括了用户的其他特征,属于另一种模型的变异,可以参见1
二、DSSM实践
DSSM模型结构比较简单,实现上常常用正负样本分类的方式训练模型,通常有二分类和多分类的方式,需要注意的是采用多分类时,doc侧网络需要公用网络层。
# 定义网络层
embedding_layer = Embedding(embedding_look_up, 128, input_length=item_len_query,
embeddings_initializer='random_uniform')
# query tower
input_query = Input(shape=(pad,), name='input_query')
embedding_query = embedding_layer(input_query)
inception_query = TextCNN()(embedding_query)
# item tower
input_item = Input(shape=(item_len_query,), name="item_input")
embedding_item = embedding_layer(input_item)
inception_item = TextCNN()(embedding_item)
# cosine sore
cosine_scores = Lambda(cosine_distance, output_shape=cos_dist_output_shape)([inception_query, inception_item])
prob = Dense(1, activation='sigmoid')(cosine_scores)
model = Model(inputs=[input_query, input_item], outputs=prob)
model.compile(
optimizer="adam",
loss="binary_crossentropy",
metrics=['accuracy'])
model.summary()
笔者也尝试过基于Transformer的多塔模型,限于篇幅,代码就不提供了,结构如下,其效果明显优于基于TextCNN-DSSM模型。
三、DSSM的优缺点
3.1、优点
- 相比于LSA、LDA、Autoencoder等方法等语义模型存在字典爆炸问题,DSSM在计算上花销更少
- 使用有监督的方法,优化语义embedding的映射问题
- 省去大量的人工特征
3.2、缺点
- 采用词袋模型时没有考虑词的位置关系,对语义理解存在损失。(不过如果采用LSTM或者Transformer作为网络结构可以解决这个问题)
- 采用弱监督和端到端的这种方式,模型预测结果不可控。
四、总结
对于电商商品召回来说,DSSM不可以不说是一个非常快速有效有方法,Google、百度和阿里等都有类似的实践。若需要更精确的召回,还可以在模型输入层加上其他特征,比如商品的品牌,类别等,甚至可以用上attention,参见苏宁的实践方案2。