文章下载地址:https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2014_cdssm_final.pdf
DSSM模型的输入是query和doc的词袋模型生成的向量,所以模型丢失来文本的上下文结构信息。而CDSSM模型则通过词的n-gram和卷积池化操作来捕获上下文关系,按文章说明的,该算法相比原始DSSM将近会有10%的效果提升。
直入主题
按图从上到下进行讲解
1. Query/document 是输入模型的query和doc句子,这里分别对输入的句子首尾用<s>进行了填充,保证在n-gram和卷积的时候每个词的前后都有词。
这个不用多说了,就是输入的句子。
2. Sliding window 是定义滑动窗口对输入的句子做n-gram,来获取word-n-gram,文章用的tri-gram。
3.word-n-gram layer 是经过滑窗处理后的word-n-gram 数据。
4.Letter-trigram layer 是对word-n-gram 按原始dssm说的那个把单词用n-gram进行切割的方式进行处理,不过在进行词袋模型统计的时候统计的是word-n-gram了,不再是整个句子。
下面针对2,3,4进行讲解
letter-trigram based word-n-gram representation
一个单词通常被表示为一个one-hot向量,但是因为词汇量过大,数据会很稀疏,所以这里的输入也用到了word hashing 技术。比如把一个单词 (boy)前后填充上词边界标识,变为#boy#,然后做letter-n-grams,比如做letter-tri-grams,就能获得#bo,boy,oy#。然后我们就可以把单词表示成letter-tri-grams多热向量,如下所图所示:
这样就能大大减少单词的向量的维度。
框架图中的letter-trigram 矩阵就是将一个单词转化为对应的letter-trigram向量。
然后一个word-n-gram里面会有多个词,比如word-tri-gram按窗口为3将句子进行切分的话,一个word-tri-gram里面就有三个单词。那么这个word-tri-gram的表示就用每个单词的letter-trigram拼接起来来表示。
比如句子的第t个word-n-gram就直接表示为:
其中是第t个词的letter-trigram表示,n=2d+1是滑动窗口的大小。如果letter-trigram的词汇量大小为30k的话,那么word-n-grams的向量表示就是n*30k。模型框架图中的90k就是因为窗口大小n=3。
5.卷积矩阵
可以理解为卷积模版
6.卷积层
其实5,6就是在做一个事情,把原始dssm的全连接网络转化成卷积网络,因为是一维向量所以用的一维卷积,
其输出就是上一层一个word-n-gram输出的,输出为:
就是卷积矩阵,激活函数选择的tanh()函数。
7.max-pooling 池化层也是经常和卷积一起配合使用的操作了,这里之所以选择max-pooling是因为,语义匹配的目的是为了找到query和doc之间的相似度,那么就需要去找到两者相似的点,max-pooling则可以找到整个特征图中最重要的点,而avg-pooling则容易把重要的信息平均掉。
但是为了让最后不定长句子的输入也有定长的向量输出,这里的max-pooling是基于每个word-n-gram输出向量,在每个向量的不同维度上的max-pooling。就是这么个意思:
i是向量的第i个维度,这样就能保证最后输出的维度一致了。
其实到这里输出的向量已经可以作为潜在的语义向量使用了,
不过作者还在这后面加了一个全连接网络,即
8.semantic matrix 就是全连接矩阵
9.semantic layers 就是经过全连接后的最后一层输出。
之所以再加一层全连接无非是想对提取的向量再做一次非线性映射,让输出的向量能更好的在欧式空间内进行度量。
最后的损失函数,相似度度量等,都和原始的dssm一毛一样了。可以去看看我前面写的那篇DSSM。
完