雷锋网按:本文作者张俊林,主要介绍了3种基于深度RNN的语义搜索模式。
本文讨论如何用深度学习系统来构造语义搜索引擎的问题。这里所谓的语义搜索,是指的能做用户查询和搜索网页之间的语义级别匹配,比如说,用户输入“Iphone”,虽然某篇文章讲到了“苹果公司正在试图做新型的手机”,但是没有明确说iphone的字样,那么即使如此也能够将这篇文章找出来。传统的搜索引擎对于这种情况是无能为力的,因为它们基本上还是基于字面匹配作为排序的基础的,没有任何字面匹配的结果是不会被搜索出来的,即使两者在语义上讲非常相关也不行。
搜索引擎大家平常都会用,所以这块不必说。但是从技术角度讲,搜索是在干什么事情?这个需要简单说明一下。所谓搜索,就是说我们手头假设有10亿个网页,形成文档集合D,用户想找一个信息,向搜索引擎发出用户查询Query。搜索引擎本质上就是计算文档集合D中每个网页和用户查询Query之间的相关程度,越相关的排在搜索结果前列,就形成了搜索结果。
所以本质上搜索就是对于两个信息:Query 和某篇文档Di,计算两者之间的相关程度。传统的方法是寻找两者之间的特征重合程度来判断的(此文我们不考虑链接关系等因素,纯考虑文本匹配角度),比如TF.IDF啊,查询词是否在标题出现啊等等特征。
也就是说,对于搜索来说,可以将其改造成句子对匹配的问题,即可以如下理解搜索问题:
意思是说,给定了用户查询和某篇文章,经过映射函数,给出两者相关还是不相关的判断,或者给出从1到5的不同相关程度的分类结果,1代表不相关,5代表非常相关:
就是说给定Doc和Query,利用神经网络构造映射函数,映射到1到5分值空间里面。
之前我们归纳过对于句子匹配问题常见的几种基于RNN的网络结构,而本文给出将搜索问题看做是典型的句子匹配问题以及将其看做是特殊的句子匹配问题的神经网络结构。我们可以将这种基于RNN构建出的语义搜索神经网络结构称之为NeuralSearch结构。就我的阅读视野范围来看,目前看到过CNN做搜索问题的,还没有看到RNN结构的。当然其实神经网络做搜索的工作相对来说不多,这可能跟查询太短文档太长有一定关系,至于这里介绍的方法是否有效我也不知道,本文只是把这个想法分享一下。
在给出后续的RNN结构前,先给出一个非常简单易行的非监督的语义搜索模型。
其实你要想通过神经网络做语义搜索,有一种非常简单的方式。这里描述下其工作机制。
图1 抽象的语义搜索结构
图1给出了一个最抽象的神经网络做语义搜索的模型结构。它的核心思想是:把文档集合D中的每个网页通过一定映射方法表示为Word Embedding的表达方式,同时把用户查询Q也映射到Word Embedding表达方式,在这里其实已经分别将查询和文档映射到了语义空间了。然后对两者通过相似性函数进行匹配:
然后根据相似性得分由高到低输出就完成了文档排序工作,给出了搜索结果。
之前有一些结合Word Embedding和IR的工作其实都是在这个抽象框架里覆盖范围里的,区别无非在于:从文档的单词列表如何映射出文档的Word Embedding表示可能方法(图1中的文档WE转换模块)是不一样的;从用户查询如何映射出查询的Word Embedding表示可能方法(图1中的查询WE转换模块)是不一样的;相似性计算函数F可能也是不一样的。
在这个框架下,我们给出一个最简单易行的做语义搜索的方法,在上述框架下,只需要做两点:
1. 如何获得文档的Word Embedding表示以及如何获得查询的Word Embedding表示?直接把单词的Word Embedding表示累加或者求个平均即可,简单吧。其实这种方法效果并不一定就差,在有些场合直接累加效果还是挺好的,实现起来又异常简单;
2. 文档和查询的相似性度量函数如何取?直接用Cosine计算就行。
这样,就能够构造出非常简单可行的语义搜索系统了。由于采用的是Word Embedding表示,所以它肯定可以支持语义搜索,因为即使文档里面没有出现过查询词,只要文档中包含和查询词语义接近的单词,那么他们的Word Embedding就非常像,就能算出语义相似性来。
从感觉上说,这种非监督的方法肯定能增加搜索系统的召回率,因为原先无法匹配的文档现在可以匹配了,但是理论上说对于搜索精度来说很可能是下降的,所以可能需要和传统方法结合来一起用。
在图1的抽象结构上,其实我们很容易产生一个创新性想法,就是把个性化搜索融合进来,做个“个性化语义搜索引擎”,改动很简单,只需要加入一个用户个性化建模模块即可,如图2所示,只需要把用户个人历史通过“User历史WE转换模块”来将用户个性模型能够表达为Word Embedding形式,就将个性化因素融合到这个语义搜索系统里面来了。
图2 个性化语义搜索抽象框架图
这个结构目前好像我也没看到过有提到的,应该是种新想法,当然,算是一种简单的新想法。而且如何构建个性化模块可能有很多不同的方法,所以这个结构也是大有文章可作的。
在之前的文章里面,我们从现有文献里面归纳抽象出了用RNN解决句子匹配问题的几种常见神经网络结构。既然我们把搜索问题看做是句子匹配问题,那么完全可以套用这些模型来解决这个问题。当然,直接使用RNN累加一个文档Word Embedding未必是个很好的想法,但是这块可以采用分句子给出Word Embedding,然后在累加等其它变体,这里为了简化说明,采用简单方法描述。
图3 NeuralSearch结构一
图3是第一种可能的RNN解决语义搜索问题的神经网络结构,我们可以称之为NeuralSearch Model1。核心思想是:针对文档D和用户查询Q,分别建立一个深度RNN神经网络,用来抽取两者的特征,然后将两者特征拼接成MLP三层神经网络结构的输入层,进行非线性变换,在这里来探讨两者之间的关系,之后给出分类结果。图中W代表文档中出现的单词,而Q代表查询中出现的单词。与CNN模型比,RNN模型可以显示地将单词顺序因素考虑进来。
图4 NeuralSearch结构二
图4是第二种可能的RNN解决语义搜索问题的神经网络结构,我们称之为NeuralSearch Model2。核心思想是:将文档D和用户查询Q的单词依次拼接起来作为深层RNN结构的输入,两者之间用特殊分隔符EOS来进行分隔,然后上面套上深层RNN结构,在此之上,可以用Mean Pooling来收集各个BLSTM单元的投票信息,并通过SoftMax给出最终分类结果。一样的,图中W代表文档中出现的单词,而Q代表查询中出现的单词。这种模型相对NeuralSearch Model1来说,在神经网络输入层级就开始对D和Q中单词之间的关系建立联系。
图5 NeuralSearch结构三
图5是第三种可能的RNN解决语义搜索问题的神经网络结构,我们称之为NeuralSearch Model3。这个模型和NeuralSearch Model2在输入层以及之后的深度网络结构是一样的,区别在于:在做最后分类之前,不是每个BLSTM单元各自做出投票,而是将双向RNN的首节点和尾节点隐层状态拼接起来作为最后分类的基础,因为这两个状态存储了文档D和用户查询Q之间的语义关系信息。
我们标题说的是语义搜索,但是好像半天没讲语义怎么体现出来的,其实最初那个简单语义搜索模型已经能够说明这个问题了,只要单词是以Word Embedding的方式进行的,那么其实已经能够处理那些字面不同但是语义相同的语义匹配问题了,也就是说,它肯定是语义级别进行匹配的。
上面三种结构是将搜索问题完全看成句子匹配问题引出的,下面看看是否可以构造具有搜索特性的网络结构。
因为搜索问题和一般的句子匹配问题相比,有个明显的特点:文档内容长,而用户查询短,也就是两者信息含量非常不同。在此基础上看,是否采用典型的RNN句子匹配思路来做会获得非常好的效果,带有一定的不确定性因素,因为上面的结构中查询很短而文档很长,拼接作为输入是否查询信息会被弱化,以及LSTM是否能够捕获如此长距离的关系等影响都是未知数。
那么我们是否可以根据搜索问题的特点,来对RNN模型结构进行进一步的改造,使得神经网络结构更能符合搜索任务的特点。
图6 NeuralSearch结构四
图6是这种经过特殊化改造的感觉更适合搜索场景的NeuralSearch结构,我们称之为NeuralSearch Model4。首先,第一层神经网络首先把用户查询和文档的每个句子根据RNN进行语义编码,上层仍然采用经典的深层双向RNN结构,与之前的网络结构区别在于:对于每个BLSTM单元来说,输入由两部分拼接而成,一个是Query 的语义编码,另外一个是某个句子的语义编码。两者拼接后作为新的输入,这样每个BLSTM节点实际是在判断每个句子和用户查询的相关程度,而通过双向RNN结构将构成文档的所有句子按照顺序串接起来,这里的RNN结构是能体现句子之间的顺序关系的。对于更深层的网络来说,不断重复这个过程,直到最高层的BLSTM产生输出,而对于每个句子的输出通过Mean Pooling进行信息融合,然后通过SoftMax产生最后的分类结果,也就是{1,2,3,4,5}几个不同相关类别中。这个过程可以理解为判断查询和每个句子之间的语义相关程度,然后每个句子做出投票,根据每个句子的投票结果构造出文档整体和查询的语义相关程度。
可以看出,上述结构把文档转换为句子的集合,而在每一层结构中反复使用用户查询,同时在每个句子处反复拼接用户查询,通过这种方式,一方面可以试图解决文档和查询长度差异极大的情况,对用户查询进行了强化,另外一方面这种将查询的语义表示在不同层级间反复使用的思路,类似于Residual Network的那种建立输入和深层网络中间结构之间的ShortCut直连思想。
有了上述几种NeuralSearch神经网络结构,可以采取传统的Learning to rank的思路,用人工标好的训练数据去训练神经网络。当神经网络训练好之后,就可以集成到搜索系统里,来实现语义搜索的功能。
当然,上述几种RNN结构做搜索是我自己拍脑袋想的,目前还没有看到相似想法的相关文献,而我也没有时间精力以及训练数据来对其效果进行验证,所以上述的任意一种结构用来解决搜索问题是否有效也没有结论。很可能其中某种会有效,也许都没有效果。所以这里对此不能作任何结论性的假设或说明,只是将一种自己认为也许可行的思路分享出来,有兴趣的且有数据的同学可以试试。
最后再补充两句,其实如果对Learningto rank有了解的同学可以看出来,Learning to rank包含三种范型:单文档方法、文档对方法和文档列表方法。上面几个模型本质上都是单文档方法,其实可以将RNN神经网络和文档对方法以及文档列表方法结合起来构建新的Learning to Rank模型,这块我不确定是否已经出现,就我跟踪的范围看好像还没有看到,但是很明显的一点是,这个结合的出现只是时间问题。而这种结合如果证明有效,就是比较大的创新,所以这块是有很多文章可以做的,我是一没有数据二没有精力放在这块,否则条件允许,这个方向是值得投入较大精力去摸索的。
雷锋网注:本文转自CSDN,转载请联系授权,并注明作者和出处,不得删减内容。