本文来自公众号Jina AI
ODQA全称Open Domain Question Answering,即开放域问答,是NLP领域长期研究的重要课题,在搜索引擎、智能客服、智能助手等行业应用广泛。
随着深度学习技术的发展,问答系统逐渐从基于特征的多模块级联系统,向更为精简高效的端到端训练转变。
基于深度学习框架飞桨和神经搜索框架Jina,百度NLP团队推出了领先的检索式端到端问答开发工具--RocketQA,进一步提升了ODQA系统的性能。
RocketQA的repo地址:
https://github.com/PaddlePaddle/RocketQA
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
关注公众号,获取更多技术内容~