正則化
学習目標: 過学習を防ぐための正則化技術を理解する
ドロップアウト
訓練時にランダムにニューロンを無効化し、過学習を防ぎます。
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. ドロップアウトが過学習を防ぐ理由は?