行业报告 AI展会 数据标注 标注供求
数据标注数据集
主页 > 机器学习 正文

《搜索与推荐中的深度学习匹配》之搜索篇

 

讲真,很久没看过能让我这么兴奋的资料了,这个 tutorial https://www.comp.nus.edu.sg/~xiangnan/sigir18-deep.pdf 简直就像一个博士论文,能让我对这个方向有足够深入的了解。而我最近又恰好从事这个方向,恰好也是落地到搜索引擎和推荐系统中,刚看到这个 tutorial 的时候,简直开心得不要不要的。

本篇 blog 的纲要:

  • part-1 搜索和推荐的概述
  • part-2 什么是语义匹配
  • part-3 匹配问题的重要性
  • part-4 搜索的 query 和 doc 匹配的核心因素
  • part-5 搜索中的传统匹配模型
  • part-6 搜索里的深度学习语义匹配的方法分类
  • part-6.1 Representation based 的一些方法介绍

  • part-6.2 Interaction based 的一些方法介绍
  • part-6.3 representation-based 和 interaction-based 方法的融合
  • part-7 搜索里的 query 和 doc 的相关性匹配

  • part-7.1 based on Global Distribution of Matching Strengths 的一些方法介绍

  • part-7.2 based on Local Context of Matched Terms 的一些方法介绍
  • part-8 short summary

part-1 搜索和推荐的概述

  • 搜索

搜索是一个用户主动输入 query,用 query 比较明确的表达自己需求,然后从搜索引擎的网页库中获取自己想要的信息的过程。

  • 推荐

推荐一般是非主动触发的,一般没有用户输入的 query,用户的兴趣由他过去的行为、用户的一些属性(例如职业、年龄、性别等)、以及当前的上下文来隐式地表达,推荐的实体可以是电商的宝贝、电影、标签、好友等。推荐里的两大实体:user 和 item,他们是不同类型的东西,不像搜索里的 query 和 doc 都是文本。

举个例子,在下述的特征体系中,用户和 item 字面(表面)上的匹配没有任何的重叠。

part-2 什么是语义匹配

例如在搜索中,同样想知道 iPhone 手机的价格,两个 query:“iphone 多少钱”和“苹果手机什么价格”,这两个 query 的意思是完全一样的,但是字面上没有任何的重叠,用 bm25 和 tfidf 来计算,他们的相似度都是 0。语义匹配就是要解决这种字面上不一定重叠,但是语义层面是相似的文本匹配问题。

part-3 匹配问题的重要性

大部分的机器学习所应用的系统,例如搜索、推荐、广告,其实都可以分为召回和排序两个阶段,召回是一个拉取候选集的过程,往往就是一个匹配问题,而且很多匹配特征会是排序阶段的重要依据。再进一步说,搜索、推荐、广告本身其实就是一个匹配问题。

part-4 搜索的 query 和 doc 匹配的核心因素

例如

  • query: Down the ages noodles and dumplings were famous Chinese food
  • doc: … down the ages dumplings and noodles were popular in China …

那么要做好 query 和 doc 的匹配任务,要从以下几个点入手:

  • 建立词和词之间的语义匹配:

  • 精确匹配的词: Down~down,dumplings~dumplings

  • 语义相似的词:famous ~ popular, Chinese ~ China
  • 识别词序信息和大粒度匹配:

  • N-grams: “down the ages” ~ “down the ages”

  • N-terms: “noodles and dumplings” ~ “dumplings and noodles”

那么到底是词的出现信息更重要,还是词的顺序更重要呢?slide 中很好的说明了这个问题,80% 由出现信息决定,20% 由词的顺序决定:

part-5 搜索中的传统匹配模型

这里不详细展开,但举几个例子

  • tf-idf
  • bm25
  • 隐式模型:一般是将 query、title 都映射到同一个空间的向量,然后用向量的距离或者相似度作为匹配分,例如使用主题模型:

  • 翻译、转换模型:将 doc 映射到 query 空间,然后做匹配;或者计算将 doc 翻译成 query 的概率 (同语言的翻译问题)。

part-6 搜索里的深度学习语义匹配的方法分类

  • representation-based

这类方法是先分别是学习出 query 和 doc 的语义向量表示,然后用两个向量做简单的 cosine(或者接 MLP 也可以),重点是学习语义表示 (representation learning)。

这种方法的模型分两个步骤:

  • interaction based

这种方法是不直接学习 query 和 doc 的语义表示向量,而是在底层,就让 query 和 doc 提前交互,建立一些基础的匹配信号,例如 term 和 term 的匹配,再想办法把这些基础的匹配信号融合成一个匹配分。

这种方法也分为两个步骤:

part-6.1 Representation based 的一些方法介绍

  • Deep Structured Semantic Model (DSSM)

语义匹配的开山之作。这个模型,用 MLP 来分别学习 query 和 doc 的语义向量表示:

  • 首先,这是模型使用 letter-trigrams,即 letter 级别的 trigram 来表示词(即在每个单词前后插入一个 #,然后使用每一个 letter-trigrams 来表示单词):

  • “#candy# #store#” –> #ca can and ndy dy# #st sto tor ore re#

  • Representation: [0, 1, 0, 0, 1, 1, 0, …, 1]
  • 将每一个 letter-trigram 映射成一个 d 维的向量
  • 将 query 内所有的 letter-trigram 的向量相加得到一个 d 维的向量(bag of words,词袋模型);因为是相加,所以是词袋模型;相加还有一个作用是,将变长的向量转化为定长
  • 将 doc 内所有的 letter-trigram 的向量相加得到一个 d 维的向量(bag of words,词袋模型
  • 后续继续接几个 FC 来分别学习 query 和 doc 的语义向量
  • 然后用 query 和 doc 的语义向量的 cosine 表示它们的相似度打分

dssm 的 loss function:

point-wise 的 loss,例如 log-loss,即和 ctr 点击率预估一样,相关的文档的 label 为 1,不相关的文档的 label 为 0

使用 bag of letter-trigrams 的好处:

  • 减少字典的大小,#words 500K -> letter-trigram: 30K
  • 处理 out of vocabulary 的问题,对于训练数据中没出现的单词也可以处理,提高了泛化性
  • 对于拼写错误也有一定的鲁棒性

dssm 的缺点:

  • 词袋模型,失去了词序信息
  • point-wise 的 loss,和排序任务 match 度不够高。可以轻松的扩展到 pair-wise 的 loss,这样和排序任务更相关。

那么怎么获取词序信息呢?答案是可以使用 CNN 和 RNN。

  • CNN

  • CNN 对文本建模的常见操作,以 CNN 如何获得一个句子的向量为例:

  • 假设输入句子是 sen=[A B C D E],每个单词映射成一个 100 维的向量

  • 假设卷积核窗口大小为 k=3,那么每次对 3 个单词的向量(concat,得到 3*100 的一个 300 维的向量)进行卷积,卷积结果得到一个值,类似以下过程:
  • out_1 = w_1x_1 + w_2x_2+…..w_300*x_300

  • 那么依次对 ABC、BCD、CDE 进行卷积,就会得到三个值:out_1、out_2、out_3

  • 对 out_1、out_2、out3 取最大值, 即所谓的 max-pooling,就会得到一个值,不妨叫 max_out_1
  • 上面是只有一个卷积核的情况,如果我们使用 128 个卷积核,就会得到 128 个值,这 128 个值就可以当成句子的向量

例如,我们要提取 query 的句子向量表示,可以表示为下图:

以上的操作中,卷积的时候,就类似抓取 trigram 信息,这个过程是保持局部的词序信息的(局部统筹)。但是 max-pooling 的时候,又把次序信息丢失了,max-pooling 类似一个全局统筹的操作,抓取最强的语义信息。可以有其它的 pooling 操作,可以部分的保留次序信息,这里先不展开。另外,pooling 还有一个作用,可以将变长的东西,变成定长的,因为神经网络的神经元数目需要预先设定好,所以这个 pooling 的操作特别巧妙。

  • RNN

RNN 可以很好的对序列进行建模,保留序列信息。每个 timestamp 喂入一个词的 embedding,那么最后一个 time_stamp 的隐状态就可以当成整个句子的语义表示向量:

  • matching function:

得到 query 和 doc 的向量表示后,可以由以下几种方式得到它们的语义匹配分:

  • cosine
  • 内积
  • 接一个或者多个 MLP,最后一层的输出层只有一个节点,那么最后一层的输出值就可以表示匹配分

part-6.2 Interaction based 的一些方法介绍

  • **ARC-II (Hu et al., NIPS ‘14) **http://hangli-hl.com/uploads/3/4/4/6/34465961/hu-etal-nips2014.pdf :

  • 让两个句子在得到它们各自的句子向量表示之前,提前交互,使用 1D conv:

  • 例如窗口大小为 N=3,那么每次从两个句子中分别取 1 个 trigram,然后把两个 trigram 的向量 concat 起来,然后使用一个卷积核进行卷积得到一个值

  • 那么每两个 trigram 进行卷积,就会得到一个矩阵,这个矩阵是两个句子的基础的匹配信号,这个矩阵类似图像,是个 2 维的向量。
  • 使用多个卷积核,就会得到多个矩阵,即 tensor
  • 得到多个有关两个句子的基础匹配信号的矩阵后,就可以像处理图像一样,处理每一个矩阵。常见的操作就是使用 2D 的卷积核。不断的卷积,就会得到一个定长的向量,然后再接 MLP,最后一层的输出节点数目只有 1,就得到了它们的匹配分。

这个模型的优缺点:

  • 优点是,有基础的匹配信号矩阵,可解释性强,而且卷积操作是保留次序信息的
  • 缺点是,基于 trigram 的匹配,没有 unigram 的匹配信号,不过这个稍微改一下就可以了;另外没有特别区分精确匹配(sim=1.0)和普通匹配信号 (sim<1.0)
  • **MatchPyramid (Pang et al., AAAI ‘16) **http://cn.arxiv.org/pdf/1602.06359:

  • 和上文类似,只是这里不是 trigram 的基础匹配信号,而是使用 unigram 的匹配信号,即 word-level 的匹配信号,每两个词的向量算 cosine 即得到两个词的相似度。那么两个句子中每两个词都计算一遍相似度,就可以得到一个匹配矩阵,然后就可以像处理图像一样处理这个矩阵(用 2D-CNN 来提取匹配模式,或者更大片段的匹配信号):

同理,这里匹配矩阵是保留词序信息的。

  • **Match-SRNN (Wan et al., IJCAI ‘16) **https://arxiv.org/pdf/1604.04378.pdf:

  • 这篇论文利用了和动态规划类似的思想。假设我们有了基础的 word-level(或者说 unigram 粒度) 的匹配信号矩阵后,怎么得到这两个句子最终的匹配分呢?假设 query 的长度是 n,doc 的长度是 m,f[i][j] 表示 query 的前 i 个词和 doc 的前 j 个词的匹配分,那么 f[n][m] 就是最终的 query 和 doc 的匹配分。那么怎么得到 f[i][j] 呢?

由动态规划的转移方程,我们可以得知,f[i][j] 和以下信息有关:

  • f[i-1][j]
  • f[i][j-1]
  • f[i-1][j-1]
  • query[i] 和 doc[j] 的相似度打分,query[i] 表示 query 的第 i 个词,doc[j] 表示 doc 的第 j 个词,不妨用 s[i][j] 表示这个打分。

那么 f[i][j] = func(f[i-1][j], f[i][j-1], f[i-1][j-1], s[i][j]),论文中用一个 2D 的 gru 拟合这个 func。

  • Decomposable Attention Model for Matching (Parikh et al., EMNLP ‘16)https://aclweb.org/anthology/D16-1244 :

  • 这个论文的主要思路是使用 attention:

  • 假设 query 的每个词对应的词向量是:query=[a1, a2, a3],doc 的每个词对应的词向量是:doc=[b1, b2, b3]

  • attention 类似一种对齐机制,query 的每个词都会去跟 doc 做 attention,例如 a1 去跟 doc 去做 attention,得到的向量表示是 A1。那么 query 的每个词都去跟 doc 做一遍 attention,就得到 [A1,A2,A3]
  • 同理,doc 的每个词都去跟 query 做一遍 attention,就得到 [B1, B2, B3]
  • 使用一个 function,例如一个简单的神经网络,例如一层的 FC 作用到每个词和它的 attention 向量上,例如 f(a1, A1) = X1,f(b1, B1) = Y1
  • 然后做一个简单的累加,v1=sum(X1, X2, X3),v2=sum(Y1,Y2,Y3)
  • 然后再在 v1、v2 上,使用简单的 FC 层,就可以获得它们的相似度打分

part-6.3 representation-based 和 interaction-based 方法的融合

  • Duet, Mitra et al., WWW ‘17https://www.microsoft.com/en-us/research/wp-content/uploads/2016/10/wwwfp0192-mitra.pdf :

这篇论文的卖点是,将 interaction based 的模型和 representation based 的模型融合。

Representation based 和 Interaction based 的效果、优缺点

效果上是 interaction based 好一些,但是 representation based 的方法,可以提前把 doc 的 embedding 计算出来,建网页库的时候就存进去,不用实时计算

总结一下:

  • Representation based:

  • 重点是学习文本的句子表示;可以提前把文本的语义向量计算好,在线预测时,不用实时计算。

  • 在学习出句子向量之前,两者没有任何交互,细粒度的匹配信号丢失。学习出来的向量可能是两个不同向量空间的东西,通过上层的融合层和 loss,强制性的拉近两个向量。
  • interaction based:

  • 有细粒度、精细化的匹配信号,上层进行更大粒度的匹配模式的提取;可解释性好

  • 在线计算代价大。

part-7 搜索里的 query 和 doc 的相关性匹配

这一 part 和前文有点跳跃性的转弯了,突然跳到一个相关性匹配(前文是语义匹配)的问题。但两者相关性高,语义匹配是相关性匹配的基础技术。例如,在工业界的搜索引擎中,网页 doc 往往可以切分为不同的 part,然后可以在不同的 part 上,应用上述的深度学习匹配技术,然后将不同 part 的匹配分融合,得到最后的 query 和 doc 的匹配分。

首先,作者阐明相似度!= 相关性,区别是:

  • 相似性:

  • 判断两个句子语义、意思是否相似

  • 一般是同质的两段文本,例如两个句子、两个文章
  • 在两段文本的不同位置进行匹配
  • 匹配函数是对称的,因为是同质的文本进行匹配
  • 代表性任务:同义句子识别
  • 相关性:

  • 判断文档和搜索 query 是否相关

  • 不同质的两段文本,例如一个是 query,一个是网页
  • 在网页的不同部分进行匹配,例如 title、锚文本 (链接对应的文本)、正文
  • 匹配函数不是对称的,因为不是同质的文本进行匹配
  • 代表性任务:query- 网页检索

Query-Document Relevance Matching 的方法也主要分为两大类:

  • Based on global distribution of matching strengths,基于全局的匹配信号
  • Based on local context of matched terms,基于局部的 term 级别的匹配信号

part-7.1 based on Global Distribution of Matching Strengths 的一些方法介绍

这种方法的基本步骤:

1. 对于 query 中的每个 term:

a. 计算它在 doc 中的匹配信号

b. 计算整体的匹配强度的分布

2. 累计匹配强度的分布

  • Deep Relevance Matching Model (Guo et al., CIKM ’16)http://www.bigdatalab.ac.cn/~gjf/papers/2016/CIKM2016a_guo.pdf

  • 这篇论文更像 interaction-based 的方法:

  • 和 match matrix 类似,使用 cosine 就算两个单词的相似度,这个模型直接用使用 word2vec 的词向量,不在模型中学习。这样可以使用少量的标注样本,专注于匹配函数的学习。而无监督的数据容易大量获得,所以学习 word2vec 是一件容易的事

对于 query 中的每个 term:

  • 将它和文档的所有单词的匹配分,离散化分桶。特别是,为精确匹配单独划分一个桶。统计在每个桶上的次数,即得到一个关于这个 term 和文档匹配分的一个直方图,即一个向量。
  • 得到上述向量后,使用全连接层学习匹配分。注意,不同的单词 ,这些全连接层的参数是共享的。
  • 将上述的匹配分加权求和,这里的权重论文中也介绍了两者方法,其中一种是使用简单的 IDF。

这个模型的优点是:

  • 区分精确匹配和普通的相似度匹配信号
  • 使用直方图,不用像卷积那样子使用 padding
  • 相比原始的匹配信号,直方分布图更鲁棒

缺点是:

  • 失去了位置信息。但这篇论文要解决的是 Ad-hoc Retrieval 的问题,位置信息相对没那么重要。

  • K-NRM: Kernel Pooling as Matching Function (Xiong et al., SIGIR ‘17)https://arxiv.org/pdf/1706.06613.pdf

  • 这篇论文也是 interaction-based 的方式,步骤如下:

  • 先用 cosine 计算 query 和 doc 的 match matrix

  • 对于 match matrix 的每一行,应用 K 个 pooling-kernel,得到一个 K 维的向量
  • 然后将每一行的 K 的向量加和,得到一个 K 维的向量,然后后面就可以接 FC 层,得到匹配分

现在介绍一下这个 pooling 函数。首先,整个模型的流程用数学符号表示如下:

其中 M 表示匹配矩阵,M[i][j] 表示匹配矩阵里的第 i 行的第 j 个元素。

论文中采用 RBF 的 pooling-kernel 函数:

其中  是第 k 个 kernel 的超参(应该也可以学习得来),  表示匹配矩阵的第 i 行。

论文中讲了,这个 pooling 可以泛化到很多 pooling 函数的:

  • μ = 1 and σ → 0 ,那么除非 M[i][j]=1,否则  都是负无穷大,exp 后的值就是 0,所以只有 M[i][j]=1 才会得到非零值,所以这个时候,kernel 只会抓取精确匹配的信号
  • 如果 σ → ∞ ,  基本趋于 0,所以所有值的贡献都一样,类似捕捉的是 doc 的 term 的数目。论文中说这时,kernel 函数类似于 mean-pooling,这是我暂时还理解不了的。

同理,这个模型是忽略了顺序信息的。

  • Conv-KNRM (Dai et al., WSDM ‘18)http://www.cs.cmu.edu/~callan/Papers/wsdm18-zhuyun-dai.pdf
    看懂了 KNRM 后,这篇论文就比较简单,只是用 Conv 来分别抓取 unigram 和 bigram 的信号,然后分别做 match-matrix: q-unigram vs d-unigram、q-unigram vs d-bigram、q-bigram vs d-unigram、q-bigram vs d-bigram,然后四个矩阵的匹配信号 concat 起来即可。

part-7.2 based on Local Context of Matched Terms 的一些方法介绍

based on Global Distribution of Matching Strengths 的方法是,对于 query 中的每个 term,直接求解它和整个文档的匹配信号。而 based onLocal Context of Matched Terms 的方法是,对于 query 中的每个 term:

  • 找出它要匹配的 doc 的局部上下文

  • 匹配 query 和 doc 的局部上下文

  • 累计每一个 term 的匹配信号

这种方法的好处是:

  • 鲁棒性强,可以过滤掉 doc 和 query 无关的部分
  • 在 doc 的局部上下文,可以很好的考虑顺序信息
  • DeepRank (Pang et al., CIKM ’17)https://arxiv.org/pdf/1710.05649.pdf

这个论文的方法比较简单。模仿人类的判断相关性的过程:

  • 对于 query 中的每个 term,找出它在 doc 中出现的位置。
  • 例如 query 的第二个 term:q2,它在 doc 中三个地方出现,对于这三个位置,分别取出 2k+1 个词(前后各取 k 个),不妨假设取出来的三个句子是 s1、s2、s3,然后可以用 match-matrix 等各种方法算出 query 和 s1、s2、s3 匹配信号,然后用 rnn 融合这三个匹配信号,得到一个匹配分
  • 将每个 term 的匹配分加权求和得到最后的匹配分

  • Position-Aware Neural IR Model (PACRR, Hui et al., EMNLP ’17)https://arxiv.org/pdf/1704.03940.pdf

其实这篇论文更多的是讲用不同大小的卷积核抓取不同粒度的匹配信号,然后把不同粒度的匹配信号 concat,然后用一个 rnn 将 query 的每一个 term 的匹配信号(匹配信号 + 每个 term 的权重)融合,得到最后的匹配分。具体步骤:

  • 先基于 unigram,计算 query 和 doc 的 match matrix
  • 对于上述的 match-matrix,使用不同大小的卷积核进行卷积,例如 22 对应获取 bigram 的匹配信号,33 对应获取 trigram 的匹配信号,同样这样的每种粒度的匹配信号,都对应一个 match-matrix
  • 对于 query 中的每个 term,将上述的不同粒度的匹配信号融合 (匹配矩阵的每一行),例如通过 max-pooling(row-wise k-max pooling)、concat 等,反正每个 term 都得到一个关于匹配信号的向量。这个向量还会插入一个新的信号,就是这个 term 的权重信号。
  • 然后用一个 rnn 将上述的匹配向量融合,得到最后的匹配分。

不过论文中讲了,为了方便后续的卷积,需要将原始的 q*d 的匹配矩阵,转化成定长的  的匹配矩阵,虽然个人觉得不是定长的也没啥问题。这里还是介绍一下论文中提出的将原始的匹配矩阵转化成定长的匹配矩阵的两种方法:

  • firstk- 简单的取前  行和前  列,不足的补 0
  • kwindow- 为了抓取 n-gram 的匹配信号,不妨假设 n=3:
  • 对于 doc 的所有长度为 n 个词的片段:

  • 计算这个 n-gram 和 query 的相似度,例如:计算 n-gram 的第一个词和 query 的所有词的相似度,取 max,然后将这个 n-gram 的所有词计算出来的相似度 max 值取 avg,作为这个 n-gram 和 query 的相似度打分,然后取 top-k 个最高分的片断,凑齐长度 

  • 对于每一个 n,都取出这样的一堆长度和为  的词,用这堆文本和 query 计算匹配矩阵,叫  ,那么对于上述的卷积核大小为 n*n 的卷积,输入就是  。这种情况下,卷积层的 stride 为 [1,n],即 query 每次滑动一个词,doc 每次滑动 n 个词,保证处理的是 doc 的连续的 n 个词。

不过本人还是觉得这篇论文的重点是用不同大小的卷积核抓取不同粒度的匹配信号,而不是所谓的 position-aware。

part-8 short summary

搜索着重解决相关性、权威性、时效性等问题,深度学习匹配是解决相关性的大杀器。

模型结构上,以下结构都值得尝试:

  • bow
  • CNN
  • RNN、双向 RNN、LSTM、GRU
  • match-matrix

PLSA 同样可以做到语义层面的匹配,但是深度学习可以基于有监督数据进行训练,label 可以和直接的任务相关,而不是泛泛意义上的匹配。DNN 使用语义平滑的 word embedding,可以大大提高模型的泛化性。

模型方法论上,深度学习匹配可以分为 representation based 的和 interaction based 的。而具体到将匹配技术应用到搜索里的相关性问题,又可以分为 based on Global Distribution of Matching Strengths 的和 based on Local Context of Matched Terms 的。

最后,安利一下这篇 reference 百度 NLP | 神经网络语义匹配技术 ,将这篇文章和本文的 tutorial 里的细节都看懂,相信你的功力会大增。

参考连接:

https://www.comp.nus.edu.sg/~xiangnan/sigir18-deep.pdf

https://arxiv.org/pdf/1706.06613.pdf

[1511.08277] A Deep Architecture for Semantic Matching with Multiple Positional Sentence Representations

百度 NLP | 神经网络语义匹配技术

“百度一下”背后:深度学习技术的最新应用

微信公众号

声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
SEM推广服务

Copyright©2005-2028 Sykv.com 可思数据 版权所有    京ICP备14056871号

关于我们   免责声明   广告合作   版权声明   联系我们   原创投稿   网站地图  

可思数据 数据标注

扫码入群
扫码关注

微信公众号

返回顶部