bert-base-cased
简介
基于掩码语言建模(MLM)目标在英语上预训练的模型。该模型首次发表于此论文,并在此仓库中首次发布。本模型区分大小写:例如,它能够区分"english"和"English"。
模型卡片
模型配置
模型详情
已翻译BERT base model (cased)
使用掩码语言建模(MLM)目标在英文语料上预训练的模型。该模型在此论文中提出,并首次发布于此仓库。本模型区分大小写:它能识别 english 和 English 之间的差异。
免责声明:发布 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 | 平均 |
|:----:|:-----------:|:----:|:----:|:-----:|:----:|:-----:
正在翻译中,请稍候...