🚀 基于DPR的问题编码器模型
本项目是一个基于 DPRQuestionEncoder 架构的问题编码器模型。它利用Transformer的池化器输出作为问题表示。更多详细信息请参考 博客文章。
🚀 快速开始
本模型可用于对问题进行编码,以获取问题的向量表示。以下是使用示例:
from transformers import DPRContextEncoder, DPRContextEncoderTokenizer
model = DPRQuestionEncoder.from_pretrained("vblagoje/dpr-question_encoder-single-lfqa-wiki").to(device)
tokenizer = AutoTokenizer.from_pretrained("vblagoje/dpr-question_encoder-single-lfqa-wiki")
input_ids = tokenizer("Why do airplanes leave contrails in the sky?", return_tensors="pt")["input_ids"]
embeddings = model(input_ids).pooler_output
✨ 主要特性
📦 安装指南
暂未提供具体安装步骤,你可以参考 transformers
库的官方文档进行安装。
💻 使用示例
基础用法
from transformers import DPRContextEncoder, DPRContextEncoderTokenizer
model = DPRQuestionEncoder.from_pretrained("vblagoje/dpr-question_encoder-single-lfqa-wiki").to(device)
tokenizer = AutoTokenizer.from_pretrained("vblagoje/dpr-question_encoder-single-lfqa-wiki")
input_ids = tokenizer("Why do airplanes leave contrails in the sky?", return_tensors="pt")["input_ids"]
embeddings = model(input_ids).pooler_output
🔧 技术细节
训练过程
我们使用FAIR的 dpr-scale
分两个阶段训练了 vblagoje/dpr-question_encoder-single-lfqa-wiki
模型。
- 第一阶段:使用基于PAQ的预训练检查点,并在LFQA数据集的问答对上微调检索器。由于
dpr-scale
需要DPR格式的训练集输入,包含正样本、负样本和难负样本,我们创建了一个训练文件,其中答案作为正样本,与问题无关的答案作为负样本,难负样本则从余弦相似度在0.55到0.65之间的问题答案中选择。
- 第二阶段:使用第一阶段创建的Wikipedia/Faiss索引中的正样本、负样本和难负样本,而不是LFQA数据集的答案,创建一个新的DPR训练集。具体来说,对于每个数据集问题,我们查询第一阶段的Wikipedia Faiss索引,然后使用SBert交叉编码器对问题/答案(段落)对进行评分,
topk=50
。交叉编码器选择得分最高的正段落,而得分最低的七个答案作为难负样本。负样本再次选择为与给定数据集问题无关的答案。在创建了一个基于Wikipedia的正、负和难负段落的DPR格式训练文件后,我们使用 dpr-scale
训练基于DPR的问题/段落编码器。
性能表现
基于LFQA DPR的检索器(vblagoje/dpr-question_encoder-single-lfqa-wiki
和 vblagoje/dpr-ctx_encoder-single-lfqa-wiki
)在性能上略逊于 “最先进” 的Krishna等人在 “Hurdles to Progress in Long-form Question Answering” 中基于REALM的检索器。在KILT基准测试中,R精度为11.2,Recall@5为19.5。
📄 许可证
本项目采用MIT许可证。
👨💻 作者信息