一文读懂Bert预训练模型

BERT模型作为自然语言处理领域的重大突破,其核心优势在于创新性地采用了双向注意力机制和大规模无监督预训练方法。该模型通过深度双向上下文编码,有效捕捉了语言的复杂语义关系和长程依赖,显著提升了对语言理解的深度和广度。

一. 关于Bert

BERT是一种革命性的自然语言处理模型,全称为"Bidirectional Encoder Representations from Transformers"(来自Transformer的双向编码器表示)。以下是BERT的简要介绍:

  1. 开发背景:由Google AI团队在2018年开发。

  2. 核心技术:基于Transformer架构,使用双向训练。

  3. 预训练方法:采用掩码语言模型(MLM)和下一句预测(NSP)任务。

  4. 主要优势: > - 捕捉更丰富的上下文信息 > - 适用于多种NLP任务 > - 性能优异,在多个基准测试中取得突破

  5. 应用领域:问答系统、情感分析、文本分类等。

  6. 影响:推动了NLP领域的快速发展,催生了许多基于BERT的改进模型。

二. Bert的发展与衍生

模型名称 优化点 发布时间
RoBERTa 更大的训练数据:使用了更大规模的数据进行预训练。longer训练时间:延长了模型的训练时间和迭代次数。移除Next Sentence Prediction(NSP)任务:发现NSP任务对模型性能影响不大,因此将其移除。动态掩码:每次输入序列时动态生成掩码,而不是静态掩码。更大的batch size:使用更大的batchsize进行训练。字节对编码(Byte-PairEncoding):使用更大的词表 2019年7月
ALBERT 轻量级BERT变体 , 通过参数共享来减少模型大小,同时保持性能 2019年9月
DistilBERT 轻量级版本,保留BERT 97%的性能,但体积减小40%,速度提高60% 2019年10月
XLNet 使用置换语言建模来解决BERT的一些局限性 2019年6月
ELECTRA 使用替换检测而不是掩码语言建模进行预训练 2020年3月
ERNIE 加入了额外的知识信息 2019年3月
T5 统一框架:T5将所有NLP任务转化为文本到文本的格式,包括分类、翻译、摘要等。编码器-解码器架构:与BERT的编码器结构不同,T5采用了编码器-解码器架构。更大的模型和数据集:T5使用了更大规模的模型参数和训练数据。新的预训练任务:T5使用了"spancorruption"作为预训练任务,不同于BERT的掩码语言模型。多任务学习:在预训练阶段就引入了多任务学习。 改进的位置编码:使用相对位置编码而非绝对位置编码。 2019年10月
BART 结合了BERT的双向编码器和GPT的自回归解码器 2019年10月
DeBERTa 使用解耦注意力机制和增强的掩码解码器 2020年1月

三. 模型架构

BERT模型的整体架构可以分为输入(Input)、编码器(Encoder)和输出(Output)三个层面。

1. 输入层(Input Layer)

BERT模型的输入层负责将文本数据转化为模型可以处理的格式。

输入层主要分为三大部分:

词嵌入(Word Embeddings)

  • Tokenization(分词):将输入的文本字符串拆分为更小的单元,通常是词(words)或子词(subwords)。BERT使用的是WordPiece tokenizer。
  • Adding Special Tokens(添加特殊标记):在每个输入序列的开头添加[CLS]标记,在两个句子之间添加[SEP]标记。
  • Token IDs:将每个token映射到词汇表中的唯一ID。

分段嵌入(Segment Embeddings)

Segment IDs(分段ID):在NSP任务中用于区分不同的句子。第一个句子的token IDs标记为0,第二个句子的token IDs标记为1。

位置嵌入(Position Embeddings): 完成词嵌入操作后 ,模型自动执行位置嵌入

Attention Mask:用于区分填充(padding)部分和实际的token。在批处理时,将所有输入序列填充到相同的长度,填充值通常为0,实际token的attention mask为1。

例如:

1
2
3
4
5
6
7
8
9
10
11
from transformers import BertTokenizer

# 加载预训练的BERT tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')

# 输入文本
text = ["Hello, how are you?", "I am fine, thank you!"]

# 使用tokenizer对输入文本进行编码
encoded_input = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
print(encoded_input)

2. 编码器层(Encoder Layer)

BERT的编码器层是由多个Transformer编码器堆叠而成的。每个Transformer编码器层包括以下几个部分:

  • Self-Attention Mechanism(自注意力机制):每个token可以在序列中与其他token进行交互,从而捕捉句子中的全局依赖关系。BERT使用多头自注意力机制(Multi-Head Self-Attention),使得模型能够同时关注不同位置的信息。
  • Feed-Forward Neural Network(前馈神经网络):每个自注意力层之后接一个前馈神经网络,进一步处理和变换注意力机制的输出。
  • Add & Norm(加和归一化):每个子层(自注意力和前馈神经网络)都有一个残差连接,并进行层归一化(Layer Normalization)。
  • Position-wise Feed-Forward Networks(逐位置前馈神经网络):每个token在自注意力机制处理后,通过一个逐位置的前馈神经网络进行非线性变换。

3. 输出层(Output Layer)

BERT的输出层根据具体任务的不同而有所变化,常见的任务包括:

  • 分类任务:使用第一个token([CLS])的输出表示整个序列的特征,然后通过一个分类层进行分类。
  • 序列标注任务:对每个token的输出进行处理,通过一个分类层对每个token进行标注。
  • 问答任务:预测答案的起始和结束位置,使用的是序列中每个token的输出表示。

示例:

1
2
3
4
5
6
7
8
9
10
from transformers import BertModel

# 加载预训练的BERT模型
model = BertModel.from_pretrained('bert-base-chinese')

# 使用模型进行推理
output = model(**encoded_input)

# 输出结果
print(output)

output包含两个部分: - last_hidden_state:最后一个隐藏层的输出,可以用于各种下游任务。 - pooler_output:对应于[CLS]标记的输出,通常用于分类任务。


BERT模型作为自然语言处理领域的重大突破,其核心优势在于创新性地采用了双向注意力机制和大规模无监督预训练方法。该模型通过深度双向上下文编码,有效捕捉了语言的复杂语义关系和长程依赖,显著提升了对语言理解的深度和广度。BERT的预训练-微调范式不仅大幅降低了特定任务的训练成本,还实现了模型在多种NLP任务上的卓越迁移能力。其强大的特征表示能力和灵活的架构设计,为下游任务提供了高质量的语言表征基础。


一文读懂Bert预训练模型
https://linxkon.github.io/一文读懂Bert预训练模型.html
作者
linxkon
发布于
2022年2月20日
许可协议