728x90
AI도 공부를 너무 열심히 하면 안 좋다
오늘은 과적합 해결에 대해 알아보자.
오늘의 배움 |
|
1. 과적합
- 정의: 머신러닝 모델이 학습 데이터를 너무 완벽하게 외워버려서 실제 상황에서는 성능이 떨어지는 현상
- 핵심 개념 한 줄 설명: 시험 문제집만 달달 외워서 실전에서 응용문제를 못 푸는 현상과 비슷하다
- 특징:
- 학습 데이터에서는 매우 높은 성능을 보임
- 새로운 데이터에서는 성능이 크게 저하됨
- 모델이 너무 복잡하거나 학습 데이터가 부족할 때 주로 발생
- 해결하기 위한 대표적인 기법: 배치 정규화(Batch Normalization), 드롭아웃(Dropout), 하이퍼파라미터 최적화(Hyperparameter Optimization)가 있다.
[핵심 공식]
- 배치 정규화: (x - μ) / σ
- 드롭아웃 비율: 일반적으로 0.2 ~ 0.5 사이
- L2 정규화: Loss + λ∑w²
2. 핵심 개념 정리
2-1. 배치 정규화
- 정의: 데이터의 분포를 균일하게 만드는 방법
- 작동 원리: 각 층의 입력 데이터를 평균 0, 분산 1로 정규화
- 특징: 학습 속도 향상, 초깃값에 대한 의존성 낮음, 과적합 방지
- 배치 정규화의 주요 특징
- 각 미니배치에서 평균과 분산을 이용하여 정규화 진행한다.
- 학습 과정에서 데이터의 스케일 변화를 줄여 학습을 안정적으로 수행한다.
- 과적합을 방지하고, 일반적으로 더 적은 학습률로도 빠른 학습이 가능하다.
- 배치 정규화의 주요 특징
- 예시: 시험 점수를 상대평가로 변환하는 것과 유사
import torch
import torch.nn as nn
import torch.optim as optim
class NeuralNet(nn.Module):
def __init__(self):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.bn1 = nn.BatchNorm1d(128)
self.fc2 = nn.Linear(128, 64)
self.bn2 = nn.BatchNorm1d(64)
self.fc3 = nn.Linear(64, 10)
def forward(self, x):
x = torch.relu(self.bn1(self.fc1(x)))
x = torch.relu(self.bn2(self.fc2(x)))
x = self.fc3(x)
return x
model = NeuralNet()
2-2. 드롭아웃
- 정의: 뉴런을 임의로 끄고 켜서 학습하는 방법
- 작동 원리: 학습 시 일부 뉴런을 확률적으로 비활성화
- 드롭아웃 과정
- 학습 과정에서 랜덤하게 일부 뉴런을 제거한다.
출처: https://ko.d2l.ai/chapter_deep-learning-basics/dropout.html - 테스트 과정에서는 모든 뉴런을 활성화하지만, 드롭아웃 확률을 고려하여 가중치를 조정한다.
- 네트워크의 강건성을 높이고, 과적합을 방지한다.
- 학습 과정에서 랜덤하게 일부 뉴런을 제거한다.
- 드롭아웃 과정
- 특징: 앙상블 효과, 과적합 방지
- 예시: 한 과목에만 의존하지 않고 여러 과목을 골고루 공부하는 것과 유사
class NeuralNet(nn.Module):
def __init__(self):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.dropout1 = nn.Dropout(0.5)
self.fc2 = nn.Linear(128, 64)
self.dropout2 = nn.Dropout(0.3)
self.fc3 = nn.Linear(64, 10)
def forward(self, x):
x = torch.relu(self.dropout1(self.fc1(x)))
x = torch.relu(self.dropout2(self.fc2(x)))
x = self.fc3(x)
return x
model = NeuralNet()
2-3. 하이퍼파라미터 최적화
- 정의: 학습률, 배치 크기, 드롭아웃 비율 등의 하이퍼파라미터를 조정하는 과정
- 대표적인 최적화 방법
- 그리드 서치(Grid Search): 미리 정의된 하이퍼파라미터 조합을 탐색하며 최적의 조합을 찾는 방법이다.
- 랜덤 서치(Random Search): 하이퍼파라미터를 무작위로 선택하여 최적의 값을 찾는 방법이다.
- 베이지안 최적화(Bayesian Optimization): 이전 실험 결과를 바탕으로 최적의 조합을 찾는 기법이다.
from skorch import NeuralNetClassifier
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
net = NeuralNetClassifier(NeuralNet, max_epochs=10, lr=0.01)
param_dist = { 'lr': uniform(0.0001, 0.1) }
random_search = RandomizedSearchCV(estimator=net, param_distributions=param_dist, n_iter=5, cv=3, verbose=1)
2-4. 조기 종료 (Early Stopping)
- 정의: 검증 데이터의 손실(validation loss)이 더 이상 감소하지 않을 때 학습을 중단하는 기법
- 작동 원리: 일반적으로 patience 값을 설정하여 일정 횟수 동안 성능이 개선되지 않으면 학습을 멈춘다.
- 특징: 과적합을 방지하는 동시에 불필요한 연산을 줄여 학습 시간 단축
2-5. 데이터 증강 (Data Augmentation)
- 정의: 기존 데이터를 변형하여 새로운 데이터 생성
- 작동 원리: 이미지 데이터의 경우 회전, 이동, 크기 조정, 밝기 변경, 뒤집기 등을 통해 새로운 데이터를 생성
- 특징: 데이터 다양성 확보
- 예시: 하나의 사진을 여러 각도에서 찍는 것과 유사
2-6. L1, L2 정규화 (가중치 감쇠, Weight Decay)
- 신경망의 가중치 값이 너무 커지면 특정 뉴런에 대한 의존성이 증가하여 과적합이 발생할 수 있다.
- 이를 방지하기 위해 L1 정규화(Lasso), L2 정규화(Ridge) 기법을 사용하여 손실 함수에 패널티를 추가한다.
- L1 정규화: 가중치의 절대값을 기준으로 패널티 부여
- L2 정규화: 가중치의 제곱을 기준으로 패널티 부여
기법 | 작동 원리 | 장점 | 단점 | 적용 분야 |
배치 정규화 | 데이터 분포 정규화 | 학습 속도 향상 | 작은 배치에서 불안정 | 딥러닝 전반 |
드롭아웃 | 뉴런 무작위 비활성화 | 구현 간단 | 훈련 시간 증가 | 과적합 위험 모델 |
데이터 증강 | 데이터 변형 생성 | 데이터 다양성 확보 | 추가 처리 시간 필요 | 컴퓨터 비전 |
728x90
'Develop > ML·DL' 카테고리의 다른 글
모델 성능 고도화를 알아보자. (4) | 2025.02.11 |
---|---|
모델 검증을 알아보자. (0) | 2025.02.11 |
최적화 함수를 알아보자. (2) | 2025.02.07 |
인공신경망(딥러닝) 중간 점검 - 한 눈에 알아보기 (3) | 2025.02.06 |
오차역전파법을 알아보자. (0) | 2025.02.06 |