LESSON

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 比較

特性BERTGPT
方向性双方向(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-mediumrinna日本語テキスト生成
line-corporation/japanese-large-lmLINE大規模日本語モデル

モデルのサイズと性能

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分