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

BERT large model (cased)

基于英语语言的预训练模型,采用掩码语言模型(MLM)目标进行训练。该模型在以下论文中被提出:https://arxiv.org/abs/1810.04805,并首次在以下代码库中发布:https://github.com/google-research/bert。此模型区分大小写:它会对“english”和“English”加以区分。

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

模型说明

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

  • 掩码语言模型(MLM):给定一个句子,模型会随机掩码输入中 15% 的词,然后将整个掩码后的句子输入模型,模型需要预测被掩码的词。这与传统的循环神经网络(RNNs)通常逐个处理词的方式不同,也与像 GPT 这样的自回归模型在内部对未来 token 进行掩码的方式不同。这种方式使模型能够学习句子的双向表示。
  • 下一句预测(NSP):模型在预训练过程中将两个掩码后的句子拼接作为输入。有时这两个句子在原始文本中是相邻的,有时则不是。然后模型需要预测这两个句子是否前后相邻。

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

该模型具有以下配置:

  • 24 层
  • 1024 隐藏维度
  • 16 个注意力头
  • 3.36 亿参数。

预期用途与限制

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

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

使用方法

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

>>> from transformers import pipeline
>>> unmasker = pipeline('fill-mask', model='bert-large-cased')
>>> unmasker("Hello I'm a [MASK] model.")
[
   {
      "sequence":"[CLS] Hello I'm a male model. [SEP]",
      "score":0.22748498618602753,
      "token":2581,
      "token_str":"male"
   },
   {
      "sequence":"[CLS] Hello I'm a fashion model. [SEP]",
      "score":0.09146175533533096,
      "token":4633,
      "token_str":"fashion"
   },
   {
      "sequence":"[CLS] Hello I'm a new model. [SEP]",
      "score":0.05823173746466637,
      "token":1207,
      "token_str":"new"
   },
   {
      "sequence":"[CLS] Hello I'm a super model. [SEP]",
      "score":0.04488750174641609,
      "token":7688,
      "token_str":"super"
   },
   {
      "sequence":"[CLS] Hello I'm a famous model. [SEP]",
      "score":0.03271442651748657,
      "token":2505,
      "token_str":"famous"
   }
]

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

from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-large-cased')
model = BertModel.from_pretrained("bert-large-cased")
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-large-cased')
model = TFBertModel.from_pretrained("bert-large-cased")
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-large-cased')
>>> unmasker("The man worked as a [MASK].")
[
   {
      "sequence":"[CLS] The man worked as a doctor. [SEP]",
      "score":0.0645911768078804,
      "token":3995,
      "token_str":"doctor"
   },
   {
      "sequence":"[CLS] The man worked as a cop. [SEP]",
      "score":0.057450827211141586,
      "token":9947,
      "token_str":"cop"
   },
   {
      "sequence":"[CLS] The man worked as a mechanic. [SEP]",
      "score":0.04392256215214729,
      "token":19459,
      "token_str":"mechanic"
   },
   {
      "sequence":"[CLS] The man worked as a waiter. [SEP]",
      "score":0.03755280375480652,
      "token":17989,
      "token_str":"waiter"
   },
   {
      "sequence":"[CLS] The man worked as a teacher. [SEP]",
      "score":0.03458863124251366,
      "token":3218,
      "token_str":"teacher"
   }
]

>>> unmasker("The woman worked as a [MASK].")
[
   {
      "sequence":"[CLS] The woman worked as a nurse. [SEP]",
      "score":0.2572779953479767,
      "token":7439,
      "token_str":"nurse"
   },
   {
      "sequence":"[CLS] The woman worked as a waitress. [SEP]",
      "score":0.16706500947475433,
      "token":15098,
      "token_str":"waitress"
   },
   {
      "sequence":"[CLS] The woman worked as a teacher. [SEP]",
      "score":0.04587847739458084,
      "token":3218,
      "token_str":"teacher"
   },
   {
      "sequence":"[CLS] The woman worked as a secretary. [SEP]",
      "score":0.03577028587460518,
      "token":4848,
      "token_str":"secretary"
   },
   {
      "sequence":"[CLS] The woman worked as a maid. [SEP]",
      "score":0.03298963978886604,
      "token":13487,
      "token_str":"maid"
   }
]

这种偏差也会影响该模型的所有微调版本。

训练数据

BERT 模型在 BookCorpus(https://yknzhu.wixsite.com/mbweb)上进行了预训练,该数据集包含 11,038 本未出版书籍,以及英文维基百科(https://en.wikipedia.org/wiki/English_Wikipedia)(不包括列表、表格和标题)。

训练过程

预处理

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

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

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

每个句子的掩码(masking)过程细节如下:

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

预训练

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

评估结果

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

模型SQUAD 1.1 F1/EMMulti NLI 准确率
BERT-Large, Cased (Original)91.5/84.886.09

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}
}