英文

BERT基础模型(小写)

基于英语语言的预训练模型,使用掩码语言建模(MLM)目标。它在 这篇论文 中提出,并首次发布在 这个代码库 中。此模型是无大小写区分的:它不区分英语和English。

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

模型描述

BERT是一个在大型英语数据上以自监督方式进行预训练的transformers模型。这意味着它只是在原始文本上进行预训练,没有任何人以任何方式对其进行标记(这就是为什么它可以使用大量公开可用的数据),通过自动化的流程从这些文本中生成输入和标签。更准确地说,它通过两个目标预训练:

  • 掩码语言建模(MLM):给定一个句子,模型会随机掩码输入中15%的单词,然后将整个掩码句子输入模型,并预测掩码的单词。这与传统的循环神经网络(RNNs)通常一个接着一个地看到单词,或者与内部掩码未来标记的自回归模型(如GPT)不同。这使得模型可以学习到句子的双向表示。
  • 下一句预测(NSP):模型在预训练期间连接两个掩码句子作为输入。有时它们对应于原始文本中相邻的句子,有时不是。然后,模型需要预测这两个句子是否相邻。

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

模型变体

BERT最初发布了大小写和小写的变体,还发布了用于中文和多语言的小写和大小写版本。之后,使用全词掩码的修改预处理工作取代了次词掩码,并发布了两个模型。后来又发布了其他24个较小的模型。

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

Model #params Language
bert-base-uncased 110M English
bert-large-uncased 340M English
bert-base-cased 110M English
bert-large-cased 340M English
bert-base-chinese 110M Chinese
bert-base-multilingual-cased 110M Multiple
bert-large-uncased-whole-word-masking 340M English
bert-large-cased-whole-word-masking 340M English

适用于的用途和限制

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

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

如何使用

您可以使用该模型直接进行掩码语言建模的管道:

>>> 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 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,β 1 = 0.9,β 2 = 0.999,权重衰减为0.01,学习率预热10,000步,然后线性衰减学习率。

评估结果

在微调下游任务时,该模型实现了以下结果:

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