红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

搜索中的深度匹配模型

  • 2020-03-26
  • 本文字数:54571 字

    阅读完需:约 179 分钟

搜索中的深度匹配模型

01 搜索引擎概述

对于搜索来说,搜索引擎的本质是对于用户给定 query,搜索引擎通过 query-doc 的 match 匹配,返回用户最可能点击的文档的过程。从某种意义上来说,query 代表的是一类用户,就是对于给定的 query,搜索引擎要解决的就是 query 和 doc 的 match,如图 1.1 所示。



图 1.1 搜索引擎架构


对于推荐来说,推荐系统就是系统根据用户的属性 ( 如性别、年龄、学历等 ),用户在系统里过去的行为 ( 例如浏览、点击、搜索、收藏等 ),以及当前上下文环境 ( 如网络、手机设备等 ),从而给用户推荐用户可能感兴趣的物品 ( 如电商的商品、feeds 推荐的新闻、应用商店推荐的 app 等 ),从这个过程来看,推荐系统要解决的就是 user 和 item 的 match,如图 1.2 所示。



图 1.2 推荐引擎架构



图 1.3 搜索和推荐的本质,都是 match


关于搜索和推荐更多的细节在"推荐系统中的深度匹配模型"一文中已经给出了详细的对比,本文不再赘述。在目前工业界的大多数主流系统里,推荐系统和搜索引擎一般分为召回和排序两个过程,这个两阶段过程称呼较多,召回也会叫粗排、触发、matching;排序过程也会叫精排、打分、ranking。


而在本文要讲到的匹配,并不仅仅指的是第一阶段这个 matching 的过程,而是泛指整个 query 和 doc 的匹配。图 1.4 可以表示本文要讲的 query 和 doc 的匹配表示,通过给定的 training data,通过 learning system,学习得到 query 和 doc 的匹配模型 fM(q, d)。然后对于 test data,也就是给定的需要预测的 q 和 d,便可以通过这个模型,预测得到 q 和 d 的匹配分数 fM(q, d)。



图 1.4 query-doc 匹配过程的机器学习本质


由于 query 和 doc 本身都是文本表示,所以本质上来说,这篇文章要讲的东西也是文本的深度匹配模型。大部分自然语言处理的任务基本都可以抽象成文本匹配的任务。


① 信息检索 ( Ad-hoc Information Retrieval ):也就是本文要介绍的主体,在搜索引擎里,用户搜索的 query 以及网页 doc 是一个文本匹配的过程


② 自动问答 ( Community Question Answer ):对于给定的问题 question,从候选的问题库或者答案库中进行匹配的过程


③ 释义识别 ( Paraphrase Identification ):判断两段文本 string1 和 string2 说的到底是不是一个事儿


④ 自然语言推断 ( Natural Language Inference ):给定前提文本 ( premise ),根据该 premise 去推断假说文本 ( hypothesis ) 与 premise 的关系,一般分为蕴含关系和矛盾关系,蕴含关系表示从 premise 中可以推断出 hypothesis;矛盾关系即 hypothesis 与 premise 矛盾。


02 搜索中的传统匹配模型

图 2.1 表示的是 query-doc 的匹配在整个搜索引擎流程中的流程。在讲整个搜索的深度匹配模型之前,我们依然先来看下传统的匹配模型。



图 2.1 query-doc 的匹配在搜索引擎中的作用


更早之前有基于 term 的统计方法,例如 TF-IDF 等,而从 match 的角度,按照 query 和 doc 是否映射到同一个空间,可以分为两大类,一类是基于隐空间的 match,将 query 和 doc 都映射到同一个 latent space,如图 2.2 所示;第二种是基于翻译空间的 match,将 doc 映射到 query 的空间,然后学习两者的匹配,如图 2.3 所示:



图 2.2 搜索中基于 latent space 的匹配



图 2.3 搜索中基于 translation 的 match

2.1 基于 latent space 的传统匹配方法

2.1.1 BM25

对于第一种方法,基于隐空间的匹配,重点是将 query 和 doc 都同时映射到同一空间,经典的模型有 BM25。BM25 方法核心思想是,对于 query 中每个 term,计算与当前文档 doc 的相关性得分,然后对 query 中所有 term 和 doc 的相关得分进行加权求和,可以得到最终的 BM25,整体框架如图 2.4 所示



图 2.4 BM25 方法框架表示


对于 query 的表示采用的是布尔模型表达,也就是 term 出现为 1,否则为 0;



图 2.5 BM25 公式表达


图 2.5 的 BM25 公式为 query 中所有 term 的加权求和表达,可以分为两部分,第一部分是每个 term qi的权重,用 IDF 表示,也就是一个 term 在所有 doc 中出现次数越多,说明该 qi对文档的区分度越低,权重越低。


公式中第二部分计算的是当前 term qi与 doc d 的相关得分,分子表示的是 qi在 doc 中出现的频率;分母中 dl 为文档长度,avgdl 表示所有文档的平均长度,|d|为当前文档长度,k1和 b 为超参数。直观理解,如果当前文档长度|d|比平均文档长度 avgdl 大,包含当前 query 中的 term qi概率也越高,对结果的贡献也应该越小。

2.1.2 PLS 方法

PLS 方法全称是 Partial Least Square,用偏最小二乘的方法,将 query 和 doc 通过两个正交映射矩阵 LX和 LY映射到同一个空间后得到向量点积,然后通过最大化正样本和负样本的点积之差,使得映射后的 latent space 两者的距离尽可能靠近。


① query 和 doc 的空间表示



② 训练数据



③ 模型表示


用两个线性映射矩阵 LX和 LY分别将 query 和 doc 的原始空间 x 和 y 映射后的点积作为匹配分数,并且要求两个转化矩阵都必须是正交的。



④ 优化目标


上述用映射后的空间的向量点积作为匹配分数,在求最优化时,目标就是最大化正样本 query-doc 的 pair 对,以及负样本 query-doc 的 pair 对的向量点击差异,并且满足两个转化矩阵 LX和 LY都是正交的约束条件,如下公式所示:


2.1.3 RMLS 模型

Regularized Mapping to Latent Space 和 PLS 在空间表示、训练数据以及优化目标表示上都一致,区别在于转化矩阵 LX和 LY上,PLS 模型的基本假设要求两个矩阵是正定的;而 RMLS 模型在此基础上加入了正则限制,整体优化目标下公式所示:



总结下 PLS 和 RMLS 的特点如下:



图 2.6 PLS 和 RMLS 方法比较

2.2 基于 translation 的传统匹配方法

query 和 doc 的匹配过程,就是将原本属于不同空间的两段文本映射到一个空间后进行匹配。基于 translation 的方法把这个过程类比于机器翻译过程:query 看成是目标语言 E,把 doc 看成是源语言 C,目的是为了得到源语言到目标语言的概率 P(E|C)最大化,也就是 P(query|doc)最大化。

2.2.1 SMT 模型

Baseline 方法的基于统计机器翻译的方法,给定源语言 C(document),以及目标语言 E(query),从源语言到目标语言的翻译过程,就是将 doc 映射到 query 的过程。



其中,h(C,E)是关于 C 和 E 的特征函数。整个求解过程看成是特征函数的线性组合。

2.2.2 WTM 模型

Word-base Translation Model,简称 WTM 模型,把 doc 和 query 的关系看成是概率模型,也就是给定 doc,最大化当前的 query 的概率。Doc 生成 query 的过程可以看成两部分组成,第一项 p(q|w)是概率模型,也就是 doc 中的单词 w,翻译到当前 query 的单词 q 的概率,称为 translation probability;p(w|d)注意 doc 是加粗表示整个文档,也就是 doc 生成每个单词 w 的概率,称为 document language model。



图 2.7 WTM 模型公式组成


上述公式将 doc->query 的翻译过程拆成了两个模型的连乘,对于很多稀疏的 term,一旦出现某个概率为 0,最终结果也将变为 0。为了防止这种情况就需要做平滑,下述公式通过引入 background language model 的 p(q|C),并且用参数 alpha 进行线性组合来做平滑。C 代表的是整个 collection。



图 2.8 加入了 background language model 平滑的 WTM 模型


从贝叶斯公式,可以得到 p(q|C)以及 p(w|D)的表达;C(q;C)表示的是当前 query 的单词 q 在整个 collection 出现的次数;C(w;D)表示的是单词 w 在文档 D 中出现的次数



但是这种方法也存在问题,就是 self-translation 问题。原本这个问题是在机器翻译过程中,但是在 query 和 doc 过程中,源语言和目标语言都是同一种语言,也就是 doc 中的每个 term 都有可能映射到 query 中相同的 term,即 p(q=w|w)>0。因此,CIKM2010 年引入了 unsmoothed document language model,也就是 p(q|d)来解决这种问题



图 2.9 加入 unsmoothed document 的 WTM 表示

03 基于 representation learning 的深度匹配模型

在搜索的深度模型匹配中,我们发现这一步和推荐系统的深度匹配模型一样,也可以分为两类模型,分别是基于 representation learning 的模型以及 match function learning 的模型。


本章主要讲述第一种方法,representation learning,也就是基于表示学习的方法,这种方法会分别学习 query 和 doc ( 放在推荐里就是 user 和 item ) 的 representation 表示,然后通过定义 matching score 函数,例如简单点的做法有向量点积、cosine 距离等来得到 query 和 doc 两者的匹配,整个 representation learning 的框架如图 3.1 所示,是个经典的双塔结构:



图 3.1 搜索中基于 representation learning 的深度匹配模型


整个学习过程可以分为两步:


① 表示层:计算 query 和 doc 各自的 representation,如图 3.2 中蓝色圈所示。


② 匹配层:根据上一步得到的 representation,计算 query-doc 的匹配分数,如图 3.2 中红色圈所示。



图 3.2 基于 representation learning 的模型流程


因此,基于 representation learning 的深度匹配模型,无外乎围绕着表示层和匹配层进行模型结构的改造,其中大部分工作都集中在表示层部分。表示层的目的是为了得到 query 和 doc 的向量,在这里可以套用常用的一些网络框架,如 DNN、CNN 或者 RNN 等,本章也将沿着这 3 种框架进行表述。

3.1 基于 DNN 的模型

3.1.1 DSSM 模型

DSSM 模型全称是 deep struct semantic model,是微软在 2013 年提出来的深度匹配模型,后续一举成为表示学习的框架鼻祖。同年百度 NLP 团队也提出了神经网络语义匹配模型 simnet,本质上两者在模型框架上是一致的,如图 3.3 所示,都是典型的双塔模型,通过搜索引擎里 query 和 doc 的海量用户曝光点击日志,用 DNN 把 query 和 doc 通过表示层,表示为低维的 embedding 向量,然后通过匹配层来计算 query 和 doc 的 embedding 向量距离,最终得到匹配分数。



图 3.3 百度 simnet 框架,经典的双塔 representation learning


DSSM 作为框架型的模型得到大范围应用,除了其简洁经典的三段式结构:输入层-表示层-匹配层来得到最终的匹配得分,还有个很重要的原因:通过表示层得到的 query 和 doc 的向量是个非常重要的产物,可以在后续很多任务如召回层等地方继续使用。



图 3.4 2013 微软 DSSM 模型框架


整个 DSSM 可以分为 3 层,输入层、表示层和输出层


输入层


输入层做的事情是把原始的句子 ( query 或者 doc ) 映射到一个向量空间并进入表示层。这里由于中文和英文本身的构造不同,在处理方式上也有所不同。


a. 英文输入


DSSM 论文里对英文的处理方式是 word hashing,对于每个单词前后都用 #表示作为开始符和结束符。例如对于单词 boy,采用 n-gram 方式表达,以 trigram 为例 ( n=3 ),将表示为 #bo, boy, boy# 这三个 trigram。由于这种切分方法是在 letter 字符级别的,因此称为 letter-trigram,目的是为了区分后面会提到的其他 trigram 方法。


这种方法可能存在的一个问题就是单词冲突问题。举个例子,god 和 dog 采用原始的 one-hot 是两个不同单词,但是用 trigram 的话这两个词的输入将是一个向量,因此产生了冲突。


通过 word hash 的方式有两个好处,第一是可以大大减少原始输入空间。以 4 万单词为例,采用 trigram 的 hash 方法以后,将压缩到 1 万左右的输入空间。而对于一个 50 万单词的词表的话,将压缩到 3 万,与此同时 trigram 的冲突率只有 22/50w=0.0044%。



图 3.5 bigram 和 trigram 的冲突率区别


b. 中文输入


对于中文而言,没有英文输入这种 char 级别的语法构造,因此不适用 word hash 的方法。在 NLP 领域对中文的原始输入都会采用各种分词工具进行分词的预处理,而对于正常规模的汉字,单字规模 1.5 万左右,双字规模在百万左右,因此对于中文的输入,采用的是单字的输入


表示层


在 DSSM 中表示层采用的是词袋模型 ( bag of words ),也就是说不区分 word 的输入顺序,整个句子的所有单词都是无序输入的。这也为后面各种 DSSM-based 模型提供了很多优化工作。


在 embedding 层之后,对每个 sentence 使用的是 MLP 网络,经典的隐层参数是 300->300>128,也就是说最后,每个句子都将表示成一个 128 维度的向量。



其中 W1表示第一层的 embedding 矩阵,W2,W3,…WN-1表示 MLP 的隐层;最后一层的输出层采用 tanh,输出一个 128 维的向量。



匹配层


在原始的 DSSM 模型使用的是 cosine 作为两个向量的匹配分数:



DSSM 模型能够 work 的原因是利用了用户的后验点击数据,给定一个 query,在展示出来的 doc 里面,用户点击了的 doc 则认为这个 doc 和 query 是相关的,因此将 query 和 doc 的关系用 softmax 来表示其后验概率:



其中,γ是一个平滑因子,是个超参数。而 D 表示的是所有候选的 doc,这里对于给定的 query,所有被点击过的 doc 认为是正样本,而对于负样本,则从所有未点击的 doc 里随机采样 4 个,文章提出来使用不同的采样方法对结果影响并不大。模型的损失函数表达如下所示,注意到这里仅仅使用的是正样本的后验概率,和负样本无关。




图 3.6 DSSM 中 query 和 doc 的匹配框架


总结下 DSSM 模型的几个特性:


  • 框架鼻祖:提出了一个输入层->query 和 doc 各自的表示层->匹配层的模型范式,和百度的 simnet 一样,更像匹配模型的框架范式,这里的每一层都可以针对性的做优化

  • word hash:输入层对于英文提出了 word hash 的方法,大大减少了原始 one-hot 输入空间

  • 端到端学习:模型是个完全 end-2-end 的框架,包 query 和 doc 的 embedding 向量直接通过训练得到不需要经过预训练

  • 表示层:使用原始的 DNN 全连接网络来得到 query 和 doc 的向量表示

  • 匹配层:使用 cosine 表示 query 和 doc 的匹配分数

  • 缺点:对 query 和 doc 的表示都是 bow,丢失了序列信息和上下文信息

3.2 基于 CNN 的模型

以 DSSM 为代表的基于 DNN 的表示学习匹配模型如 3.2 分析,无论是 bow 的表示还是 DNN 全连接网络结构的特点,都无法捕捉到原始词序和上下文的信息。因此,这里可以联想到图像里具有很强的 local relation 的 CNN 网络结构,典型代表有 ARC-I 模型,CNN-DSSM 模型,以及 CNTK 模型。

3.2.1 ARC-I 模型

针对上述讲到的 DSSM 模型对 query 和 doc 序列和上下文信息捕捉能力的不足,华为诺亚方舟在 2015 年在 DSSM 的模型基础上加入了 CNN 模块,里面提到了两种模型 ARC-I 和 ARC-II,前者是基于 representation learning 的模型,后者是基于 match function learning 的模型将在第三章讲到。两个模型对比原始的 DSSM 模型,最大的特点是引入了卷积和池化层来捕捉句子中的词序信息,ARC-I 全称 Architecture-I,框架如图 3.7 所示。



图 3.7 ARC-I 对于两个文本的表示学习匹配


ARC-I 模型引入了类似 CNN 模块的卷积层和池化层,整体框架如图 3.8 所示:



图 3.8 ARC-1 模型框架架构


卷积层



其中 zi(l,f)表示的是第 l 层中第 f 个 filter 位置为 i 的 word 的卷积输出,word 滑动窗口大小为 k1 ( 图中 k1=3 ),word embedding 的大小为 De。这里不同的 filter 可以得到不同的 feature map,通过 w(l,f)和 b(l,f)进行加权,表示的是第 l 层第 f 个 filter 的待学习参数。



用矩阵形式来表达如下:



其中 zi(l-1)表示第 l-1 层第 i 个元素的向量,维度大小为 Fl-1。对于第一层卷积层,将连续的 k1个 word 向量直接 concat 起来,如下所示,维度为 k1*De



池化层


卷积层提取了相邻 word 的关系,不同的 feature map 提供了不同的 word 的组合,通过池化层进行选择。ARC-I 选择的滑动窗口为 2,用 max-pooling 提取相邻两个滑动窗口的最大值,用公式表示如下:




图 3.9 word-window 表示,灰色表示置信度低


总结下 ARC-I 的特点:


  • 对于 query 和 doc 两段文本的匹配,相比 DSSM 引入了 word-ngram 网络

  • 通过卷积层不同的 feature map 来得到相邻 term 之间的多种组合关系

  • 通过池化层 max pooling 来提取这些组合关系中最重要的部分,进而得到 query 和 doc 各自的表示。

  • 表示层:通过上述卷积层和池化层来强化相邻 word 的关系,因此得到的 query 和 doc 的表示比原始 DSSM 能捕捉到词序信息

  • 缺点:卷积层虽然提取到了 word-ngram 的信息,但是池化层依然是在局部窗口进行 pooling,因此一定程度上无法得到全局的信息

3.2.2 CNN-DSSM 模型

CNN-DSSM 模型也称 CLSM,是 CIKM2014 微软提出的基于 CNN 的 DSSM 模型,在 DSSM 框架上引入了 CNN,整体来看可以分为输入层、表示层和匹配层,模型框架如图 3.10 所示



图 3.10 CNN-DSSM 模型框架


输入层


a. 英文对比 DSSM 模型,在输入层除了做了 word hash 的 letter-trigram,同时也捕捉了 word 级别的信息,称为 word-trigram。Word-trigram 同样采用的是 n=3 的上下文单词的滑动窗口,每个窗口包含 3 个单词。例如<s> online auto boy … <s>这句话,可以提取得到三组信息,第一组是<s> online auto,第二组是 online auto boy,第三组是 auto boy <s>。


通过 word-trigram 提取得到的 3 组句子都各有 3 个单词,对每个单词按照 DSSM 中的 letter-trigram 方法进行 word hash 后,映射到一个 3 万维的 embedding 里,因此每个句子都可以得到 9 万维的 embedding 向量。



上述公式 ft表示第 t 个单词的 word-n-gram 表示, n=2d+1 则为滑动窗口大小,d 则表示用该单词前后单词个数,例如 d=1,n=3 表示 word-trigram,使用当前 word 前后各 1 个单词以及自身进行表示。


b. 中文


对于中文,和 DSSM 模型一样,采用的是字级别的编码


表示层


a. 卷积层


通过输入层得到的每个句子是一个 m*90k 维的矩阵,其中 m 代表的是 query 或者 doc 的长度,为矩阵的行,而 90k 理解成每个 word 的 embedding size,为矩阵的列。对于 query 和 doc 的句子不等长情况,可以通过 padding 方式进行补齐,确保所有句子都是等长的。论文中使用 m=300,就是每个 query 和都需要 pad 到 300 维。


为了说明整个卷积过程,这里借用文本分类的经典模型 textCNN 模型来展示,如图 3.11 所示。卷积核 Wc大小为 3*90k,3 表示的是卷积高度,代表每次滑动进行卷积的词窗口大小为 3,90k 是为了和原始句子的 embedding size 保持一致,整个卷积过程从上到下进行卷积,最终每个卷积核得到一个 m*1 的特征向量 ( feature map )。



图 3.11 textCNN 模型框架


论文使用了 300 个卷积核,因此可以得到 300*m 的一个矩阵 ( 前 300 为 filter 个数,后 300 表示的是每个 feature map 的行数 )



b. 池化层


前面卷积层每个 filter 得到的 feature map 维度是 300,采用 max pooling 的方式选择最大的一个,总共有 300 个 filter,因此 max pooling 可以得到一个 300*1 的定长特征向量:



通过一层 MLP 网络后,用 tanh 进行激活输出,从 300 维的向量映射到一个 128 维的特征向量



匹配层


在原始的 DSSM 模型使用的是 cosine 作为两个向量的匹配分数:



训练和损失函数和原始 DSSM 论文一致,这里不再赘述。


总结下 CNN-DSSM 模型,对比原始 DSSM 模型主要区别如下:


  • 输入层除了 letter-trigram,增加了 word-trigram,提取了词序局部信息

  • 表示层的卷积层采用 textCNN 的方法,通过 n=3 的卷积滑动窗口捕获 query 和 doc 的上下文信息

  • 表示层中的池化层通过 max-pooling,得到卷积层提取的每个 feature map 的最大值,从而一定程度的捕获了全局上下文信息

  • 表示层中的池化层的 max-pooling 对比 ARC-I 的 max pooling 不同之处在于 ARC-I 的池化层是在相邻的两个滑动窗口进行 max pooling,得到的还是局部关系;而 CNN-DSSM 模型是在每个 feature map 整个句子进行 max pooling,能得到全局的关系

3.2.3 CNTN 模型

前面提到的两种基于 CNN 的模型 ARC-I 模型以及 CNN-DSSM 模型核心在于表示层上引入了 CNN 模型结构,对匹配层依然是沿用了 DSSM 的 cosine 来计算 query 和 doc 的匹配分数。而在 IJCAI2015 年提出的 Convolutional Neural Tensor Network,简称 CNTN 模型,除了一样在表示层引入 CNN 学习 query 和 doc 的表示,另外也在匹配层做了改造,引入了 Neural Tensor Network,整体框架表示如图 3.12 所示。



图 3.12 CNTN 模型框架


对于给定的 query 和 doc,从表示层已经得到各自的表示 q 和 d,在匹配层引入了 neural tensor network,也就是更多的网络参数来学习 q 和 d 的匹配分数,用公式表示如下:



用图 3.13 表示如下:



图 3.13 CNTN 的匹配层网络结构


其中 query 和 doc 都各自由 3 个 word 组成,query 为图中的黑色部分,doc 为黄色方块。M[1:r]中的每个 r ( 图中等于 2 ),是 query 和 doc 之间的一个 3*3 转换矩阵,因此,qTM[1:r]d 产生的是一个 r 维度的向量,在图中就是 2 维向量。公式的第二部分,V 是一个 3*2 的矩阵,乘以 q 和 d 两个向量 concat 一起的向量后,也得到一个 2 维向量,在加上一个维度为 2 的 bias 向量 b。


通过中间括号的操作得到一个 2 维的向量后,引入了非线性函数 f 进行拟合,再通过左侧一个线性矩阵 u 的映射,最终得到匹配分数

3.3 基于 RNN 的模型

作为空间关系代表的 CNN 网络结构能够捕捉到 query 和 doc 的局部关系,RNN 作为时间序列相关的网络结构,则能够捕捉到 query 和 doc 中前后词的依赖关系。因此,基于 RNN 的表示学习框架如图所示,query 或者 doc 用黄色部分表示,通过 RNN 网络结构作为隐层来建模序列关系,最后一个 word 作为输出,从而学习得到 query 和 doc 的表示。对于 RNN 结构,可以使用业内经典的 LSTM 或者 GRU 网络结构,如图 3.14 所示。



图 3.14 基于 RNN 的表示学习框架

3.3.1 LSTM-RNN 模型

2016 在 TASLP 上提出的 LSTM-RNN 模型,在 DSSM 的基础上提出了用 LSTM 来强化 query 和 doc 的 representation。整个模型思想很简单,通过将原始 query 和 doc 的文本转换成 embedding 向量,然后通过 LSTM-RNN 的网络结构进行抽取转换。假设原始的 query 或者 doc 有 m 个 word,得到的最后一个隐层的输出 hm 就是整个 query 或者 doc 的最终表达,框架如图 3.15 所示。



图 3.15 LSTM-RNN 模型框架


文中核心的改造在于表示层中使用了 LSTM 来捕捉序列关系,在 LSTM 的多种变体结构中,作者使用了 peephole connection 的变体,也就是说让门结构 ( 输入门、输出门、遗忘门 ) 也会接受前一时刻的细胞状态作为输入,具体表示如图 3.16 所示。



图 3.16 peephole connection LSTM 网络结构


整个 LSTM 的前向输出结构表示如下:



总结 LSTM-RNN 模型的几个特点:


  • 相比于 DSSM 模型引入了 LSTM 网络结构来捕捉次序的关系

  • LSTM 最后一个隐层的输出作为 query 和 doc 的 representation

3.4 representation learning 模型总结

总下基于 representation learning 的深度匹配模型框架,核心在于表示层和匹配层。



图 3.17 表示层和匹配层是 representation learnning 框架的两大模块

3.4.1 表示层

① DNN 框架:DSSM 模型


② CNN 框架:ARC-I 模型、CNN-DSSM 模型、CNTN 模型


③ RNN 框架:LSTM-RNN 模型

3.4.2 匹配层

匹配函数有两大类,一种是直观无需学习的计算,如 cosine、dot product,一种是引入了参数学习的网络结构,如 MLP 网络结构,或者 CNTN 模型。


① cosine 函数:DSSM 模型、CNN-DSSM 模型、LSTM-RNN 模型



② dot product



③ MLP 网络:ARC-I 模型



④ Neural Tensor Network:CNTN 模型


04 基于 match function learning 的深度匹配模型

对比 representation learning 的深度匹配模型,match function learning 方法的特点,是不直接学习 query 和 doc 的表示,而是一开始就让 query 和 doc 进行各种交互,通过两者交互的 match signals 进行特征提取,然后通过 aggregation 对提取到的 match signals 用各种网络结构进行学习得到最终的匹配分数,如图 4.1 所示。



图 4.1 基于 match function learning 的深度匹配模型


和 representation learning 匹配模型一样,match function learning 的匹配过程也一样可以分为两步:


① 基础匹配信号提取:让 query 和 doc 在这一步就开始进行交互,得到两者的基础匹配信号,如图 4.2 中的蓝色圆圈所示


② 信号聚合(aggregation):对应于 representation learning 中的匹配层,这里也叫匹配层,由于前一步已经进行了 query 和 doc 的交互,信号更加丰富,在后面介绍的模型中可以发现匹配层这里也会比表示学习的网络结构设计变化要丰富很多



图 4.2 query 和 doc 的匹配过程


由于从一开始就让 query 和 doc 进行交互。因此,基于 match function learning 的匹配模型也称为交互匹配模型。

4.1 基于 word level 匹配度矩阵的模型

基于 match function learning 的模型和 representation learning 的模型最大的区别是让 query 和 doc 提前进行交互,因此很多模型的工作就是关于如何设计 query 和 doc 的交互上。一种很直观的思路就是,让 query 和 doc 两段文本里面每个 word 两两进行交互,在 word level 级别建立匹配度矩阵。本章在原始 slides 上的基础上加了 aNMM 模型,虽然听名字是 attention-based 的,但其区别于 CNN 的 position-aware 提出的 value-aware 思路个人觉得还是值得研究下的。

4.1.1 ARC-II 模型

ARC-II 全称 Architecture-II,和 ARC-I 出自 2015 年华为的同一篇 paper,属于交互学习的模型。ARC-I 直到最后的全连接层进行匹配之前,query 和 doc 两段文本都是没有任何交互的,大家都在各自学习各自的表示。而 ARC-II 模型属于交互学习的模型,通过对 query 中的 word 进行 n-gram 的卷积提取,以及 doc 中的 word 进行卷积提取,然后各自卷积后得到的词向量进行 pairwise 计算,得到一个匹配度矩阵,整体框架如图 4.3 所示。



图 4.3 ARC-II 模型框架


在提取匹配度矩阵过程中,核心有 3 层:一维卷积层、二维卷积层和二维池化层


一维卷积层


假设 query 和 doc 的长度都是 N,我们把整个过程想象类比层二维图像,让 query 和 doc 的每个 word 两两组成一个 N*N 的矩阵,query 是列,doc 是行。其中每个 word 的 embedding 维度是 De


用一个 3*3 的卷积核在这个 N*N 的矩阵上进行扫描,每次横向扫描 3 个格子,纵向扫描 3 个格子,代表在 query 和 doc 上对应的 3 个相邻的词,总共取到 6 个词进行 concat,可以得到一个 6*De的矩阵,卷积核大小也为 6*De,两者进行点乘相加得到一个值。这样扫描完整个 N*N 矩阵就可以得到一个二维的矩阵 feature map。使用多个卷积核,就可以得到多个二维矩阵 feature map。


通过这种 trigram 的方法 ( 每次取 3 个词 ) 的交互,可以得到 query 和 doc 中任意 3 个相邻的 word 组成的短语的交互关系,因此交互级别属于 phrase 级别的。


对于 query 句子 SX中的第 i 个 word,和 doc 句子 SY中的第 j 个 word,卷积后的表示为:





注意到第一层的元素 zi,j(0)相当于将输入 x 和 y 的向量 concat 了起来,embedding 维度为 De,n-gram 的滑动窗口为 k1 ( 在示意图中为 3 )。


整个过程 query 和 doc 的信息都是独立计算后 concat 的,称为一维卷积。


2 维池化层


一维卷积层保留了 query 和 doc 中每个词的原始信息。在 2 维的池化层作用是用一个 2*2 的卷积核,用 max-pooling 得到这 4 个二维空间的最大值。



2 维卷积层


前面通过一维卷积层和 max pooling 后得到的是 2 维的匹配矩阵,接着的操作可以类比于图像,在二维的平面上进行多层的卷积-池化-卷积-池化…的操作了。以第三层为例 ( 前面已经有两层:一维卷积-二维池化 ),在一个二维平面做卷积:



2 维卷积层之后可以叠加多个卷积和池化的操作,最后再通过全连接 MLP 输出最终的匹配分数。损失函数使用 pairwise loss:



在整个 2 维卷积和池化过程,可以发现 word 的顺序关系是有所保留的,如图 4.4 所示的 2 维度池化过程,max pooling 选择的黄色方块保留了原始的 order 信息。



图 4.4 2 维 pooling 过程


另外一个角度,我们可以看到其实 ARC-I 是 ARC-II 的特殊情况,如下图 4.5 所示:



图 4.5 ARC-I 本质上是 ARC-II 的特殊情况


总接下 ARC-II 模型特点:


  • 对比 ARC-I,在一开始就引入了 query 和 doc 两段文本的匹配矩阵,提前得到两者的交互信息,对信息匹配的捕捉能力更强,并且卷积和池化过程保留了次序的信息

  • 虽然引入了 query 和 doc 的匹配矩阵,但是匹配矩阵的计算是按照每个句子的 n-gram 后的 word embedding 计算,只有 phrase level 的匹配信号而没有更细粒度的 word level 的匹配信号,因而丢失了原始精确匹配和泛化匹配的信息。

4.1.2 MatchPyramid 模型

前面提到的 ARC-II 模型引入了匹配矩阵,但是匹配的粒度是 n-gram 后提取各自的 word embedding 进行计算,并不是 word-level 级别的。而 MatchPyramid 模型的提出灵感源于 CV 领域里的图像识别。在此之前,文本匹配的维度是一维的 ( TextCNN 为代表的 word embedding );而图像是二维平面的,显然信息更加丰富。2016 年的 AAAI 上中科院提出了基于 word-level 级别交互的矩阵匹配思想,用一个二维矩阵来代表 query 和 doc 中每个 word 的交互,相比于更高 level 的匹配如 ARC-II 的 phrase level(n-gram)信息能捕捉更精细的匹配信息,属于真正 word level 的匹配度矩阵,整体框架如图 4.6 所示:



图 4.6 word-level 的匹配矩阵模型示意图


以下图两个例子说明下 word-level 的匹配以及 phrase-level 的匹配的不同:



图 4.7 word-level 和 phrase-level 示例


对于 word-level 的匹配能捕捉到更细粒度的信息,例如橙色方框中能捕捉到 famous 对应 popular 以及 Chinese 对应 China 这样的匹配信息。


对于 phrase-level 的短语匹配又可以分为 n-gram 有序的短语,以及 n-term 无序的短语。图 4.7 显示的是 trigram 也就是 3 个词一个窗口,同颜色的方框是匹配的。对于 n-term 的匹配,方框中第一个句子中的"down the ages"和第二个句子中的"down the ages"是匹配的。对于 n-gram 的匹配,橙色方框中第一个句子中的"noodles and dumplings"和第二个句子中的"dumplings and noodles"通过 3-gram 后打乱了词序信息后是匹配的。


整个 MatchPyramid 模型框架如图 4.8 所示:



图 4.8 MatchPyramid 模型网络结构


因此,文中的关键在于如何构建 query 和 doc 中 word 级别的匹配信息,整体框架可以分为 3 层,匹配矩阵层、2 维卷积层、2 维池化层,后续卷积和池化可以持续进行叠加。


匹配矩阵层


匹配矩阵的构造是 MatchPyramid 模型的核心关键。用 M 矩阵代表 query 和 doc 的匹配,Mij为矩阵的第 i 行第 j 列,表示第一个句子 query 中第 i 个单词和第二个句子 doc 中第 j 个单词的交互。这里对于 Mij如何构造,有 3 种方法,indicator、cosine 以及 dot product,分别如下:


a. indicator match


0-1 匹配矩阵,只有两个 word 完全相同才等于 1,否则为 0,相当于是精确匹配:



b. cosine match


将每个 word 用 glove 预训练得到的词向量,两两计算 cosine 相似度:



c. dot product match


将每个 word 用 glove 预训练得到的词向量,两两计算向量点积:



图 4.9 显示了 indicator 和 dot product 两种,黑色部分是 0;dot product 或者 cosine 对比 indicator 能捕获到更多的泛化信息,例如在 indicator 对于 famous 和 popular 的匹配分数是 0,而用 dot product 得到两者的匹配分数是 1.2。



图 4.9 indicator 和 dot product 匹配计算方式


二维卷积层


以第一层为例,通过一个 rk* rk的卷积核提取二维匹配矩阵的信息,相当于是提取 query 和 doc 在各自连续 rk个 word 的信息交互:



二维池化层


还是以第一层的池化层为例,在 dk*dk’的 kernel 下用 max-pooling 求最大值:




以下这张图展示了 MatchPyramid 模型和图像识别中一些相似的匹配过程:



图 4.10 MatchPyramid 类比图像识别的匹配


图 4.10 左边用 indicator match 得到两个句子的相似匹配矩阵,相当于是精准匹配,第一层卷积层通过上下两个对角线以及反对角线的卷积核之后,可以得到两个 feature map,第一个 feature map 的绿色部分和第二个 feature map 的橙色线条类似于图像识别中的边缘检测。通过第二层的卷积核之后,可以得到右侧的 feature map 中的紫色的“T-type”的 part,这一部分类比于图像识别中的 motifs(part)识别。



图 4.11 图像识别类比文本匹配过程


总结 MatchPyramid 模型的特点:


  • 比起 ARC-II 模型通过 n-gram 得到的 word embedding 进行相似度计算,MatchPyramid 模型在匹配矩阵的计算上做得更加精细,关注的是原始 word 级别的交互

  • 对于 query 和 doc 之间每个 word 的两两交互提出了 3 中方法,包括精确匹配的 indicator 计算,两个 word 完全相同为 1 否则为 0;以及语法相似度的匹配,包括 cosine 以及 dot product,关注的是更泛化的匹配

  • 整个过程和图像识别以及人类的认知一样,word-level 的匹配信号,类比图像中的像素特征;phrase-level 的匹配信号,包括 n-gram 有序的 phrase 以及 n-term 无序的 phrase,类比图像中的边缘检测;到 sentence-level 的匹配信号,类比图像中的 motifs 检测

4.1.3 Match-SRNN 模型

IJCAI2016 上提出了一种空间相关 RNN ( Spatial RNN ),全称 Match-SRNN 模型来拟合交互矩阵,类似于一种动态规划的思路,query 和 doc 的交互矩阵中每个位置的值由不仅由当前两个 word 的交互值得到,还由其前面 ( 左、上、以及左上三个位置 ) 的值决定,模型整体框架如图 4.12 所示:



图 4.12 Match-SRNN 模型


整个模型可以分为 3 个部分,分别是 query 和 doc 的匹配矩阵层、本文的核心 Spatial RNN 层以及最终的输出层。


匹配矩阵层


首先,对于输入的两个文本 query 和 doc 的表示 s1和 s2分别由 m 和 n 个词组成的词向量组成。



对 query 中的 m 个 term,以及 doc 中的 n 个 term 两两计算匹配分数得到初始的匹配矩阵,一般来说可以用 cosine 或者 dot product 来表达其匹配分数 ( MatchPyramid )。论文中作者提到为了更好的捕捉关系,引入了 neural tensor network 来拟合两者关系,具体有 3 个参数向量,T[1:c]代表的是层数为 c 的 tensor 向量,W 为线型参数,维度和 embedding size 一致,而 b 为 bias。



这一步其实对本文的核心模块是独立的,实际中也可以从简单的 cosine、dot product 甚至是 indicator 的直接先做计算,没有更多参数学习。


Spatial RNN


第一步得到了 query 和 doc 的原始匹配矩阵之后,作者使用了 Spatial RNN 的网络结构来进一步提取得到 query 和 doc 两段文本的关系。对于 query 中第 i 个 term 以及 doc 中的第 j 个 term 用 sij表示,它的值由其左边、上边、左上 3 个相邻的元素的函数所决定,表示如下:



该公式是整个 Spatial RNN 的理解关键,结构和动态规划很像,以图 4.13 为例来直观理解整个过程。


给定两个句子 s1=“The cat sat on the mat.”, s2=“The dog played balls on the floor.”



图 4.13 两段文本的递归匹配示例


假设 i=3,j=4,那么 s1[1:3]={The cat sat},s2[1:4]={The dog played balls},那么,h34将由它的前缀 h24,h33,h23这三项所决定。而 s1中第 3 个词"sat"和 s2中第 4 个词"balls"其中:


h24代表的是 s1[1:2]={The cat}以及 s2[1:4]={The dog played balls}


h33代表的是 s1[1:3]={The cat sat}以及 s2[1:3]={The dog played}


h23代表的是 s1[1:2]={The cat}以及 s2[1:3]={The dog played}


可以发现这三项中,h33其中占比应该最高,语义相关性也最强,和直觉认知也是符合的。这种递归的方式,也可以更好的捕捉两个句子之间的长依赖关系。


公式中的 f 是拟合的函数,可以采用多种时序相关的模型去拟合,比如 RNN, LSTM,GRU 等,作者在文中提到最终用的是 GRU。在原始的 GRU 公式中,关键的是两个门 reset gate z 以及 update gate r,表达如图所示:



图 4.14 1D-GRU 结构



其中 ht-1表示句子中第 t-1 个单词的隐层输出,z 表示的是 update gate,控制 ht-1中有多少比例能够更新当前时刻的信息;r 表示的是 reset gate,控制着储存在 cell 中的信息;W(z),U®,W®, U®,W,U 为 GRU 中学要学习的模型参数。


可以发现原始的 GRU 的更新门 z 只有一个。而在 Match-SRNN 模型中,匹配矩阵是二维的,每个元素(i,j)的表达式是由 3 项组成的,分别是 (i-1,j),(I,j-1),(i-1,j-1),因此,论文中用了 4 个更新门 z,分别表示为 zl,zt,zd以及 zi。三个 reset 门 rirl,rd示意图如图 4.15 所示:



图 4.15 2D-GRU 网络结构


4 个 update gate 以及 3 个 reset gate 最终的表达如下:



其中的 softmax by row 表达如下:



输出层


从上一层 SRNN 层提取得到 query s1和 doc s2的交互矩阵后,要得到最终的 match score 就简单了,论文使用了简单的线性函数去拟合:



其中 W 和 b 为待学习的线性参数,通过训练得到。因为是相关性的 rank 问题,论文使用的是 pairwise loss:



总结 Match-SRNN 模型的特点:


  • 对比 MatchPyramid 模型,query 和 doc 的匹配分数,使用 neural tensor network 结构,引入了参数得到初始匹配矩阵,更复杂的结构捕捉信息更精准

  • 引入了 Spatial RNN 来进一步得到匹配矩阵,每个元素(i, j)的值除了当前的匹配 sij值,还由其左(i-1, j)、上(i, j-1)、左上(i-1, j-1)三个元素决定,通过网络结构 f 进行拟合

  • 上述的网络结构 f 采用的 2D-GRU,对比常规的 1D-GRU,最大的特点是有 4 个 update gate 以及 3 个 reset gate

4.1.4 MV-LSTM 模型

AAAI2016 年提出的 MV-LSTM 模型,用双向 LSTM 来对两段文本 query 和 doc 进行编码,然后将 LSTM 的每个隐层输出进行归一化后作为 query 和 doc 每个 term 的输出,并对这些 term 计算得到不同维度的匹配度矩阵。由于采用双向 LSTM 的编码,以及不同的匹配度矩阵计算方法,作者认为这是个 Multi-View 的过程,能够捕捉到每个 term 在不同的语境下的表示,整体过程如图 4.16 所示:



图 4.16 MV-LSTM 模型表示


整个模型可以分为 3 部分:① query 和 doc 各自的 LSTM 编码;② query 和 doc 的匹配矩阵;③ 匹配信号融合


LSTM 编码


对于给定的句子 S=(x0,x1,x2,…,xT),MV-LSTM 模型使用双向的 LSTM 进行编码,对于每个单词 xt ( 在 query 或者 doc 中的第 t 个 term ),用 LSTM 隐层的输出 ht作为其表示,由于是双向,因此将两个方向的输出进行 concat:



匹配矩阵计算


上一步通过 Bi-LSTM 得到 query 和 doc 的表示 SX和 SY,对于 SX中每个 term,以及 SY中每个 term 的交互可以得到匹配度矩阵。同样的,在这里作者提出了 3 种不同的计算方法:


a. cosine 相似度


query 中的 term u 以及 doc 中的 term v,计算 cosine 相似度



b.双线性 bilinear


通过引入待训练参数 M 进行映射



c. Tensor layer


这一步的过程和 3.2.3 讲到的 CNTN 模型一样



匹配信号融合


从上一步可以得到 query 和 doc 的匹配度矩阵,在这一步对匹配信号进行融合得到最终的匹配分数。


a. k-max pooling


在计算两段文本的匹配过程中,一般来说整个匹配分都是由匹配矩阵中的特定匹配信号决定的,在论文中作者使用了 k-max pooling 进行这种匹配信号的提取。假设 k=1 代表的是最佳匹配信号,也就是整个匹配信号中最大的值才会被选择;对于 k>1,代表的是选择匹配信号最大值的 top k。


b. MLP


通过 k-max pooling 提取匹配信号后接着就是用简单的全连接网络 f 后得到 r,再经过线性映射得到最终的匹配分数 s:



总结整个 MV-LSTM 模型过程如下:


  • 用双向 LSTM 对 query 和 doc 进行编码,得到的每个 term 的隐层前向和后向输出 concat 起来,作为该 term 的表示

  • 对 query 和 doc 上一步得到的每个 term 两两计算匹配分数,文中提到了 cosine、双线性以及 tensor layer 这 3 种计算方法,由于网络参数的不断加大,拟合精确度和复杂度也依次提升

  • 对前一步得到的匹配度矩阵,先是用 k-max pooling 提取,然后用 MLP 后输出最终的匹配分数

4.1.5 aNMM 模型

CIKM2016 年提出的 attention based Neural Matching Model,简称 aNMM 模型,原文主要解决 QA 匹配问题,模型同样可以应用在 query 和 doc 中两段文本的匹配关系设计中。前面讲到的 ARC-II 模型以及 MatchPyramid 在匹配矩阵后,都用到 CNN 的卷积层做 n-gram 的提取。而 CNN 卷积的基本思想,是不同位置的 word 是共享权重。而在 aNMM 模型中,作者认为不同位置的 word 在卷积核中共享权重是不合理的,因此提出了基于 value 的共享权重方法。根据共享权重的组数不同,论文提出了两种模型,aNMM-1 模型和 aNMM-2 模型。

4.1.5.1 aNMM-1 模型

按照模型结构可以分为 3 层,输入层、value share 层以及 attention 层


input encode 层


对于给定的问题 query q,以及对应的文档 a,q 由 m 个 word 组成,a 由 n 个 word 组成,通过 word embedding 得到 q 和 a 各自的 embedding 矩阵。让 q 和 a 的 word 两两求 cosine 相似度,可以得到一个 M*N 的匹配矩阵 P,里面的每个元素 Pj,i代表的是 q 中的第 j 个 term,以及 a 中第 i 个 term 的相似度。


Value share 层


从匹配矩阵中 P 提取到的不同 q 和 a 的匹配分数存在一个问题,就是给定一个 query,不同 doc 长度是不同的,得到的匹配矩阵的大小也不同。因此需要有个机制将其映射到定长的维度中去方便后续网络处理。


这里很容易想到 CV 领域里的 CNN 网络结构,通过卷积和池化的方法进行维度的压缩。在图像领域 CNN 之所以能够奏效,很大程度在于图像本身的局部关系,也就是 CNN 的权重是 position-shared 的。如图 4.17 所示是个 3*1 的卷积核,相同颜色的边共享权重,所有同个位置的边共享相同的权重,在途中分别是红色、蓝色和绿色。



图 4.17 position-share 权重的 CNN


但是在 NLP 领域的文本匹配问题上,query 和 doc 的匹配 term 可能出现在任意位置上,并不一定是强位置关联的。在前面得到的 query-doc 匹配矩阵 P 中,不同的匹配分数值对最终结果的共享程度是不同的,相同权重的对结果的共享应该一致,因此作者提出了一种 value-shared 的权重方法,如图 4.18 所示。



图 4.18 value-share weight 示意图


为了方便说明,在图中将区间分成 3 个桶,[0,0.5],[0.5,1],[1,1]。其中实线部分表示上面第一个结点 node1 的参数,虚数部分表示第二个结点 node2 的参数。同样的,相同线型和颜色的表示共享权重。权重等于 1 的 3 个结点用红色共享权重,权重小于 0.5 的两个结点 0.3 和 0.4 用绿色共享权重,权重大于等于 0.5 小于 1 的 4 个节点 ( 0.8、0.9、0.6、0.7 ) 共享权重。


由于匹配矩阵 P 中每个元素的值都是在-1 到 1 之间 ( cosine 取之范围 )。因此在实际模型中作者将取值范围区间按照 0.1 进行分桶,总共有 21 个分桶,落到相同的分桶区间的 value 是共享权重的。通过这样的方式,可以将匹配矩阵转为相同的维度,不管输入矩阵的维度大小,隐层节点的个数都是固定的。


假设后续隐层的维度为 K+1,另 xjk表示问题 q 中第 j 个 term,在第 k 个分桶节点上的所有匹配信号值,那么隐层第 j 个节点则为这 K+1 个分桶的加权求和:



attention 层


经过前面两层网络,对于每个 query-doc 对,都可以计算得到一个 M*1 的向量,向量的每个元素都表示 doc 与当前 query 中 M 个 term 中每个 term 的相似度。


作者在论文中引入了参数向量 v,维度和 P 一致,来对问题中的每个 term 求点积映射得到每个 term 的权重并做 softmax 归一化,然后和前面得到的每个隐层节点 hj相乘,得到最总的匹配分数 y:


4.1.5.2 aNMM-2 模型

相比于 anmm-1 的改进在于,对于 value-share 权重网络,anmm-1 只有一个。而类比于 CNN 的卷积层有多个 filter,anmm-2 提出来可以有 k 个 value-share 权重网络,表示权重网络的组数,整体网络结构如图 4.19 所示。



图 4.19 aNMM-2 模型框架


总结来说,aNMM 模型结构框架主要的创新点在于:


  • 借鉴了 CNN 模型中相同位置共享权重 ( position-shared weight ) 的思想,认为 QA 匹配问题 ( 可以扩展到其他的 query 和 doc 的两段文本匹配问题 ) 不应该是同位置共享,而应该是相同的匹配值共享权重 ( value-shared weight ),从而起到 pooling 的作用,保证隐层个数都相同

  • 类比 CNN 的多个 filter 思路,共享权值网络也可以有多层

4.2 基于 attention 的模型

基于 word level 的匹配度矩阵可以说是整个基于 match function learning 模型的标配组件,而这有这种 low level 的匹配矩阵信息基本是不够的,在当前 attention 机制在整个 NLP 领域随处可见的情况下,attention 也基本成了后续众多模型的标配组件之一。除了徐君老师的 slides 里的 DecAtt 模型,本章也加入了近两年在各大主会 &文本比赛里比较流行的十几个模型,如 BiMPM、ESIM、DIIN 等。

4.2.1 ABCNN 模型

前面讲的基于 CNN 的匹配模型如 ARC-II,CNN-DSSM 模型在匹配的时候使用了在图像和文本领域都大放异彩的 CNN 模块,2015 年的 ACL 上在此基础上又加入了近年来在 CV 和 NLP 也同样无处不在的 attention 模块,Attention-Based CNN 模型,简称 ABCNN 用来做 query 和 doc 的文本匹配。

4.2.1.1 BCNN

在加入 attention 之前,先看下没有 attention 的 Basic CNN 模型,简称 BCNN 模型,如图 4.20 所示:



图 4.20 BCNN 模型结构


对于 query 和 doc 两个输入的文本表示为 s0和 s1,长度分别为 s0和 s1 ( 实际操作需要用 0 补齐到一样的长度 s ),为了方便进行说明,在图中没有 pad 的这一步。


输入层


两个句子的 embedding 向量,embed 维度为 d0 ( 图中等于 8 ),输入均为 d0*s


卷积层


通过维度大小为 w*d0的卷积核,分别沿着词的方向做卷积,d0高度方向和词的 embedding 维度保持一致,w 表示卷积的宽度。论文使用的是 wide convolution,也就是对原始输入需要左右长度为 w-1 的方向分别补 0,这样,经过宽卷积的 feature map 为 s+w-1,在图中,左边 s=5, w=3,因此卷积后 feature map 为 7*d0;右边 s=7,w=3,卷积后 feature map 维度为 9*d0。卷积核个数为 d1


池化层


以图 4.20 为例,分为两种池化层:


  • Average pooling(w-ap):如图 4.20 所示,使用滑动窗口的方式,滑动窗口大小为 w,这样经过宽卷积列数为 s+w-1 的 feature map 经过 w-ap 后,列数重新变为 s 列。这样的好处是可以根据情况叠加任意多层的 wide convolution +average pooling

  • All pooling (ap):最后一层的 pooling 使用的是在整个句子维度 s 的 pooling,最终得到一个列向量。最终的原始句子 s0和 s1经过这些网络结构后变为左右两个列向量 concat 后输入到 MLP 网络中

4.2.1.2 ABCNN-1

论文提出的第一种 attention-based 的 CNN 结构为 ABCNN-1,如图 4.21 所示:



图 4.21 ABCNN-1 模型


对比前面没有 attention 的 BCNN,最大特点是两段文本 query 和 doc s0和 s1的卷积表示,不再只是自身的表达,而是引入了 s0和 s1的交互矩阵 A。用 F0,r,F1,r表示原始句子的向量表达,大小均为 s*d,表达如下:



这里 Fi,j表示的是 query s0的第 i 个 term 和 doc s1的第 j 个 term 的 match score,match score,大小为 s*s,可以采用多种衡量距离的方式,论文文中使用如下的表达发现效果不错,简单来说,如果 x 和 y 越接近,匹配分数越接近于 1:



通过引入 attention 矩阵 W0和 W1,得到两段文本 query 和 doc 的最终加权特征向量 F0,a和 F1,a



将原始的句子向量 F0,r,F1,r以及 attention 特征向量 F0,a和 F1,a concat 一起后作为最终 MLP 的输出。

4.2.1.3 ABCNN-2

ABCNN-1 的 attention 机制发生在卷积操作之前,而 ABCNN-2 是在卷积输出之后进行 attention。原始的句子向量经过卷积后,得到 7*d 和 9*d 的表示。因此 query s0以及 doc s1的交互 attention 矩阵 A 是个 7*9 的矩阵(实际中也会用 0 补齐),如图 4.22 所示。



图 4.22 ABCNN-2 模型框架


其中 a0,j表示的是第 0 个句子 query s0的第 j 个单词,它的权重为 attention 矩阵中第 j 行的和;a1,j表示的是第 1 个句子 doc s1的第 j 个单词。



用 Fi,r,c表示的是第 i 个句子中卷积层的输出,Fi,r,p表示第 i 个句子池化层的输出,通过一个 w 的滑动窗口,池化层第 j 列 ( 每一列长度为 d ) 为卷积层第 j 列到第 j+w 列以及 attention 矩阵 A 相乘得到。



总结来说,ABCNN-1 和 ABCNN-2 有几个不同的地方在于:


  • ABCNN-1 方法中的 attention 是作用在卷积层,而 ABCNN-2 是发生在池化层,也就是已经过了卷积层。

  • ABCNN-1 方法需要两个额外的转换矩阵 W0和 W1得到 attention 特征向量,从而比 ABCNN-2 需要更多的参数。因此作者认为更容易过拟合。

4.2.1.4 ABCNN-3

ABCNN-3 做的是同时结合 ABCNN-1 和 ABCNN-2 方法,如图 4.23 所示:



图 4.23 ABCNN-3 模型


总结 ABCNN 模型特点:


  • ABCNN-1 模型的 attention 机制发生在卷积层之前,也就是两段文本交互计算之前。query 和 doc 原始向量表示为 F0,r,F1,r,通过参数矩阵 W0和 W1得到加权表示 F0,a和 F1,a,四个向量 concat 后进行卷积。额外引入参数 W0和 W1,作者认为容易发生过拟合。

  • ABCNN-2 模型的 attention 机制发生在卷积之后,也就是两段文本已经交互计算之后。通过计算 query 和 doc 的 attention 矩阵 A,然后对 query 和 doc 的卷积进行加权滑动得到池化的输出。

  • ABCNN-3 同时将 ABCNN-1 和 ABCNN-2 两个模型做融合。

4.2.2 DecAtt 模型

EMNLP 2016 提出的 Decomposable Attention Model,简称 DecAtt 模型,是较早在 query 和 doc 的关系建模上引入 attention 机制的。该模型将两个句子通过分解 ( decompose ) 成每个 word 的软对齐机制,来计算当前文本 query ( doc ) 中每个 word 与另一段文本 doc ( query ) 的 attention 得到每个 word 的加权向量,然后通过当前 word 的原始向量与 attention 加权向量的 compare,最终对交互得到的向量进行 aggregate 得到最终的匹配分数,整体框架如图 4.24 所示:



图 4.24 DecAtt 模型整体框架


query 和 doc 各自由 la和 lb个 term 组成,每个 term 是个定长的 embedding 向量:



整个模型可以分为 3 步、attend、compare 以及 aggregate


① attend


对于 query 向量 a 的第 i 个 term 和 doc 向量 b 的第 j 个 term 的权重用如下公式表示:



其中 F 用的是普通的神经网络并经过 RELU 激活。如果使用 F’函数,复杂度为 la*lb。而先用 F 函数拟合 query 和 doc 各自的表达,则 F 只需要计算次数为 la+lb。原始的复杂度从 la*lb变成了 la+lb。除此之外,论文中将 attention 机制看成一种软对齐机制(soft-align),将 query 中第 i 个 word 与 doc 中每个 word 分别求权重,然后加权求和,就可以得到第 i 个 word 的权重βi;同理可以得到 doc 向量 b 中第 j 个 word 的权重αj



② compare


从①可以得到 query 向量 a 和 doc 向量 b 中每个 word 的权重βi和αj,通过函数 G 就可以得到各自的加权 ( soft-align ) 表达,这里 G 用的是 MLP 全连接网络:



③ aggregate


得到每个 word 的加权表达后,最终的句子为每个 word 直接 sum 得到:



由于 NLI 是个分类问题,因此后面使用一个线性分类器进行分类:



损失函数使用 cross entropy 损失函数:



总结 DecAtt 模型,整体可以用如下图 4.25 所示:



图 4.25 DecAtt 模型结构


整个过程可以分为 3 个步骤:


① attend:用 attention 机制看成 soft-align 对齐过程,得到 query 和 document 中每个 word 的加权向量 ( subphrase )


② compare:把每个 word 的加权向量 subphrase,与原始的向量进行 compare 通过一个前向网络拟合,作为 query 的最终向量以及 doc 的最终向量


③ aggregate:通过一个神经网络 H 去捕捉 query 和 doc 的向量,得到匹配分数。在该 paper 中是个分类问题,因此使用的是交叉熵作为损失函数

4.2.3 MCAN 模型

在文本匹配的很多模型中,现有的很多基于 attention 的模型通常都把 attention 看成一种特征提取的工具,但是缺陷是常常仅受限于一种 attention 的变体,如果要使用多个 attention,通常是使用 concat 的方式,整个模型结构将会成倍变大。在 2018KDD 上,南洋理工大学提出了一种 Multi-Cast Attention Network,简称 MCAN 模型,论文面对的问题是 QA,一样可以扩展到 query 和 doc 的文本匹配中。模型通过多视角的 attention 新框架来解决这个问题,如图 4.26 所示:



图 4.26 MCAN 模型框架


从整个模型框架来看可以分成 5 层:① input encoder 层;② co-attention 层;③ multi-cast attention 层;④ LSTM encoder 层;⑤ 输出层


input encoder 层


首先,将两段文本 query 和 doc 分别通过预训练得到的 word embedding 进行映射后,得到各自的 embedding 向量,每个 term 的 embedding size 为 d。然后通过 highway encoder 进行映射。这里的 highway encoder 类似于一种门机制,用来控制当前输入的每个 term 流入到下一层的信息多少。


比较经典的一个 highway 表达如下,给定 x,得到的 Highway encoder 输出 y:



其中 H 为 RELU,T 为 sigmoid 函数,WH和 WT为待训练的参数,维度为 r*d。


co-attention 层


对于 query 中第 i 个 term 以及 doc 中第 j 个 term 的匹配分数 sij,论文中使用经过 F 映射后的向量点积如下:



其中 F(.)可以采用简单 MLP 网络,另外这里也可以采用双线性映射或者 concat 的方式得到 sij的值。对 query 中的 lq个 word 和 doc 中的 ld个 term 两两进行上述计算,可以得到一个 lq*ld的匹配矩阵。


由于每个 query 和 doc 的输入长度都不一致,因此需要通过 attention pooling 机制做映射,论文提出了 4 种不同的 attention 方法


a. max pooling 最大池化


对于 query 的第 i 个 term,选择和 doc 中所有 lb个 word 在交互矩阵中最大的值来代表其重要性,相当于是在第 i 行选择最大的值,所以是 col-wise 的 max pooling;同理对于 doc 来说是 row-wise 操作:



b. mean pooling 平均池化


对于 query 的第 i 个 term,选择和 doc 中所有 lb个 word 在交互矩阵中的平均值来代表其重要性,因此是 col-wise 的 mean pooling:



c. alignment pooling 对齐池化


把 attention 机制看成是一种软对齐 ( soft align ),思想和 4.2.2 讲到的 DecAtt 模型一致,将 query 中第 i 个 term 与 doc 中每个 term ( 一共 lb个 )分别求权重,然后加权求和,就可以得到第 i 个 term 的加权向量 di’;同理可以得到 doc 向量 b 中第 j 个 term 的加权向量 qj’。



d. intra attention 内部注意力


对于 query 里的每个 term 都计算与 query 里所有 term 的交叉权重并做归一化,最终每个 term 都是 query 里所有 term 的加权向量表达;同理,对于 doc 里的每个 term 也做同样的操作,得到每个 term 的加权向量表达。由于该步骤都是在 query 和 doc 内部计算,因此也称为 self-attention。



multi-cast-attention 层


对于 co-attention 层得到的不同表示侧重点不同,因此在这一层为了是为了将不同的 attention 进行融合,同时控制参数复杂度。该层也是整个模型 MCAN ( Multi-Cast-Attention Network ) 的核心所在。


a. casted attention


对于 query 和 doc 的表示用表示,通过前一层 co-attention 得到的表示用 x 表示,对两个向量的编码,分别用 concat、哈达码积、以及 minus 不同的方法表示,分别得到 fc、fm和 fs如下所示:



这里的 Fc表示的是不同的压缩函数。


b. 压缩函数


对于前面讲到的 Fc,目的是为了将不同的两个向量进行压缩表示,具体有三种表达方式如下:


Ⅰ. Sum Function(SF)



Ⅱ. Neural Network(NN)



Ⅲ. Factorization Machines(FM)



对于不同的 attention casts 之间,由于捕捉的是不同的是 attention,模型之间并不共享权重。


c. multi-cast 表示


对于每个 query-doc 的 pair 对,都分别计算 max pooling、mean pooling 以及 alignment pooling。对于 query 和 doc 本身则使用 intra attention,如图所示。每种 attention 机制都可以得到一个 3 维的向量 ( 代表 concat、点积和 minus 的 3 个输出值 fc、fm和 fs ),并且和原始的 word embedding concat 后进入下一层。


LSTM encoder 层


前一层得到的的表示再经过一层 LSTM 来学习得到序列之间的关系:



注意这里对 query 和 doc 都应用上述的 LSTM 公式,且 LSTM 的模型参数在 query 和 doc 之间是共享的。LSTM 的每个隐层的输出 h1,h2,h3,…,hl之后得到的是不定长的输出,作者使用了 mean pooling 和 max pooling 并把结果 concat 起来,称为 Mean-Max 操作,对 query 和 doc 都得到一个固定维度的输出向量 xq和 xd



输出层


前面得到 query 和 doc 的最终表示 xq和 xd后,经过向量点积、相减并且经过两层的 highway network H1和 H2后得到 prediction 的输出:



最终的输出经过一层 softmax 得到匹配分数:



总结下 MCAN 模型的特点:


  • 输入层通过 highway encoder 将原始的 embedding 经过编码输入下一层

  • attention 层分为两部分 co-attention 以及 multi-cast attention。对于 co-attention 层对于每个 query-doc 的 pair 对,使用 max pooling、mean pooling 以及 alignment pooling 三种 attention 机制,对 query 和 doc 本身则使用 intra-attention(self-attention)

  • 通过前一层的 co-attention,query 和 doc 可以得到 3 种 attention:alignment-pooling,max-pooling 以及 mean-pooling。对于 query 和 doc 则各自得到 intra-pooling,一共有 5 个 attention,每个 attention 可以得到原始向量与 attention 交互后的向量,通过 concat、哈达码积和 minus 后,经过压缩函数进入下一层

  • 前面 5 种 attention 得到的网络经过 LSTM 编码,并经过 mean-max 池化后得到固定维度向量,经过两层的 high way 网络后套上 softmax 输出

4.2.4 HCRN 模型

IJCAI2018 年新加坡南洋理工大学提出的 HCRN 模型,提出了一种复数向量。该模型和 4.2.3 介绍的模型 MCAN 模型是同一个团队,可以发现 HCAN 模型里很多网络结构都和 MCAN 都有相同的地方,整个框架如图 4.27 所示。



图 4.27 HCRN 模型框架


input encoding


对于给定的两个句子 a 和 b,每个句子由 l 个 term 组成,通过 We矩阵将每个 term 映射到维度为 r 的 embedding 空间:



每个 term wi通过 Wp映射并经过 RELU 激活输出,得到新空间下的向量 ui,维度从 d 变成了 n:



接着,通过一个双向的 LSTM,得到句子中每个时刻的隐层输出 hi



其中,每个隐层的输出为 d 维的向量,由于是双向 LSTM,每个隐层的输出包含前向向量和后向向量,因此 d=2n。



vanilla co-attention 机制


对于 BiLSTM 层的输出,可以得到两个句子的向量 a 和 b,接着得到两个向量的匹配矩阵 s,维度为 la*lb,第一个句子第 i 个 term 和第二个句子第 j 个 term 通过 F 函数求向量点积匹配分:



其中 F 函数的设计采用前向神经网络:



a. Alignment pooling


把 attention 机制看成是一种软对齐 ( soft align ),思想和 DecAtt 模型一致,将 query 中第 i 个 term 与 doc 中每个 word ( 一共 lb个 ) 分别求权重,然后加权求和,就可以得到第 i 个 word 的权重βi;同理可以得到 doc 向量 b 中第 j 个 word 的权重αj



b. Extractive pooling


对于 query 和 doc,分别采在 column-wise 和 row-wise 维度上进行 max pooling,取最大值得到 query 和 doc 新的表示 a’和 b’:



其中 S 函数为 softmax 函数。也就是说,对于 query 的 la个 word 中的第 i 个 word,选择和 doc 中所有 lb个 word 交互矩阵中最大的值来代表其重要性,相当于是在第 i 行选择最大的值,所以是 col-wise;同理对于 doc 来说是 row-wise 操作。


Hermitian Co-Attention


这一步个人认为是主要区别于 MCAN 模型的地方。论文提出了将原始的向量映射到复数向量的方法,对于两个复数向量的乘积,也称为 Hermitian Inner product,定义如下:



其中 ai=Re(ai)+Im(ai),左边 Re(ai)代表的是复数向量的实数部分,第二项 IM(ai)代表的是复数向量 ai的虚数部分,这里 i 是虚数单位,是-1 的平方根。是 ai的共轭复数 ( 两个复数 a 和 b,实数部分相等,虚数部分互为相反数称为共轭复数 ),也就是 ai= Re(ai)-Im(ai)。


a. 向量复数化


通过上一层得到的 query 和 doc 的 embedding 都是实数向量,为了得到虚数部分向量,论文里提到试过对虚数向量进行随机初始化,或者直接用原始的 word embedding,效果都不好,最终模型使用的是个非线性映射得到映射,对于 query 和 doc 分别得到 Fproj(ai)以及 Fproj(bj)。


b. 匹配矩阵计算


得到 query 第 i 个 term 虚数向量 Fproj(ai),以及 doc 第 j 个 term 的虚数向量 Fproj(bj)后,匹配分数通过计算两者的 Hermitian inner product,并取实数部分得到:



论文里同样也利用一个 d*d 维度的 M 矩阵来进行双线性的复数向量计算:



总结来说,HCRN 模型和 MCAN 模型均出自同一团队,有许多的地方是相似的:


  • 第一层的 input encoding,HCRN 模型的 word embedding 经过线性映射然后通过双向 LSTM 编码得到表示;而 MCAN 是通过 high way 网络结构对 word embedding 进行编码表示

  • 第二层都是 co-attention,HCRN 模型用了两种 attention 机制:alignment pooling 以及 extractive pooling ( max pooling );而 MCAN 模型用的是 4 种:alignment pooling、max pooling、mean pooling 以及 self-attention。可以看出,HCRN 模型少了 mean pooling 以及 self-attention

  • 第三层开始 HCRAN 提出了复数向量化的概念,并计算复数向量化的 Hermitian 内积得到匹配分数,然后通过 M 矩阵映射后得到最终的匹配分数

4.2.5 BiMPM 模型

IJCAI2017 年提出的双向多角度匹配模型 Bilateral Multi-Perspective Matching 模型,简称 BiMPM 模型,在关于文本匹配的很多任务上都取得了些不错的成绩。该模型最大的创新点在于,对于给定的 query 和 doc,作者认为在匹配过程中,不仅需要考虑 query 到 doc,也应该考虑从 doc 到 query 的倒推关系,因此这是个双边 ( Bilateral ) 的关系。对于多角度,则是在考虑两个句子 query 和 doc 的关系的时候,用了 4 种不同的方法,体现了多角度 ( Multi-Perspective ) 的思想。整个模型结构如图 4.28 所示:



图 4.28 BiMPM 模型框架


如上图所示,整个模型可以分为 5 层:① 词表示层;② 上下文表示层;③ 匹配层;④ 聚合层;⑤ 输出层


词表示层 ( word representation layer )


这一层的主要目的是将原始的两个句子 P 和 Q 中每个词,映射成一个维度为 d 的 embedding 向量。



其中 P 由 M 个 word 组成,Q 由 N 个 word 组成其。对于 P 和 Q 中的每个 word,由两部分 embedding 构成,第一部分是 word 本身经过预训练得到的 embedding 向量,第二部分是字符集别的 embedding 向量 ( character-composed embedding ),是由组成 word 的每一个字符向量经过 LSTM 编码得到,取 LSTM 中最后一个隐层的输出作为字符向量。


上下文表示层 ( context representation layer )


这一层的目的是将上下文信息融入到句子 P 和句子 Q 的每一个 time step 中去,文中采用双向 LSTM 对上下文进行编码。对于第一个句子 P(query),其前向和后向编码表示如下:



其中 pi表示句子 P 中第 i 个 word 的 embedding 输入,hi表示 i 时刻 ( 第 i 个 word ) 的隐层输出,hi-1和 hi+1分别表示前一时刻 i-1 和后一时刻 i+1 的隐层输出。


对于第二个句子 Q(doc),同样采用双向 LSTM 来表示:



其中 qj表示句子 Q 中第 j 个 word 的 embedding 输入,hj表示 j 时刻 ( 第 j 个 word ) 的隐层输出,hj-1和 hj+1分别表示前一时刻 j-1 和后一时刻 j+1 的隐层输出。


匹配层 ( matching layer )


这一步是整个 BiMPM 模型的核心创新,该层的目的是,在前一步提取了 P 和 Q 两个方向的隐层输出 embedding 表示后,在匹配层需要找到两者的匹配关系。模型分别从 P-Q 以及 Q->P 两个方向进行匹配。


首先,对于给定的两个向量 v1和 v2为了得到其匹配关系 ( 相似度、相关度 ),简单的无参数做法是求向量点积,或者 cosine 相似度。为了更好拟合两者关系,论文引入了新参数 W,其中 v1和 v2是 d 维向量,W 是一个 l*d 的参数矩阵,通过训练得到,其中 l 是视角 ( perspective ) 的数量,类似 CNN 中的 filters 概念。



通过参数 W 以及拟合函数 fm ( 后续会讲到如何设计 ),将原始的两个向量从 d 维映射得到一个 l 维的向量 m:



其中 m 中的每一个元素 mk(k=1,2,3…,l)由 v1和 v2经过 Wk矩阵的映射向量求 cosine 得到其余弦匹配分数如下:



这里 Wk表示的是 W 矩阵的第 k 行。


对于 fm函数,在该文中给出了四种匹配策略,分别为 Full-Matching,Maxpooling-Matching,Attentive-Matching,Max-Attentive-Matching,如图所示:



图 4.29 BiMPM 4 种不同的 matching 方法


a. full matching


以第一个句子 P 为例,如图 a 中左边的橙色条框,对于 P 中的每个前向单词 ( 对于后向单词则为),都和 Q 中所有 N 个隐层的最后一个隐层输出( 对于后向则为) 进行匹配,通过 fm网络拟合得到前向和后向两个维度为 l 的向量 mifull。如图 a 中 a 最右侧的蓝色条框为前向最后一个隐层的输出:



同理的,对于 Q 中的每个单词,也依次得到和 P 中前向 LSTM 中最后一个以及后向 LSTM 中第一个隐层输出的匹配向量。


总结来说,full-matching 方法在计算当前匹配的时候,只用到后向 LSTM 隐层中的最后一个隐层以及前向 LSTM 隐层中的第一个隐层,中间的隐层信息并未利用。对于 P 和 Q 中的每个 word 都需要和对方进行两次计算,因此时间复杂度为 O(2*M+2*N)。


b. max-pooling matching


以第一个句子 P 为例,对于 P 中的每个前向单词(对于后向单词则为),如图 b 中最左边的橙色条框,都和 Q 中所有 N 个隐层输出一一计算,每个向量对通过 fm映射后可以得到 N 个 l 维度的匹配向量后,对这 N 个匹配向量进行 element-wise 的最大值,也就是在 l 个维度中的每个维度,从 N 个向量当前这个维度选择最大值,相当于是对 N 个隐层的 max-pooling 操作,最终得到前向和后向两个维度为 l 的向量 mimax



同理,对于 Q 中的每个单词,也依次得到和 P 中的前向 LSTM 中 M 个 word 通过 element-wise 最大池化得到的前向匹配向量,以及和 P 中的后向 LSTM 中 M 个 word 通过 element-wise 最大池化得到的后向匹配向量。


总结来说,max-pooling matching 在计算当前匹配的时候,利用到了所有隐层的所有信息,然后对向量中每个维度,从所有的 word 中的最大值作为匹配分数。除了最大值的隐层信息,其他隐层信息也是没有利用到。由于是 P 和 Q 每个 word 两两都需要计算,时间复杂度是 k*M*N,k 为常数项。


c. attentive-matching


以第一个句子 P 为例,对于 P 中的每个前向单词 ( 对于后向单词则为 ),依次和 Q 中的所有单词计算 cosine 余弦相似度从而得到一个 M*N 的相似度矩阵。以 P 中第 i 个 word 和 Q 中第 j 个 word 为例 ( 矩阵的第 i 行 j 列 ),其权重表达如下所示:



这里得到的 ${\vec\alpha}{i,j}{\overleftarrow\alpha}{i,j}{\vec h}_j^q{\overleftarrow h}_j^q$的前向和后向权重,整个句子 Q 的注意力向量为其权重的加权表达:



分母对权重求和是为了保证权重的归一化。最终,将 P 中第 i 个 word,与句子 Q 的注意力向量通过 fm函数得到前向和后向两个维度为 l 的匹配向量 miatt



同理,对于 Q 中的每个单词,也依次通过计算 P 中各个 word 的权重,得到对应的 P 中每个词的权重后,通过 P 中每个词的 weight-sum 可以得到 P 的注意力向量。最终计算 Q 中每个单词与 P 中对应的注意力向量,得到前向和后向两个维度为 l 的匹配向量。


总结来说,attentive-matching 方法充分利用了每个隐层的输出计算权重进行 weight-sum。


d. max-attentive matching


该方法和 attentive-matching 前面计算权重的方法一致,不一样的地方在于,attentive-matching 是用 weight-sum 得到注意力向量,而 max-attentive matching 方法是用权重里最高的那个向量来得到注意力向量。


还是以第一个句子 P 为例,对于 P 中的每个前向单词 ( 对于后向单词则为 ),依次和 Q 中的所有单词计算 cosine 余弦相似度,最终得到的相似度矩阵(M*N)中,第 i 行 j 列元素表达如下:



这一步之前和 attentive-matching 是一致的。不同地方在于,对于 i 所匹配的 N 个权重,选择权重最大的作为注意力向量。


以上 4 种不同的匹配策略捕捉到的信息各自不同,在论文中为了提升模型拟合精度,在实际应用中是 4 种 attention 策略的叠加,每个策略中每个 word 得到一个 l 维的向量,最终得到 4 个匹配向量 concat 起来


对于句子 P,得到一个 M*4l 的矩阵 ( M 个 time-step,每个 time-step 是一个 4*l 维度的向量 ),对于句子 Q,得到一个 N*4l 的矩阵 ( N 个 time-step,每个 time-step 是一个 4*l 维度的向量 )。


聚合层 ( aggregation layer )


这一层的目的,是将两个句子 P 和 Q 匹配得到的向量,聚合成一个固定长度的匹配向量。文中依然使用了双向 LSTM 网络去拟合,如图 2 中 aggregation layer 中的 4 个绿色向量所示。从 P->Q 前向和双向得到两个向量,从 Q->P 双向和前向各自得到一个向量,最终 4 个向量 concat 起来作为下一层的输入。


预测层 ( prediction layer )


文中使用两层 MLP 后,最后 softmax 作为概率输出。


总结来说,BiMPM 模型特点如下:


  • 输入层 embedding 对比大多数的 word embedding,引入了 character embedding,每个 word 的 embedding 表达是预训练的 embedding 和字符 embedding 经过 LSTM 编码后得到的表示组合而成

  • 引入了上下文表示层:用双向的 LSTM 来对 P 和 Q 的每个 word 进行编码,每个 word 可以得到前向和后向的两个隐层输出表示

  • 多视角关系:对于给定的两个 d 维向量 v1和 v2,通过 l*d 的参数 W 通过网络 fm进行映射,各自得到 l 维的向量,l 类似于 CNN 中的 filter,l 的维度就代表了多视角的维度。

  • 双向计算关系:所有的计算都是对称的,从 P 对 Q 的各种网络结构,一定能看到 Q 对 P 也会有,因此是个双向关系

  • 多种注意力匹配关系:对于两个句子 P 和 Q 的关系,提出了 4 种不同的 attention 计算方法,分别是:

  • a. Full-Matching:以 P->Q 计算为例,对 P 中每个 word,和 Q 中最后一个 ( 前向 LSTM ) 和第一个 ( 后向 LSTM ) 隐层的 word 分别通过 fm网络计算后,得到该 word 对于 Q 的两个维度为 l 的前向和后向匹配向量

  • b. Maxpooling-Matching:以 P->Q 计算为例,对 P 中每个 word,和 Q 中每个 word 经过 fm网络映射后得到 N 个维度为 l 的前向和后向向量,对 l 维度的每一维选择最大 ( element-wise max-pooling ) 值,得到该 word 对于 Q 的两个维度为 l 的前向和后向匹配向量

  • c. Attentive-Matching:以 P->Q 计算为例,对 P 中每个 word,和 Q 中的每个 word 计算前向和后向 cosine 相似度,然后计算该 word 对于句子 Q 的注意力向量后,两个向量通过 fm网络映射计算,可以得到两个维度为 l 的前向和后向匹配向量

  • d. Max-Attentive-Matching:以 P->Q 计算为例,对 P 中每个 word,和 Q 中的每个 word 计算前向和后向 cosine 相似度,然后用相似度中的最大值作为 Q 的注意力向量,这两个向量通过 fm网络映射计算,可以得到两位维度为 l 的前向和后向匹配向量

  • 计算复杂度高:如此复杂的网络结构,很多计算之间又是串行的,可想而知,对于大规模的文本匹配计算速度很慢

4.2.6 ESIM 模型

ESIM 模型在众多短文本匹配比赛中大杀四方,表现十分出色。ESIM 模型全称为"Enhanced Sequential Inference Model",增强序列推断模型,是加强版的 LSTM。论文中解决的虽然是 premise 和 hypothesis 的关系,但是我们可以应用到 query 和 doc 或者其他两段文本关系之中。对比以往传统的 LSTM 模型非常复杂的网络设计,ESIM 模型通过精细的序列式网络设计,以及同时考虑局部推断和全局推断的方法来达到更好的效果。整体框架如图 4.30 所示。



图 4.30 ESIM 模型网络结构


整个模型结构主要有 3 部分:① input encoding 层;② 局部推理层;③ 推理组合层。


input encoding


对于给定的两个句子 a 和 b ( 代表前提 premise 和假设 hypothesis ),分别由 la和 lb个 word 组成,其中每个 word 为维度为 l 的 embedding 向量,一般由预训练得到:



作者使用双向 LSTM 作为基础模块,用表示句子 a 中第 i 个时刻的隐藏层输出,用表示句子 b 中第 j 个时刻的隐藏层输出,表示如下:



除了常规的 Bi-LSTM 之外,文中还使用了 Tree-LSTM 来捕捉序列关系。在每个 t 时刻,具体结构如下:


  • 当前输入除了 xt,还有前一时刻的隐层输入 ht-1的左右叶子结点 ht-1L以及 ht-1R

  • 输入门 input gate 以及输出门 output gate 依然只有一个,两个门的输入都包括当前输入 xt、前一时刻隐层 ht-1的两个叶子结点 ht-1L和 ht-1R

  • 遗忘门 forget gate:和传统的 LSTM 不同,有两个,分别是 left forget gate 和 right forget gate,输入和前面两个门一样,分别是当前输入 xt、前一时 ht-1L和 ht-1R

  • 细胞状态:输入来自前一时刻细胞状态左右两个节点 ct-1L和 ct-1R,而左右两个遗忘门 forget gate 分别控制需要左右两个细胞状态需要保留的信息。



图 4.31 tree-LSTM 网络结构


整体的公式表达如下所示:



其中 Wf,Wi,Wc,Wo是一个 d*l 的待训练参数;U 是 d*d 的待训练参数矩阵。这样,原始的两个句子输入通过 word embedding 之后,通过左边一个 BiLSTM,右边一个 tree-LSTM 编码之后输入到下一层网络


局部推理层 local inference modeling


在很多相关性模型中,都使用硬对齐或者软对齐的方式来建立 query 和 doc 的关系。在前面 4.2.2 中的 DecAtt 模型中就是用 attention 机制来建立 soft-align 软对齐。而在 ESIM 模型中,作者延续使用了 DecAtt 的软对齐方式,对于给定的 query 句 a,以及 doc 句 b,建立两个句子之间每个 word 两两的向量点积作为相似度:



在原始的 DecAtt 模型中,作者使用的是例如 MLP 来计算 F(ai) 以及 F(bj)进而计算相似度;而在 ESIM 模型中,使用的是 LSTM 和 tree-LSTM 得到两个句子的表示后再计算相似度矩阵。得到 eij后,query 中第 i 个 word 的表示为 doc 中每个单词的 weight-sum;也就是说表示 b 中每个词与的相关程度。同理,假设句子 b 中第 j 个 word 的表示为句子 a 中每个单词的 weight-sum 表示,表示 a 中每个词与的相关程度。



得到局部推断后,为了增强信息,分别使用了向量相减、向量点积、最终 4 个向量 concat 起来,ma和 mb分别表示增强后的 premise 和 hypothesis。



推理组合层


a. composition layer


通过前一层局部推理建模之后得到的向量 ma和 mb进入当前的推理组合之后,作者依然使用了 Bi-LSTM 和 Tree-LSTM 来捕捉两者关系。对于 Bi-LSTM,公式和第一层 input encoding 的一致,而对于 Tree-LSTM 来说,表示如下:



这里使用了函数 F 来控制模型复杂度,F 函数在文章中作者使用了一层的前向神经网络并且经过 RELU 激活输出。


b. pooling


通过前面的 composition layer 两个 LSTM 网络编码得到的向量是变长的,query 句子 a 得到一个长度为 la的向量,doc 句子 b 得到一个长度为 lb的向量,在这层 pooling 层目的是为了得到一个固定长度的向量。


为了最大程度捕捉信息,论文中同时使用了 average pooling 和 max pooling,并将两种 pooling 得到的向量 concat 起来,在实验中证明比单纯的 sum pooling 效果要好,公式如下:



注意到上述最后一个公式,其实论文作者也用到了在 Tree-LSTM 中根节点的隐层状态一起 concat 起来,只是在上述公式中没有体现。


最终得到的向量 v 再经过全连接网络后,最后接一个 softmax 输出,训练过程使用多分类的 cross-entropy 损失函数。


总结整个 ESIM 模型特点:


  • 引入了 Tree-LSTM,是加强版的 LSTM。输入门和输出门都只有一个,输入包括当前输入,以及前一时刻隐层的左右叶子结点;遗忘门有左右两个,每个遗忘门的输入都包括当前输入以及前一时刻隐层的左右叶子结点;细胞状态有一个,输入为前一时刻的左右两个细胞状态

  • 局部推理层中对于匹配矩阵的做法区别于 DecAtt 模型使用 MLP 去提取 query 和 doc 两个句子的做法;而是用两种 LSTM 提取编码后计算加权向量表达。得到加权向量表达后,和原始向量进行乘积和相减后,总共 4 个向量 concat 起来,相当于是丰富了提取到的信息,作为下一层的输入

4.2.7 DIIN 模型

DIIN 模型是在 ICLR2018 上提出的要用于自然语言推理任务的模型,解决的是 premise 和 hypothesis 的关系,同理我们可以应用到 query 和 doc 或者其他两段文本关系之中。作者在这篇论文中引入了一种新的网络-交互推理网络 ( interactive inference network,IIN ),而通过用 attention 更密集的交互矩阵可以得到更丰富的语义信息,因此该模型名称为密集交互推理网络 ( Densely Interactive Inference Network,简称 DIIN )。


模型可以分为 5 个部分,分别是嵌入层、编码层、交互层、特征抽取层以及输出层,整个网络如图 4.32 所示:



图 4.32 DIIN 模型网络结构图


嵌入层


在 embedding 层中,论文中同时将单词级别 embedding、字符级别特征的 embedding 以及句法级别的特征 embedding 信息 concat 起来作为每个词的 embedding。


a. word embedding


使用的是 glove 预训练得到词向量进行初始化,并在模型训练过程中允许更新。


b. character embedding


引入 character embedding 的目的,是为了解决未登录词无法得到 word embedding 的时候,字符级别的 embedding 能够提供一些额外的信息。这里的方法是先经过 1 维的卷积核进行卷积之后,再通过 Max pooling 得到 character embedding。其中卷积核对与 P 和 H 是共享的。


c. 语法特征 syntactical feature


对于语法的特征,包含了两个方面的信息,一个是词性特征 ( POS ),另一个是二进制精确匹配特征 ( EM )。


通过上述 4 种 embedding ( 语法特征有 pos 和 em 两种 embedding ),最终的维度:


d=dword+dchar+dpos+dem,对于 query 和 doc 来说维度一致。


最终,query 的表示 P 是一个维度为 p*d 的矩阵 ( p 为 query 的单词个数 );而 doc 的表示 H 是一个维度为 h*d 的矩阵 ( h 为 doc 的单词个数 ),d 为隐层的维度。


编码层 encoding layer


编码层的主要作用是将第一层 embedding layer 得到的特征进行融合编码得到新特征。对于前面得到的 P 和 H,经过两层的 highway network 后,得到


为了进一步提取信息,论文中使用 self-attention 机制,同时利用词序和上下文信息进行编码。以 query 句子 P 的第 i 个 term 为例,得到的加权向量表达如下:




其中第一个公式 Aij个人觉得原文应该有误,括号应该包含,求的是两者的关系,论文中使用如下公式表达:通过将两个向量以及向量的点积三个向量 concat 后,变成一个维度为 3d 的向量,并通过一个简单的线性变化得到两个向量的匹配分数,也即 attention 分数,表示如下:



其中 wa是一个 3d 的参数向量,通过训练得到。而上述第二个公式得到的是 P 中第 i 个 term 的加权表达,分母做了归一化。同理,我们也可以得到关于 doc 句子 H 的加权表达。


这样,P 中第 i 个 term 的原始向量,以及经过 self-attention 的注意力向量,两个向量一起 concat 起来,作为 fuse gate 的输入。这里 fuse gate 作用类似于 dense net:



其中 W1,W2,W3位一个 2d*d 的参数矩阵,b1,b2,b3都是 d 维的参数向量,W 和 b 都通过训练得到。


同理的方法可以得到 doc 句子的表示。不过论文认为 P 和 H 的 fuse gate 权重是不共享的,目的是为了学习到 P 和 H 语法信息中的不同点。


交互层 interaction layer


本层对于前一层得到的两个向量中每个 term,两两求匹配分数:



这里 beta 函数学习的是两个向量的交互匹配分数,可以有多种表达,如 cosine,点积,MLP 网络等,论文中用的是简单的向量点积:



特征抽取层 feature extraction layer


本层在论文中没有太详尽到公式的介绍,大体意思是对于前一层得到的交互矩阵 I,利用 resnet 进行特征提取,个人感觉也不是太关键,实际在使用中该层可以考虑不用。


输出层 output layer


输出层使用简单的一个线性层以及 softmax 多分类进行分类。


总结来说,DIIN 模型特点如下:


  • 嵌入层对 embedding 的处理较为精细,除了预训练的 word embedding,还包括字符级别的 embedding,以及语法层面的词性特征 ( POS ) 和二进制精确匹配特征 ( EM )

  • 编码层先是用 high way 网络分别提取 query 和 doc 中每个 word 的向量后,再通过 self-attention,提取每个 word 的加权向量,然后两个向量通过 resnet 的思路,引入 fuse gate,分别提取原始向量的一部分,以及加权向量的一部分作为最终每个 word 的表达

  • 前两层都还只是 query 和 doc 各自的信息表示,特征交互层通过 query 中每个 word 和 doc 中每个 word 的向量点积得到交互矩阵,然后通过特征提取层的 dense net 进行特征提取,最终通过输出层的线性网络并利用 softmax 输出概率

4.2.8 MwAN 模型

2018 年 IJCAI 提出了的 Multiway Attention Network,简称 MwAN 模型,模型利用多种 attention 方式进行融合,整体框架如图 4.33 所示:



图 4.33 MwAN 模型网络结构


从图可以看出,整个模型分为:① encoding layer;② multiway matching;③ inside aggregation;④ mixed aggregation;⑤ prediction layer


encoding layer


给定两个句子 Q 和 P,分别由 N 个 term 和 M 个 term 组成,首先通过预训练得到的 embedding 得到 Q 和 P 各自的 word embedding 表示。接着,使用双向的 GRU 模型,得到 Q 和 P 的各个时刻隐层输出:



multiway matching


上一层编码层得到 Q 和 P 的 GRU 隐层输出后,需要进行信号的匹配,整个表示如下所示:



其中 htp表示 P 中第 t 个 word 的表示,hq表示 Q 的所有 M 个 word 的表示,fk为使用的匹配网络结构,qtk为最终得到的 P 中第 t 个 word 与 Q 匹配后分数。


对于 fk的设计,在该论文中作者提出了 4 种不同的方法,因此该层称为 multiway matching,分别为 concat, bilinear, dot 和 minus,每种计算 attention 的公式整体范式如下:第一步,P 中第 i 个 word 与 Q 中的每个 word,以第 j 个为例,两个向量,挨个计算原始的权重,这里两个向量的交互分为 concat、bilinear、doc 和 minus,得到第 j 个 word 的原始权重 sjt;第二步,对于 Q 中的所有 N 个 word 进行归一化,得到每个 word 的归一化权重;第三步,通过前一步得到的 Q 的每个 word 的归一化权重,乘以该 word 本身的向量表示,得到最终 P 中第 i 个 word 的加权向量表达。


a. concat attention


通过 concat 的方式,将 hjq经过 Wc1矩阵映射后的向量,以及 htp经过 Wc2矩阵映射后的向量 concat 一起。为了保证非线性进行 tanh 非线性变化后,再通过 vc向量进行映射得到原始权重 sjt,最终得到 Pi关于 Q 的归一化加权向量表达 qtc。这里待学习参数为 Wc1, Wc2和 vc



b. bilinear attention


通过一个 Wb矩阵,对两个向量 hjq和 htp进行双线性变化得到原始权重 sjt,最终得到 Pi关于 Q 的归一化加权向量表达 qtb。这里待学习参数为 Wb



c. dot attention


通过两个向量 hjq 和 htp 的点积 ( 哈达码积 ),维度和原始维度保持一致,然后通过非线性变化 tanh 映射后,再经过 vd的线性变化后得到原始权重 sjt,最终得到 Pi关于 Q 的归一化加权向量表达 qtd



d. minus attention


通过两个向量 hjq和 htp的向量相减,维度和原始维度保持一致,然后通过非线性变化 tanh 映射后,再经过 vm的线性变化后得到原始权重 sjt,最终得到 Pi关于 Q 的归一化加权向量表达 qtm



inside aggregation


在 aggregation 层分为两层,第一层是对于前面 matching layer 讲到的 4 种不同的 attention 方法,求各自内部的 aggregation,因此称为 inside aggregation。还是以 P 中第 t 个 word 为例,输入是将 P 中第 t 个 word 本身的表达 ( 双向 GRU 的输出 ) htp,以及前一层 matching layer 得到的关于 Q 的加权向量表达,以 concat attention 的输出 qtc为例 ( bilinear、dot 和 minus 分别为 qtb, qtd, qtm ),两个向量 concat 起来得到 xtc


第二个公式为了得到 xtc的重要性,通过 Wg的映射再经过非线性 sigmoid 输出其重要性,相当于是 gate 的作用,然后通过第三个公式得到重要性表达的 xtc*。接着通过一个双向 GRU 得到前向和后向的表达:



最终,对于 P 的第 t 个 word,以 concat attention 为例,可以得到其输出为:



同理,当用 bilinear、doc 和 minus attention,分别可以得到 htb,htd,htm


mixed aggregation


将上述 4 种不同的 attention 计算得到的输出 htc,htb,htd,htm在这一层融合,称为 mixed aggregation。首先通过两个矩阵 W1进行映射,下述公式第一个式子的 va可以认为是 bias。第二和第三个式子通过计算 4 种 attention 各自的归一化权重,得到 4 种不同 attention 的加权向量表达如下:



注意这里的 attention 针对的是上述 concat、bilinear、dot 和 minus4 种不同计算方式的。然后继续通过一个双向 GRU 进行拟合,得到每个时刻 t 在在前向和后向 GRU 隐层时刻的输出:



接着将前向和后向的输出进行 concat 得到 P 中 t 时刻的隐层输出 hto



prediction layer


这一层的目的,是为了将原始的不定长 P 转换成定长的向量。论文中首先得到关于 Q 的归一化加权向量表达:



注意这里的 attention pooling 针对的是 Q 中的 N 个 word。利用得到的 rq向量可以得到 P 向量的最终表达:



注意这里的 attention pooling 针对的是 P 中的 M 个 word。最终,将 rp后面介入一个 MLP 全连接网络后得到输出概率 pi,通过 cross entropy 损失函数进行求解。总结整个 MwAN 模型特点如下:


  • 第一层的编码层通过双向 GRU,对 query 和 doc 中的每个 word 进行编码,每个 word 可以得到前向和后向 GRU 中每个隐层的输出表示

  • 第二层的 Multiway Matching 是 MwAN 模型的核心所在,对于 query 中每个 word,和 doc 中的每个 word 都进行不同 attention 计算,分别有 concat、bilinear、minus 以及 dot product,然后进行 attention 归一化,可以得到 query 中每个 word 关于 doc 的注意力向量;同理也可以得到 doc 中每个 word 关于 query 的注意力向量

  • 第三层的 inside aggregation 是对于 query 和 doc 在第二步得到的 4 种注意力向量,每种 attention 向量,与各自在第一步得到的原始向量表示进行内部融合,最终得到 4 种 attention 的向量表示

  • 第四层的 mixed aggregation 对第三层得到的 4 种不同的 attention 向量进行融合,通过线性变化,tanh 非线性映射,以及归一化加权后,再通过双向 GRU,得到前向和后向的两个融合向量

  • 第五层将前面得到的不定长向量进行 pooling 操作变成定长的向量输出最终概率

4.2.9 HAR 模型

WWW2019 提出的层次注意力检索模型 ( Hierarchical Attention Retrieval ),简称 HAR 模型。在搜索和信息检索中,一般 query 和 doc 是不等长的,作者将 query 看成多个 word 组成,而 doc 由多个句子组成,每个句子又有多个 word。论文中因此在 query 内部的 word 之间的 attention、doc 内部每个句子中每个 word 之间的 attention、doc 内部句子和句子之间的 attention、以及 query 和 doc 之间的 attention,由此构建了许多不同层次的 attention 交互,因此是层次注意力的检索模型,整体模型框架如图 4.34 所示:



图 4.34 HAR 模型网络结构


HAR 模型按照结构可以分为 5 层:① word embedding 层:② encoder 层;③ query-doc 交叉 attention 层;④ query 内部 attention 层;⑤ doc 内部不同 sentence 的 attention 层;⑥ 输出层。


word embedding


输入层的作用是将 query 和 doc 中的每个 word 都映射成 embedding。对于 query 由 m 个 word 组成,表示如下左;doc 由 l 个句子表示,每个句子由 n 个 word 组成,表示如下右公式 :



encoder 层


encoder 编码层作用是将第一层输入层通过该层进行信息的编码,文中使用的是双向 RNN ( bi-RNN ) 进行信息提取,对比原始 RNN,GRU 能解决长依赖导致的梯度下降,而一般来说 doc 都是一些短句子不需要用到 LSTM,因此论文中用的是双向 GRU。


a. query encoder


query 本身只有一个句子,由 m 个 word 组成,



第 t 个时刻 ( query 中第 t 个 word ) 的隐层输出 utq由上一时刻隐层输出 uqt-1和当前输入 etq表示,可以得到一个 m*H 的向量,H 为隐层的维度:



b. doc encoder


对于 doc 一般来说都比 query 长,由多个句子组成,所以论文中使用了句子层级的双向 bi-GRU encoder 进行表示。对于 doc 中给定的一个句子 i,将该句子的 word embedding 作为输入,可以得到该句子一个 n*H 的向量,H 为隐层的维度:



doc 中有 l 个句子,可以得到 l*n*H 的表示:



query 和 doc 的交叉 attention 层


通过前面 query 和 doc 的 encoder 编码提取信息后,交互层这里需要做 query 和 doc 的交互信息提取。由于 query 和 doc 各自信息不同,论文中分别使用了 query 到 doc 的交互信息 Q2D,以及 doc 到 query 的交互信息 D2Q。


首先计算 query 和 doc 的相似度矩阵 S,维度为 n*m。对于给定的 doc 中第 i 个句子,query 输入 Uq,则 S 矩阵中第 x 行 ( 第 i 个句子中第 x 个 word ),第 y 列 ( query 中第 y 个 word ) 的表示如下:



对 S 矩阵的每一行进行 softmax,以第 x 行为例,相当于求 doc 中第 i 个句子每个 word 对于当前 query 第 x 个 word 的权重,可以得到 D2Q 的相似度矩阵。同理,对 S 矩阵的每一列进行 softmax,以第 y 列为例,相当于求 query 中每个 word 对于 doc 中第 i 个句子中第 y 个 word 的权重,可以得到 Q2D 的相似度矩阵:



最终 doc->query 以及 query->doc 的表达为其相似度矩阵的加权向量表示:





通过 cross attention 之后,doc 中的每个句子得到的是一个 n*4H 的矩阵 Vid,其中 n 为每个句子的 word 个数,4H 为每个 word 的 embedding 维度。


query 内部 attention


为了将不等长的 query 维度映射到固定维度,论文中使用了的 self-attention 机制,通过计算 query 中 m 个 word 中每个 word 不同的权重进行加权求和,表达如下:



其中第一个公式中,ctq为第 t 个 word 的原始注意力权重,第二个公式中 atq通过 softmax 得到归一化后的注意力权重,第三个公式对 m 个 word 的向量进行加权求和,得到最终 query 的向量表达,维度为 H。


doc 层级内部 attention


doc 中有 l 个句子,因此 doc 的 attention 设计分为两部分,分别是每个句子内部各个 word 级别的 attention,以及每个句子级别的 attention。


a. word 层级的 attention


对于③中得到的 cross attention,doc 中每个 word 的维度变成了 4H。对于 word 之间的 attention,和 query 的公式一致,以第 i 个 sentence 为例:




最后一个公式 xid为第 i 个 sentence 中 n 个 term 的加权注意力向量,维度为 4H。


b. sentence 层级的 attention


直观理解,doc 中的 l 个句子中,每个句子对 doc 的最终共享应该是不同的,因此文中引入了第二层的 attention,句子级别的 attention,表达如下:



其中最后一个句子得到的是 doc 中 l 个句子的加权表达,维度为 4H。


输出层


通过 4 和 5 得到的 query 和 doc 各自的输出向量维度分别为 H 和 4H,维度不同,因此文中先经过一层的神经网络对 doc 进行降维到 H 后,再通过 query 和 doc 的向量点积得到其匹配分数,最终再通过一层的神经网络得到最终的恶匹配分数:



总结来说,整个 HAR 模型结构如下:


  • 输入层和编码层用双向 GRU 提取 query 以及 doc 中每个 word 的隐层编码

  • query 内部的 attention 比较简单,对自身 m 个 word 使用 self-attention,得到每个 word 的归一化权重后,对 m 个 word 进行加权得到加权注意力向量,维度为 H

  • 把 doc 看成是多个句子组成,在得到 doc 的 attention 之前,先计算 query 和 doc 的匹配。分别计算 query->doc 的矩阵以及 doc->query 的矩阵,然后 doc 的每个句子由本身的向量, D2Q 的向量,本身向量和 D2Q 以及 Q2D 分别乘积后,这 4 个向量 concat 起来作为 doc 中每个句子的表达,维度为 4H

  • 有了前一步 doc 中每个句子的表达后,doc 内部的 attention 分成两种,一种是句子内部每个 word 的 self-attention,这一步和 query 的计算是一致的,可以得到每个句子的表达;另一种是每个句子的 self-attention,把每个 sentence 看成前一种的每个 word,计算方式是一致的,最终可以得到维度为 4H 的 doc 的表达

  • 在输出层通过一层先行网络对 doc 进行降维到 H 后,和 query 进行哈达码积后再通过一层神经网络输出最终的匹配分数

4.2.10 HiNT 模型

2018SIGIR 上中科院提出的 HINT 模型,全称 Hierarchical Neural maTching model,和 HAR 模型大体思路一致,把 doc 看成多个段落 ( passage ) 组成,每个段落又有多个 word 组成,因此在 word 和 word 之间,passage 之间,passage 之间的 word 的 attention 又构成了多层次的关系,因此成为多层次的神经网络匹配模型,整体框架如图 4.35 所示:



图 4.35 HiNT 模型框架


整个模型结构核心可以分为两层,局部匹配层以及全局决策层。


局部匹配层 local matching layer


对于给定的 query 和 doc,doc 可以看成由 K 个段落 ( passage ) 组成的,每个段落用 Pi进行表示:



因此,给定 query Q,doc 中每个段落和 query 的匹配分数用函数 f 来拟合:



核心问题在于如何表示 Pi,以及匹配函数 f 该如何设计。对于第二个问题匹配函数 f 的设计可以有多种选择,比如基于统计的,或者基于神经网络的等。为了尽可能表示语法匹配以及 term 的重要性,论文中作者选择了固定窗口来表示 doc 中的段落,并且采用空间 GRU 模型来拟合 query 和 doc 的匹配关系,如图 4.36 所示:



图 4.36 spatial-GRU 对 query 和 passage 的捕捉


a. 输入编码层


对于给定的 query 和 doc,query 由 M 个 term 组成,doc 由 N 个 term 组成:



其中,doc 由多个 passage 组成,而每个 passage 也被分成了固定窗口大小为 L 的表示:



b. 深度相关性匹配模型 DRMN


对于给定的 query 和 doc 中给定的每个 passage,将其表示为 term vector,为了得到 query 和 passage 的相似度矩阵,文章提出了两种计算方法,分别是 cosine 以及 xor 方法,可以发现其实和 4.1.2 提到的 MatchPyramid 模型里的匹配方法是一致的。


第一种方法 cosine 相似度,对于 query 中第 i 个 term,passage 中第 j 个 term 计算其 cosine 相似度如下:



第二种方法精确匹配,相当于是个 indicator,对于 query 中第 i 个 term 和 passage 中第 j 个 term,只有两者完全相同,也就是精确匹配才等于 1,表达如下:



因此,query 和 passage 可以学习得到 cos 以及 xor 两个相似度矩阵,在论文中称为 matching tensor,如图所示。为了学习得到 term 重要性,作者把原始 query 和 passage 中对应的 term 表达也加了进来,concat 到一起如下:



这里的 xi和 yj是 query 中原始的第 i 个 term 向量 wiQ,以及 passage 中第 j 个 term 向量 wj§经过一个转换矩阵 Ws转换得到,其中 Ws通过训练得到:



注意到这里 xi和 yj是共享 Ws的。因此,对于 k 个 passage,和 query 构成了 k 个 pair 对,分别可以得到 k 个 sxor 的匹配 tensor 以及 k 个 scos 的匹配 tensor。


从前面学习得到的匹配 tensor:scos 和 sxor 后,论文使用了 spatial GRU,也就是 2 维的 GRU 来拟合学习 query 和 passage 的关系,可以发现和 4.1.3 里的 Match-SRNN 模型是一致的:



其中,第(i,j)个隐层状态,分别由左、上、左上三个隐层状态(i-1,j)、(i,j-1)、(i-1,j-1),以及当前匹配分数 Sij组成。最后一个隐层的状态 HM,L作为匹配层的输出。cos 和 xor 两个匹配向量 concat 后,以及两个方向的 GRU concat 一起作为最终的输出:



全局决策层 global decision layer


从局部匹配层得到的向量后经过全局决策层进一步捕捉交互信息。论文中提出了 3 种不同的模型,分别是独立决策 ( ID ) 模型、累积决策 ( AD ) 模型、以及决策和累积模型联合的模型。


a. 独立决策模型 ( Independent Decision Model )


从最终的 k 个 embedding 向量中,用 k-max pooling 的方式,对于 K 个向量的每个维度,从中选择最大的 k 个值。以图 3 为例,隐层维度 d=4,k=2,从隐层 4 个维度中,各选择最大的 2 个值,如橙色、黄色、蓝色、绿色各 2 个,然后 concat 到一起作为下一层的输入,如图 4.37 所示。



图 4.37 独立决策模型


b. 累积决策模型 ( Accumulative Decision Model )


和 ID model 最大的不同,是在 k-max pooling 之前,引入了序列模型来捕捉 K 个输入的 embedding 向量的关系,论文使用了双向 LSTM 来拟合这种关系,如图 4.38 所示。



图 4.38 累积决策模型


c. 混合决策模型 Hybrid Decision Model


HD 模型同时使用了 a b 中提到的模型,AD 是直接提取 K 个 math tensor 向量 eK的 k-max pooling,CD 是在 eK后接了双向 LSTM 后提取 k-max pooling,在混合使用时,由于后者经过了 LSTM 映射,为了保证公平,在原始的 eK向量后也通过一个非线性映射 tanh 得到 vt。最终从非线性映射的 v1, v2, v3,…,vK向量,以及 LSTM 之后的隐层输出 h1,h2,…,hK通过 k-max pooling 提取得到固定维度的向量,再通过 MLP 映射得到匹配分数。




图 4.39 混合决策模型


总结 Hint 模型,特点如下:


  • query 看成 M 个 word 组成,doc 看成 K 个 passage ( 可以理解成句子 ) 组成,每个 passage 又由 L 个 word 组成。

  • 模型分为局部匹配层和全局决策层

  • 在局部匹配层中,对 query 以及 doc 中的 K 个 passage 两两进行计算,可以得到 K 个 m*L 个矩阵,作者分别用了 xor 和 cosine 两种计算方法,分别代表精确匹配,以及一般的匹配。然后作者使用 spatial-GRU 对这 2K 个匹配度矩阵,GRU 的最后一层输出作为局部匹配层最终的输出匹配信号

  • 全局决策层对于局部匹配层,提出了 3 种模型,AD 模型的 k-max pooling、ID 模型接入了 LSTM 后的 k-max pooling,以及 HD 模型同时混合了 AD 和 ID 模型。

4.2.11 MIX 模型

KDD2018 上腾讯 MIG 提出了一种混合通道的文本匹配方法,Multichannel Information Crossing, 简称 MIX,对于两个句子之间的全局匹配,以及句子中语素级别的局部匹配,论文分别进行精确的信息提取和融合来提升整体的匹配,整体框架如图 4.40 所示:



图 4.40 MIX 模型网络框架


整个模型框架可以分为 3 部分:局部匹配、局部和全局匹配,以及匹配信息的融合


局部匹配


在大多数文本匹配工作中,对于两段文本的匹配,大多数都是先基于文本的 term 做 word embedding,然后在 word embedding 的基础上,比较两段文本不同 word 之间 embedding 的相似度。文中指出这种方法通常来说只是语法层面的表示,无法表示更高层级的匹配。



图 4.41 word embedding 的匹配度矩阵 case


以图 4.41 为例,对于"place of interest"以及"senic spot"语法上是很相近的,但是如果从 word embedding 的相似度矩阵来看,两者匹配度却非常低。"all in"和"in all"字面上虽然包含的词相同,但意思完全不同,如果简单计算相似度矩阵如图 4.41 中 b 所示。另外一个例子 hard work 和 work hard 语义也是同个意思,但是相似度矩阵也不同。


以上 3 个例子如果在原始的 word embedding 匹配阶段就存在着这种鸿沟,后续再复杂的 MLP 网络也是无法拟合好两者的匹配关系的。因此,作者提出了将句子解析成不同粒度的文本片度,如一元分词、二元分词、三元分词等,通过这种方法来找到文本中最适合表达语义的语义表征。如图 4.42 所示,两段文本 a 和 b 分别切分成 uni-convA、bi-convA、tri-convA;以及 uni-convB、bi-convB、tri-convB。



图 4.42 文本 A 和 B 分别通过一元、二元和三元进行语义表示


在英文中,一般最小语法结构包含 1-3 个单词,因此 MIX 模型使用了 1 维到 3 维不同的卷积来提取短语信息,如图 4.43 所示:



图 4.43 2 维和 3 维词卷积


对于两段文本 text1 和 text2,分别使用卷积窗口大小为 m 和 n 的卷积核。图 4.43 显示了使用 2 维的 bigrams 和 3 维的 trigrams,灰色部分表示组成一个短语的概率更高。



其中 zi(0)表示在 embedding layer 中第 i 个位置的 unigram 信息,zi(1)表示位置 i 的卷积输出,其中 m 表示卷积核的滑动窗口大小。



局部和全局匹配


全局匹配需要依赖于局部匹配,而不同局部匹配对最终结果的影响不同,因此全局匹配在局部匹配的基础上增加不同维度的 attention 机制。论文分别在 term weight、词性以及词位置 3 个不同维度进行 attention 权重提取。


a. term weight


在原始的匹配矩阵中没有考虑到句子中不同 term 的权重重要性。以 QA 匹配为例,问题"What year did Lebron James win his first MVP",答案"Steven curry win his first MVP in 2014",明显是 bad case。但是在 QA 匹配矩阵中,由于是基于 word embedding 进行相似度计算,两者大多数词匹配度都很高,显然是不 make sense 的。


因此作者第一种 attention 使用的是 term weight,用每个 term 的 IDF 做为 attention 权重,这里不用 TF-IDF 是因为在短语匹配中,大多数 term 的词频都是 1。



图 4.44 term weight 做 attention 表现


图 4.44 中的 a 为原始 QA 匹配相似度矩阵,b 为用 IDF 作为 term 权重,c 为叠加了 term weight 后的匹配度矩阵,可以发现例如 his-his,first-first,year-2014 等 term pair 的相似度都比较低,从而体现不同 term 对结果的不同贡献。


b. 词性特征 attention


除了 term weight,词性 part-of-speech ( pos ) 特征也是能体现不同 term 交互重要性的特征。比如名字实体和名字实体的匹配权重,比普通的名词和名词以及形容词和形容词之间的权重要高。



图 4.45 part-of-speech 特征 attention 表现


以图 4.45 为例,b 图表示的是不同的 pos tag 权重,可以发现人名-人名权重>动词-动词权重,引入 pos 特征 attention 能帮助让对匹配度更有效的实体权重拿到更大的权重。


c. 词语位置 attention


除了 1 和 2 的 term weight 以及 pos feature 能够反映不同匹配部分的重要性,词的位置对结果的贡献也是不同的。直观的理解,位置靠前的词的权重要高于位置靠后的词。如图 4.46 表示的是不同匹配位置的权重大小,颜色越深则权重越大,可以发现句首的权重要高于句尾。



图 4.46 词语位置 attention 的表现:越靠前越重要


通过上述 3 种不同通道的 attention 权重,分别表示为 Atttw,Attpos,Attspatial,每个通道得到一个 M*N 的 layer。


融合匹配


在第一层的局部匹配中,论文使用了多层的匹配;在第二层的全局和局部匹配中,论文构建了 term weight、词性特征、词位置 3 种通道的 attention,在这一层中则是对前面提取的信息进行最后的融合。这部分在论文中没有太多公式描述,作者论证卷积神经网络的优点后,最终使用了卷积网络,用滑动窗口形式进行融合。



其中 rk表示卷积核的大小。


总结 MIX 模型特点:


  • 在局部匹配阶段,不是直接使用原始 word embedding 的相似度矩阵,而是通过不同粒度的词语切分方法,如 unigram,bigram,trigram,分别组成一元、二元和三元的短语信息提取,从而建立多层次的匹配

  • 在局部和全局匹配阶段,提出了 3 种不同的 attention 方式,第一种 attention 是认为不同的 term 的权重不同;第二种 attention 认为是 pos 特征也就是词性特征重要程度不同,比如人名实体应该大于动词的权重;第三种 attention 认为词的位置重要程度也不同,例如句首权重一般要高于句尾。三种不同的 attention 方式可以看成是三种不同的 channel

  • 对于最后的匹配融合,论文使用了卷积神经网络进行提取,通过卷积-池化->卷积->池化的方式可以得到最终的匹配信号

4.3 match function 模型总结

本章讲到的基于 match function 的匹配模型对比第三章讲到的基于 representation learning 的匹配模型,让 query 和 doc 在一开始就提前交互,可以类比图中的图像匹配,是个二维匹配的过程,如图 4.47 所示。



图 4.47 图像和文本匹配过程相似性


对于 query 和 doc,核心思想是如何构建 query 中的 term 以及 doc 的 term 的交互矩阵。4.1 介绍的基于 word level 的匹配度矩阵的模型,大致可以用诺亚方舟 2013 年 nips 这篇文章的图 4.48 来表示。对于 query 中 ( Y 轴 ) 的所有 term,以及 doc 中 ( X 轴 ) 中的所有 term,两两计算得到匹配分数,可以得到一个 10*10 的匹配度矩阵。具体的匹配计算方式,在 4.1.2 的 MatchPyramid 中提出了 3 种不同的计算方法,有直接代表精确匹配的 indicator,有计算两个 word 的向量点击的 dot product,也有计算两个 word 的 cosine 相似度方法。



图 4.48 基于 match function learning 匹配模型的通用范式


得到匹配句矩阵后,简单的做法是如下图所示直接连接全连接网络,更多的做法,这里就可以用各种常见的神经网络了。如 4.1.2 的 MatchPyramid 模型用卷积和池化进行信息提取,4.1.3 的 Match-SRNN 模型用二维也就是空间层级的 GRU 来提取信息。


更多的,在 4.2 这一节,则介绍了各种 attention 结构的变化,名词千变万化,我个人按照论文本身的网络结构出发,大体分成以下几类模型:


① Baseline 的 attention 模型:如 4.2.1 的 ABCNN,以及 4.2.2 的 DecAtt 模型都是比较早提出 attention 的模型,整体结构相对后续其他变种来说相对简单


a. ABCNN 模型:主要是用卷积和池化的思路提取匹配度矩阵的 attention。根据 attention 在卷积之前和卷积之后又分为 ABCNN-1 和 ABCNN-2


b. DecAtt 模型:较早使用 self-attention 的匹配模型,把 attention 看成是 soft-align 机制。


② 多视角维度:如 4.2.3 的 MCAN 模型、4.2.4 的 HCRN 模型、4.2.5 的 BiMPM 模型、4.2.8 的 MwAN 模型、4.2.11 的 MIX 模型都属于多种 attention 的组合。这里的 attention 可以有多种角度进行区分


a. MCAN 模型:将 attention 分为 query 和 doc 之间的 max pooling、mean pooling、alignment pooling 以及 query 和 doc 各自内部的 self-attention。最终各种 attention 进行组合,从而体现 Multi-Cast-Attention 的思想


b. HCRAN 模型:将 attention 分为 alignment pooling,以及 extractive pooling,其中后者又分为 max pooling 和 mean pooling。


c. BiMPM 模型:整个计算过程都是对称的,query->doc 的所有计算,在 doc->query 也都需要计算一遍,体现了双向(Bidirectional)的思想。对于匹配方式,则提出了 full-matching、max-pooling-matching、attentive-matching、max-attentive-matching 这 4 种不同的匹配方式,体现了 Multi-Perspective 的思想。


d. MwAN 模型:对于两个 word 的 embedding 计算方式,按照 concat、minus、dot product 以及 cosine 进行划分计算,然后 concat 组合,从而体现了 Multiway-Attention 的思想


e. MIX 模型:对于两个句子之间的匹配,提出了 3 种不同的 channel 匹配:term weight attention、POS attention 以及词位置的 attention,体现了多通道信息交叉的思想,即 Multichannel Information Crossing


③ 多层次维度:如 4.2.9 的 HAR 模型、4.2.10 的 HiNT 模型。多层次大致可以理解成 query 内部的 word 之间、doc 内部的句子之间,doc 内部句子的 word 之间,这里就有不同层级的交互了,因此归类为多层次。


a. HAR 模型:query 看成一个句子,内部使用 word 级别的 self-attention;把 doc 看成多个句子,句子之间色 self-attention,doc 内部每个句子内部 word 之间的 self-attention。从而体现了多层次注意力 Hierarchical Attention 的思想


b. HiNT 模型:和 HAR 模型不同,将 doc 看成是多个 passage;对于 query 和 doc 中的每个 passage 分别计算 attention,体现层次神经匹配 Hierarchical Neural maTching 的关系

05 搜索中 query 和 doc 的相关性匹配模型

前 2 章讲的是语义匹配 ( semantic matching ) 里的深度模型,本章要讲的是相关性匹配 ( relevance matching ) 里的深度模型。语义匹配可以说是相关性匹配的基础。


语义匹配通常更关注的是相似性,一般来说两段文本通常结构相似,主要有以下特点:


① 代表性任务:自动问答 QA 任务、同义句子识别 Paraphrase identification


② 语义匹配判断的是同质的两段文本:比如自动问答的 QA 问题,问题和答案一般来说讲的都是一个意思,长度和属性都相近;同义句子识别 Paraphrase identification 讲的是两段文本 string1 和 string2 是否是一个意思,这两段文本也都是同质的


③ 全局匹配:语义匹配通常将两段文本的片段作为一个整体,来推理他们之间的语义关系


④ 匹配是对称的:因为是两段同质的文本进行匹配


相关性匹配更关注 document 文档和搜索 query 是否相关,特点如下:


① 代表任务:信息检索中的 query-doc 匹配


② 两段文本一般不同质:query 长度一般较短,doc 的长度较长


③ 多样化匹配:相关性匹配可能发生在对应文档的任何部分,不需要把 doc 看作整体去和 query 进行匹配


④ 匹配不对称:因为是两段不同质的文本进行匹配


对于相关性匹配,可以分成两个方向,第一种是基于 global distribution 的模型,第二种是基于 local context 的模型。

5.1 基于 global distribution 的模型

对于 global distribution 的模型来说,计算步骤分为两步:


① 对于 query 中的每个 term:


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


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


② 对上述得到的匹配强度进行累积融合


注意到对于这种 global distribution 的模型,会丢失掉词序信息

5.1.1 DRMM 模型

DRMM 模型是中科院在 2016 提出的的相关性匹配模型,文中把 query 和 doc 分别表示为由 M 和 N 个 term 组成的 term vector。



可以将 query 和 document 的 term 两两比对,计算相似性,再将相似性进行以直方图的形式进行分桶计算。例如:query:car ; document:( car,rent,truck,bump,injunction,runway )。query 和 doc 两两计算相似度为 ( 1,0.2,0.7,0.3,-0.1,0.1 )


将[-1,1]的区间分为{[−1,−0.5], [−0.5,−0], [0, 0.5], [0.5, 1], [1, 1]} 5 个区间。落在 0-0.5 区间(第三个区间)的个数有 0.2,0.3,0.1 共 3 个,所以最终表示为:[0,1,3,1,1]。



图 5.1 DRMM 模型框架



其中,⨂ 代表 interaction,也就是 query 和 doc 的匹配函数;l=1,…,L 表示的是 L 层隐层函数。值得注意的是最后一个公式,zi表示的是 MLP 网络最后一层第 i 个 query 的输出,gi表示的是第 i 个 query 和 document 的参数权重,通过 term gating 的网络来学习,其实就是 query 的 softmax 归一化表达:



这里 xi(q)表示的是 query 中第 i 个 term vector, wg为待学习的参数。对于该文章中提到的 query 和 doc 的相似度匹配计算,论文中提出了 3 种方法:


a. Count-based histogram ( CH )


这种方法使用直接计数的方法进行分桶计算。也就是说先计算原始的相似度 ( 通过 cosine 等 ),然后进行等距分桶 ( bin ) 后,统计每个桶 ( bin ) 的数量,得到的就是个基于计数的直方图。


b. Normalized Histogram ( NH )


在 CH 的计数基础上做了归一化,确保所有直方图的分桶都在一个区间范围。


c. LogCount-based Histogram ( LCH )


对 CH 的计数直方图取 log 对数,这个在搜索引擎里主要也是为了迎合大多数 query 和 doc 的分布都是 pow-law 的,取对数后 pow-law 分布的数据会更加服从线性分布。


总结下 DRMM 的模型流程,基本思想就是每个 query 在检索 doc 的过程中,对结果的贡献程度是不同的:


  • 把 query 和 doc 分别表示成 M 和 N 个 term 的向量表达

  • 忽略 query 中每个 term 的位置关系和上下文,并且认为每个 term 对 doc 的共享程度不同

  • 匹配强度计算:query 中每个 term 和 doc 通过直方图匹配的方法计算其匹配强度,可以分为基于计数、归一化计数、log 计数等不同直方图匹配,得到匹配强度 zi

  • 权重计算:query 中每个 term 在整个 query 的权重,通过所有 term 的 softmax 权重表达计算,得到权重 gi

  • 前两步得到的 zi和 gi的加权表达


就是最终整个 query 对 doc 的表达 DRMM 作为相关性模型的 baseline,忽略了每个词的位置信息和上下文信息。后续一些加入 position 和 attention 的方法都是为了改进该模型无位置信息的缺点。但个人觉得,读 DRMM 更大的收获,其实是更加清晰的了解了语义匹配和相关性匹配两者的异同点。

5.1.2 K-NRM 模型

针对 DRMM 提到的无位置信息的相关性模型,卡梅隆大学在 SIGIR2017 提出了 K-NRM 模型,全称为 Kernel-based Neural Rank Model,一种基于 kernel-pooling 的相关性模型。整个框架如图 5.2 所示:



图 5.2 K-NRM 模型框架


整个模型可以分为以下 3 层:① translation layer;② kernel pooling layer;③ rank layer


translation layer


query 和 doc 分别由 n 个 term 和 m 个 term 的词向量组成的 vector。通过 query 和 doc 之间每个 term 两两求 cosine 相似度,得到一个 n*m 的矩阵 M:



kernel pooling layer


Kernel pooling 层引入了 K 个 kernel。对于第 k 个 kernel,query 中第 i 个 term ( M 矩阵中的第 i 行 ) 如果采用 RBF kernel 进行计算,表达如下:



其中,uk和 sigmak为第 k 个 kernel 的超参数均值和标准差,是超参数,需要在训练前事先设定。这里使用 RBF 核函数也是有原因的。当 Mij越趋近于 u, 方差 sigmak越趋近于无穷大,kernel pooling 的输出越大。我们来看下 2 种不同的特殊情况:


a. 当方差 sigma 接近无穷大,上述公式趋近于 1,相当于是 average pooling


b. 当方差 sigma 趋近于 0,均值 u 等于 1,相当于是 TF 词频统计模式


可以发现,如果 Mij等于 1,此时该 term 的输出才为 1,而 Mij=1 意味着 query 的第 i 个 term 和 doc 的第 j 个 term 是完全精准匹配的 ( exact match ),只有这样才能使得 cosine 距离为 1。所以在这种情况下,kernel pooling 相当于是一个完全精准匹配。也完全等价于 TF 词频统计模式,也就是只统计 query 和 doc 有多少个 term 是完全匹配的。


对 M 矩阵每一行,也就是每个 query 使用一个核函数可以得到一个匹配分数,K 个 kernel 则能得到一个维度为 K 的向量。如下面的公式所示,第二个公式表示,M 矩阵的每一行通过 K 个核函数,可以得到长度为 K 的向量,第一个公式对所有行 ( n ) 进行对数 log 加和,得到一个维度为 K 的向量进入下一层网络。



rank layer


上一层 kernel pooling layer 得到的 K 维向量通过一个线性映射后,再经过 tanh 得到最终的分数。使用 tanh 是为了让最终的 match score 映射到-1 到 1 之间,也符合相关性从-1 到 1 的定义。这里的 w 和 b 都是一个可训练的维度为 K 的参数向量。



总结下 K-NRM 的核心公式,可以用如图 5.3 的 6 个公式表示,值得注意的是从 1-6 的公式网络结构是从输出到输入自顶向下的关系



图 5.3 K-NRM 公式


训练过程使用的是 pairwise loss:



整个模型可以用如图 5.4 所示框架表示:



图 5.4 K-NRM 模型框架


总结下 K-NRM 的特点:


① 对比 DRMM 最大的不同,就是引入了 K 个 kernel function,通过 kernel pooling 的方式,对 query 中每个 term 求和对应的 doc 的匹配分数。


② 这里的 K 个 kernel 可以类比 CNN 中的 filter,卷积过程是从上到下卷积列数保持固定;这里的 kernel pooling 计算也是按列计算。


③ Kernel pooling 的每个 kernel 的均值和方差都是超参数,需要事先设定。

5.1.3 Conv-KNRM 模型

2018 年的 WSDM 上,卡梅隆大学 &清华又在原来的 K-NRM 上提出了加入卷积元素的 Conv-KRNM 模型,对比原来的 kernel pooling,显式的引入了 CNN 模块,框架如图 5.5 所示:



图 5.5 Conv-KRNM 模型框架


整个模型可以分为 4 层:① embedding 层;② convolutional 层;③ cross-match 层;④ kernel pooling 层;⑤ rank 层。


embedding 层


首先,把 query 和 document 投射到隐层维度为 L 的 embedding 去,维度均为 m*L:



Convolution 层


卷积层通过大小为 h*L 的 filter ( 一共有 F 个 ),来从上到下对 query 和 doc 分别进行卷积。对于第 i 个 term,通过和 filter 进行卷积,得到一个实数 v 如下:



因为有 F 个 filer ( w1,w2,w3,…,wF ),每个 term 可以得到一个 F 维度的向量,然后再通过一个 RELU 层进行映射得到第 i 个 term 经过卷积后的 F 维输出:



这里 W 大小为 h*L*F,b 大小为 F,均为待学习的模型参数。因此,对于不同的滑动窗口 h1,h2,…,hmax,每个窗口我们都可以得到原始 m 个 term 的卷积输出。维度从原始 embedding 的 m*L 变成了 m*F,L 为 embedding size,F 为 filter 个数。



Cross match layer


从②中经过 CNN 提取的 query 和 document 分别的矩阵 m*F 和 m*F 后,对于 query 中第 i 个元素、hq的 n-gram 的值,以及 doc 中第 j 个元素、hd的 n-gram 的值的匹配分数为:



最终可以得到 hmax * hmax个元素的匹配矩阵 M,每个元素都是一个 m*m 的矩阵模块 Mhq, hd



Kernel pooling layer


上一步得到匹配矩阵 M 后,在 kernel pooling layer 这里的做法是 K-NRM 是一样的。M 元素里一共有 hmax*hmax个元素,每个元素都是一个矩阵模块,一共有 K 个 kernel:



每个元素产出的是一个 K 维的向量,因此最终得到的向量为 K*hmax*hmax



Ranking layer


上一层 kernel pooling layer 得到的 K*hmax*hmax维向量通过一个线性映射后,在经过 tanh 得到最终的分数。



损失函数 loss 用 pairwise loss 表示如下:




图 5.6 Conv-NRM 模型


总结来说,Conv-NRM 模型对比 K-NRM 模型,在 kernel pooling 之前对于 query 和 doc 各自引入了高度为 hmax的滑动窗口。对图 5.6 来说,hmax=2,分别代表 unigram 和 bigrams。整体过程如下:


① query 和 doc 各自映射为 embedding 特征向量 m*L


② query 和 doc 各自通过 hmax=2 的滑动窗口 ( unigram 和 bigram ),F 个 filter 进行卷积得到卷积后的新特征向量,各有 2*m*F 个


③ 通过 cross match 的匹配,对②得到的 query 和 doc 的新特征向量,两两进行 cosine 匹配,得到 2*2 个匹配矩阵,每个匹配矩阵是个 m*m 的矩阵


④ 通过 kernel pooling,对于③中 4 个匹配矩阵中的每一个,应用 K 个 kernel 提取得到 k 维度的特征向量,一共得到 4*K 的特征向量,然后 concat 起来作为下一层的输入


⑤ 对 kernel pooling 得到的 4*K 个向量,应用 tanh 函数得到 match score, 损失函数使用 pairwise loss

5.2 基于 local context 的模型

对于 local context 的模型来说,计算步骤分为两步:


① 对于 query 中的每个 term:


a. 找到该 term 在 doc 中对应部分的上下文


b. 计算该 term,以及在 doc 中对应的上下文两者的匹配信号


② 对上述得到的匹配强度进行累积融合


注意到对于这种 global distribution 的模型相比于 5.1 讲到的 global distribution,捕获了词序信息,同时它关注的是 doc 中与 term 相关部分的上下文,丢弃了无关部分 ( 非上下文 ),因此匹配会更加的鲁棒。

5.2.1 PACRR 模型

EMNLP2017 年提出的 PACRR,全称是 Position-Aware Convolutional- Recurrent Relevance Matching,在原来的相关性模型 DRMM 基础上引入了位置信息。PACRR 模型基于一种假设,就是 query 和 doc 的相关性匹配是由 doc 中的特定位置决定的,论文通过 CNN 的卷积操作来捕捉局部词序的关系,在 doc 上利用不同大小的卷积核进行卷积,然后在整个 doc 上进行池化。主要整体框架如图 5.7 所示:



图 5.7 PACRR 模型结构


输入层


给定 query 和 doc,term 的长度大小为别为 q 和 d,通过 word embedding 映射得到 query embedding 和 doc embedding 矩阵。这里 word embedding 采用预训练得到并且训练中保持不更新。


匹配层


query 和 doc 的匹配矩阵采用 cosine 相似度,从 q 个 query embedding 和 d 个 doc embedding 两两计算 cosine 相似度,得到一个维度为 q*d 的相似度矩阵。为了保证长度一致,假设 query 最大长度为 lq,对于 query 来说统一补齐到长度 lq,如果 q<lq的则直接用 0 补齐。对于 doc 文中提出了两种方法:first-k 和 k-window,如图 5.8 所示:



图 5.8 query-doc 的两种方法:firstK 和 KWindow


a. PACRR-firsrK


对于匹配矩阵,取前 k 行。如果当前 doc 长度 d<k,则不足部分用 0 补齐。


b. PACRR-KWindow


k-window 方法的基本假设是 doc 中相关性比较低的 term 对结果的共享应该比较小。因此引入了一个超参数 n,表示的是每个 doc 的片段最大长度,相当于是个 n-gram 的卷积,过程如下:


  • 对于 doc 中的每个 n-gram,相当于有 n 个 term,每个 term 和 query 中的 lq个 term 计算相似度,取这 lq个相似度中最高的值作为该 term 的匹配分数

  • 对当前这 n 个 term 的匹配分数求均值作为该 n-gram 和 query 的匹配分数

  • 对于 doc 的所有 term 都按照第一步从头到尾滑动,按照 n-gram 求每个 n-gram 的匹配矩阵,表示如下:



对所有的 n-gram 匹配分数,求 top k 的片段,k 的取值如下,不足补 0。



深度触发模型


a. 卷积层 convolution layer


通过上述得到一个 lq*ld的相似度矩阵后,在该层则通过不同的卷积核,2*2,3*3,4*4,…,lg*lg来进行卷积得到 lg-1个卷积层 ( 原始的相似度矩阵相当于是 1*1 的卷积核 ),相当于是提取了 bigram,trigram,…,lg-gram 信息。每个卷积核又有 nf个 filter, 可以得到 lg个 lq*ld*nf的三维矩阵。


b. 池化层 pooling layer


在池化层通过两层的 pooling 提取信息。首先是 max pooling,对于 lg个三维矩阵,每个矩阵有 nf个 filter,通过 max pooling 在 nf个 filter 中提取得到最大值,因此可以得到 lg个矩阵 c1,c2,c3,…,clg,每个矩阵维度 lq*ld和原始匹配度矩阵维度一致。


为了保留 ns个最强信号,在 max-pooling 之后论文由使用了 k-max-pooling,在 lq维度上 ( 也就是对于 lq*ld矩阵的每一行 ) 进行提取最大的 ns个信号,直观解释就是 doc 中的 ld个 term,只提取其中和当前 query 匹配度最高的 ns个,可以得到 lg个二维矩阵 lq*ns。因此,最终得到一个 lq*lg*ns维度的三维向量作为下一层的输入。


c. 递归神经层 recurrent layer


该层的目的是为了提取得到全局的匹配信号。前面得到的向量维度 lq*lg*ns中,其中 lq为 query 经过 pad 的长度,这里作者使用的 query 的 IDF 信息,将其进行归一化,目的是消除 query 在全局频次的影响。


因此,通过 IDF 的归一化,可以得到一个 lg*ns的矩阵 P,通过展开得到一个向量,并且将当前 query 的 IDF 信息 concat 后,接入 LSTM 网络,最终的输出为匹配分数。


总结来说,PACRR 模型特点如下:


① 提到的位置相关 ( position aware ) 原意指的是 query 和 doc 的相关性由 doc 中特定位置决定。


② 通过不同大小的卷积核进行卷积提取匹配信息、max-pooling 以及 k-max pooling 两层池化层的信息提取。


③ 引入 query 的 IDF 信息等各种细节对位置信息进行强化。

5.2.2 Co-PACRR 模型

2018 年的 WSDM 上作者等人在 2017 年的 PACRR 模型上由加入了上文 context 信息,context-aware,因此该模型称为 CO-PACRR,整体框架如图 5.9 所示:



图 5.9 Co-PACRR 模型模型


的核心创新点有 3 部分:① 上下文信息;② 级联的 k-max pooling;③ query 位置随机打乱


引入上下文信息


和 PACRR 模型相比,在输入层除了 query 和 doc 的原始相似度矩阵 ( 维度大小为 lq*ld ),最大的不同在于引入了局部上下文信息作为输入。对于 doc 中的每个 term,除了当前 term 和 query 的相似度,还考虑当前 term 上下文和 query 的相似度。


对于 query 来说,由于一般都比较短,因此 query 的上下文向量表示 queryvec 用整个 query 的所有 term 求平均作为其上下文表示;对于 doc 来说,类似于 word2vec 的思想,取上下文滑动窗口大小为 wc,doc 在该窗口内上下文的向量的平均值作为其上下文表示:



因此,对于 doc 中第 i 个 term 的上下文和 query 上下文向量的相似度表示如下:



由于 doc 的 term 个数为 d,query 都是固定的 q 个 term 求平均,对 doc 的 term 挨个计算和 query 上下文的相似度,可以得到一个 d 维的向量作为输入。


级联的 k-max pooling


在 PACRR 模型中用到的 k-max pooling 是在整个 doc 中选择最大的 ns个值,例如 doc 的长度为 100,ns=2,相当于是在每个 doc 的 100 个词中选择最大的 2 个值。


而 CO-PACRR 模型引入了新的超参数 nc,表示文档划分的个数,比如 nc=4,则分别在文档的 25%、50%、75%、100%把 doc 划分成了 4 部分,对于每一部分进行 k-max pooling,以 ns=2 为例,在 doc 的第 1-25、26-50、51-75、76-100 这 4 部分,分别取 2 个作为最大值,最终得到 8 个值。


前面我们知道 PACRR 模型在整个 doc 上使用 k-max pooling 后得到的向量为 lq*lg*ns,通过这种层次 k-max pooling 得到的矩阵维度为 lq*nc*lg*ns


query 位置的随机 shuffle


在 PACRR 模型中,query 都是统一 pad 到固定长度 lq的,对于较短的 query,尾部需要用 0 补齐到 lq。这种做法缺点是对于 query 尾部特征的向量,将得不到足够的信息进行权重更新,这样模型在训练学习过程会认为 query 尾部的 term 对结果的共享较小,权重也接近 0,从而导致真正在 query 尾部的 term 对结果贡献较小,模型缺乏泛化能力。


为了了避免这种情况,CO-PACRR 模型对 query 的顺序,也就是矩阵的行进行 shuffle 随机打乱,从而让用 0 填充的向量均匀的分散在 query 的特征各处,从而解决了用 0 填充带来的问题。总结 Co-PACRR 模型特点:


  • 引入了上下文信息 ( context-aware ):doc 中每个 word 的表示出了自身的 embedding,还将其窗口为 wc的上下文平均向量作为其表示,与 query 计算相似度

  • 级联的 k-max-pooling:将 doc 平均分成 nc个部分,每个部分进行 k-max-pooling 提取最大的 ns个值,总共可以得到 nc*ns的最大值 ( 3 ) 对 query 的位置进行 shuffle,消除 pad 带来的尾部特征训练不充分影响

5.2.3 DeepRank 模型

CIKM2017 提出的 DeepRank 模型,基于一个有趣的假设,用户搜索 query 后,在展现的 doc 里面 ( title ),往往更关注的在 doc 中和 query 匹配的词的上下文。有个关于眼球实验的 paper 也做了类似的验证。比如,你搜索了"佳能相机价格"后,在展现结果里,往往会快速的扫描"佳能相机"前后相关的词,例如相关型号之类的,以及"价格"前后的信息,例如具体多少钱的信息,这种假设在信息检索是比较 make sense 的。


DeepRank 模型主要是基于该假设,集中在 doc 中与 query 相关的 term 上下文,称为 query-centric contexts。整体框架如下图 5.10 所示:



图 5.10 DeepRank 模型框架


整个过程分为 3 步:① detection 策略,也就是找到 doc 中与 query 中的 term 匹配的位置;② measurement 策略;③ aggregation 策略


detection 策略


首先,对于给定的 query,第一步的 detection,需要检测找到 query 中的 term 在 doc 中的位置。给定 query 和 doc,分别由 M 和 N 个 term 组成,每个 term 隐层维度 d。



如果 query 中的 term wu在 doc 中第 p 个位置出现,就把该位置前后位置窗口大小为 k 的 term 都找出来,总共 2k+1 个的词向量,称为 query-centric contexts。



measure 网络


前一步得到 query 中的 term,以及在 doc 中对应的 query-centric contexts 后,需要进行匹配得到交互矩阵。对每个 query 中的第 i 个 term,以及 query-centric contexts 中的第 j 个 term,用 sij来表示,和 MatchPyramid 模型一样,文中使用了 indicator 和 cosine 两种方法,indicator 相当于是精确匹配,只有 query 的第 i 个 term 和 doc 的第 j 个 term 完全一致才 sij为 1,否则为 0;cosine 则直接计算 query 第 i 个 term 和 doc 第 j 个 term 的向量 cosine 距离。



为了充分表达上下文信息,最终的 input tensor 是个三维的向量表达,sij分别由 query 第 i 个 term,doc 的第 j 个 term,以及两者的交互 ( indicator 或者 cosine ) 表示。



对于输入向量 S,引入 K 个 kernel 进行卷积表达,每个 kernel 卷积核大小为γ*γ。对于卷积输出第 i,j 个元素,其表达为 Si,j到 Si+γ-1, j+γ-1之间的元素和卷积核 ( γ*γ ) 的卷积输出。



由于 S 中每个元素都是个三维向量,因此 l=3。第二个公式采用 max pooling,对 K 个 kernel 分别求 max,得到 K 维的向量。



这里论文使用了 Match-SRNN 中的递归 RNN,由 4 个更新 gate 和 3 个 reset gate 来拟合。



图 5.11 DeepRank 模型框架


总结 DeepRank 模型的特点和人类的直觉判断相关性很类似:


  • 首先对于 query 中的每个 term,找出每个 term 在 doc 中出现的位置

  • 对于第一步每个 term 在 doc 出现的位置,将该位置前后各 k 个词(总共 2k+1)找出来,作为 query 在 doc 中该位置匹配的上下文表示 query-centric contexts

  • 对第二步得到的每一个 query-centric contexts 以及 query 对,使用 CNN 或者 2D-GRU 的网络及结构提取信息得到匹配分数

  • 通过 term gating network 对前一步得到的每个 query 和 query-centric contexts 局部相关性分数进行加权融合。

06 总结

推荐和搜索的本质其实都是匹配,前者匹配用户和物品;后者匹配 query 和 doc。具体到匹配方法,分为传统模型和深度模型两大类。本文系统的介绍传统模型和深度模型,以及语义匹配和相关性匹配。


传统模型。有两种主要的方法,第一种是把 query 和 doc 都同时映射到 latent space 的方法,比如基于统计的 BM25 方法,以及 PLSRMLS 方法。另一种方法,是通过将 doc 映射到 query 的空间的,然后在 query 的空间进行匹配。这种方法和机器翻译中,将源语言映射到目标语言的做法是一致的,因此又称为基于 translation 的方法。


深度匹配模型。对于 query 和 doc 的匹配分数,有两种思路,一种是 query 和 doc 都各自学习自己的表示,不到最后一刻不交互,在得到 query 和 doc 各自充分的 representation 后,再进行融合匹配。因此,我们首先介绍了基于 representation 的深度匹配模型。为了得到 query 和 doc 的表示,当然是各种网络结构都可以尝试使用,比如基于 DNN 的 DSSM 模型、基于 CNN 的 CNN-DSSM 模型、基于 RNN 的 LSTM-RNN 模型。


深度匹配模型中的第二种思路,也就是让 query 和 doc 在一开始就通过 match function 进行交互,因此称为基于 match function 的深度匹配模型,也称为 interaction-based 的模型。既然要交互,当然需要想办法得到 query 和 doc 尽可能丰富的匹配信号。比如 4.1 提到的在 word level 层级的匹配度矩阵。有了匹配度矩阵,4.2 讲述了众多在匹配度矩阵上进行各种 attention 的模型。


最后,介绍了相关性匹配以及语义匹配的不同,并基于 global distribution 以及 local context 分别介绍了不同的相关性匹配模型。


本次分享就到这里谢谢大家。


参考文献


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

  2. https://github.com/NTMC-Community/awesome-neural-models-for-semantic-match

  3. [SMT] Stefan Riezler and Yi Liu. Query Rewritting Using Monolingual Statistical Mac3.hine Translation. In ACL 2010.

  4. [WTM] Jianfeng Gao, Xiaodong He, and JianYun Nie. Click-through-based Translation Models for Web Search: from Word Models to Phrase Models. In CIKM 2010.

  5. [DSSM] Huang P S, He X, Gao J, et al. Learning deep structured semantic models for web search using clickthrough data[C]//Proceedings of the 22nd ACM international conference on Conference on information & knowledge management. ACM, 2013: 2333-2338.

  6. [ARC-I,ARC-II] Z, Li H, et al. Convolutional neural network architectures for matching natural language sentences[C]//Advances in neural information processing systems. 2014: 2042-2050.

  7. [CNN-DSSM] Hu B, LuShen Y, He X, Gao J, et al. A latent semantic model with convolutional-pooling structure for information retrieval[C]//Proceedings of the 23rd ACM International Conference on Conference on Information and Knowledge Management. ACM, 2014: 101-110.

  8. [CNTN] Qiu X, Huang X. Convolutional Neural Tensor Network Architecture for Community-Based Question Answering[C]//IJCAI. 2015: 1305-1311.

  9. [LSTM-RNN] Palangi H, Deng L, Shen Y, et al. Deep sentence embedding using long short-term memory networks: Analysis and application to information retrieval[J]. IEEE/ACM Transactions on Audio, Speech and Language Processing (TASLP), 2016, 24(4): 694-707.

  10. [MatchPyramid] Pang L, Lan Y, Guo J, et al. Text Matching as Image Recognition[C]//AAAI. 2016: 2793-2799.

  11. [MatchPyramid-cont] Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu, Xueqi Cheng. A Study of MatchPyramid Models on Ad-hoc Retrieval. In Proceedings of SIGIR 2016 Neu-IR Workshop.

  12. [Martch-SRNN] Shengxian Wan, Yanyan Lan, Jun Xu, Jiafeng Guo, Liang Pang, and Xueqi Cheng.

  13. Match- SRNN: modeling the recursive matching structure with spatial RNN. In Proceedings of the Twenty- Fifth International Joint Conference on Artificial Intelligence (IJCAI’16), 2922-2928.

  14. [MV-LSTM] Wan S, Lan Y, Guo J, et al. A Deep Architecture for Semantic Matching with Multiple Positional Sentence Representations[C]//AAAI. 2016, 16: 2835-2841.

  15. [aNMM] aNMM: Ranking Short Answer Texts with Attention-Based Neural Matching Model. CIKM 2016.

  16. [ABCNN] Wen Y, Hin S, Bing X, Bowen Z. ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs. ACL 2016.

  17. [DecAtt] Ankur P. Parikh, Oscar Tackstrom, Dipanjan Das, and Jakob Uszkoreit. A Decomposable Attention Model for Natural Language Inference. In Proceedings of EMNLP, 2016.

  18. [MCAN] Yi T, Luu T, Siu H. Multi-Cast Attention Networks for Retrieval-based Question Answering and Response Prediction. KDD 2018.

  19. [HCRN] Yi T, Luu T, Siu H. Hermitian Co-Attention Networks for Text Matching in Asymmetrical Domains. IJCAI 2018.

  20. [BiMPM] Zhi W, Wael H, Radu H. Bilateral Multi-Perspective Matching for Natural Language Sentences. IJCAI 2017.

  21. [ESIM] Qian C, Xiao Z, Zhen L, et al. Enhanced LSTM for Natural Language Inference. ACL 2017.

  22. [DIIN] Yi G, Heng L, Jian Z. Natural Lanuguage Inference Over Interaction Space. ICLR 2018.

  23. [MwAN] Chuan T, Fu W, Wen W, et al. Multiway Attention Networks for Modeling Sentences Pairs. IJCAI 2018.

  24. [HAR] Ming Z, Aman A, Wei W, Chandan R. HAR: A Hierarchical Attention Retrieval Model for Healthcare Question Answering. WWW 2019.

  25. [HiNT] Yi F, Jia G, Yan L, et al. Modeling Diverse Relevance Patterns in Ad-hoc Retrieval. SIGIR 2018.

  26. [MIX] Hao C, Fred H, Di N, et al. MIX: Multi-Channel Information Crossing for Text Matching. KDD 2018.

  27. [Duet] Bhaskar Mitra, Fernando Diaz, and Nick Craswell. Learning to match using local and distributed representations of text for web search. In Proceedings of WWW 2017.

  28. [DRMM] Jiafeng Guo, Yixing Fan, Qiqing Yao, W. Bruce Croft, A Deep Relevance Matching Model for Ad-hoc Retrieval. In Proceedings of CIKM 2016.

  29. [K-NRM] Chenyan Xiong, Zhuyun Dai, Jamie Callan, Zhiyuan Liu, Russell Power. End-to-End Neural Ad-hoc Ranking with Kernel Pooling. In Proceedings of SIGIR 2017.

  30. [Conv-KRNM] Zhuyun Dai, Chenyan Xiong, Jamie Callan, and Zhiyuan Liu. Convolutional Neural Networks for Soft-Matching N-Grams in Ad-hoc Search. In Proceedings of WSDM 2018.

  31. [Co-PACRR] Kai Hui, Andrew Yates, Klaus Berberich, and Gerard de Melo. Co-PACRR: A Context-Aware Neural IR Model for Ad-hoc Retrieval. WSDM '18, 279-287.

  32. [DeepRank] Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu and Xueqi Cheng. DeepRank: a New Deep Architecture for Relevance Ranking in Information Retrieval. In Proceedings of CIKM 2017.


作者简介


辛俊波,腾讯高级研究员。


本文来自 DataFunTalk


原文链接


https://mp.weixin.qq.com/s/lcyw_kHNxPB-DUfNzTaj5g


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2020-03-26 14:133990

评论

发布
暂无评论
发现更多内容

一文读懂ZKFair PFP-CyberArmy的参与价值与潜力

加密眼界

1美元持有ZKFair PFP-CyberArmy,潜在收益分析

石头财经

TunesKit Screen Recorder for mac(录屏软件)v2.6.0直装版

影影绰绰一往直前

2024-03-02:用go语言,一个句子是由一些单词与它们之间的单个空格组成, 且句子的开头和结尾没有多余空格, 比方说,“Hello World“ ,“HELLO“ ,“hello world h

福大大架构师每日一题

福大大架构师每日一题

不会使用ps怎么办?适用于苹果Mac的最佳Photoshop替代品

Rose

一文读懂 ZKFair PFP-CyberArmy 的参与价值与潜力

大瞿科技

一文读懂ZKFair PFP-CyberArmy的参与价值与潜力

威廉META

保持耐心,有些事需要靠时间来做到

老张

副业 码农副业

TunesKit Subtitle Editor for Mac(字幕编辑工具)v 2.1.0激活版

影影绰绰一往直前

ViWizard Tidal Music Converter for Mac(音频格式转换工具)v1.4.0激活版

影影绰绰一往直前

2024年2月文章一览

codists

阅读 编程人 codists 2024年2月

Serial Box for Mac(软件序列号查询软件)v2024.03激活版

影影绰绰一往直前

BRC-20铭文发行合约系统开发:深度思考与逻辑性

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

苹果电脑有哪些好用的修图软件?

Rose

修图 抠图 Mac软件 照片编辑

一文读懂ZKFair PFP-CyberArmy的参与价值与潜力

股市老人

一文读懂ZKFair PFP-CyberArmy的参与价值与潜力

BlockChain先知

Topaz Photo AI for Mac(人工智能降噪软件)v2.4.0激活版

影影绰绰一往直前

什么是 web 应用的 type-ahead search help

秃头小帅oi

Git 分支管理:优化版本控制与应急处理的关键策略

小万哥

git 程序人生 编程语言 软件工程 后端开发

探讨汽车虚拟仿真的实现、应用和未来

3DCAT实时渲染

解锁软件架构设计之门:软件架构设计的基础理论剖析(一)

灸哥漫谈

架构师 软件架构设计 系统架构设计

AI会夺走程序员的饭碗吗?

算AI

#人工智能

安装mac软件时提示已损坏,无法打开,应该移到废纸篓的解决办法

Rose

一文读懂ZKFair PFP-CyberArmy的参与价值与潜力

长安区块链

TunesKit Audio Capture for Mac(音频录制和音乐嗅探软件)v3.0.0激活版

影影绰绰一往直前

iShowU Studio for mac(强大的屏幕录像编辑工具)v2.3.14(1508)激活版

影影绰绰一往直前

全栈开发(TS,React,Vue, Java, 移动端flutter)接单

hz

Eudic欧路词典 for Mac(英语词典翻译查询工具)v4.6.2激活版

影影绰绰一往直前

iShowU Instant for Mac(强大的实时屏幕录像工具)v1.4.19(1488)直装版

影影绰绰一往直前

System Toolkit for Mac(mac系统维护软件)v6.1.0中文激活版

影影绰绰一往直前

adobe 系列应用出现Error无法继续安装,文件已损坏,无法打开解决方法

Rose

搜索中的深度匹配模型_文化 & 方法_DataFunTalk_InfoQ精选文章