Develop/ML·DL

인공신경망 - 과적합 해결을 알아보자.

YOOZI. 2025. 2. 11. 10:42
728x90
AI도 공부를 너무 열심히 하면 안 좋다

 

 

 

오늘은 과적합 해결에 대해 알아보자.

오늘의 배움
  • 과적합의 개념과 발생 원인
  • 과적합 해결을 위한 다양한 기법들
  • 실제 코드 구현 방법

1. 과적합

  • 정의: 머신러닝 모델이 학습 데이터를 너무 완벽하게 외워버려서 실제 상황에서는 성능이 떨어지는 현상
  • 핵심 개념 한 줄 설명: 시험 문제집만 달달 외워서 실전에서 응용문제를 못 푸는 현상과 비슷하다
  • 특징:
    • 학습 데이터에서는 매우 높은 성능을 보임
    • 새로운 데이터에서는 성능이 크게 저하됨
    • 모델이 너무 복잡하거나 학습 데이터가 부족할 때 주로 발생
  • 해결하기 위한 대표적인 기법: 배치 정규화(Batch Normalization), 드롭아웃(Dropout), 하이퍼파라미터 최적화(Hyperparameter Optimization)가 있다.
[핵심 공식]
- 배치 정규화: (x - μ) / σ
- 드롭아웃 비율: 일반적으로 0.2 ~ 0.5 사이
- L2 정규화: Loss + λ∑w²

 


 

2. 핵심 개념 정리

2-1. 배치 정규화

 

  • 정의: 데이터의 분포를 균일하게 만드는 방법
  • 작동 원리: 각 층의 입력 데이터를 평균 0, 분산 1로 정규화
  • 특징: 학습 속도 향상, 초깃값에 대한 의존성 낮음, 과적합 방지
    • 배치 정규화의 주요 특징
      • 각 미니배치에서 평균과 분산을 이용하여 정규화 진행한다.
      • 학습 과정에서 데이터의 스케일 변화를 줄여 학습을 안정적으로 수행한다.
      • 과적합을 방지하고, 일반적으로 더 적은 학습률로도 빠른 학습이 가능하다.
  • 예시: 시험 점수를 상대평가로 변환하는 것과 유사

 

출처: https://gaussian37.github.io/dl-concept-batchnorm/ALT

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. 드롭아웃

  • 정의: 뉴런을 임의로 끄고 켜서 학습하는 방법
  • 작동 원리: 학습 시 일부 뉴런을 확률적으로 비활성화
    • 드롭아웃 과정
      1. 학습 과정에서 랜덤하게 일부 뉴런을 제거한다.
        출처: https://ko.d2l.ai/chapter_deep-learning-basics/dropout.html
      2. 테스트 과정에서는 모든 뉴런을 활성화하지만, 드롭아웃 확률을 고려하여 가중치를 조정한다.
      3. 네트워크의 강건성을 높이고, 과적합을 방지한다.
  • 특징: 앙상블 효과, 과적합 방지
  • 예시: 한 과목에만 의존하지 않고 여러 과목을 골고루 공부하는 것과 유사
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