导语
NLP领域,语义相似度的计算一直是个难题:搜索场景下queryDoc的语义相似度、feeds场景下DocDoc的语义相似度、机器翻译场景下375度算发烧吗A句子和B句子的语义相似度等等。本文通过介绍DSSMCNN-DSSMLSTM-DSSM等深度学习模型在计算语义相似度上的应用,希望给读者带来帮助。
0. 提纲
1. 背景
2. DSSM
3. CNN-DSSM
4. LSTM-DSSM
5. 后记
6. 引用
1. 背景
搜索引擎搜索广告为例最重要的也最难解决的问题是语义相似度,这里主要体现在两个方面:召回和排序。
召回时,传统的文本相似性如 BM25,无法有效发现语义类 query-Doc 结果对,如"从北京到上海的机票""携程网"的相似性、"快递软件""菜鸟裹裹"的相似性。
排序时,一些细微的语言变化往往带来巨大的语义变化,如"小宝宝生病怎么办""狗宝宝生病怎么办""深度学习""学习深度"
DSSMDeep Structured Semantic Models)为计算语义相似度提供了一种思路。
本文的最后,笔者结合自身业务,对 DSSM 的使用场景做了一些总结,不是所有的业务都适合用 DSSM
2. DSSM
DSSM [1]Deep Structured Semantic Models)的原理很简单,通过搜索引擎里 Query
Title 的海量的点击曝光日志,用 DNN Query Title 表达为低纬语义向量,并通过 cosine 距离来计算两个语义向量的距离,最终训练出语义相似度模型。该模型既可以用来预测两个句子的语义相似度,又可以获得某句子的低纬语义向量表达
DSSM 从下往上可以分为三层结构:输入层表示层匹配层
2.1 输入层
输入层做的事情是把句子映射到一个向量空间里并输入到 DNN 中,这里英文和中文的处理方式有很大的不同
1)英文
英文的输入层处理方式是通过word hashing举个例子,假设用 letter-trigams 来切分单词(3 个字母为一组,#表示开始和结束符),boy 这个单词会被切为 #-b-o, b-o-y, o-y-#
这样做的好处有两个:首先是压缩空间50 万个词的 one-hot 向量空间可以通过 letter-trigram 压缩为一个 3 万维的向量空间。其次是增强范化能力,三个字母的表达往往能代表
英文中的前缀和后缀,而前缀后缀往往具有通用的语义。
这里之所以用 3 个字母的切分粒度,是综合考虑了向量空间单词冲突
50 万个单词的词库为例,2 个字母的切分粒度的单词冲突为 1192(冲突的定义:至少有两个单词的 letter-bigram 向量完全相同),而 3 个字母的单词冲突降为 22 效果很好,且转化后的向量空间 3 万维不是很大,综合考虑选择 3 个字母的切分粒度。
2)中文
中文的输入层处理方式与英文有很大不同,首先中文分词是个让所有 NLP 从业者头疼的事情,即便业界号称能做到 95%左右的分词准确性,但分词结果极为不可控,往往会在分词阶段引入误差。所以这里我们不分词,而是仿照英文的处理方式,对应到中文的最小粒度就是
单字了。(曾经有人用偏旁部首切的,感兴趣的朋友可以试试)
由于常用的单字为 1.5 左右,而常用的双字大约到百万级别了,所以这里出于向量空间的考虑,采用字向量one-hot)作为输入,向量空间约为 1.5 万维。
2.2 表示层
DSSM 的表示层采用 BOWBag of words)的方式,相当于把字向量的位置信息抛弃了,整个句子里的词都放在一个袋子里了,不分先后顺序。当然这样做会有问题,我们先为 CNN-DSSM LSTM-DSSM 埋下一个伏笔。
紧接着是一个含有多个隐层的 DNN,如下图所示:
Wi 表示第 i 层的权值矩阵,bi 表示第 i 层的 bias 项。则第一隐层向量 l1300 维),第 i 个隐层向量 li300 维),输出向量 y128 维)可以分别表示为:
tanh 作为隐层和输出层的激活函数:
最终输出一个 128 维的低纬语义向量。