英文

此模型是通过以下命令导出为带有掩码语言模型(Masked Language Modeling,MLM)任务的模型:

python3 -m optimum.exporters.onnx --model bert-base-cased --for-ort --task masked-lm models/

如果您想将 bert-base-uncased 用于其他任务,请使用相应任务导出 ONNX 模型。

BERT基础模型(非区分大小写)

使用掩码语言建模(MLM)目标在英语语言上进行预训练的模型。它是在 this paper 中引入并首次发布于 this repository 。此模型未区分大小写:对于英语和 English 没有区别。

免责声明:发布 BERT 的团队没有为此模型编写模型卡片,因此这个模型卡片是由 Hugging Face 团队编写的。

模型描述

BERT 是一个以无人工标注的自我监督模式在大规模英语数据上进行预训练的 Transformer 模型。这意味着它仅在原始文本上进行预训练,没有人工以任何方式对其进行标注(这就是为什么它可以使用大量公开可用的数据),利用自动化流程从这些文本中生成输入和标签。具体而言,它采用了以下两个目标进行预训练:

  • 掩码语言建模(MLM):输入一个句子,模型会随机掩码输入中的15%的单词,然后将整个掩码句子输入模型并预测被掩码的单词。这与传统的递归神经网络(RNN)通常逐个单词处理或内部掩码未来标记的自回归模型(如GPT)不同。它使模型能够学习句子的双向表示。
  • 下一句预测(NSP):模型在预训练期间将两个掩码句子串联作为输入。它们有时对应于原始文本中相邻的句子,有时不对应。然后,模型需要预测这两个句子是否相邻。

通过这种方式,模型学习了英语语言的内在表示,然后可以用于提取在下游任务中有用的特征。例如,如果有一个标记的句子数据集,可以使用 BERT 模型生成的特征作为输入来训练标准分类器。

模型变体

BERT 最初有基础和大型变体,分为区分大小写和非区分大小写的输入文本模型。之后,紧随其后的是中文和多语言的非区分大小写和区分大小写版本。在后续的工作中,通过全词掩码替换了子词掩码进行了修改,发布了两个模型,并随后发布了其他24个较小的模型。

详细的发布历史可以在 google-research/bert readme 的 GitHub 页面上找到。

Model #params Language
1239321 110M English
12310321 340M English
12311321 110M English
12312321 340M English
12313321 110M Chinese
12314321 110M Multiple
12315321 340M English
12316321 340M English

预期用途和限制

可以直接使用原始模型进行掩码语言建模或下一句预测,但主要用于在下游任务上进行微调。可以查看 model hub 来寻找您感兴趣的任务的微调版本。

请注意,该模型主要用于在使用整个句子(可能被掩码)进行决策的任务上进行微调,例如序列分类、标记分类或问答。对于文本生成等任务,您应该考虑使用像 GPT2 这样的模型。

使用方法

可以使用 Optimum library 中的掩码语言建模管道直接使用此模型:

>>> from optimum.pipelines import pipeline
>>> unmasker = pipeline('fill-mask', model='bert-base-uncased', accelerator="ort")
>>> unmasker("The capital of France is [MASK].")

[{'score': 0.4167858958244324,
  'token': 3000,
  'token_str': 'paris',
  'sequence': 'the capital of france is paris.'},
 {'score': 0.07141812890768051,
  'token': 22479,
  'token_str': 'lille',
  'sequence': 'the capital of france is lille.'},
 {'score': 0.06339272111654282,
  'token': 10241,
  'token_str': 'lyon',
  'sequence': 'the capital of france is lyon.'},
 {'score': 0.04444783180952072,
  'token': 16766,
  'token_str': 'marseille',
  'sequence': 'the capital of france is marseille.'},
 {'score': 0.030297117307782173,
  'token': 7562,
  'token_str': 'tours',
  'sequence': 'the capital of france is tours.'}
]

以下是如何使用此模型使用 ONNX Runtime 后端填充掩码令牌:

from transformers import AutoTokenizer
from optimum.onnxruntime import ORTModelForMaskedLM
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')

model = ORTModelForMaskedLM.from_pretrained("bert-base-uncased", from_transformers=True)
text = "The capital of France is [MASK]."
inputs = tokenizer(text, return_tensors="pt")
logits = model(**inputs)

mask_token_index = (inputs.input_ids == tokenizer.mask_token_id)[0].nonzero(as_tuple=True)[0]
predicted_token_id = logits[0, mask_token_index].argmax(axis=-1)

tokenizer.decode(predicted_token_id)

限制和偏差

即使用于此模型的训练数据可能被视为相当中立,但该模型可能具有偏见:

>>> from optimum.pipelines import pipeline
>>> unmasker = pipeline('fill-mask', model='bert-base-uncased', accelerator="ort")
>>> unmasker("The man worked as a [MASK].")

[{'score': 0.09747613966464996,
  'token': 10533,
  'token_str': 'carpenter',
  'sequence': 'the man worked as a carpenter.'},
 {'score': 0.0523831732571125,
  'token': 15610,
  'token_str': 'waiter',
  'sequence': 'the man worked as a waiter.'},
 {'score': 0.04962756112217903,
  'token': 13362,
  'token_str': 'barber',
  'sequence': 'the man worked as a barber.'},
 {'score': 0.03788623586297035,
  'token': 15893,
  'token_str': 'mechanic',
  'sequence': 'the man worked as a mechanic.'},
 {'score': 0.03768099099397659,
  'token': 18968,
  'token_str': 'salesman',
  'sequence': 'the man worked as a salesman.'}]

>>> unmasker("The woman worked as a [MASK].")

[{'score': 0.21981455385684967,
  'token': 6821,
  'token_str': 'nurse',
  'sequence': 'the woman worked as a nurse.'},
 {'score': 0.15974153578281403,
  'token': 13877,
  'token_str': 'waitress',
  'sequence': 'the woman worked as a waitress.'},
 {'score': 0.11547334492206573,
  'token': 10850,
  'token_str': 'maid',
  'sequence': 'the woman worked as a maid.'},
 {'score': 0.0379691943526268,
  'token': 19215,
  'token_str': 'prostitute',
  'sequence': 'the woman worked as a prostitute.'},
 {'score': 0.030423566699028015,
  'token': 5660,
  'token_str': 'cook',
  'sequence': 'the woman worked as a cook.'}]

这种偏见也会影响此模型的所有经过微调的版本。

训练数据

BERT 模型在 BookCorpus 上进行了预训练,该数据集包含 11,038 本未出版的书籍以及 English Wikipedia (不包括列表、表格和标题)。

训练过程

预处理

文本被转换为小写,并使用 WordPiece 进行标记化,词汇表大小为 30,000。模型的输入格式如下:

[CLS] Sentence A [SEP] Sentence B [SEP]

有一半的概率,句子A和句子B对应于原始语料库中的两个连续句子,其他情况下是语料库中的另一个随机句子。注意,这里所说的句子是通常长度超过一个句子的一段连续文本。唯一的约束是两个"句子"的组合长度小于512个标记。

每个句子的掩码过程的详细内容如下:

  • 15%的标记被掩码。
  • 在80%的情况下,掩码标记被替换为 [MASK]。
  • 在10%的情况下,掩码标记被替换为与其不同的随机标记。
  • 在剩下的10%情况下,掩码标记保持不变。

预训练

模型在 4 个 Pod 配置的云 TPU 上进行训练(总共 16 个 TPU 芯片),训练了一百万步,批量大小为 256。90% 的步骤将序列长度限制为 128 标记,余下的 10% 为 512 标记。使用 Adam 优化器,学习率为 1e-4, β 1 = 0.9 , β 2 = 0.999 ,权重衰减为 0.01,在前10000步进行学习率预热,之后学习率呈线性衰减。

评估结果

在下游任务上进行微调时,此模型实现了以下结果:

Glue 测试结果:

Task MNLI-(m/mm) QQP QNLI SST-2 CoLA STS-B MRPC RTE Average
84.6/83.4 71.2 90.5 93.5 52.1 85.8 88.9 66.4 79.6

BibTeX条目和引用信息

@article{DBLP:journals/corr/abs-1810-04805,
  author    = {Jacob Devlin and
               Ming{-}Wei Chang and
               Kenton Lee and
               Kristina Toutanova},
  title     = {{BERT:} Pre-training of Deep Bidirectional Transformers for Language
               Understanding},
  journal   = {CoRR},
  volume    = {abs/1810.04805},
  year      = {2018},
  url       = {http://arxiv.org/abs/1810.04805},
  archivePrefix = {arXiv},
  eprint    = {1810.04805},
  timestamp = {Tue, 30 Oct 2018 20:39:56 +0100},
  biburl    = {https://dblp.org/rec/journals/corr/abs-1810-04805.bib},
  bibsource = {dblp computer science bibliography, https://dblp.org}
}