BERT vs. GPT:エンコーダーモデルとデコーダーモデル完全ガイド

BERT vs. GPT The Ultimate Guide to Encoder and Decoder Models

AIアプリケーションを構築する際、BERTを選ぶかGPTを選ぶかは、単なる好みの問題ではありません。それは、あなたのモデルに「読ませる」必要があるのか、それとも「書かせる」必要があるのかという、構造的な決定事項なのです。

どちらも2018年にGoogleによって発表された革新的なTransformer(トランスフォーマー)アーキテクチャに由来しますが、根本的に異なる問題を解決するために、エンジンの異なる部分を使用しています。この違いを誤解すると、パフォーマンスの低下や計算リソースの無駄遣いにつながります。

本ガイドでは、両者の仕組み、ユースケース、そしてコード実装について詳しく解説します。

中核概念:Transformerの分離

オリジナルのTransformerアーキテクチャは、2つのスタック(積み重ね)で構成されています。

  1. エンコーダー (The Encoder): 入力を処理します。文脈を理解するように設計されています。
  2. デコーダー (The Decoder): 出力を生成します。次のステップを予測するように設計されています。

現代の大規模言語モデル(LLM)は通常、この方程式のどちらか半分に特化しています。

BERT (Bidirectional Encoder Representations from Transformers)

BERTはエンコーダーのみ(Encoder-only)のモデルです。双方向(Bi-directional)であり、単語の文脈を左と右の両方から同時に見ることができます。

  • 例え: 古文書を読む学者。前後の文脈から曖昧な単語の意味を理解するために、文全体を同時に見渡します。
  • 強み(スーパーパワー): 理解、分類、検索。

GPT (Generative Pre-trained Transformer)

GPTはデコーダーのみ(Decoder-only)のモデルです。自己回帰(Auto-regressive)、つまり単方向であり、左から右へと読み進めます。「未来」のトークン(単語)を見ることはできません。過去の履歴のみに基づいて、次の単語を予測します。

  • 例え: 演説の原稿をライブで書いているスピーチライター。一貫性を保つために、直前の単語に続いてどの単語が最も自然に流れるかという点に全神経を集中させます。
  • 強み(スーパーパワー): 生成、チャット、テキスト補完。

アーキテクチャの可視化

違いは、Attention(注意機構)を通じて情報がどのように流れるかにあります。

graph TD
    subgraph "BERT (エンコーダー)"
    A["入力: 'The bank of the river'"] --> B["Self-Attention (双方向)"]
    B --> C["'bank' は 'The', 'of', 'river' を参照する"]
    C --> D["出力: 文脈化された埋め込み表現"]
    end

    subgraph "GPT (デコーダー)"
    E["入力: 'The bank of'"] --> F["Masked Self-Attention (単方向)"]
    F --> G["'of' は 'The', 'bank' のみを参照する"]
    G --> H["出力: 予測 'the'"]
    end
    
    style A fill:#e1f5fe,stroke:#01579b
    style E fill:#fff3e0,stroke:#e65100

機能比較マトリックス

機能 BERT (エンコーダー) GPT (デコーダー)
方向性 双方向 (左 <-> 右) 単方向 (左 -> 右)
主なタスク 理解 / 識別 生成
事前学習の目標 マスク化言語モデリング (穴埋め問題) 因果的言語モデリング (次のトークン予測)
最適なユースケース 感情分析、固有表現抽出(NER)、スパム検出、セマンティック検索 チャットボット、コード生成、ストーリー作成、要約
入力制限 固定 (通常 512 トークン) 柔軟 (可変コンテキストウィンドウ)

実装:コードで見る違い

実際の動作の違いを確認するために、Hugging FaceのPythonライブラリ transformers を使用してみましょう。

1. BERTによる理解(特徴量抽出)

BERTを使用して、テキストをその意味を表すベクトル(数値)に変換します。ここでは、モデルに「話す」ことは求めていない点に注目してください。

from transformers import BertTokenizer, BertModel
import torch

# 1. BERT(エンコーダー)の初期化
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

text = "The bank of the river."
inputs = tokenizer(text, return_tensors="pt")

# 2. 隠れ状態(Hidden States)を取得するためのフォワードパス
with torch.no_grad():
    outputs = model(**inputs)

# 'last_hidden_state' には、各トークンの文脈化された埋め込みが含まれます
# 形状: [バッチサイズ, シーケンス長, 隠れ層サイズ]
embeddings = outputs.last_hidden_state

print(f"Vector Shape: {embeddings.shape}")
# 出力例: torch.Size([1, 7, 768]) 

2. GPTによる生成

GPTを使用してテキストを生成します。モデルは一度に1つのトークンを予測するため、ループ処理(または generate ユーティリティ)が必要です。

from transformers import GPT2Tokenizer, GPT2LMHeadModel

# 1. GPT(デコーダー)の初期化
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')

prompt = "The future of AI is"
inputs = tokenizer(prompt, return_tensors="pt")

# 2. テキスト生成(自己回帰ループは内部で処理されます)
output_sequences = model.generate(
    input_ids=inputs['input_ids'],
    max_length=20,
    temperature=0.7,
    num_return_sequences=1,
    do_sample=True
)

generated_text = tokenizer.decode(output_sequences[0], skip_special_tokens=True)
print(f"Generated: {generated_text}")
# 出力例: Generated: The future of AI is likely to be shaped by the development of new technologies...

ステップ・バイ・ステップ:選び方

プロジェクトに最適なアーキテクチャを選ぶために、以下のロジックフローに従ってください。

  1. 出力を定義する:
    • 出力は「ラベル」ですか?(例:「ポジティブ」「スパム」「カテゴリA」) -> BERTを使用
    • 出力は「数値」ですか?(例:ニュースに基づく株価予測) -> BERTを使用
    • 出力は「新しいテキスト」ですか? -> GPTを使用
  2. 文脈の要件を評価する:
    • 文頭の意味が、文末の内容に依存していますか?(例:DNA配列解析、複雑な法的条項の解釈など)
    • アクション: はいの場合、エンコーダーモデルの持つ双方向性が優れています。
  3. レイテンシ(遅延)を考慮する:
    • エンコーダーモデルは入力を一度のパスで処理するため、分類タスクにおいては一般的に高速です。
    • デコーダーモデルは生成される単語ごとにモデルを順次実行する必要があるため、生成タスクにおいては低速になります。

数学的直感

核心的な違いは、確率計算の方法にあります。

GPT (自己回帰 / Auto-regressive):
シーケンス $W$ の確率は、条件付き確率の積で表されます。

BERT (マスク化オートエンコーディング / Masked Auto-encoding):
BERTは、シーケンス内のその他すべてのトークンを与えられた状態で、マスクされたトークン $w_i$ を予測します。

パワーユーザー向けのプロ・ヒント

  • 埋め込み(Embedding)の品質: セマンティック検索やクラスタリングに、生のGPT埋め込みを使用しないでください。GPTは左側しか見ないため、最後の単語の埋め込みは直近の文脈を過剰に表現しがちです。BERT(またはS-BERT)の方が、圧倒的に優れた文埋め込みを生成します。
  • 「エンコーダー・デコーダー」という中間地点: テキストを入力してテキストを出力する必要がある場合(翻訳や要約など)、T5BARTを使用してください。これらのモデルは、ソーステキストを読むためのエンコーダーと、翻訳を生成するためのデコーダーという、両方のスタックを活用します。
  • インストラクション・チューニング: 現代の「チャット」モデル(ChatGPTやLlama 3など)は、指示を理解しているかのように振る舞うよう調整(Fine-tuned)されたデコーダー専用モデルです。これらはデコーダーですが、その圧倒的なスケールにより、かつてはエンコーダーの領域であった推論タスクも実行できるようになっています。

要約: マシンに分析、分類、または検索をさせる必要がある場合は、エンコーダー (BERT) を使用してください。マシンに創造、会話、または文章の拡張をさせる必要がある場合は、デコーダー (GPT) を使用してください。