ネットワークアーキテクチャ
田中VPoE:「パーセプトロンと学習アルゴリズムを理解したところで、次はネットワーク全体の設計について学ぼう。層の種類や組み合わせ方で、モデルの性能は大きく変わる。」
あなた:「何層にすればいいか、各層のニューロン数はどう決めるか、という話ですね。」
田中VPoE:「そうだ。理論的な裏付けと実務的な指針の両方を押さえておこう。」
ニューラルネットワークの構造
基本的な構成要素
入力層 隠れ層1 隠れ層2 出力層
(特徴量数) (ユニット数) (ユニット数) (クラス数)
○ ○ ○ ○
○ ────────── ○ ────────── ○ ────────── ○
○ ○ ○
○ ○
| 層 | 役割 | サイズの決め方 |
|---|---|---|
| 入力層 | 特徴量を受け取る | 特徴量の次元数に一致 |
| 隠れ層 | 特徴量の非線形変換 | タスクの複雑さに応じて設計 |
| 出力層 | 予測を出力 | タスクに応じて決定 |
層の種類
| 層の種類 | 概要 | 主な用途 |
|---|---|---|
| 全結合層(Dense/Linear) | 全入力と全出力が接続 | MLP の基本構成 |
| 畳み込み層(Conv) | 局所的なパターンを検出 | 画像処理(Step 3 で詳細) |
| プーリング層(Pooling) | 空間的なダウンサンプリング | CNN でのサイズ削減 |
| Attention層 | 入力間の関係性を学習 | Transformer(Step 4 で詳細) |
| 正規化層(BatchNorm等) | 内部の分布を安定化 | 学習の安定化・高速化 |
| Dropout層 | ランダムにニューロンを無効化 | 過学習の抑制 |
深さ vs 幅
ネットワークの深さ(層の数)
- 浅いネットワーク(2-3層): 単純なパターンを学習
- 深いネットワーク(10層以上): 階層的な特徴を学習可能
import torch.nn as nn
# 浅いネットワーク: 単純なタスク向け
shallow_model = nn.Sequential(
nn.Linear(10, 64),
nn.ReLU(),
nn.Linear(64, 1),
nn.Sigmoid()
)
# 深いネットワーク: 複雑なタスク向け
deep_model = nn.Sequential(
nn.Linear(10, 128),
nn.ReLU(),
nn.Linear(128, 256),
nn.ReLU(),
nn.Linear(256, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 1),
nn.Sigmoid()
)
ネットワークの幅(各層のユニット数)
- 狭い層: パラメータが少なく、計算が高速
- 広い層: 表現力が高いが、過学習のリスクも増大
実務的な指針
| 設計要素 | 指針 |
|---|---|
| 深さ | 3-5層から始めて、必要に応じて深くする |
| 幅 | 入力次元の2-4倍程度から試す |
| 形状 | 逆三角形(入力側が広く、出力に向けて狭くなる)が一般的 |
| ボトルネック | 中間層を狭くして情報の圧縮を促す場合もある |
万能近似定理
万能近似定理(Universal Approximation Theorem)は、「1つの隠れ層を持つニューラルネットワークは、十分な数のニューロンがあれば、任意の連続関数を近似できる」という定理です。
理論: 1層でも十分(ただし指数的に多くのニューロンが必要)
実践: 深いネットワークの方が少ないパラメータで効率的に学習できる
なぜ深いほうが良いのか
浅いネットワーク:
「猫」を認識するために、直接ピクセル→猫の対応を学習
→ 膨大なパターンを覚える必要がある
深いネットワーク:
層1: エッジを検出
層2: エッジの組み合わせでテクスチャを認識
層3: テクスチャの組み合わせでパーツ(耳、目)を認識
層4: パーツの組み合わせで「猫」を認識
→ 階層的な特徴の再利用で効率的
ネットワーク設計の実践例
NetShop の商品分類(テーブルデータ)を例に、段階的に設計します。
import torch
import torch.nn as nn
class ProductClassifier(nn.Module):
def __init__(self, input_dim, num_classes):
super().__init__()
self.network = nn.Sequential(
# 入力層 → 隠れ層1
nn.Linear(input_dim, 256),
nn.BatchNorm1d(256),
nn.ReLU(),
nn.Dropout(0.3),
# 隠れ層1 → 隠れ層2
nn.Linear(256, 128),
nn.BatchNorm1d(128),
nn.ReLU(),
nn.Dropout(0.3),
# 隠れ層2 → 隠れ層3
nn.Linear(128, 64),
nn.BatchNorm1d(64),
nn.ReLU(),
nn.Dropout(0.2),
# 出力層
nn.Linear(64, num_classes)
)
def forward(self, x):
return self.network(x)
# モデル作成
model = ProductClassifier(input_dim=50, num_classes=10)
total_params = sum(p.numel() for p in model.parameters())
print(f"総パラメータ数: {total_params:,}")
パラメータ数の計算
Linear(50, 256): 50 * 256 + 256 = 13,056
Linear(256, 128): 256 * 128 + 128 = 32,896
Linear(128, 64): 128 * 64 + 64 = 8,256
Linear(64, 10): 64 * 10 + 10 = 650
BatchNorm: 各層2パラメータ × ユニット数
パラメータ数が多すぎると過学習、少なすぎると学習不足になります。データ量とのバランスが重要です。
まとめ
- ニューラルネットワークは入力層・隠れ層・出力層で構成される
- 層の種類(全結合、畳み込み、Attention 等)をタスクに応じて選択する
- 深さと幅のバランスが重要で、深いネットワークは階層的特徴を効率的に学習できる
- 万能近似定理は理論的保証だが、実践では深いネットワークが効率的
- 設計は3-5層から始め、パラメータ数とデータ量のバランスを考慮する
チェックリスト
- 入力層・隠れ層・出力層の役割を説明できる
- 全結合層、畳み込み層、Attention 層の違いを概説できる
- 深さと幅のトレードオフを理解した
- 万能近似定理の意味と実践的な示唆を説明できる
推定読了時間: 30分