《Poly-encoders》阅读笔记

文章: Poly-encoders: Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring

来源:ICLR 2020

链接:

Poly-encoders: Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoringarxiv.org

一、主要贡献:

· 开发了一种新的transformer体系结构,即Poly-encoder,该体系结构学习了全局而不是令牌级别的self-attention特征,同时解决了 DSSM 式的 Bi-encoder 匹配质量低的问题和 ARC-II、BERT 等交互式的 Cross-encoder 匹配速度慢的问题。

· 为了对架构进行预训练,我们表明选择与下游任务更相似的大量数据也比BERT预训练带来了可观的收益。在我们尝试的所有不同体系结构选择和下游任务中都是如此。

二、相关工作

三、模型

Bi-encoder 的主要问题在于它要求 encoder 将 query 的所有信息都塞进一个固定的比较 general 的向量中,这导致最后vec_{q}vec_{c} 计算相似度时已经为时过晚,很多细粒度的信息丢失了(e.g. query 为“我要买苹果”),所以无法完成更精准的匹配。

这就有点像 word2vec 静态词向量:即使一个词有多种语义,它的所有语义也不得不塞进一个固定的词向量。

为了克服这个问题,Poly-encoder 的方案就是每个 query 产生 m 个不同的 vec_{q} ,接着再根据 vec_{c}动态地将 m 个 vec_{q}集成为最终的 final-vec_{q},最后再计算final-vec_{q}vec_{c}的匹配度。

Poly-encoders使用两个单独的transfomer(如Bi-encoders)用于context和候选,并且将候选编码为单个向量 y_{candi} 。因为输入上下文通常比候选对象长很多,所以用m个向量( y_{ctxt}^{1} ...y_{ctxt}^{m})表示,而不是像Bi编码器那样仅用一个。我们再用 candidate 对应的向量 y_{cand}计算 m 个y_{ctxt}的 attention,进而得到最终的final-y_{ctxt}


很显然,Poly-encoder 架构在实际部署时是可以离线计算好所有 candidates 的向量的,所以只需要计算 query 对应的 m 个 y_{ctxt}向量,再通过简单的 dot product 就可以快速计算好对应每个 candidate 的“动态的”final-y_{ctxt}向量。

看起来 Poly-encoder 享有 Bi-encoder 的速度,同时又有实现更精准匹配的潜力。

四、实验

本文选择了检索式对话数据集 ConvAI2、DSTC 7、Ubuntu v2 数据集以及 Wikipedia IR 数据集进行实验。

训练 Bi-encoder 和 Poly-encoder 时由于这两类模型的特性,负采样方式为:在训练过程中,使用同一个 batch 中的其他 query 对应的 response 作为负样本。

而 Cross-encoder 的负采样方式为:在开始训练之前,随机采样 15 个 responses 作为负样本。

4.1检索质量

图给出了一些 baseline 模型以及本文的基于预训练 BERT 的 Bi-encoder、Poly-encoder 以及 Cross-encoder 在各个数据集上的表现。

当然我们很容易发现,本文的所有模型由于以预训练的BERT为基础,他们的表现都要显著超出不使用 BERT的那些 baseline 们。所以我们只需要关注 Bi、Poly 和 Cross 三种架构之间的表现差异即可。

实验结果表明即使仅增设少数几个 code(用于计算 attention 产生向量),Poly-encoder 的表现也要远优于 Bi-encoder。

实验结果还表明,Poly-encoder 的表现会随着 code 个数的增加而逐渐增加,并且慢慢逼近 Cross-encoder 的结果。

4.2检索速度

图给出了各模型在 ConvAI2 数据集上的检索耗时。

Bi-encoder 理所当然是最快的架构,当 candidates 为 100k 时,在 CPU 和 GPU 环境下其检索耗时分别为 160ms 和 22ms;而 Cross-encoder 显然是最慢的一个:同样实验条件下其检索耗时分别约为 2.2M (220 万) ms 和 266K (26.6 万) ms。

反观 Poly-encoder,以 Poly-encoder 360 为例,该模型可以达到远超 Bi-encoder、接近甚至反超 Cross-encoder 的检索质量,但其检索速度确比 Cross-encoder 足足快了约 2600-3000 倍!

发布于 05-19

文章被以下专栏收录