AI: 深層学習アーキテクチャ
最終更新:2026-08-26
深層学習の三大アーキテクチャ――CNN、RNN、Transformer――はそれぞれ、視覚・系列・言語という中核的な課題に取り組みます。この章では数式の導出はせず、直感とコードを使って「なぜ CNN は画像認識に、RNN は時系列処理に、Transformer は言語理解に優れているのか」、そしてなぜ Transformer がすべてを統一しつつあるのかを理解します。
1. 学べること
- CNN の畳み込みとプーリングの直感:なぜ「滑らかな窓」で特徴を抽出できるか
- RNN の系列処理の直感:なぜ「記憶」が時系列データで重要か
- Transformer の自己注意機構の直感:なぜ「全体的注意」が「逐次伝播」より優れるか
- 三大アーキテクチャのユースケースと選択基準
- 事前学習モデルの概念と Hugging Face の実践
2. ストーリー:3 種のミッション、3 種の構造
(1) 痛みの種:AI は 1 つで足りないのか?
Charlie のスタートアップは同時に 3 つの課題に直面しています。
| タスク | データ | 目的 |
|---|---|---|
| 商品画像の自動タグ付け | 画像 | 画像分類 |
| ユーザーコメントの感情分析 | テキスト | ポジティブ/ネガティブ |
| 株価予測 | 価格時系列 | 上/下 |
Charlie はもともと 3 つの異なる AI 技術が必要だと思い、3 人のエンジニアを雇うことさえ検討していました。Alice は言いました。「確かに 3 つのアーキテクチャがありますが、ゼロから学習する必要はありません。事前学習モデルを使えばすぐに済ませられます。」
(2) AI の解決策:3 アーキテクチャ、1 プラットフォーム
Hugging Face の pipeline を使い、Alice はわずか 30 行のコードで 3 つのタスクを完了しました。
- 画像分類 → CNN アーキテクチャを用いた事前学習モデル
- 感情分析 → Transformer アーキテクチャに基づく事前学習モデル
- テキスト生成 → Transformer アーキテクチャに基づく大規模言語モデル
▶ サンプル: 3 大タスク、30 行のコードで完了(難易度:⭐)
# 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'])
感情: [{'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 の核心要素です。入力上を滑る小さな重み行列で、各ステップでドット積を計算し 特徴マップ を生成します。
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 カーネル | 勾配方向を検出 | エッジの方向と強度を判定 |
▶ サンプル: 畳み込みカーネルでエッジ検出(難易度:⭐)
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)
元画像(黒背景の白い四角):
[[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.]]
(3) プーリング――重要情報を保ちながらダウンサンプリング
プーリングは特徴マップ上を小さな窓で滑らせ、各ステップで最大値(最大プーリング)または平均値(平均プーリング)のみを残して特徴マップのサイズを縮小します。
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 | 統合特徴を用いた分類 |
4. RNN――回帰型ニューラルネットワークの系列的直感
(1) なぜ系列には専用アーキテクチャが必要か?
系列データ(テキスト、音声、株価)には 1 つの重要な特徴があります。順序が意味を持つということです。「I love you」と「You love me」は同じ単語だが意味がまったく異なります。全結合ネットワークはすべての入力を「平坦化」し順序情報を失います。CNN は局所窓のみを考慮し、長距離依存をモデル化できません。
RNN の核心洞察:「隠れ状態を使って履歴情報を渡す」ことです。各ステップの出力は現在の入力だけでなく、それ以前のすべての入力の「記憶」にも依存します。
(2) RNN の計算プロセス
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(難易度:⭐⭐)
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 はランダムな文字を出力します)")
シード: 'hel'
出力: 'hellhlelohl'
(学習前の 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 ステップで全体情報を得られます。
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 に対する重み付き和を計算して出力を得る。
▶ サンプル: 自己注意の重みの模式的可視化(難易度:⭐⭐)
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("(各単語の表現には、すべての単語の情報が含まれるようになりました)")
自己注意の重み(各行 = その単語からの注意):
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)
(各単語の表現には、すべての単語の情報が含まれるようになりました)
(3) 位置エンコーディング――Transformer に順序を教える
注意自体は 位置に依存しない(「I love you」と「you love me」の結果は同じ)ため、位置情報を明示的に組み込む必要があります。Transformer は正弦・余弦関数で 位置エンコーディング を生成し、入力埋め込みに加えます。
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))
位置エンコーディング(各行 = 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. ]]
(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 つのアーキテクチャの進化には明確な論理の糸があります。
CNN (1989) → RNN (1997/LSTM) → Transformer (2017)
各アーキテクチャは前のものの限界を解決した:
CNN: 「空間データをどう効率的に処理するか」を解決
限界: 局所パターンしか見えず、全体には深い積み重ねが必要
RNN: 「記憶を持って系列データをどう処理するか」を解決
限界: 逐次処理必須、長系列で勾配が消失
Transformer: 「すべてを一度に、並列で見る」ことを解決
ボーナス: 事前学習により「汎用」アーキテクチャに
重要洞察:Transformer は「より良い RNN」ではなく、パラダイムシフト です。それは「逐次情報伝播」から「情報への全体的・同時注意」への移行です。それは「 Chinese Whispers(伝言ゲーム)」(逐次伝播するうちに情報が歪む)から「全体会議」(全員が同時に他人の発言を聞く)への移行のようなものです。
8. 事前学習モデルと Hugging Face の実践
(1) 事前学習モデルとは?
事前学習モデルとは、巨大なデータセットで学習され一般特徴をすでに学んだモデルです。自身の小さなデータセットで微調整するだけで優れた結果が得られます。すでに英語を知っている人がフランス語を学ぶ方が、ゼロからよりずっと速いのと同じです。
▶ サンプル: 事前学習モデルで画像分類(難易度:⭐)
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%}")
画像の上位 3 予測:
tiger, Panthera tigris: 89.2%
tiger cat: 3.4%
cheetah, cheetah, Acinonyx jubatus: 1.2%
▶ サンプル: 事前学習モデルで感情分析(難易度:⭐)
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")
レビュー: 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%)
▶ サンプル: 事前学習モデルでテキスト生成(難易度:⭐⭐)
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")
プロンプト: 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
pipeline の使い方はまったく同じで、1 つの model パラメータを変えるだけです。
9. 総合例:Hugging Face パイプラインで 3 大タスクを探る
▶ サンプル: 画像分類 + 感情分析 + テキスト生成――事前学習モデルをサービスとして(難易度:⭐⭐⭐)
# ============================================
# 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)
============================================================
実践:深層学習アーキテクチャ
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 ファミリー!
============================================================
❓ よくある質問
transformers ライブラリ:わずか 3 行のコードで任意のモデルを呼び出し ③ Datasets:膨大な公開データセット ④ Spaces:オンラインデモとデプロイ。pipeline は最も単純な API で、1 コマンドで推論できます。📖 まとめ
- CNN は畳み込みカーネルで局所特徴を抽出し、プーリングで重要情報を保ちながら次元を削減、エッジ → 形状 → 意味へ階層的に進む。画像などの空間データに最適。
- RNN は隠れ状態で系列の記憶を渡し、LSTM はゲート機構で勾配消失問題を緩和する。しかし逐次計算により並列性と長距離依存が制限される。
- Transformer は自己注意(Q/K/V)で各位置が他のすべての位置に直接注意でき、RNN の逐次伝播のボトルネックを完全に解決する。
- Transformer は AI を統一しつつある:ViT が画像を、BERT/GPT が言語を、時系列 Transformer が時系列を処理する。
- 事前学習モデル = 巨大データで学習した汎用モデル + 自身の小データセットでの微調整。Hugging Face なら 3 行のコードで事前学習モデルを呼び出せる。
- アーキテクチャ選択の核心論理:空間データには CNN、短系列には LSTM、長系列/言語には Transformer。迷ったら Transformer を試す。
📝 練習問題
-
基本問題(難易度:⭐): Hugging Face の
pipeline("image-classification")で 5 枚の画像(URL でもローカルでも可)を分類し、各画像の上位 3 予測と確信度を記録しなさい。 -
応用問題(難易度:⭐⭐):
pipeline("sentiment-analysis")で実際のレビュー 5 件(e コマースサイトからコピー可)の感情分析を行いなさい。モデルが正しく分類したレビューと誤ったレビューを特定し、誤りの理由(皮肉?曖昧さ?短すぎ?)を考えなさい。 -
挑戦問題(難易度:⭐⭐⭐):
pipeline("text-generation", model="gpt2")で 3 つのテキスト断片を生成し、さらにtemperature=0.3、temperature=0.7、temperature=1.5でそれぞれ 1 断片ずつ生成しなさい。生成テキストの多様性と品質を比較し、temperatureパラメータが生成結果にどう影響するか分析を書きなさい。