模型库 / google-bert/bert-base-cased

bert-base-cased

google-bert fill-mask transformers en
google-bert/bert-base-cased
4,296,116
下载量
357
收藏数
10
浏览量
apache-2.0
许可

简介

基于掩码语言建模(MLM)目标在英语上预训练的模型。该模型首次发表于此论文,并在此仓库中首次发布。本模型区分大小写:例如,它能够区分"english"和"English"。

模型卡片

许可协议 apache-2.0
语言
en
数据集
bookcorpus wikipedia
exbert

模型配置

模型类型 bert
架构 BertForMaskedLM

模型详情

已翻译

BERT base model (cased)

使用掩码语言建模(MLM)目标在英文语料上预训练的模型。该模型在此论文中提出,并首次发布于此仓库。本模型区分大小写:它能识别 englishEnglish 之间的差异。

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

模型描述

BERT 是一个 transformer 模型,以自监督方式在大量英文数据上预训练。这意味着它仅基于原始文本进行预训练,没有任何人工标注(因此可以使用大量公开数据),并通过自动化流程从这些文本生成输入和标签。更具体地说,它通过两个目标进行预训练:

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

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

预期用途与局限性

你可以直接使用原始模型进行掩码语言建模或下一句预测,但其主要目的是在下游任务上进行微调。请访问模型中心查找你感兴趣任务的微调版本。

请注意,该模型主要面向需要利用整个句子(可能包含掩码)进行决策的任务进行微调,例如序列分类、token 分类或问答。对于文本生成等任务,你应该关注 GPT2 这类模型。

如何使用

你可以通过 pipeline 直接使用此模型进行掩码语言建模:

>>> 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(包含 11,038 本未出版书籍的数据集)和 英文维基百科(排除列表、表格和标题)上进行了预训练。

训练流程

预处理

文本使用 WordPiece 进行 tokenize,词汇表大小为 30,000。模型的输入格式如下:

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

以 0.5 的概率,句子 A 和句子 B 对应原始语料中两个连续的句子;在其他情况下,它们对应语料中的另一个随机句子。注意,这里所说的"句子"实际上是一段连续的文本,通常比单个句子更长。唯一的约束是两个"句子"合并后的长度不超过 512 个 token。

每个句子的掩码处理细节如下:
- 15% 的 token 被掩码。
- 在 80% 的情况下,被掩码的 token 替换为 [MASK]
- 在 10% 的情况下,被掩码的 token 替换为另一个随机 token(与被替换的 token 不同)。
- 在剩余的 10% 情况下,被掩码的 token 保持不变。

预训练

该模型在 Pod 配置(共 16 个 TPU 芯片)的 4 个云端 TPU 上训练了 100 万步,batch size 为 256。序列长度在 90% 的训练步骤中限制为 128 个 token,在剩余 10% 的步骤中限制为 512 个 token。使用的优化器为 Adam,学习率为 1e-4,\(\beta_{1} = 0.9\),\(\beta_{2} = 0.999\),权重衰减为 0.01,学习率预热 10,000 步,之后学习率线性衰减。

评估结果

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

Glue 测试结果:

| 任务 | MNLI-(m/mm) | QQP | QNLI | SST-2 | CoLA | STS-B | MRPC | RTE | 平均 |
|:----:|:-----------:|:----:|:----:|:-----:|:----:|:-----:

标签

tf jax bert exbert en dataset:bookcorpus dataset:wikipedia arxiv:1810.04805

操作


详细信息

厂商
google-bert
任务
fill-mask
框架
transformers
模型类型
bert
许可(HF)
apache-2.0
语言
en