模型:
optimum/bert-base-uncased-for-masked-lm
此模型是通过以下命令导出为带有掩码语言模型(Masked Language Modeling,MLM)任务的模型:
python3 -m optimum.exporters.onnx --model bert-base-cased --for-ort --task masked-lm models/
如果您想将 bert-base-uncased 用于其他任务,请使用相应任务导出 ONNX 模型。
使用掩码语言建模(MLM)目标在英语语言上进行预训练的模型。它是在 this paper 中引入并首次发布于 this repository 。此模型未区分大小写:对于英语和 English 没有区别。
免责声明:发布 BERT 的团队没有为此模型编写模型卡片,因此这个模型卡片是由 Hugging Face 团队编写的。
BERT 是一个以无人工标注的自我监督模式在大规模英语数据上进行预训练的 Transformer 模型。这意味着它仅在原始文本上进行预训练,没有人工以任何方式对其进行标注(这就是为什么它可以使用大量公开可用的数据),利用自动化流程从这些文本中生成输入和标签。具体而言,它采用了以下两个目标进行预训练:
通过这种方式,模型学习了英语语言的内在表示,然后可以用于提取在下游任务中有用的特征。例如,如果有一个标记的句子数据集,可以使用 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个标记。
每个句子的掩码过程的详细内容如下:
模型在 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 |
@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} }