在工业界DSSM(Deep Structured Semantic Models)已经演化成一种语义匹配框架,不仅用于文本的匹配,也用于推荐系统的User-Item的匹配,本文描述与实现DSSM在文本匹配上的应用,主要内容如下:
- DSSM原理
- 数据预处理
- 模型实现
- 模型训练
- 模型预测
DSSM原理
DSSM的主要结构如下:
主要分为表示层和匹配层,表示层可使用全连接、RNN、Transformer等等网络得到query和doc的向量,匹配层一般使用cosine相似度来计算query和1个正样本doc和N个负样本doc的相似度。这里就不讲解原始论文里DSSM的原理了,只讲其在文本上是如何使用的,有兴趣的朋友可以参考原论文《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data》。
- 表示层
原始论文中主要针对英文,为了降维做了word hashing,而中文常用汉字只有1万左右。我们将query和doc的字直接传入embedding,然后接一层双向的GRU,假设每个字的embedding表示为,则GRU表示为:
然而,并不是每个字都是我们所需要的,所以在GRU后面再接一层Attention,其表示为:
即通过一个线性层对GRU的输出进行变换,然后通过softmax公式计算出每个字的重要程度,最后与GRU的输出求和得到句子的表示。
- 匹配层
得到query和doc的向量表示之后(一般为64或128维向量),计算他们之间的cosine相似度:
并通过softmax将query与正样本doc的相似度计算转换为后验概率,计算如下:
其中为softmax平滑因子,可设置为固定值(如20,50等)也可以用一个参数去学习。D+为query对应的正样本,D'为随机采样的query对应的N个负样本。
训练时通过极大似然估计最小化损失函数:
数据预处理
这里我们采用某新闻语料,训练样本格式为每行:标题\t正文,作为一条样本。
- 将句子转换成ID序列
def sent2id(sent, vocab, max_size=30):
sent = [vocab[c] for c in sent if c in vocab]
sent = sent[:max_size] +