BERTとGPT
田中VPoE:「Transformer アーキテクチャを理解したところで、それを応用した2大モデル、BERT と GPT を見ていこう。NetShop のレビュー感情分析には、これらの事前学習済みモデルが強力な武器になる。」
あなた:「BERT は Google、GPT は OpenAI ですよね。どちらも Transformer ベースだけど、アプローチが違うと聞きました。」
田中VPoE:「その通り。BERT は双方向、GPT は単方向。それぞれの特性を理解して、タスクに合ったモデルを選べるようになろう。」
事前学習と微調整のパラダイム
BERT も GPT も「大量のテキストで事前学習 → 特定タスクで微調整」という2段階のアプローチを取ります。
Phase 1: 事前学習(Pre-training)
大量のテキスト(Wikipedia、書籍等)で言語の一般的知識を学習
→ 数十億パラメータのモデルが汎用的な言語理解を獲得
Phase 2: 微調整(Fine-tuning)
特定のタスク(感情分析、質問応答等)のデータで追加学習
→ 少量のラベル付きデータでも高精度を達成
BERT(Bidirectional Encoder Representations from Transformers)
双方向の文脈理解
BERT は Transformer の Encoder のみを使用し、文の左右両方向から文脈を理解します。
入力: "この [MASK] はデザインが良い"
左方向の文脈: "この" →
右方向の文脈: ← "はデザインが良い"
BERT の予測: [MASK] = "商品"(双方向の文脈を利用)
事前学習タスク
| タスク | 内容 | 目的 |
|---|---|---|
| MLM(Masked Language Model) | 入力の15%をマスクし、元の単語を予測 | 双方向の文脈理解 |
| NSP(Next Sentence Prediction) | 2文が連続しているか判定 | 文間の関係理解 |
BERT の使い方
from transformers import BertTokenizer, BertModel, BertForSequenceClassification
# トークナイザーとモデルの読み込み
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# テキストをトークン化
text = "This product has excellent design quality"
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
print(f"トークン: {tokenizer.convert_ids_to_tokens(inputs['input_ids'][0])}")
# モデルで推論
outputs = model(**inputs)
# [CLS] トークンの出力を文全体の表現として使用
cls_output = outputs.last_hidden_state[:, 0, :]
print(f"[CLS] 出力: {cls_output.shape}") # (1, 768)
GPT(Generative Pre-trained Transformer)
単方向の自己回帰モデル
GPT は Transformer の Decoder のみを使用し、左から右への単方向で次の単語を予測します。
入力: "この商品はデザインが"
GPT の予測:
"この" → P("商品" | "この")
"商品" → P("は" | "この商品")
"は" → P("デザイン" | "この商品は")
"デザインが" → P("良い" | "この商品はデザインが")
GPT の特徴
from transformers import GPT2Tokenizer, GPT2LMHeadModel
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
# テキスト生成
input_text = "Deep learning is"
inputs = tokenizer(input_text, return_tensors='pt')
outputs = model.generate(
inputs['input_ids'],
max_new_tokens=50,
temperature=0.7,
do_sample=True,
top_p=0.9
)
generated = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"生成テキスト: {generated}")
BERT vs GPT 比較
| 特性 | BERT | GPT |
|---|---|---|
| 方向性 | 双方向(Encoder) | 単方向(Decoder) |
| 事前学習 | マスク言語モデル | 次単語予測 |
| 得意なタスク | 分類、質問応答、NER | テキスト生成、対話 |
| 入力の理解 | 文全体を一度に処理 | 左から右に逐次処理 |
| 出力 | 各トークンの表現ベクトル | 次のトークンの確率分布 |
タスク別の推奨モデル
| タスク | 推奨 | 理由 |
|---|---|---|
| 感情分析 | BERT | 文全体の理解が必要 |
| テキスト分類 | BERT | 双方向の文脈が有効 |
| 固有表現抽出 | BERT | トークンレベルの分類 |
| テキスト生成 | GPT | 自己回帰的な生成が得意 |
| 対話システム | GPT | 応答の生成に適する |
| 質問応答 | BERT / GPT | タスクの種類による |
日本語モデル
NetShop のレビューは日本語なので、日本語に対応したモデルを使用します。
# 日本語 BERT
from transformers import AutoTokenizer, AutoModel
# 東北大学の日本語 BERT
tokenizer = AutoTokenizer.from_pretrained('tohoku-nlp/bert-base-japanese-v3')
model = AutoModel.from_pretrained('tohoku-nlp/bert-base-japanese-v3')
text = "この商品はデザインが素晴らしい"
inputs = tokenizer(text, return_tensors='pt')
outputs = model(**inputs)
print(f"トークン: {tokenizer.convert_ids_to_tokens(inputs['input_ids'][0])}")
| モデル | 提供元 | 特徴 |
|---|---|---|
| bert-base-japanese-v3 | 東北大学 | 日本語 Wikipedia で学習 |
| rinna/japanese-gpt2-medium | rinna | 日本語テキスト生成 |
| line-corporation/japanese-large-lm | LINE | 大規模日本語モデル |
モデルのサイズと性能
BERT-base: 110M パラメータ, 12層, 768次元
BERT-large: 340M パラメータ, 24層, 1024次元
GPT-2: 117M〜1.5B パラメータ
GPT-3: 175B パラメータ
GPT-4: 非公開(推定1T以上)
まとめ
- BERT は双方向 Encoder で文脈理解に優れ、分類・抽出タスクに適する
- GPT は単方向 Decoder で次単語予測に基づき、テキスト生成に適する
- 事前学習 → 微調整のパラダイムにより、少量データでも高精度を達成
- 日本語では東北大学の BERT や rinna の GPT が利用可能
- NetShop のレビュー感情分析には日本語 BERT が最適
チェックリスト
- BERT と GPT の構造の違い(双方向 vs 単方向)を説明できる
- BERT の事前学習タスク(MLM、NSP)を理解した
- タスクに応じた BERT / GPT の使い分けを理解した
- Hugging Face Transformers ライブラリの基本的な使い方を把握した
推定読了時間: 30分