说明文档
BERT 基础模型(不区分大小写)
基于英语语言使用掩码语言建模(MLM)目标预训练的模型。它在这篇论文中首次提出,并在这个仓库中首次发布。此模型不区分大小写:它不会区分 english 和 English。
免责声明:发布 BERT 的团队没有为该模型编写模型卡片,因此该模型卡片由 Hugging Face 团队编写。
模型描述
BERT 是一个以自监督方式在海量英语语料库上预训练的 Transformer 模型。这意味着它仅在原始文本上进行预训练,无需人工以任何方式进行标注(这也是为什么它可以使用大量公开可用的数据),并通过自动过程从这些文本中生成输入和标签。更具体地说,它使用两个目标进行预训练:
- 掩码语言建模(MLM):取一个句子,模型随机掩码输入中 15% 的单词,然后将整个掩码后的句子传入模型,并让模型预测被掩码的单词。这与传统的循环神经网络(RNN)不同,后者通常逐个查看单词;也与像 GPT 这样的自回归模型不同,后者在内部掩码未来的 token。这允许模型学习句子的双向表示。
- 下一句预测(NSP):在预训练期间,模型将两个掩码句子拼接作为输入。有时它们对应于原始文本中相邻的句子,有时则不是。然后模型需要预测这两个句子是否是相邻的。
通过这种方式,模型学习了英语语言的内部表示,随后可用于提取对下游任务有用的特征:例如,如果你有一个带标签的句子数据集,你可以使用 BERT 模型生成的特征作为输入来训练一个标准分类器。
模型变体
BERT 最初发布了基础版和大型版两种变体,分别支持区分大小写和不区分大小写的输入文本。不区分大小写的模型还会去除重音符号。 中文和多语言的不区分大小写及区分大小写版本随后不久发布。 在后续工作中,使用全词掩码取代了子词掩码的预处理方式,并发布了两个模型。 此后又发布了其他 24 个更小的模型。
详细的发布历史可以在 GitHub 上的 google-research/bert readme 中找到。
| 模型 | 参数量 | 语言 |
|---|---|---|
bert-base-uncased |
110M | 英语 |
bert-large-uncased |
340M | 英语 |
bert-base-cased |
110M | 英语 |
bert-large-cased |
340M | 英语 |
bert-base-chinese |
110M | 中文 |
bert-base-multilingual-cased |
110M | 多语言 |
bert-large-uncased-whole-word-masking |
340M | 英语 |
bert-large-cased-whole-word-masking |
340M | 英语 |
预期用途与限制
你可以直接使用原始模型进行掩码语言建模或下一句预测,但它主要用于在下游任务上进行微调。请查看模型中心以寻找你感兴趣的任务的微调版本。
请注意,此模型主要旨在对使用整个句子(可能被掩码)进行决策的任务进行微调,例如序列分类、token 分类或问答。对于文本生成等任务,你应该查看像 GPT2 这样的模型。
如何使用
你可以直接使用 pipeline 进行掩码语言建模:
>>> from transformers import pipeline
>>> unmasker = pipeline('fill-mask', model='bert-base-uncased')
>>> unmasker("Hello I'm a [MASK] model.")
[{'sequence': "[CLS] hello i'm a fashion model. [SEP]",
'score': 0.1073106899857521,
'token': 4827,
'token_str': 'fashion'},
{'sequence': "[CLS] hello i'm a role model. [SEP]",
'score': 0.08774490654468536,
'token': 2535,
'token_str': 'role'},
{'sequence': "[CLS] hello i'm a new model. [SEP]",
'score': 0.05338378623127937,
'token': 2047,
'token_str': 'new'},
{'sequence': "[CLS] hello i'm a super model. [SEP]",
'score': 0.04667217284440994,
'token': 3565,
'token_str': 'super'},
{'sequence': "[CLS] hello i'm a fine model. [SEP]",
'score': 0.027095865458250046,
'token': 2986,
'token_str': 'fine'}]
以下是如何在 PyTorch 中使用此模型获取给定文本的特征:
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained("bert-base-uncased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='pt')
output = model(**encoded_input)
在 TensorFlow 中:
from transformers import BertTokenizer, TFBertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = TFBertModel.from_pretrained("bert-base-uncased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='tf')
output = model(encoded_input)
限制与偏见
即使用于此模型的训练数据可以被描述为相当中性,此模型仍可能产生有偏见的预测:
>>> from transformers import pipeline
>>> unmasker = pipeline('fill-mask', model='bert-base-uncased')
>>> unmasker("The man worked as a [MASK].")
[{'sequence': '[CLS] the man worked as a carpenter. [SEP]',
'score': 0.09747550636529922,
'token': 10533,
'token_str': 'carpenter'},
{'sequence': '[CLS] the man worked as a waiter. [SEP]',
'score': 0.0523831807076931,
'token': 15610,
'token_str': 'waiter'},
{'sequence': '[CLS] the man worked as a barber. [SEP]',
'score': 0.04962705448269844,
'token': 13362,
'token_str': 'barber'},
{'sequence': '[CLS] the man worked as a mechanic. [SEP]',
'score': 0.03788609802722931,
'token': 15893,
'token_str': 'mechanic'},
{'sequence': '[CLS] the man worked as a salesman. [SEP]',
'score': 0.037680890411138535,
'token': 18968,
'token_str': 'salesman'}]
>>> unmasker("The woman worked as a [MASK].")
[{'sequence': '[CLS] the woman worked as a nurse. [SEP]',
'score': 0.21981462836265564,
'token': 6821,
'token_str': 'nurse'},
{'sequence': '[CLS] the woman worked as a waitress. [SEP]',
'score': 0.1597415804862976,
'token': 13877,
'token_str': 'waitress'},
{'sequence': '[CLS] the woman worked as a maid. [SEP]',
'score': 0.1154729500412941,
'token': 10850,
'token_str': 'maid'},
{'sequence': '[CLS] the woman worked as a prostitute. [SEP]',
'score': 0.037968918681144714,
'token': 19215,
'token_str': 'prostitute'},
{'sequence': '[CLS] the woman worked as a cook. [SEP]',
'score': 0.03042375110089779,
'token': 5660,
'token_str': 'cook'}]
这种偏见也会影响此模型的所有微调版本。
训练数据
BERT 模型在 BookCorpus(一个包含 11,038 本未出版书籍的数据集)和英文维基百科(不包括列表、表格和标题)上进行了预训练。
训练过程
预处理
文本被转换为小写,并使用 WordPiece 进行分词,词汇表大小为 30,000。模型的输入形式如下:
[CLS] 句子 A [SEP] 句子 B [SEP]
以 0.5 的概率,句子 A 和句子 B 对应于原始语料库中两个连续的句子,在其他情况下,它是语料库中的另一个随机句子。请注意,这里所谓的句子实际上是连续的文本片段,通常比单个句子更长。唯一的约束是两个"句子"的组合长度少于 512 个 token。
每个句子的掩码过程详情如下:
- 15% 的 token 被掩码。
- 在 80% 的情况下,被掩码的 token 被
[MASK]替换。 - 在 10% 的情况下,被掩码的 token 被一个随机 token(与被替换的 token 不同)替换。
- 在剩余的 10% 情况下,被掩码的 token 保持不变。
预训练
该模型在 Pod 配置的 4 个云 TPU(总共 16 个 TPU 芯片)上训练了 100 万步,批量大小为 256。序列长度在 90% 的步骤中限制为 128 个 token,在剩余的 10% 中限制为 512 个 token。使用的优化器是 Adam,学习率为 1e-4,(\beta_{1} = 0.9) 和 (\beta_{2} = 0.999),权重衰减为 0.01,学习率预热 10,000 步,之后学习率线性衰减。
评估结果
在下游任务上微调时,该模型取得了以下结果:
GLUE 测试结果:
| 任务 | MNLI-(m/mm) | QQP | QNLI | SST-2 | CoLA | STS-B | MRPC | RTE | 平均 |
|---|---|---|---|---|---|---|---|---|---|
| 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}
}
<a href="https://huggingface.co/exbert/?model=bert-base-uncased"> <img width="300px" src="https://cdn-media.huggingface.co/exbert/button.png"> </a>
Narya-ai/lr-bert-base-uncased
作者 Narya-ai
创建时间: 2023-10-13 14:35:13+00:00
更新时间: 2023-10-13 18:24:09+00:00
在 Hugging Face 上查看