📚 阶段二:BERT 结构 + 预训练任务 + 微调实战

内容纲要

好,既然我们已经打下了 Transformer 的基础,现在进入第二阶段:

🌐 目录规划

  1. BERT 是什么?和 Transformer 有什么关系?
  2. BERT 的结构图 + 原理解析
  3. 预训练任务详解(MLM + NSP)
  4. 微调实战:句子分类任务(文本情感分析)
  5. BERT 最简实现(用 transformers + 自定义代码)
  6. 模型调用与输出理解(如何用好 [CLS])

1️⃣ BERT 是啥?和 Transformer 有什么区别?

BERT 全名是:Bidirectional Encoder Representations from Transformers
👉 本质上是 多个 Transformer 编码器堆叠 + 特定预训练任务(MLM+NSP)

✅ 特点对比:

模型 架构 看上下文 适合任务
GPT Decoder-only 单向 生成
BERT Encoder-only 双向 理解

所以:BERT = Encoder-only Transformer + 自定义预训练任务


2️⃣ BERT 结构图(简化):

                输入句子对:[CLS] 句子A [SEP] 句子B [SEP]
                           ↓
                Token Embedding + Segment Embedding + Positional Embedding
                           ↓
                 Transformer Encoder x N 层(默认12层)
                           ↓
        输出:每个 token 的向量 + [CLS] 特征向量(用于分类任务)

3️⃣ 预训练任务详解

1. 🎭 MLM:Masked Language Model

  • 遮住 15% 的词,让模型猜被遮掉的是啥。
    原句:the man went to the [MASK]
    模型目标输出:store

2. 🧩 NSP:Next Sentence Prediction

  • 给两个句子,预测它们是否是原文相邻的句子。
    句子A:I went to the store.  
    句子B:I bought milk. → Label = True  
    句子B:The sky is blue. → Label = False

4️⃣ 微调实战:文本分类任务(情感分析)

👇 示例任务

用 BERT 来判断一句话是“正面”还是“负面”情绪。

from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
from datasets import load_dataset

# 加载 tokenizer & model
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

# 加载数据集
dataset = load_dataset("imdb")
def tokenize_fn(example):
    return tokenizer(example["text"], truncation=True, padding="max_length", max_length=128)

encoded = dataset.map(tokenize_fn, batched=True)
encoded.set_format(type="torch", columns=["input_ids", "attention_mask", "label"])

# 训练
training_args = TrainingArguments(
    output_dir="./bert-finetune",
    per_device_train_batch_size=8,
    evaluation_strategy="epoch",
    num_train_epochs=2,
    save_strategy="epoch",
    logging_dir="./logs"
)
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=encoded["train"].shuffle(seed=42).select(range(2000)),
    eval_dataset=encoded["test"].shuffle(seed=42).select(range(1000))
)
trainer.train()

5️⃣ 关键知识点理解

关键词 解释
[CLS] 分类任务中的汇总向量,取这一个向量用来判断情绪等
Segment Embedding 让模型区分句子A/B(NSP任务使用)
Attention Mask 标记哪些位置是 padding,不参与注意力
Fine-tune 训练所有参数,适应当前任务(不只训练头部)

6️⃣ 如何用自己的句子跑一下预测?

text = "This movie is amazing and full of emotion!"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
prediction = logits.argmax(dim=-1).item()
print("预测情绪:", "正面" if prediction == 1 else "负面")

✅ 本阶段总结

你学会了
BERT 和 Transformer 的关系
MLM + NSP 的原理和意义
使用 huggingface 快速微调 BERT
如何利用 [CLS] 输出做分类

🔜 接下来做啥?

下一阶段我们将:

🚀 阶段三:GPT 架构 + 自回归训练 + 从零训练小型玩具 GPT 模型

✅ 包括:

  • GPT 和 BERT 的编码方式对比
  • GPT2 架构详解
  • 自回归语言模型训练过程(代码实现)
  • 最小 GPT 模型(NanoGPT 风格)跑起来
  • 可视化每一步生成的 token 概率

后续路线:

  1. Transformer 结构和实现(已完成✅)
  2. BERT 的结构 + 预训练任务 + 实现(含微调任务)(已完成✅)
  3. 🔜 GPT 架构 + 自回归训练 + 从头训练一个玩具 GPT
  4. 🔜 ChatGPT 的训练流程拆解(含 RLHF、RAG、Agent)
  5. 🔜 实战项目:从 Prompt 到 Fine-tune 的完整链路演练

3 Comments

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注

close
arrow_upward