英文

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

BERT是一个在英语语言上使用掩码语言建模(MLM)目标进行预训练的模型。它是在 this paper 中引入并于 this repository 首次发布的。这个模型是区分大小写的:它区分英语(english)和English。

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

模型描述

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

  • 掩码语言建模(MLM):将一个句子,模型随机屏蔽15%的输入词,并通过整个屏蔽后的句子运行模型,并要预测屏蔽的词。这与通常一个接一个地看到单词的传统递归神经网络(RNNs)或者像GPT这样在内部屏蔽未来词语的自回归模型不同。它允许模型学习句子的双向表示。
  • 下一句预测(NSP):模型在预训练过程中连接两个屏蔽后的句子作为输入。有时它们对应于原始文本中相邻的句子,有时不是。然后,模型必须预测这两个句子是否相邻。

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

意图使用和限制

您可以使用原始模型进行掩码语言建模或下一句预测,但它主要用于在下游任务上进行微调。参见 model hub 以寻找您感兴趣的任务的微调版本。

请注意,该模型主要旨在进行使用整个句子(可能被屏蔽)作出决策的任务的微调,例如序列分类、标记分类或问题回答。对于文本生成等任务,您应该查看像GPT2这样的模型。

如何使用

您可以直接使用该模型进行掩码语言建模的流水线:

>>> from transformers import pipeline
>>> unmasker = pipeline('fill-mask', model='bert-base-cased')
>>> unmasker("Hello I'm a [MASK] model.")

[{'sequence': "[CLS] Hello I'm a fashion model. [SEP]",
  'score': 0.09019174426794052,
  'token': 4633,
  'token_str': 'fashion'},
 {'sequence': "[CLS] Hello I'm a new model. [SEP]",
  'score': 0.06349995732307434,
  'token': 1207,
  'token_str': 'new'},
 {'sequence': "[CLS] Hello I'm a male model. [SEP]",
  'score': 0.06228214129805565,
  'token': 2581,
  'token_str': 'male'},
 {'sequence': "[CLS] Hello I'm a professional model. [SEP]",
  'score': 0.0441727414727211,
  'token': 1848,
  'token_str': 'professional'},
 {'sequence': "[CLS] Hello I'm a super model. [SEP]",
  'score': 0.03326151892542839,
  'token': 7688,
  'token_str': 'super'}]

这里是如何使用此模型在PyTorch中获取给定文本的特征:

from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
model = BertModel.from_pretrained("bert-base-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-base-cased')
model = TFBertModel.from_pretrained("bert-base-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-base-cased')
>>> unmasker("The man worked as a [MASK].")

[{'sequence': '[CLS] The man worked as a lawyer. [SEP]',
  'score': 0.04804691672325134,
  'token': 4545,
  'token_str': 'lawyer'},
 {'sequence': '[CLS] The man worked as a waiter. [SEP]',
  'score': 0.037494491785764694,
  'token': 17989,
  'token_str': 'waiter'},
 {'sequence': '[CLS] The man worked as a cop. [SEP]',
  'score': 0.035512614995241165,
  'token': 9947,
  'token_str': 'cop'},
 {'sequence': '[CLS] The man worked as a detective. [SEP]',
  'score': 0.031271643936634064,
  'token': 9140,
  'token_str': 'detective'},
 {'sequence': '[CLS] The man worked as a doctor. [SEP]',
  'score': 0.027423162013292313,
  'token': 3995,
  'token_str': 'doctor'}]

>>> unmasker("The woman worked as a [MASK].")

[{'sequence': '[CLS] The woman worked as a nurse. [SEP]',
  'score': 0.16927455365657806,
  'token': 7439,
  'token_str': 'nurse'},
 {'sequence': '[CLS] The woman worked as a waitress. [SEP]',
  'score': 0.1501094549894333,
  'token': 15098,
  'token_str': 'waitress'},
 {'sequence': '[CLS] The woman worked as a maid. [SEP]',
  'score': 0.05600163713097572,
  'token': 13487,
  'token_str': 'maid'},
 {'sequence': '[CLS] The woman worked as a housekeeper. [SEP]',
  'score': 0.04838843643665314,
  'token': 26458,
  'token_str': 'housekeeper'},
 {'sequence': '[CLS] The woman worked as a cook. [SEP]',
  'score': 0.029980547726154327,
  'token': 9834,
  'token_str': 'cook'}]

这种偏见也会影响此模型的所有经过微调的版本。

训练数据

BERT模型是在 BookCorpus 上进行预训练的,该数据集包含11038本未发表的图书和 English Wikipedia 的文本(不包括列表、表格和标题)。

训练过程

预处理

使用WordPiece对文本进行标记,并使用30000个词汇量。然后,模型的输入形式为:

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

有50%的概率,句子A和句子B对应于原始语料库中的两个连续句子;在其他情况下,它是语料库中的另一个随机句子。请注意,在这里所说的句子是指通常比单个句子更长的连续文本片段。唯一的限制是这两个“句子”的结果的长度不超过512个标记。

每个句子的屏蔽过程的详细信息如下:

  • 15%的标记被屏蔽。
  • 在80%的情况下,屏蔽的标记被替换为[MASK]。
  • 在10%的情况下,屏蔽的标记被替换为不同于所替换的标记的随机标记。
  • 在剩余的10%的情况下,屏蔽的标记保持不变。

预训练

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

评估结果

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

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