英文

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

预训练模型,使用掩码语言建模(MLM)目标,在覆盖最大维基百科的102种语言上进行训练。它于 this paper 年提出,并于 this repository 年首次发布。该模型不区分英文大小写。

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

模型描述

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

  • 掩码语言建模(MLM):将一个句子,模型会随机屏蔽输入中15%的单词,然后通过整个屏蔽句子运行模型,并且需要预测出屏蔽的单词。这与传统的递归神经网络(RNN)通常一个接一个地看到单词,或者内部屏蔽未来令牌的自回归模型(如GPT)不同。它使得模型能够学习到句子的双向表示。
  • 下一句预测(NSP):模型在预训练期间将两个屏蔽的句子连接在一起作为输入。它们有时对应于原始文本中相邻的两个句子,有时则不是。然后模型需要预测这两个句子是否紧随在一起。

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

预期用途和限制

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

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

如何使用

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

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

[{'sequence': "[CLS] hello i'm a top model. [SEP]",
  'score': 0.1507750153541565,
  'token': 11397,
  'token_str': 'top'},
 {'sequence': "[CLS] hello i'm a fashion model. [SEP]",
  'score': 0.13075384497642517,
  'token': 23589,
  'token_str': 'fashion'},
 {'sequence': "[CLS] hello i'm a good model. [SEP]",
  'score': 0.036272723227739334,
  'token': 12050,
  'token_str': 'good'},
 {'sequence': "[CLS] hello i'm a new model. [SEP]",
  'score': 0.035954564809799194,
  'token': 10246,
  'token_str': 'new'},
 {'sequence': "[CLS] hello i'm a great model. [SEP]",
  'score': 0.028643041849136353,
  'token': 11838,
  'token_str': 'great'}]

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

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

[{'sequence': '[CLS] the man worked as a teacher. [SEP]',
  'score': 0.07943806052207947,
  'token': 21733,
  'token_str': 'teacher'},
 {'sequence': '[CLS] the man worked as a lawyer. [SEP]',
  'score': 0.0629938617348671,
  'token': 34249,
  'token_str': 'lawyer'},
 {'sequence': '[CLS] the man worked as a farmer. [SEP]',
  'score': 0.03367974981665611,
  'token': 36799,
  'token_str': 'farmer'},
 {'sequence': '[CLS] the man worked as a journalist. [SEP]',
  'score': 0.03172805905342102,
  'token': 19477,
  'token_str': 'journalist'},
 {'sequence': '[CLS] the man worked as a carpenter. [SEP]',
  'score': 0.031021825969219208,
  'token': 33241,
  'token_str': 'carpenter'}]

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

[{'sequence': '[CLS] the black woman worked as a nurse. [SEP]',
  'score': 0.07045423984527588,
  'token': 52428,
  'token_str': 'nurse'},
 {'sequence': '[CLS] the black woman worked as a teacher. [SEP]',
  'score': 0.05178029090166092,
  'token': 21733,
  'token_str': 'teacher'},
 {'sequence': '[CLS] the black woman worked as a lawyer. [SEP]',
  'score': 0.032601192593574524,
  'token': 34249,
  'token_str': 'lawyer'},
 {'sequence': '[CLS] the black woman worked as a slave. [SEP]',
  'score': 0.030507225543260574,
  'token': 31173,
  'token_str': 'slave'},
 {'sequence': '[CLS] the black woman worked as a woman. [SEP]',
  'score': 0.027691684663295746,
  'token': 14050,
  'token_str': 'woman'}]

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

训练数据

BERT模型在最大的102种维基百科上进行了预训练。您可以在 here 上找到完整的列表。

训练过程

预处理

文本经过小写处理和使用WordPiece进行标记化,共享词汇表大小为110,000。维基百科规模较大的语言被欠采样,资源较低的语言被过采样。对于中文、日语假名和韩语汉字这样没有空格的语言,在每个字符周围添加一个CJK Unicode块。

然后模型的输入形式如下所示:

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

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

每个句子的屏蔽过程的细节如下:

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

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