入门| Lee等人,ACL 2021 | Lee等人,EMNLP 2021 |演示|参考|执照
密码词是一种文本检索模型,可以为您的自然语言输入返回短语,句子,段落或文档。使用来自整个Wikipedia的数十亿个密集的短语向量,密集词搜索了您的问题的短语级答案或检索下游任务的段落。

有关如何学习如何执行多粒性检索的信息,请参阅我们的ACL论文(大规模学习短语的密集表示)。
*****在这里尝试我们的密集词的在线演示! *****
transformers==4.13.0释放的密码v1.1.0(请参阅注释)。densephrases-multi-query-*的预测文件。在安装密码和下载短语索引后,您可以轻松地检索查询的短语,句子,段落或文档。
有关更多示例,例如使用仅CPU模式,创建自定义索引等。
您还可以使用密码词来检索对话的相关文档或在给定文本上链接的实体。
> >> from densephrases import DensePhrases
# Load DensePhrases for dialogue and entity linking
> >> model = DensePhrases (
... load_dir = 'princeton-nlp/densephrases-multi-query-kilt-multi' ,
... dump_dir = '/path/to/densephrases-multi_wiki-20181220/dump' ,
... )
# Retrieve relevant documents for a dialogue
> >> model . search ( 'I love rap music.' , retrieval_unit = 'document' , top_k = 5 )
[ 'Rapping' , 'Rap metal' , 'Hip hop' , 'Hip hop music' , 'Hip hop production' ]
# Run entity linking for the target phrase denoted as [START_ENT] and [END_ENT]
> >> model . search ( '[START_ENT] Security Council [END_ENT] members expressed concern on Thursday' , retrieval_unit = 'document' , top_k = 1 )
[ 'United Nations Security Council' ]我们提供了更多示例,其中包括培训izacard and Grave的最先进的开放域问题答案模型,称为Fusion-In-In-In-In-In-In-Decoder,2021年。
# Install torch with conda (please check your CUDA version)
conda create -n densephrases python=3.7
conda activate densephrases
conda install pytorch=1.9.0 cudatoolkit=11.0 -c pytorch
# Install apex
git clone https://www.github.com/nvidia/apex.git
cd apex
python setup.py install
cd ..
# Install DensePhrases
git clone -b v1.0.0 https://github.com/princeton-nlp/DensePhrases.git
cd DensePhrases
pip install -r requirements.txt
python setup.py develop main分支使用python==3.7 ,而transformers==2.9.0 。参见下面的其他版本的致密词。
| 发布 | 笔记 | 描述 |
|---|---|---|
| V1.0.0 | 关联 | transformers==2.9.0 ,与main相同 |
| v1.1.0 | 关联 | transformers==4.13.0 |
在下面下载所需的文件之前,请按以下方式设置默认目录,并确保您有足够的存储空间可以下载和解压缩文件:
# Running config.sh will set the following three environment variables:
# DATA_DIR: for datasets (including 'kilt', 'open-qa', 'single-qa', 'truecase', 'wikidump')
# SAVE_DIR: for pre-trained models or index; new models and index will also be saved here
# CACHE_DIR: for cache files from Huggingface Transformers
source config.sh要下载下面所述的资源,您可以使用download.sh如下:
# Use bash script to download data (change data to models or index accordingly)
source download.sh
Choose a resource to download [data/wiki/models/index]: data
data will be downloaded at ...
...
Downloading data done !$DATA_DIR下下载并解压缩,或使用download.sh 。$DATA_DIR下下载并解压缩,或使用download.sh 。 # Check if the download is complete
ls $DATA_DIR
kilt open-qa single-qa truecase wikidump您可以使用HuggingFace Model Hub中的预训练模型。以princeton-nlp ( load_dir中指定)开头的任何模型名称将自动翻译为我们的HuggingFace Model Hub中的模型。
> >> from densephrases import DensePhrases
# Load densephraes-multi-query-nq from the Huggingface model hub
> >> model = DensePhrases (
... load_dir = 'princeton-nlp/densephrases-multi-query-nq' ,
... dump_dir = '/path/to/densephrases-multi_wiki-20181220/dump' ,
... )| 模型 | 查询ft。 | NQ | WebQ | trec | Triviaqa | 队 | 描述 |
|---|---|---|---|---|---|---|---|
| 密集词形成 | 没有任何 | 31.9 | 25.5 | 35.7 | 44.4 | 29.3 | 在任何查询之前。 |
| 密集词形成 - 杂种 - 穆尔蒂 | 多种的 | 40.8 | 35.0 | 48.8 | 53.3 | 34.2 | 用于演示 |
| 模型 | 查询ft。 &评估 | Em | 预测(测试) | 描述 |
|---|---|---|---|---|
| 密集词 - 杂种 - Query-nq | NQ | 41.3 | 关联 | - |
| 密集词形成 - 杂种-WQ | WebQ | 41.5 | 关联 | - |
| 密集词形成 - 怪异 - 特雷克 | trec | 52.9 | 关联 | --regex需要Regex |
| 密集词形成 - 怪异 - Query-TQA | Triviaqa | 53.5 | 关联 | - |
| 密集词 - 杂种 - Query-sqd | 队 | 34.5 | 关联 | - |
重要的是:使用densephrases-multi数据集(Query-ft。),使用短语索引densex-multi_wiki-wiki-20181220在指定的数据集(Query-ft。)上进行了查询侧进行微调。另请注意,我们的预训练模型是案例敏感的模型,当--truecase均可获得任何低估的查询(例如NQ)时,获得了最佳结果。
densephrases-multi ):经过Mutiple Reading理解数据集(NQ,WebQ,TREC,TRIVIAQA,小队)的培训。densephrases-multi-query-multi :在多个开放域QA数据集(NQ,WebQ,TREC,TREC,TRIVIAQA,SEEKAD)上densephrases-multi查询侧进行微调。densephrases-multi-query-* :每个开放域QA数据集上的densephrases-multi查询侧进行了微调。有关其他任务中的预训练模型(例如,插槽填充),请参见示例。请注意,大多数预训练的模型是查询侧微调密集densephrases-multi的结果。
spanbert-base-cased-* )。下载并在$SAVE_DIR下下载并解压缩或使用download.sh 。 # Check if the download is complete
ls $SAVE_DIR
densephrases-multi densephrases-multi-query-nq ... spanbert-base-cased-squad > >> from densephrases import DensePhrases
# Load densephraes-multi-query-nq locally
> >> model = DensePhrases (
... load_dir = '/path/to/densephrases-multi-query-nq' ,
... dump_dir = '/path/to/densephrases-multi_wiki-20181220/dump' ,
... )请注意,除非您想在Wikipedia量表上工作,否则您无需下载此短语索引。
$SAVE_DIR下下载并解压缩或使用download.sh 。我们还基于更多的激烈过滤(可选)提供较小的短语索引。
这些较小的索引应放置在$SAVE_DIR/densephrases-multi_wiki-20181220/dump/start与您下载的任何其他索引一起开始。如果您仅使用较小的短语索引,并且不想下载大型索引(74GB),则需要下载元数据(20GB),并将其放在$SAVE_DIR/densephrases-multi_wiki-20181220/dump文件夹下,如下所示。文件的结构应该看起来像:
$SAVE_DIR /densephrases-multi_wiki-20181220
└── dump
├── meta_compressed.pkl
└── start
├── 1048576_flat_OPQ96
├── 1048576_flat_OPQ96_medium
└── 1048576_flat_OPQ96_small所有短语索引都是由同一模型( densephrases-multi )创建的,您可以将上面的所有预训练模型与这些短语索引中的任何一个使用。要更改索引,只需在densephrases/options.py中设置index_name (或--index_name )如下:
> >> from densephrases import DensePhrases
# Load DensePhrases with a smaller index
> >> model = DensePhrases (
... load_dir = 'princeton-nlp/densephrases-multi-query-multi' ,
... dump_dir = '/path/to/densephrases-multi_wiki-20181220/dump' ,
... index_name = 'start/1048576_flat_OPQ96_small'
... )下面示出了densephrases-multi-query-nq对具有不同短语索引的自然问题(测试)的性能。
| 短语索引 | 开放域QA(EM) | 句子检索(ACC@1/5) | 通过检索(ACC@1/5) | 尺寸 | 描述 |
|---|---|---|---|---|---|
| 1048576_FLAT_OPQ96 | 41.3 | 48.7 / 66.4 | 52.6 / 71.5 | 60GB | 用eval-index-psg进行评估 |
| 1048576_FLAT_OPQ96_MEDIUM | 39.9 | 48.3 / 65.8 | 52.2 / 70.9 | 39GB | |
| 1048576_FLAT_OPQ96_SMALL | 38.0 | 47.2 / 64.0 | 50.7 / 69.1 | 20GB |
请注意,段落检索准确性(ACC@1/5)通常高于论文中报告的数字,因为这些短语索引返回自然段落,而不是固定尺寸的文本块(即100个单词)。
您可以在自己的服务器上运行Wikipedia级演示。对于自己的演示,您可以更改短语索引(从此处获取)或查询编码器(例如,变为densephrases-multi-query-nq )。
运行完整Wikipedia量表演示的资源要求是:
请注意,与以前的短语检索模型(Denspi,denspi+sparc)不同,您不再需要SSD来运行演示。以下命令与http://localhost:51997上的演示完全相同。
# Serve a query encoder on port 1111
nohup python run_demo.py
--run_mode q_serve
--cache_dir $CACHE_DIR
--load_dir princeton-nlp/densephrases-multi-query-multi
--cuda
--max_query_length 32
--query_port 1111 > $SAVE_DIR /logs/q-serve_1111.log &
# Serve a phrase index on port 51997 (takes several minutes)
nohup python run_demo.py
--run_mode p_serve
--index_name start/1048576_flat_OPQ96
--cuda
--truecase
--dump_dir $SAVE_DIR /densephrases-multi_wiki-20181220/dump/
--query_port 1111
--index_port 51997 > $SAVE_DIR /logs/p-serve_51997.log &
# Below are the same but simplified commands using Makefile
make q-serve MODEL_NAME=densephrases-multi-query-multi Q_PORT=1111
make p-serve DUMP_DIR= $SAVE_DIR /densephrases-multi_wiki-20181220/dump/ Q_PORT=1111 I_PORT=51997请更改--load_dir或--dump_dir如有必要),然后删除 - 仅CPU版本的--cuda 。设置演示后,每当出现新问题时,将自动更新$SAVE_DIR/logs/中的日志文件。您还可以使用小批次的问题将查询发送到服务器,以更快地推断。
# Test on NQ test set
python run_demo.py
--run_mode eval_request
--index_port 51997
--test_path $DATA_DIR /open-qa/nq-open/test_preprocessed.json
--eval_batch_size 64
--save_pred
--truecase
# Same command with Makefile
make eval-demo I_PORT=51997
# Result
(...)
INFO - eval_phrase_retrieval - { ' exact_match_top1 ' : 40.83102493074792, ' f1_score_top1 ' : 48.26451418695196}
INFO - eval_phrase_retrieval - { ' exact_match_top10 ' : 60.11080332409972, ' f1_score_top10 ' : 68.47386731458751}
INFO - eval_phrase_retrieval - Saving prediction file to $SAVE_DIR /pred/test_preprocessed_3610_top10.pred有关更多详细信息(例如,更改测试集),请参阅Makefile ( q-serve , p-serve , eval-demo等)中的目标。
在本节中,我们介绍了一个逐步的过程,以训练密码,创建短语向量和索引,并使用训练有素的模型进行推断。我们这里的所有命令都简化为Makefile目标,其中包括精确的数据集路径,超参数设置等。
如果以下测试运行在安装和下载后没有错误完成,那么您就可以了!
# Test run for checking installation (takes about 10 mins; ignore the performance)
make draft MODEL_NAME=test
要从从头开始训练密集词,请在Makefile中使用run-rc-nq ,该型号训练NQ(预处理理解任务预处理),并在阅读理解和(半)开放式质量固定质量质量质量质量质量质量质量检查时对其进行评估。您可以通过修改run-rc-nq的依赖项(例如, nq-rc-data => sqd-rc-data和nq-param => sqd-param以在小队上训练)来更改训练集。您需要一个24GB GPU来培训读取理解任务的密码,但是可以通过设置--gradient_accumulation_steps使用较小的GPU。
# Train DensePhrases on NQ with Eq. 9 in Lee et al., ACL'21
make run-rc-nq MODEL_NAME=densephrases-nq run-rc-nq由六个命令组成如下(如果在NQ上进行培训):
make train-rc ... :火车密码。 9(l = lambda1 l_single + lambda2 l_distill + lambda3 l_neg)带有生成的问题。make train-rc ... :负载训练有素的密码词,然后用等式进一步训练它。 9带有批处理前的负面因素。make gen-vecs :为d_small生成短语向量(= nq dev中所有段落的集合)。make index-vecs :为d_small构建短语索引。make compress-meta :压缩元数据以更快地推断。make eval-index ... :在开发集问题上评估短语索引。在第2步的末尾,您将看到给出黄金通道的阅读理解任务的性能(在NQ Dev上约为72.0 EM)。步骤6给出了半开放域设置的性能(称为d_small;请参见表6中的表6),其中NQ开发集中的整个段落用于索引(大约为62.0 EM带有NQ Dev问题)。训练有素的模型将在$SAVE_DIR/$MODEL_NAME下保存。请注意,在NQ的单程培训期间,我们在开发集中排除了一些问题,从列表或表格中找到了带注释的答案。
假设您有一个名为densephrases-multi的预训练的密码,也可以从此处下载。现在,您可以使用gen-vecs-parallel生成像Wikipedia这样的大型语料库的短语向量。请注意,您只需下载完整的Wikipedia量表的短语索引,然后跳过本节即可。
# Generate phrase vectors in parallel for a large-scale corpus (default = wiki-dev)
make gen-vecs-parallel MODEL_NAME=densephrases-multi START=0 END=8用于创建短语向量的默认文本语料库位于$ wiki-dev $DATA_DIR/wikidump中。我们有三个大型文本语料库的选择:
wiki-dev :1/100 Wikipedia量表(采样),8个文件wiki-dev-noise :1/10 Wikipedia量表(采样),500个文件wiki-20181220 :Full Wikipedia(20181220)量表,5621文件wiki-dev* Corpora还包含NQ开发集中的段落,因此您可以以文本语料库的尺寸增加(通常随着较大而减小)跟踪模型的性能。短语向量将作为hdf5文件保存在$SAVE_DIR/$(MODEL_NAME)_(data_name)/dump (例如, $SAVE_DIR/densephrases-multi_wiki-dev/dump ),将在下面引用$DUMP_DIR 。
START和END在语料库中指定文件索引(例如, wiki-dev的START=0 END=8 , START=0 END=5621对于wiki-20181220 )。每次运行gen-vecs-parallel仅在单个GPU中消耗2GB,并且您可以使用Slurm或Shell脚本以不同的START和END分配过程(例如, START=0 END=200 , START=200 END=400 ,..., START=5400 END=5621 )。在4个24GB GPU上分发28个进程(每个处理约200个文件)可以在8小时内为wiki-20181220创建短语向量。处理整个Wikiepdia最多需要500GB,我们建议在可能的情况下使用SSD存储(较小的语料库可以存储在HDD中)。
生成短语向量后,您需要为sublinear时间搜索短语创建一个短语索引。在这里,我们将IVFOPQ用于短语索引。
# Create IVFOPQ index for a set of phrase vectors
make index-vecs DUMP_DIR= $SAVE_DIR /densephrases-multi_wiki-dev/dump/对于wiki-dev-noise和wiki-20181220 ,您需要分别将簇数分别改为101,372和1,048,576(只需更改ìndex-vecs中的medium1-index ,将其更改为medium2-index或large-index )。对于wiki-20181220 (完整的Wikipedia),这大约需要1〜2天,具体取决于您的机器规格,需要约100GB RAM。对于本文中所述的IVFSQ,您可以使用index-add和index-merge将短语向量添加到索引中。
您还需要压缩元数据(与短语矢量一起保存在HDF5文件中),以更快地推断致密源。对于IVFOPQ索引,这是必须的。
# Compress metadata of wiki-dev
make compress-meta DUMP_DIR= $SAVE_DIR /densephrases-multi_wiki-dev/dump为了用您的短语索引评估密度词的性能,请使用eval-index 。
# Evaluate on the NQ test set questions
make eval-index MODEL_NAME=densephrases-multi DUMP_DIR= $SAVE_DIR /densephrases-multi_wiki-dev/dump/查询侧微调使密码词成为用于检索不同类型输入查询的多层状文本的多功能工具。虽然查询侧的微调也可以改善QA数据集的性能,但它可用于将密集词调整到非QA样式输入查询中,例如“主题[SEP]关系”,以检索对象实体或“我喜欢说唱音乐”。检索有关说唱的相关文件。
首先,您需要完整的Wikipedia( wiki-20181220 )的短语索引,该索引可以在此处简单下载,或者如下所述下载。鉴于您的查询 - 答案或查询文件对在$DATA_DIR/open-qa或$DATA_DIR/kilt中预处理为JSON文件,因此您可以轻松查询侧面微调模型。例如,T-Rex( $DATA_DIR/kilt/trex/trex-train-kilt_open_10000.json )的训练集如下:
{
"data": [
{
"id": "111ed80f-0a68-4541-8652-cb414af315c5",
"question": "Effie Germon [SEP] occupation",
"answers": [
"actors",
...
]
},
...
]
}
T-Rex上的以下命令查询侧微型densephrases-multi 。
# Query-side fine-tune on T-REx (model will be saved as MODEL_NAME)
make train-query MODEL_NAME=densephrases-multi-query-trex DUMP_DIR= $SAVE_DIR /densephrases-multi_wiki-20181220/dump/请注意,预先训练的查询编码器在train-query中指定为--load_dir $(SAVE_DIR)/densephrases-multi ,新模型将作为densephrases-multi-query-trex如MODEL_NAME中的指定保存。您还可以通过将依赖项trex-open-data更改为*-open-data (例如,用于实体链接的ay2-kilt-data )来训练不同的数据集。
使用任何密度词,查询编码器(例如, densephrases-multi-query-nq )和短语索引(例如, densephrases-multi_wiki-20181220 ),您可以如下测试查询,并且检索结果将作为JSON文件保存为JOSON文件,并具有--save_pred选项:
# Evaluate on Natural Questions
make eval-index MODEL_NAME=densephrases-multi-query-nq DUMP_DIR= $SAVE_DIR /densephrases-multi_wiki-20181220/dump/
# If the demo is being served on http://localhost:51997
make eval-demo I_PORT=51997对于在不同数据集上的评估,只需相应地更改eval-index (或eval-demo )的依赖性(例如, nq-open-data to trec-open-data以进行策划的评估)。
在Makefile的底部,我们列出了用于预处理数据集和Wikipedia的命令。对于培训问题生成模型(T5-LARGE),我们使用了https://github.com/patil-suraj/question_generation(另请参见此处的QG)。请注意,所有数据集都已预处理,包括生成的问题,因此您无需运行大多数这些脚本。有关为自定义(开放域)问题创建测试集,请参见Makefile中的preprocess-openqa 。
有关与代码或论文有关的任何问题,请随时发送电子邮件发送给Jinhyuk Lee ([email protected]) 。您也可以打开GitHub问题。请尝试指定详细信息,以便我们更好地理解并帮助您解决问题。
如果您在工作中使用密码,请引用我们的论文:
@inproceedings { lee2021learning ,
title = { Learning Dense Representations of Phrases at Scale } ,
author = { Lee, Jinhyuk and Sung, Mujeen and Kang, Jaewoo and Chen, Danqi } ,
booktitle = { Association for Computational Linguistics (ACL) } ,
year = { 2021 }
} @inproceedings { lee2021phrase ,
title = { Phrase Retrieval Learns Passage Retrieval, Too } ,
author = { Lee, Jinhyuk and Wettig, Alexander and Chen, Danqi } ,
booktitle = { Conference on Empirical Methods in Natural Language Processing (EMNLP) } ,
year = { 2021 } ,
}请参阅许可证以获取详细信息。