レッスン 8: GPT とデコーダーのみのモデル
1. GPT-1 (2018) — 教師なし事前トレーニング + 教師あり微調整
2018 年 6 月、OpenAI は GPT: 生成的事前トレーニングによる言語理解を向上させる (Radford et al., 2018) を発表しました。 BERT と同じですが、方向性はまったく異なります。
GPT-1 の核となるアイデア:
- 教師なし事前トレーニング: 次のトークンを予測するという単純な目的で、大量のテキストに対して Transformer Decoder をトレーニングします。
- 監視付き微調整: ダウンストリーム タスクごとに、タスク固有のリニア ヘッドを追加して微調整します。
GPT-1 アーキテクチャ:
- 12 層トランスフォーマー デコーダー (117M パラメーター)。
- BooksCorpus でトレーニングします (8 億語)。
- コンテキスト ウィンドウ: 512 トークン。
BERT との違い:
- 単方向: 各トークンは前のトークンにのみ関与します (因果関係/自己回帰)。
- 生成に関しては BERT より優れていますが、初期理解タスクに関しては劣ります。
GPT-1 は、個々のタスクごとにゼロからトレーニングされた多くの特殊なモデルのパフォーマンスを上回っており、ラベルなしデータでの事前トレーニング + 微調整 が非常に強力なパラダイムであることを証明しています。
2. GPT-2 (2019) — スケールアップとゼロショット転送
2019 年 2 月、OpenAI は物議を醸す内容で GPT-2 を発表しました。彼らは当初、偽情報への懸念から GPT-2 の一般公開を拒否しました**。 (その後、段階的に公開していきました。)
GPT-2 のブレークスルー:
- 15 億パラメータ (GPT-1: 117M) にスケールします。
- WebText でトレーニングする — 少なくとも 3 つのカルマを持つ Reddit 送信リンクからの 45 GB のテキスト。
- コンテキスト ウィンドウ: 1024 トークン。
ゼロショット転送: GPT-2 は、微調整せずに多くのタスクを実行できます。適切に「プロンプトを表示する」だけです。
# Summarization (zero-shot)
prompt = "{article text}\n\nTL;DR:"
# Translation (zero-shot)
prompt = "Translate English to French:\nEnglish: {text}\nFrench:"
# Q&A (zero-shot)
prompt = "Answer the question:\nQ: {question}\nA:"
GPT-2 論文の結論: 「言語モデルは教師なしのマルチタスク学習者である」 — 事前トレーニングの規模が十分に大きいため、モデルは多くのタスクを独自に学習できます。
3. GPT-3 (2020) — 175B パラメーター、コンテキスト内学習
2020 年 5 月、OpenAI は GPT-3: Language Models are Few-Shot Learners を発表しました。この論文は AI の世界で波紋を巻き起こしました。
印象的な数字:
- 1,750 億パラメータ (GPT-2: 1.5 億 — 116 倍増加)。
- 最大 3,000 億以上のトークンをトレーニング: Common Crawl、WebText2、Books、Wikipedia。
- トレーニング費用は 460 万米ドル (推定)。
インコンテキスト学習 (ICL): 重みを更新せずに、プロンプト内で提供される例から学習する機能:
# Zero-shot
"Classify sentiment: 'This movie was amazing!' → "
# One-shot
"Classify sentiment:
'The food was terrible.' → Negative
'This movie was amazing!' → "
# Few-shot
"Classify sentiment:
'The food was terrible.' → Negative
'I love this product!' → Positive
'Very disappointing experience.' → Negative
'This movie was amazing!' → "
ICL はなぜ機能するのですか? これは未解決の研究課題のままです。仮説:
- モデルは事前トレーニングからタスクをすでに「認識」しており、数ショットのサンプルはその知識を「アクティブ化」するだけです。
- モデルは、前方パスで暗黙的に勾配降下法を実行します。
緊急機能: GPT-3 は、思考連鎖推論、算術 (部分的)、コード生成など、明示的にトレーニングされていない 機能を実証し始めます。
4. GPT-4 (2023) — マルチモーダル、RLHF、より安全
2023 年 3 月、OpenAI は GPT-4 を発表しましたが、アーキテクチャの詳細やパラメーター数は明らかにしませんでした (競争上の理由から)。知っておくべきこと:
主な改善点:
- マルチモーダル: GPT-4V は画像入力を受信できます (GPT-4o: 音声も)。
- RLHF (人間のフィードバックからの強化学習): モデルを人間の好みに合わせて調整し、有害な出力を削減します。
- 詳細な内容: GPT-4-32k は 32,000 トークンをサポートします (GPT-3.5 の 4,096 トークン)。
- 推論の改善: MMLU、HumanEval、司法試験が大幅に改善されました。
- システム プロンプト: 動作をカスタマイズするための明示的なメカニズム。
専門家の混合 (MoE) — 非公式情報源によると、GPT-4 は最大 8 人の専門家による MoE を使用し、各トークンは 2 人の専門家のみをアクティブ化するため、推論がより効率的になります。
GPT-4 のベンチマーク結果:
- 司法試験: ~ 90 パーセンタイル (対 GPT-3.5: ~ 10 パーセンタイル)。
- MMLU: 86.4% (対ヒト: ~89%)。
- HumanEval (コード): 67% (対 GPT-3.5: 48%)。
5. 因果言語モデリング — 次のトークンの予測
すべての GPT モデルは同じ目的、因果言語モデリング (CLM) を使用します。
与えられたトークンの文字列 x_1, x_2, ..., x_n、最大化:
$$\mathcal{L} = \sum_{t=1}^{n} \log P(x_t | x_1, x_2, ..., x_{t-1}; \theta)$$
CLM はなぜシンプルでありながら強力なのでしょうか?
- データにラベルは必要ありません。あらゆるテキストがトレーニング データです。
- 客観的な自己監視 — 無限のスケール。
- 次のトークンを適切に予測するには、モデルが構文、セマンティクス、事実、推論を理解する必要があります。
- 世界の知識は重みに「圧縮」されます。
自己回帰生成: 推論時に、各トークンを 1 つずつ生成します。
def generate(model, tokenizer, prompt, max_new_tokens=100, temperature=0.8, top_p=0.9):
tokens = tokenizer.encode(prompt, return_tensors="pt")
for _ in range(max_new_tokens):
with torch.no_grad():
logits = model(tokens).logits[:, -1, :] # logits của token cuối
# Temperature scaling
logits = logits / temperature
# Top-p (nucleus) sampling
sorted_logits, sorted_idx = torch.sort(logits, descending=True)
cumulative_probs = torch.cumsum(torch.softmax(sorted_logits, dim=-1), dim=-1)
sorted_idx_to_remove = cumulative_probs - torch.softmax(sorted_logits, dim=-1) > top_p
sorted_logits[sorted_idx_to_remove] = float('-inf')
logits.scatter_(1, sorted_idx, sorted_logits)
# Sample
probs = torch.softmax(logits, dim=-1)
next_token = torch.multinomial(probs, num_samples=1)
tokens = torch.cat([tokens, next_token], dim=1)
# Stop at EOS
if next_token.item() == tokenizer.eos_token_id:
break
return tokenizer.decode(tokens[0], skip_special_tokens=True)
6. オープンソースの代替手段
2023 年以降、オープンソース LLM エコシステムは爆発的に拡大しています。
LLaMA (メタ AI、2023-2024)
- LLaMA-1 (2023 年 2 月): 7B ~ 65B パラメータ、1.4T トークンでトレーニング。
- LLaMA-2 (2023 年 7 月): トレーニング、2T トークン、チャット調整されたバリアントが改善されました。
- LLaMA-3 (2024 年 4 月): 8B および 70B、15T トークン、128K コンテキストでトレーニング。
- LLaMA-3.1 (2024 年 7 月): 405B、多言語が改善されました。
GPT と比較したアーキテクチャの改善:
- 絶対 PE の代わりに RoPE (回転位置埋め込み)。
- FFN での ReLU の代わりに SwiGLU をアクティブ化します。
- グループ化されたクエリ アテンション (GQA) - KV キャッシュを削減し、推論を高速化します。
- LayerNorm の代わりに RMSNorm — より単純で同等です。
ミストラル (2023-2024)
- Mistral-7B: わずか 7B のパラメータで LLaMA-2-13B を上回ります。効率が最も重要です。
- スライディング ウィンドウの注意: 固定ウィンドウで参加し、メモリ O(n²) → O(n) を削減します。
- Mixtral 8x7B: エキスパートの混合 — 合計パラメータ 46.7B、トークンごとに 12.9B がアクティブ。
ジェマ (Google、2024)
- Gemma-2B および 7B: ジェミニから蒸留され、オープンウェイト。
- マルチクエリ アテンション、RoPE、GeGLU アクティベーション。
- 特にコーディングにおいて、サイズに対して優れたパフォーマンス。
アフリカ (マイクロソフト、2023 ~ 2024 年)
- Phi-1 (1.3B): 主に「教科書品質」の合成データに基づいてトレーニングします。
- Phi-2 (2.7B): 多くの大型モデルを何度も上回ります。
- Phi-3 (3.8B): Mixtral-8x7B と競合します。
- 小規模モデル領域で データ品質 > データ量 を証明します。
| モデル | パラメータ | 開ける? | 注目すべき |
|---|---|---|---|
| GPT-4 | ~1.8T (MoE) | いいえ | 全体的に最高 |
| LLaMA-3.1-70B | 70B | はい | ベストオープン70B |
| ミストラル-7B | 7B | はい | ベスト7B |
| ミクストラル-8x7B | 46.7B (アクティブ 12.9B) | はい | 最高の萌えオープン |
| ジェマ-7B | 7B | はい | 強力な推論 |
| ファイ3ミニ | 3.8B | はい | 最高の小型モデル |
7. スケーリングの法則 — コンピューティング最適化トレーニング
カプランら。 (2020) — OpenAI スケーリングの法則: モデルのパフォーマンス (クロスエントロピー損失) は、次のようなべき乗則に従って低下します。
- パラメータの数 N。
- データセットのサイズ D.
- C を計算します。
結論: コンピューティング バジェットが固定されている場合、モデル サイズを増やす方が効果的で、データを増やしたりトレーニングを長くしたりできます。
チンチラ (ホフマン他、2022) — DeepMind: カプランのスケーリング則を再検討して、カプランが N を増やしても D を小さくしすぎることで、モデルのトレーニングが不十分であることを発見してください。
チンチラ最適ルール: コンピューティング バジェット C の場合、次の場合に最適です。
N_opt ∝ C^0.5
D_opt ∝ C^0.5
つまり、N と D を均等に増やします。 C FLOP では、次のように使用します。
トークン = 20 × パラメータ
例:
- GPT-3 (175B パラメータ) は、~3.5T トークンでトレーニングする必要があります (実際: 300B — トレーニング不足)。
- チンチラ (70B パラメータ、1.4T トークン) が GPT-3 (175B、300B トークン) を破ります。
チンチラ後:
- LLaMA-3 (8B): 15T トークン — **チンチラを最適にトレーニングし、効率的に推論します。
- ファイ: 高品質のデータ、小さなモデル — 境界をさらに押し広げます。
8. コード: ハグフェイスからの GPT-2 によるテキスト生成
# pip install transformers torch
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# ── 1. Load model và tokenizer ────────────────────────────────────
model_name = "gpt2" # hoặc "gpt2-medium", "gpt2-large", "gpt2-xl"
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)
model.eval()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
tokenizer.pad_token = tokenizer.eos_token
print(f"GPT-2 parameters: {sum(p.numel() for p in model.parameters()):,}")
# ── 2. Greedy decoding (deterministic, thường lặp lại) ───────────
def greedy_generate(prompt: str, max_new_tokens: int = 100) -> str:
inputs = tokenizer(prompt, return_tensors="pt").to(device)
with torch.no_grad():
output_ids = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=False,
)
return tokenizer.decode(output_ids[0], skip_special_tokens=True)
# ── 3. Sampling với temperature ───────────────────────────────────
def sample_generate(
prompt: str,
max_new_tokens: int = 200,
temperature: float = 0.8,
top_p: float = 0.92,
top_k: int = 50,
) -> str:
inputs = tokenizer(prompt, return_tensors="pt").to(device)
with torch.no_grad():
output_ids = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=temperature,
top_p=top_p,
top_k=top_k,
)
return tokenizer.decode(output_ids[0], skip_special_tokens=True)
# ── 4. Beam search (tốt hơn greedy, ít lặp hơn) ──────────────────
def beam_generate(prompt: str, max_new_tokens: int = 100, num_beams: int = 5) -> str:
inputs = tokenizer(prompt, return_tensors="pt").to(device)
with torch.no_grad():
output_ids = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
num_beams=num_beams,
early_stopping=True,
no_repeat_ngram_size=3, # tránh lặp n-gram
)
return tokenizer.decode(output_ids[0], skip_special_tokens=True)
# ── 5. Thử nghiệm ─────────────────────────────────────────────────
prompt = "Artificial intelligence is transforming the world because"
print("=== Greedy ===")
print(greedy_generate(prompt, max_new_tokens=80))
print("\n=== Sampling (temperature=0.8) ===")
print(sample_generate(prompt, max_new_tokens=150, temperature=0.8))
print("\n=== Beam Search (5 beams) ===")
print(beam_generate(prompt, max_new_tokens=80, num_beams=5))
# ── 6. Tính perplexity ────────────────────────────────────────────
def compute_perplexity(text: str) -> float:
"""Perplexity thấp hơn = model "tự tin" hơn về text này."""
inputs = tokenizer(text, return_tensors="pt").to(device)
input_ids = inputs["input_ids"]
with torch.no_grad():
outputs = model(input_ids, labels=input_ids)
loss = outputs.loss # cross-entropy loss
return torch.exp(loss).item()
print(f"\nPerplexity (coherent text): {compute_perplexity('The cat sat on the mat.'):.2f}")
print(f"Perplexity (random text): {compute_perplexity('xyz purple banana runs 42'):.2f}")
より大きなモデル (GPT-2 XL または GPT-Neo/GPT-J) を使用してください:
# GPT-Neo 1.3B (open-source, GPT-3 style)
from transformers import pipeline
generator = pipeline(
"text-generation",
model="EleutherAI/gpt-neo-1.3B",
device=0 if torch.cuda.is_available() else -1,
)
results = generator(
"Vietnam is a beautiful country",
max_new_tokens=100,
temperature=0.9,
top_p=0.95,
num_return_sequences=3, # sinh 3 variations
)
for i, r in enumerate(results):
print(f"--- Sequence {i+1} ---")
print(r["generated_text"])
概要
- GPT-1 → GPT-4: パラダイムは、各タスクの微調整から、スケーリングのおかげで、コンテキスト内の学習と指導に移行します。
- Causal LM (ネクストトークン予測) は最も単純な目的ですが、世界の知識を学ぶのに十分強力です。
- スケーリングの法則: N、D、C を増やすと、べき乗則に従ってパフォーマンスが向上します。チンチラショーにはNとDのバランスが必要です。
- オープンソース エコシステム: LLaMA、Mistral、Gemma、Phi は API なしで強力なモデルを提供します。
- デコード戦略 (貪欲、サンプリング、ビームサーチ) は、出力の品質と多様性に大きく影響します。
次の記事では、BPE、WordPiece、SentencePiece、Tiktoken など、すべての LLM にとって目立たないものの重要なプラットフォームである トークン化 について詳しく説明します。