패턴을 배우는 게 아니라, 노이즈까지 외워버린 상태
Bias(편향): 모델이 너무 단순할 때
Variance(분산): 모델이 너무 복잡할 때
핵심:
가장 현실적인 감지는 loss 추이(학습 손실 vs 검증 손실) 를 보는 것이다.
정상적인 학습
과적합이 시작될 때
from torchvision import transforms
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5),
transforms.RandomRotation(10),
transforms.RandomCrop(224, padding=4),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
# 테스트/추론은 "증강 없이" 평가가 원칙
test_transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
(자세한 내용은 아래에 기술)
가중치가 너무 커지면 패턴을 “과하게” 확신하는 방향으로 갈 수 있기 때문에
손실함수에 페널티를 추가하는 아이디어이다.

optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=0.01)
l2_lambda = 0.01
l2_reg = torch.tensor(0., device=device)
for p in model.parameters():
l2_reg += torch.norm(p, 2) ** 2
loss = criterion(pred, y) + l2_lambda * l2_reg
# 학습
model.train() # dropout ON
out = model(x)
# 추론/평가
model.eval() # dropout OFF
with torch.no_grad():
out = model(x)
1) 매 epoch마다 val loss 계산
2) 최저 val loss 갱신하면 best model 저장
3) 갱신 못하면 counter 증가
4) counter가 patience를 넘으면 종료


BatchNorm은 학습 중에는 미니배치 통계(평균/분산) 를 쓰고,
추론 때는 학습 중 축적한 running mean/var를 사용한다.
Training:
Inference:
그래서 model.eval()을 안 하면 추론 결과가 흔들릴 수 있다.
MLP: Linear → BatchNorm → ReLU → Dropout
CNN: Conv → BatchNorm → ReLU → Pooling
포인트: BatchNorm과 Dropout을 같이 쓸 때는 순서가 중요(보통 BN 먼저)
nn.LayerNorm(normalized_shape)
nn.InstanceNorm2d(num_features)
nn.GroupNorm(num_groups, num_channels)




랜덤 시드를 루프 안에 고정해서 진짜 공정하게 비교하면,
아이러니하게도 베이스라인 모델이 가장 좋게 나옴.
→ 이는 지금 여기서 사용한 데이터셋이 너무 크기가 작아서
과적합을 방지하고자 넣은 기법들이 너무 강하게 작용하여 오히려 모델의 과소적합을 유발했기 때문.
사실상 위의(Weight Decay가 가장 성능이 좋았던) 결과는
운 좋게 초기 가중치가 해당 모델이 학습하기 좋도록 부여되어 나타난 결과인 셈.
또한 아래의 베이스라인의 그래프에서 train data는 Accuracy는 상승하지만,
validation의 Accuracy는 정체될 뿐 하락하지는 않는다.

Loss 그래프를 통해 과적합 상태라고 판단이 되나 이는 사실상 필요한 과적합 상태일수도 있다는 것.
이런 경우 강제로 규제를 걸어 Train 성능을 억제하면, Val 성능이 같이 따라 내려가는 Underfitting(과소적합) 영역으로 들어서게 된다.


→ Dropout 0.3 아니고 0.1임(오타)
위의 경우에 비해서 Dropout, Weight Decay모델의 성능이 올라가긴 했지만,
여전히 베이스 모델에 비해 낮다


→ 이 실험 역시 Dropout은 0.1로 진행했음
Dropout 모델이 가장 안정적이고 성능도 높게 나타났다.