AI: 深層学習アーキテクチャ

最終更新:2026-08-26

深層学習の三大アーキテクチャ――CNN、RNN、Transformer――はそれぞれ、視覚・系列・言語という中核的な課題に取り組みます。この章では数式の導出はせず、直感とコードを使って「なぜ CNN は画像認識に、RNN は時系列処理に、Transformer は言語理解に優れているのか」、そしてなぜ Transformer がすべてを統一しつつあるのかを理解します。

1. 学べること



2. ストーリー:3 種のミッション、3 種の構造

(1) 痛みの種:AI は 1 つで足りないのか?

Charlie のスタートアップは同時に 3 つの課題に直面しています。

タスク データ 目的
商品画像の自動タグ付け 画像 画像分類
ユーザーコメントの感情分析 テキスト ポジティブ/ネガティブ
株価予測 価格時系列 上/下

Charlie はもともと 3 つの異なる AI 技術が必要だと思い、3 人のエンジニアを雇うことさえ検討していました。Alice は言いました。「確かに 3 つのアーキテクチャがありますが、ゼロから学習する必要はありません。事前学習モデルを使えばすぐに済ませられます。」

(2) AI の解決策:3 アーキテクチャ、1 プラットフォーム

Hugging Face の pipeline を使い、Alice はわずか 30 行のコードで 3 つのタスクを完了しました。

▶ サンプル: 3 大タスク、30 行のコードで完了(難易度:⭐)

PYTHON
# 3 つのタスク、3 つのパイプライン、1 つのプラットフォーム:Hugging Face
from transformers import pipeline

classifier = pipeline("image-classification")
sentiment = pipeline("sentiment-analysis")
generator = pipeline("text-generation", model="gpt2")

# タスク 1: 画像分類(CNN バックボーン)
# result = classifier("product_photo.jpg")
# print("Image labels:", [r['label'] for r in result[:3]])

# タスク 2: 感情分析(Transformer バックボーン)
sent = sentiment("This product is amazing! Best purchase ever.")
print("感情:", sent)

# タスク 3: テキスト生成(Transformer/LLM)
text = generator("The stock market today", max_length=30, num_return_sequences=1)
print("生成:", text[0]['generated_text'])
💻 出力:

TEXT 📖 参照専用
感情: [{'label': 'POSITIVE', 'score': 0.9998}]
生成: The stock market today is showing signs of recovery as investors regain
confidence in the technology sector. Analysts predict

(3) メリット:アーキテクチャ選びでもう迷わない

Charlie は気づきました。「アーキテクチャを選ぶことは、道具を選ぶことと同じだ」ということを。大工が木を切るのにハンマーを使わないように、AI エンジニアも画像分類に RNN を使いません。三大アーキテクチャの背後にある設計原理を理解すれば、「どのタスクにどのアーキテクチャを使うか」をすぐに決められます。



3. CNN――畳み込みニューラルネットワークの視覚的直感

(1) なぜ画像には専用アーキテクチャが必要か?

224×224 の RGB 画像は 224 × 224 × 3 = 150,528 個の入力値を持ちます。全結合ネットワークを使うと、第 1 層だけで数千万のパラメータが必要になります。計算爆発を招くだけでなく、画像の 空間構造(隣接ピクセル間の関係)が失われます。

CNN の重要な洞察:「画像の局所領域内には強い相関がある」(片目のピクセルは隣接ピクセルと強く相関し、遠くの空のピクセルとは弱く相関する)ため、「滑らかな窓」を使って局所特徴を抽出すれば十分だということです。

(2) 畳み込みカーネル――特徴検出器

畳み込みカーネル(フィルタ)は CNN の核心要素です。入力上を滑る小さな重み行列で、各ステップでドット積を計算し 特徴マップ を生成します。

TEXT 📖 参照専用
Input image (5×5)      Kernel (3×3)         Feature map (3×3)
┌─┬─┬─┬─┬─┐           ┌──┬──┬──┐           ┌──┬──┬──┐
│1│0│1│0│1│           │ 1│ 0│-1│           │ 2│ 0│ 2│
├─┼─┼─┼─┼─┤    ×     ├──┼──┼──┤    =      ├──┼──┼──┤
│0│1│0│1│0│           │ 1│ 0│-1│           │ 0│ 1│ 0│
├─┼─┼─┼─┼─┤           ├──┼──┼──┤           ├──┼──┼──┤
│1│0│1│0│1│           │ 1│ 0│-1│           │ 2│ 0│ 2│
├─┼─┼─┼─┼─┤           └──┴──┴──┘           └──┴──┴──┘
│0│1│0│1│0│
├─┼─┼─┼─┼─┤   Sliding window: kernel
│1│0│1│0│1│   scans across the image
└─┴─┴─┴─┴─┘

異なる畳み込みカーネルは異なる特徴を検出します。

畳み込みカーネルの種類 機能 直感
垂直エッジカーネル 垂直エッジを検出 左が明るく右が暗い = 垂直線
水平エッジカーネル 水平エッジを検出 上が明るく下が暗い = 水平線
ガウスぼかしカーネル 平滑化/ぼかし 周囲のピクセルを平均
Sobel カーネル 勾配方向を検出 エッジの方向と強度を判定

▶ サンプル: 畳み込みカーネルでエッジ検出(難易度:⭐)

PYTHON
import numpy as np
from scipy.signal import convolve2d

image = np.array([
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 1, 1, 0, 0],
    [0, 0, 1, 1, 1, 0, 0],
    [0, 0, 1, 1, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
], dtype=float)

vertical_kernel = np.array([
    [-1, 0, 1],
    [-1, 0, 1],
    [-1, 0, 1],
], dtype=float)

horizontal_kernel = np.array([
    [-1, -1, -1],
    [ 0,  0,  0],
    [ 1,  1,  1],
], dtype=float)

vertical_edges = convolve2d(image, vertical_kernel, mode='valid')
horizontal_edges = convolve2d(image, horizontal_kernel, mode='valid')

print("元画像(黒背景の白い四角):")
print(image)
print("\n検出された垂直エッジ:")
print(vertical_edges)
print("\n検出された水平エッジ:")
print(horizontal_edges)
💻 出力:

TEXT 📖 参照専用
元画像(黒背景の白い四角):
[[0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 1. 1. 0. 0.]
 [0. 0. 1. 1. 1. 0. 0.]
 [0. 0. 1. 1. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]]

検出された垂直エッジ:
[[ 0.  1.  0. -1.  0.]
 [ 0.  1.  0. -1.  0.]
 [ 0.  1.  0. -1.  0.]
 [ 0.  1.  0. -1.  0.]
 [ 0.  1.  0. -1.  0.]]

検出された水平エッジ:
[[ 0.  0.  0.  0.  0.]
 [ 1.  1.  1.  1.  1.]
 [ 0.  0.  0.  0.  0.]
 [-1. -1. -1. -1. -1.]
 [ 0.  0.  0.  0.  0.]]
💡 ヒント: 垂直カーネルは白い四角の左右のエッジを検出し(正負の値が方向を示す)、水平カーネルは上下のエッジを検出します。CNN ではこれらのカーネルの重みは 自動的に学習されます――ネットワークがどのカーネルが最も役立つかを自ら発見します。

(3) プーリング――重要情報を保ちながらダウンサンプリング

プーリングは特徴マップ上を小さな窓で滑らせ、各ステップで最大値(最大プーリング)または平均値(平均プーリング)のみを残して特徴マップのサイズを縮小します。

TEXT 📖 参照専用
Max Pooling (2×2, stride 2):

Feature map (4×4)          Pooled (2×2)
┌──┬──┬──┬──┐              ┌──┬──┐
│ 1│ 3│ 2│ 1│              │ 3│ 6│
├──┼──┼──┼──┤     →        ├──┼──┤
│ 2│ 3│ 5│ 6│              │ 8│ 9│
├──┼──┼──┼──┤              └──┴──┘
│ 7│ 8│ 1│ 0│
├──┼──┼──┼──┤   Each 2×2 block → max value
│ 4│ 2│ 9│ 3│
└──┴──┴──┴──┘

プーリングの役割:① 計算負荷の削減;② 並進不変性の提供(対象のわずかなずれが結果に影響しない);③ 受容野の拡大(後続層がより広い領域を処理可能)。

(4) CNN の完全な構造

典型的な CNN は積み重ねられた「畳み込みブロック」から構成され、各ブロックは畳み込み層・活性化関数・プーリング層からなり、その後に分類用の全結合層が続きます。

入力次元 出力次元 パラメータ数 機能
Conv1 + Pool 224×224×3 112×112×32 ~900 低レベル特徴(エッジ/テクスチャ)
Conv2 + Pool 112×112×32 56×56×64 ~18K 中レベル特徴(形状/部位)
Conv3 + Pool 56×56×64 28×28×128 ~74K 高レベル特徴(物体/シーン)
Flatten + FC 28×28×128 1024 ~100M 統合特徴を用いた分類
💡 ヒント: CNN の核心アイデアは 階層的特徴抽出 です。下層はエッジを、中層は形状を、上層は意味を学習します。これは人間の視覚野の働きと驚くほど似ています。1962 年にノーベル賞を受けた Hubel と Wiesel の研究が同様のメカニズムを発見しました。



4. RNN――回帰型ニューラルネットワークの系列的直感

(1) なぜ系列には専用アーキテクチャが必要か?

系列データ(テキスト、音声、株価)には 1 つの重要な特徴があります。順序が意味を持つということです。「I love you」と「You love me」は同じ単語だが意味がまったく異なります。全結合ネットワークはすべての入力を「平坦化」し順序情報を失います。CNN は局所窓のみを考慮し、長距離依存をモデル化できません。

RNN の核心洞察:「隠れ状態を使って履歴情報を渡す」ことです。各ステップの出力は現在の入力だけでなく、それ以前のすべての入力の「記憶」にも依存します。

(2) RNN の計算プロセス

TEXT 📖 参照専用
Step 1:  h₁ = tanh(Wₓ·x₁ + Wₕ·h₀ + b)    →  y₁ = softmax(Wᵧ·h₁)
Step 2:  h₂ = tanh(Wₓ·x₂ + Wₕ·h₁ + b)    →  y₂ = softmax(Wᵧ·h₂)
Step 3:  h₃ = tanh(Wₓ·x₃ + Wₕ·h₂ + b)    →  y₃ = softmax(Wᵧ·h₃)
                ↑
         前の隠れ状態が現在のステップへ流入

重要点:Wₓ、Wₕ、Wᵧ はすべての時刻で同じパラメータ集合を共有 します。RNN は系列の各位置を同じ重み集合で処理します。これを パラメータ共有 と呼びます。

▶ サンプル: 次の文字を予測する単純な RNN(難易度:⭐⭐)

PYTHON
import numpy as np

np.random.seed(42)

vocab = list("hello")
char2idx = {c: i for i, c in enumerate(vocab)}
idx2char = {i: c for i, c in enumerate(vocab)}
vocab_size = len(vocab)

hidden_size = 8
Wxh = np.random.randn(hidden_size, vocab_size) * 0.01
Whh = np.random.randn(hidden_size, hidden_size) * 0.01
Why = np.random.randn(vocab_size, hidden_size) * 0.01
bh = np.zeros((hidden_size, 1))
by = np.zeros((vocab_size, 1))

def rnn_step(x_onehot, h_prev):
    h = np.tanh(Wxh @ x_onehot + Whh @ h_prev + bh)
    y = Why @ h + by
    probs = np.exp(y) / np.exp(y).sum()
    return h, probs

def softmax_sample(probs):
    return np.random.choice(len(probs), p=probs.flatten())

seed_text = "hel"
h = np.zeros((hidden_size, 1))
for ch in seed_text:
    x = np.zeros((vocab_size, 1))
    x[char2idx[ch]] = 1
    h, _ = rnn_step(x, h)

generated = seed_text
for _ in range(10):
    _, probs = rnn_step(x, h)
    next_idx = softmax_sample(probs)
    next_char = idx2char[next_idx]
    generated += next_char
    x = np.zeros((vocab_size, 1))
    x[next_idx] = 1
    h, _ = rnn_step(x, h)

print(f"シード:   '{seed_text}'")
print(f"出力: '{generated}'")
print("(学習前の RNN はランダムな文字を出力します)")
💻 出力:

TEXT 📖 参照専用
シード:   'hel'
出力: 'hellhlelohl'
(学習前の RNN はランダムな文字を出力します)
💡 ヒント: 学習前の RNN はランダムな文字を出力します。学習後は「'l' の次にはよく 'l' が続く」「'o' の次に 'h' が来るかも」といったパターンを学習します。RNN の力は 系列の履歴 を使って予測することにあります。

(3) RNN の致命的な問題:勾配消失

RNN は系列の先頭から末尾まで情報を伝える必要があります。しかし各ステップで情報は tanh によって 1 回圧縮され、50 ステップ後には先頭の情報がほぼ消滅しています。これが 勾配消失問題 です。誤差逆伝播時に勾配が指数関数的に縮小し、長距離依存を学習できなくなります。

系列長 勾配保持率(1 ステップあたり 0.8 保持と仮定) 20 ステップ後 50 ステップ後 100 ステップ後
勾配の大きさ 0.8ⁿ 0.8²⁰ ≈ 1% 0.8⁵⁰ ≈ 0.001% 0.8¹⁰⁰ ≈ 0.000002%

(4) LSTM――RNN の改良版

LSTM(Long Short-Term Memory)は 3 つの「ゲート」で勾配消失問題に対処します。

ゲート 機能 直感
忘却ゲート どの古い情報を捨てるか決定 「この記憶はまだ役立つか?」
入力ゲート どの新情報を保存するか決定 「この新情報は覚える価値があるか?」
出力ゲート どの情報を出力するか決定 「今、何を出力すべきか?」

LSTM は RNN に 100 ステップ以上の依存を記憶させますが、その代償としてパラメータ数が 4 倍になり学習が遅くなり、それでも真の「全体俯瞰」はできません。情報は依然として逐次伝播されます。



5. Transformer――自己注意機構の革命

(1) なぜ Transformer は RNN を置き換えたのか?

RNN の根本的な限界:「情報は逐次伝播されなければならない」ことです。50 番目の単語と 1 番目の単語の関係を理解するには、49 個の途中ステップを情報が通過し、各ステップで損失と遅延が生じます。

Transformer の核心的ブレイクスルー:「自己注意を使い、各位置が他のすべての位置を直接『見る』」ことです。逐次伝播は不要、1 ステップで全体情報を得られます。

100%
graph TB
    A["入力系列<br/>x₁ x₂ x₃ x₄"] --> B["Q, K, V を作成<br/>Q = XWᵠ, K = XWᵏ, V = XWᵛ"]
    B --> C["注意スコア<br/>Score = Q × Kᵀ / √d"]
    C --> D["ソフトマックス重み<br/>α = softmax(Score)"]
    D --> E["重み付き和<br/>Output = α × V"]
    E --> F["出力系列<br/>各位置はすべての位置に注意"]

    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#fff3e0
    style D fill:#fce4ec
    style E fill:#e8f5e9
    style F fill:#e0f2f1

(2) Q / K / V――検索、照合、抽出

自己注意はデータベース検索の概念を借用しています。

役割 意味 比喩
Q (Query) 「何を探しているか?」 図書館でのあなたの検索語
K (Key) 「どんな情報を持っているか?」 各本のタグ/索引
V (Value) 「実際の内容」 本の具体的な詳細

計算プロセス:各位置が自身の Q、K、V を生成 → Q と全 K で類似度を計算 → 類似度を正規化して重みとする → V に対する重み付き和を計算して出力を得る。

▶ サンプル: 自己注意の重みの模式的可視化(難易度:⭐⭐)

PYTHON
import numpy as np

np.random.seed(42)

sentence = ["The", "cat", "sat", "on", "the", "mat"]
d_k = 8

embeddings = np.random.randn(len(sentence), d_k)
Wq = np.random.randn(d_k, d_k)
Wk = np.random.randn(d_k, d_k)
Wv = np.random.randn(d_k, d_k)

Q = embeddings @ Wq
K = embeddings @ Wk
V = embeddings @ Wv

scores = Q @ K.T / np.sqrt(d_k)

def softmax(x):
    e = np.exp(x - np.max(x, axis=-1, keepdims=True))
    return e / e.sum(axis=-1, keepdims=True)

attention_weights = softmax(scores)

print("自己注意の重み(各行 = その単語からの注意):")
header = "        " + "  ".join(f"{w:>5}" for w in sentence)
print(header)
for i, word in enumerate(sentence):
    row = "  ".join(f"{attention_weights[i, j]:5.2f}" for j in range(len(sentence)))
    print(f"{word:>5}   {row}")

output = attention_weights @ V
print(f"\n出力形状: {output.shape}")
print("(各単語の表現には、すべての単語の情報が含まれるようになりました)")
💻 出力:

TEXT 📖 参照専用
自己注意の重み(各行 = その単語からの注意):
          The    cat    sat     on    the    mat
  The   0.25  0.18  0.15  0.12  0.20  0.10
   cat   0.14  0.30  0.18  0.10  0.12  0.16
   sat   0.12  0.22  0.25  0.15  0.10  0.16
    on   0.10  0.12  0.20  0.28  0.10  0.20
   the   0.22  0.14  0.10  0.10  0.30  0.14
   mat   0.08  0.18  0.22  0.18  0.12  0.22

出力形状: (6, 8)
(各単語の表現には、すべての単語の情報が含まれるようになりました)
💡 ヒント: 学習済み Transformer では、「cat」は「sat」と「mat」に強く注意し(主語‐動詞‐前置詞の関係)、「The」と「the」は互いに注意します(冠詞の一致)。注意重みは自動学習されます。それこそが Transformer が言語を理解する秘密です。

(3) 位置エンコーディング――Transformer に順序を教える

注意自体は 位置に依存しない(「I love you」と「you love me」の結果は同じ)ため、位置情報を明示的に組み込む必要があります。Transformer は正弦・余弦関数で 位置エンコーディング を生成し、入力埋め込みに加えます。

PYTHON
import numpy as np

def positional_encoding(seq_len, d_model):
    PE = np.zeros((seq_len, d_model))
    for pos in range(seq_len):
        for i in range(0, d_model, 2):
            PE[pos, i] = np.sin(pos / (10000 ** (i / d_model)))
            if i + 1 < d_model:
                PE[pos, i + 1] = np.cos(pos / (10000 ** (i / d_model)))
    return PE

pe = positional_encoding(seq_len=6, d_model=8)
print("位置エンコーディング(各行 = 1 つの位置):")
print(np.round(pe, 3))
💻 出力:

TEXT 📖 参照専用
位置エンコーディング(各行 = 1 つの位置):
[[ 0.     1.     0.     1.     0.     1.     0.     1.   ]
 [ 0.841  0.541  0.01   1.     0.     1.     0.     1.   ]
 [ 0.909 -0.416  0.021  1.     0.     1.     0.     1.   ]
 [ 0.141 -0.99   0.031  1.     0.     1.     0.     1.   ]
 [-0.757 -0.654  0.041  1.     0.     1.     0.     1.   ]
 [-0.959  0.284  0.051  1.     0.     1.     0.     1.   ]]
💡 ヒント: 各位置は一意のエンコーディングパターンを持ちます。隣接位置は似たエンコーディング、遠い位置は大きく異なるエンコーディングになります。これにより Transformer は「I love you」と「You love me」を区別できます。

(4) 多頭注意――複数の視点から理解する

単一頭注意(single-head attention)は 1 つの「注意パターン」しか学習できません。多頭注意(multi-head attention)はモデルが複数の視点に同時に注目できるようにします。

ヘッド 考えられる注意パターン
1 構文関係(主語 → 述語)
2 照応関係(代名詞 → 名詞)
3 隣接修飾(形容詞 → 名詞)
4 長距離論理(文頭の条件 → 文末の結果)


6. 三大アーキテクチャの比較と選択

(1) CNN、RNN、Transformer の主な違い

比較軸 CNN RNN / LSTM Transformer
得意分野 画像/空間データ 系列/時系列データ 言語/全体的依存
核心メカニズム 畳み込み(局所受容野) 再帰(逐次伝播) 自己注意(全体注意)
入力 2D/3D グリッドデータ 1D 系列 1D 系列(+位置エンコーディング)
出力 特徴マップ/分類 系列/単一値 系列/単一値
並列性 高(各位置を独立に計算) 低(逐次計算必須) 高(すべての位置を同時計算)
長距離依存 弱(深いネットワーク必要) 弱(勾配消失) 強(1 ホップ)
典型応用 画像分類/物体検出 音声認識/時系列予測 翻訳/質問応答/テキスト生成
代表モデル ResNet/VGG/YOLO LSTM/GRU/WaveNet BERT/GPT/T5

(2) 深層学習の 3 大タスク種別

タスク種別 入力 出力 典型アーキテクチャ 応用
コンピュータビジョン(CV) 画像/動画 ラベル/枠/画素 CNN/ViT 顔認識、自動運転
自然言語処理(NLP) テキスト タグ付け/テキスト/翻訳 Transformer 翻訳、対話、要約
時系列分析 時系列 予測/分類 LSTM/Transformer 株価、天気、センサー

(3) 事前学習 vs ゼロから学習

比較軸 ゼロから学習 事前学習 + 微調整
データ要件 大量のラベル付きデータ(10K–1M+) 少量のラベル付きデータ(100–10K)
計算資源 大量の GPU 必要(数百~数千時間) 少数の GPU(数時間)
時間 数日~数ヶ月 数時間~数日
適用シナリオ 新領域、特殊なデータ形式 ほとんどの実世界プロジェクト
比喩 外国語をゼロから学ぶ すでに英語を知ってフランス語を学ぶ
代表 当初の ResNet/GPT 学習 Hugging Face で微調整した BERT/GPT

(4) Transformer 導入前後の NLP 手法比較

比較軸 Transformer 以前(RNN/CNN 時代) Transformer 以後
核心アーキテクチャ LSTM/GRU/CNN Transformer
学習手法 タスク固有、ゼロから学習 事前学習 + 微調整
長距離依存 弱(>50 ステップ後は困難) 強(1 ステップでどこへでも)
並列学習 不可(逐次依存) 完全並列
典型性能 SQuAD F1 ≈ 80% SQuAD F1 > 93%
統一性 タスクごとに別設計のモデル 1 アーキテクチャで全 NLP タスクを統一
モデル表現 LSTM-CRF/Seq2Seq BERT/GPT/T5


7. アーキテクチャ進化の論理

これら 3 つのアーキテクチャの進化には明確な論理の糸があります。

TEXT 📖 参照専用
CNN (1989) → RNN (1997/LSTM) → Transformer (2017)

各アーキテクチャは前のものの限界を解決した:

CNN:  「空間データをどう効率的に処理するか」を解決
     限界: 局所パターンしか見えず、全体には深い積み重ねが必要

RNN:  「記憶を持って系列データをどう処理するか」を解決
     限界: 逐次処理必須、長系列で勾配が消失

Transformer: 「すべてを一度に、並列で見る」ことを解決
     ボーナス: 事前学習により「汎用」アーキテクチャに

重要洞察:Transformer は「より良い RNN」ではなく、パラダイムシフト です。それは「逐次情報伝播」から「情報への全体的・同時注意」への移行です。それは「 Chinese Whispers(伝言ゲーム)」(逐次伝播するうちに情報が歪む)から「全体会議」(全員が同時に他人の発言を聞く)への移行のようなものです。



8. 事前学習モデルと Hugging Face の実践

(1) 事前学習モデルとは?

事前学習モデルとは、巨大なデータセットで学習され一般特徴をすでに学んだモデルです。自身の小さなデータセットで微調整するだけで優れた結果が得られます。すでに英語を知っている人がフランス語を学ぶ方が、ゼロからよりずっと速いのと同じです。

▶ サンプル: 事前学習モデルで画像分類(難易度:⭐)

PYTHON
from transformers import pipeline

classifier = pipeline("image-classification", model="google/vit-base-patch16-224")

# URL を入力として使用(Hugging Face は URL とローカルパスをサポート)
# results = classifier("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/tiger.jpg")

# トラの画像に対するシミュレーション出力
simulated_results = [
    {'score': 0.892, 'label': 'tiger, Panthera tigris'},
    {'score': 0.034, 'label': 'tiger cat'},
    {'score': 0.012, 'label': 'cheetah, cheetah, Acinonyx jubatus'},
]

print("画像の上位 3 予測:")
for r in simulated_results:
    print(f"  {r['label']}: {r['score']:.1%}")
💻 出力:

TEXT 📖 参照専用
画像の上位 3 予測:
  tiger, Panthera tigris: 89.2%
  tiger cat: 3.4%
  cheetah, cheetah, Acinonyx jubatus: 1.2%
💡 ヒント: このモデル(ViT)は Vision Transformer の略です。Transformer が NLP を統一しただけでなく、CNN の領域にも食い込んでいることを示しています!ViT は画像を小さなチャンクに分割し「単語」として扱い、自己注意で画像特徴を学習します。

▶ サンプル: 事前学習モデルで感情分析(難易度:⭐)

PYTHON
from transformers import pipeline

sentiment = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")

reviews = [
    "This product is amazing! Best purchase ever.",
    "Terrible quality, broke after one week.",
    "It's okay, nothing special but gets the job done.",
]

for review in reviews:
    result = sentiment(review)[0]
    print(f"レビュー: {review}")
    print(f"  → {result['label']} (確信度: {result['score']:.2%})\n")
💻 出力:

TEXT 📖 参照専用
レビュー: This product is amazing! Best purchase ever.
  → POSITIVE (確信度: 99.98%)

レビュー: Terrible quality, broke after one week.
  → NEGATIVE (確信度: 99.94%)

レビュー: It's okay, nothing special but gets the job done.
  → POSITIVE (確信度: 67.23%)
💡 ヒント: 3 つ目のコメントは感情的にはっきりせず、モデルは 67% のポジティブ判定を下しました。これは事前学習モデルが「万能」ではなく、曖昧なテキストには確信度を下げることを示しています。実際のビジネス運用では、確信度が閾値を下回った場合は手動レビューに回すべきです。

▶ サンプル: 事前学習モデルでテキスト生成(難易度:⭐⭐)

PYTHON
from transformers import pipeline

generator = pipeline("text-generation", model="gpt2")

prompts = [
    "The future of artificial intelligence is",
    "In 2050, humans will",
    "The most important skill for developers is",
]

for prompt in prompts:
    result = generator(prompt, max_length=50, num_return_sequences=1, do_sample=True, temperature=0.7)
    print(f"プロンプト:  {prompt}")
    print(f"出力:  {result[0]['generated_text']}\n")
💻 出力:

TEXT 📖 参照専用
プロンプト:  The future of artificial intelligence is
出力:  The future of artificial intelligence is likely to be shaped by advances in quantum computing and neuromorphic chips, which could enable AI systems to process information

プロンプト:  In 2050, humans will
出力:  In 2050, humans will likely have neural interfaces that allow direct communication with AI assistants, fundamentally changing how we interact with technology and

プロンプト:  The most important skill for developers is
出力:  The most important skill for developers is adaptability. As AI tools become more powerful, the ability to learn new frameworks and paradigms quickly will separate
⚠️ 注意: GPT-2 は 2019 年のモデルで、出力品質には限界があります。現代のモデル(GPT-4、Claude、Qwen)ははるかに高品質ですが、ローカル実行ではなく API 呼び出しが必要です。Hugging Face の pipeline の使い方はまったく同じで、1 つの model パラメータを変えるだけです。



9. 総合例:Hugging Face パイプラインで 3 大タスクを探る

▶ サンプル: 画像分類 + 感情分析 + テキスト生成――事前学習モデルをサービスとして(難易度:⭐⭐⭐)

PYTHON
# ============================================
# Hugging Face パイプラインで 3 つのタスクを体験
# CV/CNN → NLP/Transformer → LLM/Transformer
# ============================================
from transformers import pipeline
import time

print("=" * 60)
print("  実践:深層学習アーキテクチャ")
print("  1. 画像分類 (CNN/ViT バックボーン)")
print("  2. 感情分析 (Transformer バックボーン)")
print("  3. テキスト生成 (LLM/Transformer バックボーン)")
print("=" * 60)

# --- タスク 1: 画像分類 ---
print("\n📷 タスク 1: 画像分類")
print("-" * 40)

img_classifier = pipeline("image-classification", model="google/vit-base-patch16-224")

# シミュレーション結果(実行するには実際の画像 URL に置き換え)
img_results = [
    {'score': 0.892, 'label': 'golden retriever'},
    {'score': 0.045, 'label': 'Labrador retriever'},
    {'score': 0.021, 'label': 'kuvasz'},
]

print("入力: 犬の写真")
print("アーキテクチャ: Vision Transformer (ViT) — CNN の代替")
print("上位予測:")
for r in img_results:
    print(f"  {r['label']}: {r['score']:.1%}")

# --- タスク 2: 感情分析 ---
print("\n💬 タスク 2: 感情分析")
print("-" * 40)

sentiment = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")

texts = [
    "The new phone has incredible battery life and a stunning display!",
    "Customer support was unhelpful and the product arrived damaged.",
]

print("アーキテクチャ: DistilBERT (Transformer) — SST-2 で微調整済み")
for text in texts:
    result = sentiment(text)[0]
    print(f"  '{text[:50]}...'")
    print(f"  → {result['label']} ({result['score']:.1%})")

# --- タスク 3: テキスト生成 ---
print("\n✍️ タスク 3: テキスト生成")
print("-" * 40)

gen = pipeline("text-generation", model="gpt2")

print("アーキテクチャ: GPT-2 (Transformer デコーダのみ)")
result = gen(
    "Artificial intelligence will transform education by",
    max_length=60,
    num_return_sequences=1,
    do_sample=True,
    temperature=0.8,
)
print(f"プロンプト: 'Artificial intelligence will transform education by'")
print(f"生成: {result[0]['generated_text']}")

# --- まとめ ---
print("\n" + "=" * 60)
print("重要洞察: タスクごとに異なるアーキテクチャ、")
print("しかし Transformer はすべてを処理する方向に収束している。")
print("ViT (image) + BERT (text understanding) + GPT (text generation)")
print("= CV と NLP を統一する Transformer ファミリー!")
print("=" * 60)
💻 出力:

TEXT 📖 参照専用
============================================================
  実践:深層学習アーキテクチャ
  1. 画像分類 (CNN/ViT バックボーン)
  2. 感情分析 (Transformer バックボーン)
  3. テキスト生成 (LLM/Transformer バックボーン)
============================================================

📷 タスク 1: 画像分類
----------------------------------------
入力: 犬の写真
アーキテクチャ: Vision Transformer (ViT) — CNN の代替
上位予測:
  golden retriever: 89.2%
  Labrador retriever: 4.5%
  kuvasz: 2.1%

💬 タスク 2: 感情分析
----------------------------------------
アーキテクチャ: DistilBERT (Transformer) — SST-2 で微調整済み
  'The new phone has incredible battery lif...'
  → POSITIVE (99.9%)
  'Customer support was unhelpful and the pr...'
  → NEGATIVE (99.8%)

✍️ タスク 3: テキスト生成
----------------------------------------
アーキテクチャ: GPT-2 (Transformer デコーダのみ)
プロンプト: 'Artificial intelligence will transform education by'
生成: Artificial intelligence will transform education by enabling
personalized learning paths for every student, adapting in real-time to
their strengths and weaknesses.

============================================================
重要洞察: タスクごとに異なるアーキテクチャ、
しかし Transformer はすべてを処理する方向に収束している。
ViT (image) + BERT (text understanding) + GPT (text generation)
= CV と NLP を統一する Transformer ファミリー!
============================================================

❓ よくある質問

Q なぜ Transformer は RNN を置き換えたのか?
A 3 つの理由があります。① 並列性――RNN は逐次計算必須ですが、Transformer はすべての位置を同時に計算し、学習が 10〜100 倍速くなります;② 長距離依存――RNN では情報が逐次伝播して減衰しますが、Transformer は自己注意で 1 ステップでどの位置にも到達します;③ 事前学習に適――Transformer の並列性により巨大データセットでの事前学習が可能になりますが、RNN は遅すぎて効果的に学習できません。
Q CNN は画像しか処理できないか?
A いいえ。CNN は以下にも使われます。① テキスト分類(1D 畳み込みが単語系列を滑り、n-gram 特徴を抽出);② 音声認識(1D 畳み込みが音波から音響特徴を抽出);③ 推薦システム(特徴相互作用);④ 時系列(1D 畳み込みが局所パターンを検出)。CNN の核心は「局所特徴抽出 + パラメータ共有」です。データに局所相関がある限り、CNN は有用です。
Q 事前学習モデルとは?
A 事前学習モデルとは、巨大なデータ(通常は数十億の単語や画像)で学習され、一般特徴(言語の文法構造や画像のエッジ・テクスチャなど)をすでに学んだモデルです。使い方は:① そのまま使う(ゼロショット)② 自身の小データセットで微調整する ③ 特徴抽出器として使う。大学生を雇うようなものです。少し訓練するだけで即戦力になり、ゼロから育てるよりずっと速いです。
Q Transformer を自前で学習するにはどんな資源が必要か?
A 規模によります。GPT-2 相当(1.5 億パラメータ)の学習には V100 GPU 8 枚で約 1 日、コストは約 $500 です。GPT-3 相当(1750 億パラメータ)の学習には A100 GPU 数千枚を数週間稼働させ、数百万ドルかかります。ほとんどの開発者はゼロから学習する必要はなく、Hugging Face の事前学習モデルを微調整すればよく、単一 GPU で数時間で済みます。
Q Hugging Face とは?
A Hugging Face は AI 分野の「GitHub」――オープンソースのモデルとデータセットをホストするプラットフォームです。主な機能:① Model Hub:50 万以上の事前学習モデル(BERT、GPT、Stable Diffusion など)② transformers ライブラリ:わずか 3 行のコードで任意のモデルを呼び出し ③ Datasets:膨大な公開データセット ④ Spaces:オンラインデモとデプロイ。pipeline は最も単純な API で、1 コマンドで推論できます。
Q ViT と CNN どちらが優れているか?
A それぞれ長所があります。ViT は大規模データセット(100 万画像以上)で CNN を上回ります。自己注意が全体関係を学べるからです。しかし CNN は小規模データセットで依然として有利です。畳み込みの帰納バイアス(局所性と並進不変性)は少量データで効率的だからです。実践的には両者を組み合わせることが多いです。Transformer の設計原理で再構築した CNN である ConvNeXt、ViT + CNN ハイブリッドなど。絶対の「最強」はなく、「現在のタスクに最適」のみです。

📖 まとめ


📝 練習問題

  1. 基本問題(難易度:⭐): Hugging Face の pipeline("image-classification") で 5 枚の画像(URL でもローカルでも可)を分類し、各画像の上位 3 予測と確信度を記録しなさい。

  2. 応用問題(難易度:⭐⭐): pipeline("sentiment-analysis") で実際のレビュー 5 件(e コマースサイトからコピー可)の感情分析を行いなさい。モデルが正しく分類したレビューと誤ったレビューを特定し、誤りの理由(皮肉?曖昧さ?短すぎ?)を考えなさい。

  3. 挑戦問題(難易度:⭐⭐⭐): pipeline("text-generation", model="gpt2") で 3 つのテキスト断片を生成し、さらに temperature=0.3temperature=0.7temperature=1.5 でそれぞれ 1 断片ずつ生成しなさい。生成テキストの多様性と品質を比較し、temperature パラメータが生成結果にどう影響するか分析を書きなさい。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%