概要
事前トレーニングは、すべての LLM の 基礎 ステップです。十分に事前トレーニングされたモデルは、テキストを予測するだけで、文法、意味論、世界の知識、推論能力を学習します。この記事ではそのプロセスについて説明します。
##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、ミストラル、ファルコン
目的: 前のトークンに基づいて次のトークンを予測します。
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% をランダムにマスクし、マスクされたトークンを予測します。
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']
MLM の利点:
- 双方向のコンテキスト → より深い理解
- NLU タスク (分類、NER、Q&A) に適しています
欠点: テキストを直接生成できません。
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) — OpenAI
損失は、パラメーター (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. 緊急の機能
最も興味深い発見の 1 つは、モデルが十分に大きくなると、小規模なモデルからは予測できない 新しい機能が突然現れるということです。
|能力 | ~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) | MLM (バート) |
|---|---|---|
| 方向 | 左から右 | 双方向 |
| 世代 | ✅ ナチュラル | ❌ |
| NLU | 良い(大きい) | ✅ とても良い |
| スケーリング | GPT-3、GPT-4、LLaMA | BERT-大最大 ~340M |
要点:
- CLM (自己回帰) はスケールが優れているため、LLM よりも「勝ち」ます
- チンチラ: より小さなモデルでより長くトレーニング (より多くのデータ) = より効果的
- データの品質 > データの量
次の記事: 教師付き微調整 — 事前トレーニングされたモデルを指示に従うアシスタントに変える方法。