基于英语语言、采用掩码语言模型(MLM)目标训练的预训练模型。该模型在此论文中首次提出,并在此仓库中首次发布。此模型为 uncased 版本:即“english”和“English”之间没有区别。
免责声明:发布 BERT 的团队并未为此模型撰写模型卡片,因此本模型卡片由 Hugging Face 团队编写。
BERT 是一个在大型英语语料库上以自监督方式预训练的转换器模型。这意味着它仅在原始文本上进行预训练,无需人工以任何方式进行标注(这也是它能够利用大量公开可用数据的原因),并通过自动流程从这些文本中生成输入和标签。更准确地说,它是通过两个目标进行预训练的:
通过这种方式,模型学习到英语语言的内部表示,这些表示随后可用于提取对下游任务有用的特征:例如,如果您有一个带标签的句子数据集,您可以使用 BERT 模型生成的特征作为输入来训练一个标准分类器。
BERT 最初发布了基础(base)和大型(large)两种变体,分别适用于大小写敏感(cased)和大小写不敏感(uncased)的输入文本。Uncased 模型还会去除重音标记。 随后不久,又发布了中文以及多语言的 uncased 和 cased 版本。 在后续的工作中,采用整词掩码(whole word masking)的改进预处理方法取代了子词掩码(subpiece masking),并发布了两个相应模型。 之后又发布了其他 24 个更小的模型。
详细的发布历史可在 GitHub 上的google-research/bert 自述文件中找到。
| 模型 | 参数数量 | 语言 |
|---|---|---|
bert-base-uncased | 110M | 英语 |
bert-large-uncased | 340M | 英语 |
bert-base-cased | 110M | 英语 |
bert-large-cased | 340M | 英语 |
bert-base-chinese | 110M | 中文 |
bert-base-multilingual-cased | 110M | 多语言 |
bert-large-uncased-whole-word-masking | 340M | 英语 |
bert-large-cased-whole-word-masking | 340M | 英语 |
您可以将原始模型用于掩码语言建模或下一句预测,但它主要旨在针对下游任务进行微调。请参阅模型中心,查找您感兴趣的任务的微调版本。
请注意,此模型主要用于在需要使用整个句子(可能包含掩码)进行决策的任务上进行微调,例如序列分类、 token 分类或问答任务。对于文本生成等任务,您应该考虑 GPT2 等模型。
from openmind import pipeline, is_torch_npu_available
from openmind import AutoTokenizer, AutoModelForCausalLM
from openmind_hub import snapshot_download
import torch.nn.functional as F
from torch import Tensor
import openmind
import torch
import argparse
import time
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--model_name_or_path",
type=str,
help="Path to model",
default="jeffding/bert-base-uncased-openmind",
)
args = parser.parse_args()
return args
def main():
args = parse_args()
model_path = args.model_name_or_path
if is_torch_npu_available():
device = "npu:0"
else:
device = "cpu"
start_time = time.time()
classifier = pipeline(task="text-classification", model=model_path, top_k=None, device=device)
sentences = ["I am not having a great day"]
model_outputs = classifier(sentences)
print(model_outputs[0])
end_time = time.time()
print(f"硬件环境:{device},推理执行时间:{end_time - start_time}秒")
if __name__ == "__main__":
main()您可以直接通过掩码语言建模的流水线使用此模型:
>>> 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 上进行预训练的,该数据集包含 11,038 本未出版书籍以及 English Wikipedia(不包括列表、表格和标题)。
文本会被转换为小写,并使用 WordPiece 进行分词,词汇表大小为 30,000。然后,模型的输入形式如下:
[CLS] Sentence A [SEP] Sentence B [SEP]以 0.5 的概率,句子 A 和句子 B 对应原始语料库中的两个连续句子,在其他情况下,则是语料库中的另一个随机句子。请注意,此处所指的“句子”是一段连续的文本,通常比单个句子更长。唯一的限制是这两个“句子”组合后的总长度少于 512 个 tokens。
每个句子的掩码处理细节如下:
[MASK]。该模型在采用 Pod 配置的 4 个云 TPU(共 16 个 TPU 芯片)上进行训练,训练步数为一百万步,批处理大小为 256。90% 的训练步骤中序列长度限制为 128 个 tokens,其余 10% 的步骤中序列长度限制为 512 个 tokens。使用的优化器为 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 | 平均值 |
|---|---|---|---|---|---|---|---|---|---|
| 84.6/83.4 | 71.2 | 90.5 | 93.5 | 52.1 | 85.8 | 88.9 | 66.4 | 79.6 |
@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}
}