\u200E
飞桨携手Jina推出端到端问答开发工具RocketQA
发布日期:2022-01-07T11:58:00.000+0000 浏览量:2302次

本文来自公众号Jina AI


ODQA全称Open Domain Question Answering,即开放域问答,是NLP领域长期研究的重要课题,在搜索引擎、智能客服、智能助手等行业应用广泛。


随着深度学习技术的发展,问答系统逐渐从基于特征的多模块级联系统, 向更为精简高效的端到端训练转变。

基于深度学习框架飞桨和神经搜索框架Jina ,百度NLP团队推出了领先的检索式端到端问答开发工具--RocketQA,进一步提升了ODQA系统的性能。

RocketQA的repo地址:
https://github.com/PaddlePaddle/RocketQA

在实际应用中,RocketQA引入cross-attention encoder,对检索结果排序;同时利用一个包含4步的pipeline,改进训练程序。


RocketQA 中检索器的工作原理


 Cross Encoder:


通常情况下,Dual Encoder架构可以通过学习问题和段落的密集表征,进行语义匹配。

但是某些情况下,会遇到训练和推理之间存在差异、训练数据有限等问题,这就使得Dual Encoder很难进行有效训练。

在RocketQA中,除Dual Encoder外,还使用了Cross Encoder模型,来学习问题和段落之间的交叉关联,这使得结果更加精准。

Dual Encoder 和 Cross Encoder 的原理演示

Cross-Encoder 交叉关联验证,使得结果更加准确




 4 个步骤完成训练过程 


RocketQA训练Dual Encoder和Cross Encoder的过程一共包括 4 个步骤。

1、通过Cross Batch生成强负样本 (hard negative samples)。这解决了DPR的批量采样问题,使模型意识到难以区分的负样本的存在。

2、训练Cross Encoder。用步骤1中训练的Dual Encoder,从强负样本中过滤出假阳性样本。

3、再次训练Dual Encoder。为了过滤掉假阳性样本,RocketQA会同时使用步骤1的Dual Encoder和步骤2的Cross Encoder,进一步去除数据噪音。

4、利用步骤2的Cross Encoder和步骤3的Dual Encoder,进一步过滤数据中的噪音。由于Cross Encoder和Dual Encoder都已经被训练过,因此可以利用它们从未标记数据集中,生成训练数据。

训练过程结束后,就可以用Dual Encoder和Cross Encoder来检索段落。Cross Encoder可以针对每对问题和答案,返回一个可信分数。

RocketQA 中的正负样本


在Jina中

使用RocketQA



RocketQA目前已经上线Jina Hub ,我们可以通过创建一个Flow,对Document进行索引。

Document的段落被存储在 .tags['para']字段中。你也可以通过.tags['title']来提高准确性。使用RocketQADualEncoder将段落编码为向量,并存储在SimpleIndexer中。

RocketQADualEncoder详细介绍参见:
https://hub.jina.ai/executor/27h1qsmc

doc = Document(tags={'title': title, 'para': para})
f = (Flow()
    .add(
   uses='jinahub+docker://RocketQADualEncoder',
   uses_with={'use_cuda': False})
    .add(
   uses='jinahub://SimpleIndexer',
   uses_metas={'workspace''workspace_rocketqa'}))


with f:
   f.post(on='/index', inputs=[doc,])

创建查询流程,代码如下:

from jina import Flow

f = (Flow(use_cors=True, protocol='http', port_expose=45678)
    .add(uses='jinahub+docker://RocketQADualEncoder',
         uses_with={'use_cuda'False})
    .add(uses='jinahub://SimpleIndexer',
         uses_metas={'workspace''workspace_rocketqa'},
         uses_with={'match_args': {'limits'10}})
    .add(uses='jinahub+docker://RocketQAReranker',
         uses_with={'model''v1_marco_ce''use_cuda'False}))

RocketQADualEncoder外,还可以用RocketQAReranker对结果进行排序,它也可以实现RocketQA中的Cross Encoder部分。


总结



百度提出的RocketQA训练方法,通过对经典对偶模型进行优化训练,显著提升了模型的检索能力,为实现端到端问答迈出了重要一步。目前,RocketQA已逐步应用在百度搜索、广告等核心业务中,并将在更多场景中发挥作用。


百度自然语言处理(Natural Language Processing,NLP)以『理解语言,拥有智能,改变世界』为使命,研发自然语言处理核心技术,打造领先的技术平台和创新产品,服务全球用户,让复杂的世界更简单。

参考文献:

RocketQA: An Optimized Training Approach to Dense Passage Retrieval for Open-Domain Question Answering, Qu et al., NAACL 2021

https://arxiv.org/abs/2010.08191


关注公众号,获取更多技术内容~