BERT(Bidirectional Encoder Representations from Transformers)
BERT 是什么?
BERT 是 Google 在 2018 年推出的 NLP(自然语言处理)模型,全称 Bidirectional Encoder Representations from Transformers(双向编码器表示)。
BERT 采用 Transformer 结构,并使用 双向(Bidirectional)学习方式,与传统的单向语言模型(如 GPT)不同,它能同时利用 上下文信息,提升 NLP 任务的理解能力。
BERT 的关键技术
-
Masked Language Model(MLM,掩码语言模型)
- 训练时随机 屏蔽部分单词,让模型通过上下文预测这些被遮挡的词汇。
- 例如:
输入:I love [MASK] movies.
目标:模型预测[MASK]
词应该是"watching"
。
-
Next Sentence Prediction(NSP,下一句预测)
- 训练时给定两句话,模型需要判断 第二句是否是第一句的真实下一句。
- 例如:
- 句子 A:
I went to the store.
- 句子 B:
I bought some apples.
- 模型目标:判断 B 是否是 A 的下一句。
- 句子 A:
BERT 的架构
BERT 采用 Transformer 的 Encoder 部分,具有多个 Self-Attention 层,可以学习 上下文关系。
BERT 主要有两种版本:
- BERT-Base:12 层 Transformer,768 维隐藏层,12 头注意力,110M 参数
- BERT-Large:24 层 Transformer,1024 维隐藏层,16 头注意力,340M 参数
BERT 的应用
BERT 在各种 NLP 任务中表现优异,包括:
- 文本分类(如情感分析、垃圾邮件检测)
- 命名实体识别(NER)
- 问答系统(QA)
- 机器翻译
- 文本摘要
- 代码补全
BERT 代码示例
使用 Hugging Face 加载预训练 BERT
from transformers import BertTokenizer, BertModel
# 加载 BERT 预训练模型和分词器
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
# 输入文本
text = "BERT is a powerful NLP model."
# 设置return_tensors参数为"pt",表示返回的结果是PyTorch张量格式。
inputs = tokenizer(text, return_tensors="pt")
# 运行 BERT
# inputs = {'param1': value1, 'param2': value2}
# model(**inputs) 等价于 model(param1=value1, param2=value2)
outputs = model(**inputs)
# 打印outputs.last_hidden_state的形状,输出格式为 (batch_size, sequence_length, hidden_size),分别表示批次大小、序列长度和隐藏层维度。
print(outputs.last_hidden_state.shape) # (batch_size, sequence_length, hidden_size)
运行结果
torch.Size([1, 10, 768])
💡 输出:形状为 (1, 10, 768)
,表示 1 个句子,10 个 token,每个 token 由 768 维向量表示。
使用 BERT 进行文本分类
from transformers import BertForSequenceClassification
from transformers import BertTokenizer
import torch
# 加载 BERT 分词器(预训练)
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
# 加载 BERT 分类模型(预训练)
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
# 文本输入
text = "This movie is great!"
inputs = tokenizer(text, return_tensors="pt")
# 预测类别
outputs = model(**inputs)
# 每个类别的预测得分,logits 是模型输出的未经归一化的预测值,表示每个类别的原始得分。这些得分还没有经过激活函数(如softmax)处理,因此不是概率值。
logits = outputs.logits
# 使用 torch.argmax 找到logits中最大值的索引,即预测的类别。
predicted_class = torch.argmax(logits).item()
print("Predicted class:", predicted_class) # 0 或 1(根据分类任务定义)
运行结果
Predicted class: 1
这个例子:加载 BERT 用于 二分类任务(如情感分析)。
BERT vs GPT(区别对比)
模型 | 架构 | 训练方式 | 主要用途 |
---|---|---|---|
BERT | Transformer Encoder | 双向学习(MLM + NSP) | 适用于 NLP 任务(分类、问答、NER) |
GPT | Transformer Decoder | 单向学习(从左到右) | 主要用于 文本生成(如 ChatGPT) |
BERT 的改进版本
- RoBERTa(Robust BERT):去掉 NSP 任务,增加 MLM 训练时间,提高性能。
- ALBERT(Lite BERT):减少参数,提高效率。
- DistilBERT:BERT 的精简版,速度更快。
- ELECTRA:用新的 替换词检测任务(RTD) 代替 MLM,提高训练效率。
总结
- BERT 是双向 Transformer 模型,主要用于 NLP 任务。
- 通过 MLM 和 NSP 进行预训练,能理解上下文。
- 在 Hugging Face 中可以轻松加载和使用 BERT。
- BERT 还有许多改进版本,如 RoBERTa、ALBERT 等。
BERT 使 NLP 进入了新时代,被广泛用于各种任务,如情感分析、问答、翻译等!