BERT
Bidirectional Encoder Representations from Transformers
Devlin et al., Google, 2018 — arXiv:1810.04805

核心定位
| 維度 | 說明 |
|---|---|
| 架構 | Transformer encoder-only |
| 方向性 | 雙向(同時看左右上下文) |
| 目標 | 預訓練通用語言表示,再 fine-tune 各下游任務 |
| 對比 GPT | GPT 是 decoder-only、單向左→右;BERT 是 encoder-only、雙向 |
模型規格
| BERT-base | BERT-large | |
|---|---|---|
| Layers | 12 | 24 |
| Hidden size | 768 | 1024 |
| Attention heads | 12 | 16 |
| Parameters | 110M | 340M |
| Max seq length | 512 | 512 |
Input Representation
每個 token 的 embedding = Token + Segment + Position 三者相加
[CLS] 台灣 的 首都 [SEP] 台北 是 答案 [SEP]
↑ ↑ ↑
句首標記 句子分隔符 句末
[CLS]:classification token,fine-tune 分類任務時取此位置輸出[SEP]:分隔兩個句子- Segment embedding:區分句子 A / 句子 B
- Tokenizer:WordPiece(子詞切分)
預訓練任務
1. MLM — Masked Language Modeling
- 隨機 mask 15% tokens,讓模型預測被遮蓋的詞
- 15% 中:80% 換成
[MASK]、10% 換隨機詞、10% 保持原詞 - 解決:讓模型同時利用左右上下文(雙向)
2. NSP — Next Sentence Prediction
- 輸入兩個句子,預測 B 是否為 A 的下一句(50/50)
- 目的:學習句子間關係,用於 QA / NLI
- 注:後續研究(RoBERTa)發現 NSP 幫助有限,移除後反而更好
Fine-tuning 範式
預訓練 BERT
↓ 加上 task-specific head
分類任務 → 取 [CLS] → Linear → softmax
NER → 取每個 token → Linear → label
QA → 取 span 的 start/end logits
只需少量標注資料 + 幾個 epoch fine-tune,即可在各 NLP benchmark 達到 SOTA。
HuggingFace 快速使用
from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
inputs = tokenizer("Hello, BERT!", return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
# outputs.last_hidden_state: [batch, seq_len, 768]
# outputs.pooler_output: [batch, 768] ← [CLS] 經過線性層
cls_vec = outputs.pooler_output
BERT 系列演進
| 模型 | 年份 | 改進重點 |
|---|---|---|
| RoBERTa | 2019, Meta | 移除 NSP、更多資料、動態 masking、更大 batch |
| ALBERT | 2019, Google | Factorized embedding、跨層參數共享、SOP 取代 NSP,大幅降低參數量 |
| DistilBERT | 2019, HuggingFace | Knowledge distillation,小 40%、快 60%,保留 97% 性能 |
| ELECTRA | 2020, Google | Replaced Token Detection(判斷每個 token 是否被替換),更高效 |
| DeBERTa | 2020, Microsoft | Disentangled Attention(position 與 content 分開計算),多項 benchmark SOTA |
| mBERT | 2019, Google | 多語言版本,104 種語言 |
| BERT 系列(中文) | — | CKIP-BERT、MacBERT、RoBERTa-wwm-ext |
限制
- 不擅長生成:encoder-only,無法自回歸生成文字
- [MASK] 不一致:預訓練看到 MASK,推理/fine-tune 時不存在(後來 ELECTRA 解決)
- NSP 效果存疑:RoBERTa 移除後性能提升
- 固定長度 512:長文件處理需要切段或用 Longformer 等替代
適用場景
- 文本分類、情感分析
- NER(命名實體識別)
- 問答(Extractive QA)
- 語意相似度、句子對分類(NLI)
- 作為 embedding backbone(Retrieval、Reranking)
References
- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding — Devlin et al., 2018 (原始論文)
- google-research/bert — 官方 GitHub 實作
- HuggingFace Transformers — BERT — API 文件與預訓練模型
- bert-base-uncased — HuggingFace Model Hub