内容纲要
好,既然我们已经打下了 Transformer 的基础,现在进入第二阶段:
🌐 目录规划
- BERT 是什么?和 Transformer 有什么关系?
- BERT 的结构图 + 原理解析
- 预训练任务详解(MLM + NSP)
- 微调实战:句子分类任务(文本情感分析)
- BERT 最简实现(用
transformers
+ 自定义代码) - 模型调用与输出理解(如何用好 [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 概率
后续路线:
3 Comments