LESSON

ネットワークアーキテクチャ

田中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分