Jina 牵手百度 PaddlePaddle,打造端到端问答开发工具 RocketQA

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

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

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

Jina:下一代开源神经搜索引擎

Jina 是一个神经搜索框架,目前已经在 GitHub 开源,适用于所有格式的数据类型。利用 Jina,用户可以在几分钟内构建 SOTA 和可扩展的深度学习搜索应用。

它具有以下优势:

节省时间:神经搜索系统的设计模式,支持 PyTorch/Keras/ONNX/Paddle,用户可以在几分钟内搭建解决方案。

支持所有数据类型:支持处理、索引、查询和理解视频、图像、长/短文本、音频、源代码、 pdf 等多种数据类型。

本地和云端友好:支持分布式架构、可扩展和云原生。

拥有自己的堆栈:保留解决方案的端到端堆栈所有权。规避多供应商、通用遗留工具等风险。

用 Jina 搭建 ODQA 系统,可参见:

https://github.com/jina-ai/example-odqa

RocketQA 工作原理

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

Jina 牵手百度 PaddlePaddle,打造端到端问答开发工具 RocketQA_第1张图片

RocketQA 中检索器的工作原理

 Cross Encoder:

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

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

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

Jina 牵手百度 PaddlePaddle,打造端到端问答开发工具 RocketQA_第2张图片

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 可以针对每对问题和答案,返回一个可信分数。

Jina 牵手百度 PaddlePaddle,打造端到端问答开发工具 RocketQA_第3张图片

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 部分。

RocketQAReranker 详细介绍参见:

https://hub.jina.ai/executor/ao0cuqe8

完整代码参见:

https://github.com/jina-ai/example-odqa

更多 Jina 案例,点击阅读原文或访问:

https://github.com/jina-ai/jina

参考文献:

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

《您的新年大礼包即将送达,检索、问答、情感分析,代码模型全开源太香了!》

https://mp.weixin.qq.com/s/3y75PD1AxRugvkhxFFi15w

—— 完 ——

Jina 牵手百度 PaddlePaddle,打造端到端问答开发工具 RocketQA_第4张图片

下一代开源神经搜索引擎

在 GitHub 找到我们

更多精彩内容(点击图片阅读)

Jina 牵手百度 PaddlePaddle,打造端到端问答开发工具 RocketQA_第5张图片

Jina 牵手百度 PaddlePaddle,打造端到端问答开发工具 RocketQA_第6张图片

你可能感兴趣的:(搜索引擎,机器学习,深度学习,java,人工智能)