BERT预训练过程全解析:从数据准备到模型微调的实战指南

1次阅读
没有评论

共计 1790 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

1. BERT 基本原理与预训练目标

BERT(Bidirectional Encoder Representations from Transformers)的核心创新在于双向上下文理解。传统语言模型(如 GPT)只能从左到右或从右到左单向建模,而 BERT 通过以下两种任务实现双向训练:

BERT 预训练过程全解析:从数据准备到模型微调的实战指南

  • Masked Language Model (MLM):随机遮盖输入文本中 15% 的词汇,让模型预测这些被遮盖的词。例如:

    原始句子:"人工智能正在改变世界"
    遮盖后:"人工 [MASK] 正在 [MASK] 变世界"

  • Next Sentence Prediction (NSP):判断两个句子是否是连续的上下文关系。正样本来自原文连续句子,负样本随机组合不相关句子。

2. 数据准备全流程

2.1 文本清洗

  • 去除 HTML 标签、特殊字符
  • 统一全角 / 半角标点
  • 处理繁体转简体(中文场景)

2.2 分词处理

使用 BERT 专属的 WordPiece 分词器:

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')

text = "自然语言处理真有趣"
tokens = tokenizer.tokenize(text)  # ['自', '然', '语', '言', '处', '理', '真', '有', '趣']

2.3 数据格式转换

需要生成以下两种文件:

  1. 训练文本文件:每行一个句子或段落
  2. TFRecord 文件:Google 官方推荐的二进制格式,提升读取效率

3. PyTorch 实现核心代码

3.1 MLM 任务实现

import torch
from transformers import BertForMaskedLM

# 初始化模型
model = BertForMaskedLM.from_pretrained('bert-base-chinese')

# 模拟输入(已遮盖)input_ids = torch.tensor([[101, 100, 104, 100, 102]])  # [CLS], 词 1, [MASK], 词 3, [SEP]
labels = torch.tensor([[-1, 100, 104, 100,  -1]])    # 仅计算被遮盖位置的 loss

outputs = model(input_ids, labels=labels)
loss = outputs.loss

3.2 NSP 任务实现

from transformers import BertForNextSentencePrediction

model = BertForNextSentencePrediction.from_pretrained('bert-base-chinese')

# 输入格式: [CLS]句子 A[SEP]句子 B[SEP]
input_ids = torch.tensor([[101, 2054, 2003, 1996, 4248, 102, 2054, 2003, 1996, 8612, 102]])
labels = torch.tensor([1])  # 1 表示是下一句,0 表示不是

outputs = model(input_ids, labels=labels)

4. 关键超参数设置

  • Batch Size:根据显存调整,通常 32-256 之间
  • Learning Rate:建议 2e- 5 到 5e-5
  • Warmup Steps:前 10% 训练步数线性增大学习率
  • Max Sequence Length:中文建议 512,英文 128

5. 避坑指南

5.1 显存不足问题

  • 使用梯度累积(accumulate_grad_batches=4)
  • 启用混合精度训练(fp16=True)
  • 减少 max_seq_length

5.2 训练不稳定

  • 添加梯度裁剪(max_grad_norm=1.0)
  • 适当增大 warmup 比例
  • 检查数据中是否存在异常样本

6. 模型评估与微调

6.1 评估指标

  • MLM 准确率:预测被遮盖词的 top-1/top- 5 准确率
  • NSP 准确率:下一句预测任务准确率

6.2 微调策略

  • 领域适应:在专业语料(如医疗、法律)上继续预训练
  • 任务微调:修改输出层结构适配具体任务

7. 思考题

  1. 为什么 BERT 的 MLM 任务只遮盖 15% 的词汇?遮盖比例过高或过低会怎样?
  2. 如何设计实验验证 NSP 任务对下游任务的实际帮助?
  3. 在小样本场景下,有哪些提升 BERT 预训练效率的方法?

延伸阅读

  • BERT 原论文
  • Hugging Face Transformers 文档
  • 《自然语言处理入门》第 8 章
正文完
 0
评论(没有评论)