老早就改总结的一篇了
参考:
https://www.cnblogs.com/wmx24/p/10157154.html
https://mp.weixin.qq.com/s?__biz=MzI2MDU3OTgyOQ==&mid=2247488050&idx=1&sn=5cbc4b48dc49f541d96a418769263d22&scene=21#wechat_redirect
背景:做语义相似的召回(经典:给爷爷的手机 & 诺基亚)
模型结构:

还是从下往上说:
最下的一层500k其实是单词的数量不是模型中的任意一层,按照以往的做法就是一个500维的one-hot向量输入了;
dssm这里做了一个word-hashing,把单词每三个字母一个单元做了切分,总共3w个(第二层的30k)这样的单元,然后同样做word-hashing版的one-hot,这一层叫输入层;(会有同样的单词是一样的one-hot,但是比例极低,选用三个字母也是综合考虑了单词冲突和向量空间:

再上就是三层dnn(用的激活函数是tanh,初始化函数很复杂,且分层预训练并没有什么用),输出向量128维,这一层叫表示层;
得到输出向量后使用cos距离计算query和每个doc之间的余弦相似度,再过一个softmax,然后用logloss做极大似然,这一层叫匹配层:


这里D表示整个样本空间(其实是做了负采样,正负比大概1:4,采样比例不影响),D+表示用户搜索完query点击过的样本(有监督)

train的时候就梯度下降训练,但是serve的时候感觉就还是用knn就行
特点:
1.有监督,使用最大似然函数进行优化(传统的输入层都是LDA主题模型或者w2v embedding那样的无监督)
2.使用word-hashing方法解决大规模且稀疏的词典问题(英文的话以3个字母一个单元,汉字的话以单字作为一个单元)
3.将用户的Query行为和Document映射到同一语义空间中,通过余弦相似度计算相似性(显然了)
缺点:
1.word-hashing还是词袋模型,缺少语序信息
2.端到端结果不太可控
问题:
激活函数为什么要用tanh
余弦相似度算完后为什么还要过softmax
DSSM的变体改天再写(CNN_DSSM、LSTM-DSSM、应用双塔)