HuggingFace镜像/bert-base-uncased
模型介绍文件和版本分析
下载使用量0

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

基于英语语言的预训练模型,采用掩码语言模型(MLM)目标。该模型在此论文中首次提出,并在此仓库中首次发布。此模型为不区分大小写版本:即“english”和“English”对模型而言没有区别。

免责声明:发布 BERT 的团队未为此模型编写模型卡片,因此本模型卡片由 Hugging Face 团队编写。

模型描述

BERT 是一种基于 Transformer 的模型,在大规模英语语料库上以自监督方式进行预训练。这意味着它仅在原始文本上进行预训练,无需人工对文本进行任何形式的标注(这也是它能够利用大量公开可用数据的原因),通过自动流程从这些文本中生成输入和标签。更准确地说,它通过两个目标进行预训练:

  • 掩码语言模型(MLM):对于一个句子,模型随机掩盖输入中 15% 的词语,然后将整个被掩盖的句子输入模型,模型需要预测被掩盖的词语。这与传统的循环神经网络(RNNs)通常逐个处理词语,或者与像 GPT 这样的自回归模型在内部掩盖未来标记的方式不同。它允许模型学习句子的双向表示。
  • 下一句预测(NSP):模型在预训练期间将两个经过掩码处理的句子拼接作为输入。有时这两个句子在原始文本中是相邻的,有时则不是。然后模型需要预测这两个句子是否前后连贯。

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

模型变体

BERT 最初发布了基础版(base)和大型版(large)两种变体,分别适用于区分大小写和不区分大小写的输入文本。不区分大小写的模型还会去除重音标记。
随后不久发布了中文版本以及多语言的不区分大小写和区分大小写版本。
在后续工作中,采用整词掩码(whole word masking)的改进预处理方法取代了子词掩码(subpiece masking),并发布了两个相关模型。
之后又发布了其他 24 个更小的模型。

详细的发布历史可在 GitHub 上的 google-research/bert 自述文件 中找到。

模型参数数量语言
bert-base-uncased110M英语
bert-large-uncased340M英语
bert-base-cased110M英语
bert-large-cased340M英语
bert-base-chinese110M中文
bert-base-multilingual-cased110M多语言
bert-large-uncased-whole-word-masking340M英语
bert-large-cased-whole-word-masking340M英语

预期用途和限制

您可以将原始模型用于掩码语言建模或下一句预测,但它主要旨在针对下游任务进行微调。请查看模型中心,寻找您感兴趣任务的微调版本。

请注意,此模型主要用于在需要利用整个句子(可能包含掩码)来做决策的任务上进行微调,例如序列分类、 token 分类或问答任务。对于文本生成等任务,您应该考虑 GPT2 之类的模型。

使用方法

您可以直接通过管道将此模型用于掩码语言建模:

>>> from mindnlp.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'}]

以下是如何在 MindSpore 中使用该模型获取给定文本特征的方法:

from mindnlp.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='ms')
output = model(**encoded_input)

或

from mindnlp.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='ms')
output = model(encoded_input)

局限性与偏见

即便用于训练本模型的训练数据可被描述为相当中立,该模型仍可能产生有偏见的预测:

>>> from mindnlp.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 本未出版书籍和 English Wikipedia(不包括列表、表格和标题)。

训练过程

预处理

文本会被转换为小写,并使用 WordPiece 进行分词,词汇表大小为 30,000。然后,模型的输入形式如下:

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

以 0.5 的概率,句子 A 和句子 B 对应原始语料库中的两个连续句子,在其他情况下,则是语料库中的另一个随机句子。请注意,此处所指的“句子”是一段连续的文本,通常比单个句子更长。唯一的限制是这两个“句子”组合后的总长度少于 512 个标记。

每个句子的掩码处理细节如下:

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

预训练

该模型在 Pod 配置的 4 个云 TPU(共 16 个 TPU 芯片)上进行了一百万步的训练,批处理大小为 256。在 90% 的训练步骤中,序列长度限制为 128 个标记,在剩余 10% 的步骤中则为 512 个标记。使用的优化器是 Adam,学习率为 1e-4,$\beta_{1} = 0.9$,$\beta_{2} = 0.999$,权重衰减为 0.01,学习率预热 10,000 步,之后学习率线性衰减。

评估结果

在下游任务上进行微调后,该模型取得了以下结果:

GLUE 测试结果:

任务MNLI-(m/mm)QQPQNLISST-2CoLASTS-BMRPCRTE平均值
84.6/83.471.290.593.552.185.888.966.479.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}
}