specter:基于引用信息的文档级表示学习模型

SPECTER: Document-level Representation Learning using Citation-informed Transformers

分支6Tags0
文件最后提交记录最后更新时间
5 年前
6 年前
5 年前
6 年前
6 年前
3 年前
6 年前
3 年前
3 年前
6 年前

SPECTER:使用引用信息Transformer进行文档级别表示学习

SPECTER | 预训练模型 | 训练您自己的模型 | SciDocs | 公共API | 论文 | 引用

此存储库包含代码、预训练模型链接、SPECTER 使用说明和 SciDocs 评估框架链接。

***** 新增2021年1月:HuggingFace 模型*****

现在可以通过 HuggingFace 的 transformers 库访问 SPECTER。

感谢@zhipenghoustat提供 Huggingface 训练脚本和检查点。

继续阅读下面:

如何使用预训练模型

1- 通过 Huggingface Transformers 库

要求:pip install --upgrade transformers==4.2

from transformers import AutoTokenizer, AutoModel

# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained('allenai/specter')
model = AutoModel.from_pretrained('allenai/specter')

papers = [{'title': 'BERT', 'abstract': '我们引入了一个名为BERT的语言表示模型'},
          {'title': '注意力就是你需要的一切', 'abstract': '主导序列转换模型基于复杂的循环或卷积神经网络'}]

# 合并标题和摘要
title_abs = [d['title'] + tokenizer.sep_token + (d.get('abstract') or '') for d in papers]
# 预处理输入
inputs = tokenizer(title_abs, padding=True, truncation=True, return_tensors="pt", max_length=512)
result = model(**inputs)
# 取批次中第一个令牌作为嵌入
embeddings = result.last_hidden_state[:, 0, :]

scripts/embed_papers_hf.py 中提供了批量模式下在论文数据集上运行模型的示例脚本。

用法如下:

CUDA_VISIBLE_DEVICES=0 python scripts/embed_papers_hf.py \
--data-path 路径/to/paper-metadata.json \
--output 路径/to/write/output.json \
--batch-size 8

注意:Huggingface 模型在平均结果上略高于论文中报告的结果。 要复现实验室的精确数字,请使用我们的原始实现,参见复现实验室结果

Huggingface 模型预期的 SciDocs 结果:

mag-f1 mesh-f1 co-view-map co-view-ndcg co-read-map co-read-ndcg cite-map cite-ndcg cocite-map cocite-ndcg recomm-ndcg recomm-P@1 Avg
79.4 87.7 83.4 91.4 85.1 92.7 92.0 96.6 88.0 94.7 54.6 20.9 80.5

2- 通过此仓库

论文中的错误:在论文中,我们提到取对应于 [CLS] 令牌的表示作为序列的聚合表示。然而,在AllenNLP v0.9版本的BERT嵌入器中,每个令牌表示是所有层表示的标量混合。为了将输入聚合到单个向量中,使用了平均池化。因此,原始的 SPECTER 模型使用层的标量混合和平均池化来嵌入给定文档,而不是取 [CLS] 令牌的最后一层表示。 上面的Huggingface模型使用了 [CLS] 最后一层的表示。实际上,这不会影响结果,两个模型的表现相当。

1 - 克隆仓库并下载预训练模型和支持文件:

下载

在以下位置下载归档文件:下载 [833 MiB]
压缩存档包括一个model.tar.gz文件,这是预训练模型以及位于data/目录内的支持文件。

以下是运行的命令:

git clone git@github.com:allenai/specter.git

cd specter

wget https://ai2-s2-research-public.s3-us-west-2.amazonaws.com/specter/archive.tar.gz

tar -xzvf archive.tar.gz 

2 - 安装环境:

conda create --name specter python=3.7 setuptools  

conda activate specter  

# 如果没有GPU,则移除cudatoolkit参数
conda install pytorch cudatoolkit=10.1 -c pytorch   

pip install -r requirements.txt  

python setup.py install

3 - 使用 SPECTER 嵌入论文或文档

SPECTER 需要两个主要文件作为输入以嵌入文档。一个包含要嵌入文档的ID的文本文件和一个包含标题和摘要信息的JSON元数据文件。data/ 目录中提供了样本文件以帮助入门。输入数据格式如下:

metadata.json 格式:

{
    'doc_id': {'title': '科学文档的表示学习',
               'abstract': '我们提出了一种新的抽象表示模型'},
}

要使用 SPECTER 为您的数据嵌入,请执行以下命令:

python scripts/embed.py \
--ids data/sample.ids --metadata data/sample-metadata.json \
--model ./model.tar.gz \
--output-file output.jsonl \
--vocab-dir data/vocab/ \
--batch-size 16 \
--cuda-device -1

如果需要更快的推断,请将 --cuda-device 更改为 0 或指定的GPU。
模型将在提供的输入上运行推断,并将结果写入 --output-file 目录(如上述示例所示 output.jsonl)。
这是一个jsonlines文件,每行都是由嵌入文档的id和其SPECTER表示组成的键值对。

公共 API

用于检索 Semantic Scholar 文库中预先计算的SPECTER嵌入的集合的公共API可在以下网址找到:https://www.semanticscholar.org/product/api,并且可用于使用 SPECTER 为给定的论文标题和摘要嵌入的API可在以下网址找到:allenai/paper-embedding-public-apis

注意:从公共API检索的嵌入与在此仓库上运行模型生成的嵌入不匹配。它们来自SPECTER模型的不同版本。虽然不同集合的嵌入不能在同一任务中混合使用,但这些集合在下游任务上的表现相似。

如何复现实验室结果

为了复现实验室结果,请参考SciDocs 存储库,我们在其中提供了评估任务的嵌入和运行基准以获取结果的说明。

高级:训练自己的模型

首先,按照预训练模型部分中的步骤1和2下载所需文件并安装环境。

接下来,您需要利用specter/data_utils/create_training_files.py脚本创建训练实例的pickle文件,然后将生成的文件作为输入提供给scripts/run-exp-simple.sh脚本。

您需要以下文件:

  • 包含文档ID及其关系的data.json
  • 包含文档ID到文本字段(如titleabstract)映射的metadata.json
  • 分别包含训练、验证、测试集文档ID的train.txtval.txttest.txt(每行一个文档ID)。

data.json文件结构如下(嵌套字典形式):

{
  "docid1": {
    "docid11": {"count": 1},
    "docid12": {"count": 5},
    ...
  },
  "docid2": {
    "docid21": {"count": 1},
    ...
  },
  ...
}

其中,docids是数据中文档的ID,count衡量两文档间关系的重要性。在我们的数据集中,引用作为关系指标,count=5表示直接引用,而count=1指间接引用(即引用的引用)。

create_training_files.py脚本会处理这个结构,采用三元组采样器来选择容易和困难的负样本(如论文所述),依据上述结构中的count值。例如,count=5的文献被认为是正样本,count=1是难负样本,未被引用的其他文献则视为易负样本。您可以调整硬负样本的数量,通过脚本的--ratio_hard_negatives参数设定。

  • 创建预处理训练文件:
python specter/data_utils/create_training_files.py \
--data-dir data/training \
--metadata data/training/metadata.json \
--outdir data/preprocessed/

预处理后,您将获得三个包含训练实例的pickle文件以及记录各集合示例数的metrics.json。使用以下脚本来开始模型训练:

  • 运行训练脚本
./scripts/run-exp-simple.sh -c experiment_configs/simple.jsonnet \
-s model-output/ --num-epochs 2 --batch-size 4 \
--train-path data/preprocessed/data-train.p --dev-path data/preprocessed/data-val.p \
--num-train-instances 55 --cuda-device -1

在此示例中,模型的检查点和日志将存储在model-output/中。请注意,您需要根据您的数据集设置正确的--num-train-instances。该数值储存在预处理步骤输出的metrics.json文件中。 您可以使用TensorBoard监控训练进度:

tensorboard --logdir model-output/ --bind_all

SciDocs基准

SciDocs评估框架包括一系列专为文档级别任务设计的评估任务。

SciDocs链接:

引用

请引用SPECTER论文

@inproceedings{specter2020cohan,
  title={SPECTER: Document-level Representation Learning using Citation-informed Transformers},
  author={Arman Cohan and Sergey Feldman and Iz Beltagy and Doug Downey and Daniel S. Weld},
  booktitle={ACL},
  year={2020}
}

项目介绍

SPECTER: Document-level Representation Learning using Citation-informed Transformers

定制我的领域