原文:
huggingface.co/docs/transformers
BART
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/model_doc/bart
概述
Bart 模型是由 Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman Mohamed, Omer Levy, Ves Stoyanov 和 Luke Zettlemoyer 在 2019 年 10 月 29 日提出的,题为 BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension。
根据摘要,
- Bart 使用标准的 seq2seq/机器翻译架构,具有双向编码器(类似于 BERT)和从左到右的解码器(类似于 GPT)。
- 预训练任务涉及随机打乱原始句子的顺序和一种新颖的填充方案,其中文本段被替换为单个掩码标记。
- BART 在文本生成的微调时特别有效,但也适用于理解任务。它在 GLUE 和 SQuAD 上与 RoBERTa 的性能相匹配,实现了一系列抽象对话、问答和总结任务的最新成果,ROUGE 提升高达 6 个百分点。
这个模型是由sshleifer贡献的。作者的代码可以在这里找到。
使用提示:
- BART 是一个具有绝对位置嵌入的模型,因此通常建议在右侧而不是左侧填充输入。
- 具有编码器和解码器的序列到序列模型。编码器接收到被损坏版本的标记,解码器接收到原始标记(但有一个掩码来隐藏未来的单词,就像常规的 transformers 解码器)。以下转换的组合应用于编码器的预训练任务:
- 掩盖随机标记(就像在 BERT 中)
- 删除随机标记
- 用单个掩码标记掩盖 k 个标记的范围(0 个标记的范围是插入一个掩码标记)
- 排列句子
- 旋转文档,使其从特定标记开始
实现注意事项
- Bart 不使用
token_type_ids
进行序列分类。使用 BartTokenizer 或 encode() 来获得正确的分割。 - BartModel 的前向传递将创建
decoder_input_ids
,如果它们没有被传递。这与一些其他建模 API 不同。这个特性的一个典型用例是掩码填充。 - 当
forced_bos_token_id=0
时,模型预测应该与原始实现相同。然而,这仅在您传递给fairseq.encode
的字符串以空格开头时才有效。 - generate() 应该用于像总结这样的有条件生成任务,可以查看文档字符串中的示例。
- 加载 facebook/bart-large-cnn 权重的模型将没有
mask_token_id
,也无法执行掩码填充任务。
掩码填充
facebook/bart-base
和 facebook/bart-large
检查点可用于填充多个标记掩码。
from transformers import BartForConditionalGeneration, BartTokenizer
model = BartForConditionalGeneration.from_pretrained("facebook/bart-large", forced_bos_token_id=0)
tok = BartTokenizer.from_pretrained("facebook/bart-large")
example_english_phrase = "UN Chief Says There Is No <mask> in Syria"
batch = tok(example_english_phrase, return_tensors="pt")
generated_ids = model.generate(batch["input_ids"])
assert tok.batch_decode(generated_ids, skip_special_tokens=True) == [
"UN Chief Says There Is No Plan to Stop Chemical Weapons in Syria"
]
资源
一个官方的 Hugging Face 和社区(由