概述
預訓練是每個法學碩士的基礎步驟。一個經過良好預訓練的模型將只透過預測文本來學習文法、語意、世界知識和推理能力。本文解釋了該過程。
1.什麼是預訓練?
預訓練是在大量資料(數百GB到TB的文字)上訓練模型的階段,具有自我監督的目標—無需人工標籤。
Pre-training Data:
- Common Crawl (internet text) ~50%
- Books (BookCorpus, Gutenberg) ~10%
- Wikipedia ~5%
- Code (GitHub) ~10%
- Scientific papers (arXiv) ~5%
- Other curated sources ~20%
經過預訓練後,模型能夠通用語言理解——這是微調每項任務的基礎。
2. 因果語言建模 (CLM)
使用者: GPT 系列、LLaMA、Mistral、Falcon
目標: 根據先前的標記預測下一個標記。
Input: "The quick brown fox"
Label: "quick brown fox jumps"
Loss = -∑ log P(token_t | token_1, ..., token_{t-1})
import torch
import torch.nn as nn
from transformers import AutoTokenizer, AutoModelForCausalLM
# Minh họa CLM loss
def compute_clm_loss(model, input_ids):
"""
input_ids: (batch, seq_len)
Labels = input_ids shifted right (next token prediction)
"""
outputs = model(input_ids, labels=input_ids)
# HuggingFace tự động shift: labels[1:] vs logits[:-1]
return outputs.loss
# Thực tế với GPT-2
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
text = "The quick brown fox jumps over the lazy dog"
inputs = tokenizer(text, return_tensors="pt")
loss = compute_clm_loss(model, inputs["input_ids"])
print(f"CLM Loss: {loss.item():.4f}")
print(f"Perplexity: {torch.exp(loss).item():.2f}")
CLM優勢:
- 自然地適合文字生成
- 因果掩模→可直接用於生成
3. 遮罩語言建模 (MLM)
使用者: BERT、ROBERTa、ALBERT
目標: 隨機屏蔽 15% 的 token,預測屏蔽後的 token。
Original: "The [MASK] brown fox jumps"
Predict: "quick"
from transformers import BertForMaskedLM, BertTokenizer
import torch
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertForMaskedLM.from_pretrained("bert-base-uncased")
text = "The quick brown [MASK] jumps over the lazy dog"
inputs = tokenizer(text, return_tensors="pt")
mask_idx = (inputs["input_ids"] == tokenizer.mask_token_id).nonzero(as_tuple=True)[1]
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
# Top 5 dự đoán cho [MASK]
top5 = torch.topk(logits[0, mask_idx], 5).indices
predictions = tokenizer.convert_ids_to_tokens(top5[0])
print(f"Top predictions: {predictions}")
# ['fox', 'dog', 'cat', 'rabbit', 'horse']
傳銷優勢:
- 雙向脈絡→更深入的理解
- 適合 NLU 任務(分類、NER、問答)
**缺點:**無法直接產生文字。
4. 資料管理
數據品質決定模型品質。典型的資料處理流程:
4.1 集合
Common Crawl → hàng tỷ web pages mỗi tháng
GitHub → source code
arXiv → khoa học
Wikipedia → encyclopedic knowledge
Books3, Gutenberg → sách
4.2 過濾
# Các bước lọc điển hình
filters = [
"language_detection", # Giữ ngôn ngữ mục tiêu
"quality_scoring", # FastText/classifier lọc low-quality
"deduplication", # MinHash LSH loại duplicate
"toxic_content_filter", # Loại nội dung độc hại
"pii_removal", # Loại PII (email, phone, SSN)
"length_filter", # Loại doc quá ngắn/dài
]
4.3 標記化與打包
# Ghép nhiều documents thành chunks dài (e.g., 2048 tokens)
# Dùng separator token giữa documents
# EOS token đánh dấu hết document
5. 縮放法則
5.1 卡普蘭等。 (2020) — 開放人工智慧
損失根據參數 (N)、數據 (D) 和計算 (C) 的數量按 冪律 減少:
L(N) ∝ N^{-0.076} (scale parameters)
L(D) ∝ D^{-0.095} (scale data)
L(C) ∝ C^{-0.050} (scale compute)
結論:“擴展一切-越大越好。” → GPT-3 175B
5.2 龍貓 (2022) — DeepMind
霍夫曼等人。發現:**GPT-3 和當時的許多模型都訓練不足! **
在固定計算預算 C 的情況下,最優值是:
N_optimal ∝ C^{0.5}
D_optimal ∝ C^{0.5}
→ N và D nên scale BẰNG NHAU
龍貓的經驗法則:
Số tokens training ≈ 20 × số parameters
GPT-3 (175B params) → nên train trên 3.5T tokens
(thực tế chỉ train ~300B tokens → underpowered)
Llama-2 (7B params) → train 2T tokens ✅ (compute-optimal)
5.3 實際應用
Model Params Tokens Compute-optimal?
GPT-3 175B 300B ❌ Under-trained
Chinchilla 70B 1.4T ✅ Optimal
LLaMA-1 7-65B 1T ~✅
LLaMA-2 7-70B 2T ✅
Mistral-7B 7B ~1T ✅
6. 培訓基礎設施
6.1 分散式訓練
Data Parallelism: copy model lên nhiều GPU, chia batch
Tensor Parallelism: chia layers/weights across GPUs
Pipeline Parallelism: chia layers thành pipeline stages
ZeRO (DeepSpeed): partition optimizer states, gradients, params
6.2 混合精度
# bf16 training (tốt hơn fp16 cho LLM)
from transformers import TrainingArguments
args = TrainingArguments(
bf16=True, # Brain Float 16
gradient_checkpointing=True, # Tiết kiệm VRAM
gradient_accumulation_steps=4 # Accumulate 4 steps → effective batch lớn hơn
)
6.3 最佳化器
# AdamW với cosine LR schedule là tiêu chuẩn
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.1)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=total_steps)
7. 新興能力
最有趣的發現之一:當模型變得足夠大時,新功能突然出現,而這些功能無法從較小的模型中預測:
| 能力 | 出現在 ~params |
|---|---|
| 3 位加法 | 〜500M |
| 多步驟算術 | 〜5B |
| 思想鏈 | 〜100B |
| 說明如下 | 〜100B(+ RLHF) |
| 複雜推理 | 〜500B+ |
"Emergence" không phải magic — chỉ là tại threshold nào đó,
model đã học đủ "sub-skills" để combine thành ability mới.
總結
| 方面 | CLM (GPT) | 傳銷(BERT) |
|---|---|---|
| 方向 | 由左至右 | 雙向 |
| 一代 | ✅ 天然 | ❌ 不用於生成 |
| 自然語言處理 | 好(大) | ✅ 非常好 |
| 縮放 | GPT-3、GPT-4、LLaMA | BERT-large 最大 ~340M |
重點:
- CLM(自回歸)「贏得」了 LLM,因為它的擴展性更好
- 中文:用更小的模型訓練更長的時間(更多的數據)=更有效
- 数据质量 > 数据数量
下一篇文章: 有監督微調-如何將預先訓練的模型變成可以遵循指示的助手。