BERT预训练模型框架图解析:从入门到实战

1次阅读
没有评论

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

image.webp

背景介绍

BERT(Bidirectional Encoder Representations from Transformers)是 NLP 领域里程碑式的预训练模型,通过双向 Transformer 架构理解上下文语义。初学者常面临三大难点:
1. 不理解如何将文本转化为 BERT 的输入格式
2. 对 Transformer 的自注意力机制感到抽象
3. 不清楚预训练任务(MLM 和 NSP)的实际作用

BERT 预训练模型框架图解析:从入门到实战

框架图核心模块解析

输入表示层

BERT 的输入由三部分组成(假设输入句子:”[CLS] how are you [SEP]”):

  • Token Embeddings
  • 通过 WordPiece 分词器将句子拆分为[“[CLS]”, “how”, “are”, “you”, “[SEP]”]
  • 每个 token 转换为 768 维向量(以 BERT-base 为例)

  • Segment Embeddings

  • 区分句子 A / B 的标记(单句任务全为 0)
  • 例如:[0, 0, 0, 0, 0] 表示单句输入

  • Position Embeddings

  • 编码绝对位置信息:[0, 1, 2, 3, 4]
  • 最大支持 512 个 token

三者相加形成最终输入矩阵(shape: [seq_len, hidden_size])

Transformer 编码器结构

以 BERT-base 的 12 层 Transformer 为例:

  1. Self-Attention 层
  2. 计算每个 token 与其他 token 的关联权重
  3. 公式:$Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V$
  4. 多头机制(12 个 head)允许关注不同子空间

  5. Feed Forward Network

  6. 两层全连接网络(中间层维度 3072)
  7. 使用 GELU 激活函数:$GELU(x)=xΦ(x)$

每层后接 LayerNorm 和残差连接,防止梯度消失

预训练任务设计

  • Masked Language Model (MLM)
  • 随机掩盖 15% 的 token(其中 80% 替换为[MASK],10% 随机替换,10% 保持不变)
  • 通过上下文预测被掩盖的词

  • Next Sentence Prediction (NSP)

  • 判断句子 B 是否是句子 A 的后续
  • 正例:从文档连续抽取两句话
  • 负例:随机组合两句话

代码实践

from transformers import BertModel, BertTokenizer
import torch

# 初始化模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

# 输入处理
text = "[CLS] how are you [SEP]"
inputs = tokenizer(text, return_tensors="pt")  # 自动添加特殊 token

# 前向传播
with torch.no_grad():  # 关闭梯度计算
    outputs = model(**inputs)

# 输出解析
last_hidden_state = outputs.last_hidden_state  # [1, seq_len, 768]
pooler_output = outputs.pooler_output  # [1, 768] CLS token 的表示

关键参数说明:
input_ids: token 索引序列
attention_mask: 区分真实 token 与 padding(1/0)
token_type_ids: 句子 A / B 标识

常见问题与解决方案

  1. 输入长度超限
  2. BERT 最大支持 512token
  3. 解决方案:

    • 截断:tokenizer(text, truncation=True)
    • 滑动窗口处理长文本
  4. 忘记切换 eval 模式

  5. 预测时需执行 model.eval()
  6. 否则 dropout 等层会继续生效

  7. 未处理特殊 token

  8. 手动添加 [CLS]/[SEP] 可能导致重复
  9. 应使用 tokenizer 自动处理

进阶实践建议

  1. 可视化注意力权重:

    from bertviz import head_view
    head_view(model, tokenizer, text)

  2. 微调实战步骤:

  3. 准备领域特定数据
  4. 继承 BertPreTrainedModel 创建自定义模型类
  5. 添加任务特定层(如分类器)
  6. 冻结部分底层参数加速训练

  7. 输出分析技巧:

  8. 使用 TSNE 降维可视化句向量
  9. 计算相似度矩阵观察语义捕获能力

学习资源推荐

通过理解框架图的核心设计,配合代码实操,初学者可以快速跨越 BERT 的理论到实践鸿沟。建议从简单的文本分类任务开始,逐步探索更复杂的应用场景。

正文完
 0
评论(没有评论)