正則化

学習目標: 過学習を防ぐための正則化技術を理解する

ドロップアウト

訓練時にランダムにニューロンを無効化し、過学習を防ぎます。

import torch.nn as nn

# ドロップアウト層
dropout = nn.Dropout(p=0.5)  # 50%の確率で無効化

# モデルでの使用例
class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(784, 256)
        self.dropout = nn.Dropout(0.2)
        self.fc2 = nn.Linear(256, 10)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.dropout(x)  # 訓練時のみ有効
        x = self.fc2(x)
        return x
model.eval()で評価モードにすると、ドロップアウトは自動的に無効になります。

バッチ正規化

# バッチ正規化
bn = nn.BatchNorm2d(num_features=64)  # チャンネル数を指定

# CNNでの使用例
model = nn.Sequential(
    nn.Conv2d(3, 64, 3, padding=1),
    nn.BatchNorm2d(64),
    nn.ReLU(),
    nn.MaxPool2d(2, 2)
)

重み減衰(L2正則化)

# オプティマイザでweight_decayを指定
optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-4)

データ拡張

from torchvision import transforms

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(10),
    transforms.ColorJitter(brightness=0.2, contrast=0.2),
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

理解度チェック

Q. ドロップアウトが過学習を防ぐ理由は?