共计 2644 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
BERT(Bidirectional Encoder Representations from Transformers)是 Google 在 2018 年推出的预训练语言模型,通过双向 Transformer 架构和掩码语言建模任务,能够捕捉文本中的深层语义信息。bert-base-uncased 是其英文基础版本(不区分大小写),在文本分类、问答系统、命名实体识别等 NLP 任务中表现出色,尤其适合作为初学者接触预训练模型的起点。

环境准备
使用 BERT 前需要配置以下环境(推荐 Python 3.7+):
pip install torch==1.10.0
pip install transformers==4.15.0
pip install pandas sklearn
数据处理实战
1. 文本预处理
BERT 需要特定格式的输入数据,核心步骤如下:
- 使用 BERT 的 tokenizer 对原始文本分词
- 添加特殊 token([CLS], [SEP])
- 生成 attention mask 和 token type ids
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
text = "Hello, this is a BERT tutorial."
inputs = tokenizer(
text,
padding='max_length', # 填充到最大长度
truncation=True, # 超长截断
max_length=128, # 设置最大长度
return_tensors='pt' # 返回 PyTorch 张量
)
print(inputs.input_ids) # token 索引
print(inputs.attention_mask) # 注意力掩码
2. 构建数据集类
封装为 PyTorch Dataset 便于批量处理:
from torch.utils.data import Dataset
class TextDataset(Dataset):
def __init__(self, texts, labels, tokenizer, max_len):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = str(self.texts[idx])
inputs = self.tokenizer(
text,
max_length=self.max_len,
padding='max_length',
truncation=True,
return_tensors='pt'
)
return {'input_ids': inputs['input_ids'].flatten(),
'attention_mask': inputs['attention_mask'].flatten(),
'labels': torch.tensor(self.labels[idx], dtype=torch.long)
}
模型加载与微调
1. 加载预训练模型
from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained(
'bert-base-uncased',
num_labels=2 # 假设是二分类任务
)
2. 训练循环示例
from transformers import AdamW
optimizer = AdamW(model.parameters(), lr=2e-5)
for epoch in range(3): # 典型微调 3 - 4 个 epoch
model.train()
for batch in train_loader:
optimizer.zero_grad()
outputs = model(input_ids=batch['input_ids'],
attention_mask=batch['attention_mask'],
labels=batch['labels']
)
loss = outputs.loss
loss.backward()
optimizer.step()
性能优化技巧
- Batch Size 选择 :
- GPU 内存较小时(如 11GB):建议 batch_size= 8 或 16
-
可通过梯度累积模拟更大 batch:
for i, batch in enumerate(train_loader): loss = model(...).loss loss = loss / 4 # 假设累积 4 次 loss.backward() if (i+1) % 4 == 0: optimizer.step() optimizer.zero_grad() -
学习率调整 :
- 推荐初始 lr=2e- 5 到 5e-5
- 配合 warmup 效果更好:
from transformers import get_linear_schedule_with_warmup scheduler = get_linear_schedule_with_warmup( optimizer, num_warmup_steps=100, num_training_steps=len(train_loader)*3 )
常见问题解决方案
1. OOM(内存不足)错误
- 降低 batch_size
- 使用混合精度训练:
from torch.cuda.amp import GradScaler scaler = GradScaler() with autocast(): outputs = model(...) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()
2. 处理长文本
- BERT 最大长度默认为 512
- 对于超长文本可选方案:
- 截断(保留首尾重要部分)
- 分段处理后聚合结果
进阶方向
- 模型压缩 :
- 知识蒸馏(DistilBERT)
-
量化(8-bit Adam 优化器)
-
领域适配 :
- 在专业语料上继续预训练
- 添加领域特定词汇到 tokenizer
结语
通过本文的实践演示,即使是 NLP 新手也能快速上手 bert-base-uncased 模型。建议先从简单的文本分类任务开始,逐步尝试更复杂的应用场景。遇到问题时,多查阅 HuggingFace 文档和社区讨论,往往能找到解决方案。
正文完
