More Topics on Neural Networks

hyeony·2025년 6월 22일

VISION

목록 보기
4/6
post-thumbnail

1. 신경망 최적화 개요

가. Optimizer

1) 확률적 경사 하강법 (SGD)

① 개념
신경망 학습 시, 각 파라미터 ww에 대한 손실 함수의 기울기를 계산하고 그 반대 방향으로 갱신하는 기본 기법

② 업데이트 식

wnew=woldαLww_{\text{new}} = w_{\text{old}} - \alpha \,\frac{\partial L}{\partial w}

(α\alpha: 학습률, Lw\frac{\partial L}{\partial w}: 손실 함수 기울기)

③ 장·단점

  • 장점: 단순하고 구현 용이

  • 단점: 좁은 골짜기에서 진동, flat region에서 느린 수렴

2) Momentum

① 개념
이전 업데이트 관성을 반영해, 현재 그래디언트와 과거 방향을 결합하여 갱신하는 기법

② 업데이트 식

vt=μvt1+αwL,wnew=woldvtv_t = \mu\,v_{t-1} + \alpha\,\nabla_w L,\quad w_{\text{new}} = w_{\text{old}} - v_t

(mumu: 모멘텀 계수, vtv_t: 속도 벡터)

③ 효과

  • 진동 감소

  • 평지 통과 속도 향상

3) AdaGrad & RMSProp

① 공통 개념
파라미터별 과거 그래디언트 이력을 활용해 학습률을 자동 조정

② AdaGrad

  • 누적 제곱합

    Gt,i=τ=1tgτ,i2G_{t,i} = \sum_{\tau=1}^t g_{\tau,i}^2
  • 업데이트:

    wt+1,i=wt,iαGt,i+εgt,iw_{t+1,i} = w_{t,i} - \frac{\alpha}{\sqrt{G_{t,i} + \varepsilon}}\,g_{t,i}
  • 장점: 희소 특성 강점

  • 단점: 학습률 과도 감소

③ RMSProp

  • 제곱합을 지수이동평균으로 계산:

    E[g2]t=βE[g2]t1+(1β)gt2E[g^2]_t = \beta\,E[g^2]_{t-1} + (1-\beta)g_t^2
  • 업데이트:

    wt+1=wtαE[g2]t+εgtw_{t+1} = w_t - \frac{\alpha}{\sqrt{E[g^2]_t + \varepsilon}}\,g_t
  • 안정적 학습률 조정

4) Adam 계열 (Adam, AdamW, LAMB 등)

① Adam
모멘텀(Momentum) 방식과 RMSProp 방식을 융합하여 1차 및 2차 모멘텀을 활용한 adaptive 학습률로 가중치 업데이트 수행

② AdamW & LAMB
대표적인 Adam 계열 optimizer로, 하이퍼파라미터 및 사용 목적에 따라 선택됨

③ 장·단점

  • 장점: 적응적 학습률을 통해 빠른 수렴 유도
  • 단점: 하이퍼파라미터 설정에 민감할 수 있음

나. Learning Rate Scheduler

1) ExponentialLR

① 개념
매 epoch마다 학습률을 일정 비율 γ\gamma만큼 지수적으로 감소시켜 안정적인 수렴을 유도하는 스케줄러

② PyTorch 예시

scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99)

위 코드는 매 epoch이 끝날 때마다 다음의 연산을 진행한다.

lrγ×lrlr \leftarrow \gamma \times lr

2) StepLR

① 개념
지정한 epoch 간격(step_size)마다 학습률을 γ\gamma배로 감소시키는 스케줄러

② PyTorch 예시

scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=100, gamma=0.9)

③ 동작 방식

if epoch % step_size == 0:
    lr = gamma * lr

3) MultiStepLR

① 개념
여러 개의 기준점(milestones)에서 학습률을 한 번에 감소시키는 스케줄러

② PyTorch 예시

scheduler = torch.optim.lr_scheduler.MultiStepLR(
    optimizer,
    milestones=[30, 80],
    gamma=0.1
)

③ 동작 방식

if epoch in milestones:
    lr = gamma * lr

4) 특수 스케줄러 (CosineAnnealingLR, CosineAnnealingWarmRestarts 등)

① 개념
에폭이 진행될수록 학습률을 부드럽게 감소시키거나, 일정 주기마다 리스타트하여 다시 높은 학습률을 유지하도록 설계된 스케줄러

② CosineAnnealingLR: 코사인 곡선 형태로 lrη_min까지 부드럽게 감소

scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
    optimizer,
    T_max=50,
    eta_min=0
)

③ CosineAnnealingWarmRestarts: 매 T_0, T_0×T_mult, … epoch마다 스케줄을 리스타트하여 lr이 다시 최고치로 올라갔다가 감소하도록 함

scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(
    optimizer,
    T_0=10,
    T_mult=2
)

④ 특징
주기적 리스타트를 통해 모델이 새로운 지역 최적점을 탐색하도록 돕는다.

2. 가중치 초기화

가. 초기값 결정의 중요성

① 개요

  • 가중치 초기값에 따라 손실 함수의 최저점으로 수렴할 수 있거나 그렇지 않을 수 있으며, 수렴 속도에도 큰 영향을 미침

  • 일반적으로 정규 분포 함수의 표준편차를 적절하게 설정하여 초기값을 결정함

나. Xavier Glorot 초기화

① 목적
sigmoid 등 포화 영역이 있는 활성화 함수를 사용할 때, 각 층의 출력 분산이 일정하게 유지되어 gradient vanishing 문제를 완화

② 방법
앞 층의 노드 수 nn에 대해, 정규 분포의 표준편차 σ=1n\sigma = \frac{1}{\sqrt{n}}로 초기값 설정

다. Kaiming He 초기화

① 목적
ReLU 계열 활성화 함수를 사용할 때, 출력 분산 유지와 gradient 흐름을 원활하게 하여 학습 안정성 향상

② 방법
앞 층의 노드 수 nn에 대해, 정규 분포의 표준편차 σ=2n\sigma = \sqrt{\frac{2}{n}}로 초기값 설정

3. 역전파와 기울기 소실

가. 역전파 과정 개요

① 개념
순전파(feedforward)의 역순으로 계산 그래프를 따라 오차 신호를 전파하며, 각 노드에서 국소적 미분값을 곱해 상류(upstream)로 전달

나. Gradient Vanishing 문제

① 현상
네트워크 깊이가 깊어질수록 초기 층(downstream)으로 전달되는 기울기가 점점 작아져 거의 0이 되어, 가중치 업데이트가 이루어지지 않음

② 영향
입력 변화가 출력에 영향을 미치지 않아 학습이 정체됨

다. 해결 방안

① 적절한 가중치 초기화: Xavier Glorot 또는 Kaiming He 초기화로 출력 분산을 일정하게 유지

② ReLU 계열 활성화 함수 사용: Sigmoid 대비 0 이상의 영역에서 기울기 소실을 완화

③ 레이어 수 축소: 불필요하게 깊은 구조를 줄여 기울기 소실 위험 감소

④ Skip Connection 적용: 입력을 출력에 직접 더해 residual learning을 수행, 기울기 흐름을 개선

4. 배치 정규화 (Batch Normalization)

① 개념

  • 서로 다른 미니배치에서 활성화 값 분포의 차이(Internal Covariate Shift)를 줄이기 위해, 각 층의 입력을 정규화하는 기법

  • 학습 중 활성화 분포가 일정하게 유지되어, 네트워크가 더 안정적·빠르게 수렴하도록 도움

② 수식

  • 미니배치 {xi}i=1m\{x_i\}_{i=1}^m 에 대해
    • 배치 평균
      μB=1mi=1mxi\mu_B = \frac{1}{m} \sum_{i=1}^m x_i
    • 배치 분산
      σB2=1mi=1m(xiμB)2\sigma_B^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_B)^2
    • 정규화
      x^i=xiμBσB2+ε\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \varepsilon}}
    • 스케일 & 쉬프트
      yi=γx^i+βy_i = \gamma \,\hat{x}_i + \beta
      (γ,β\gamma, \beta는 학습 가능한 파라미터, ε\varepsilon은 수치 안정성 상수)

③ PyTorch 예시

import torch.nn as nn

# 1D 입력 (예: Fully-connected layer 뒤)
bn1 = nn.BatchNorm1d(num_features)

# 2D 입력 (예: Conv 계층 뒤)
bn2 = nn.BatchNorm2d(num_features)

# 순전파 예시
x = ...
y = bn2(x)

④ 장·단점

  • 장점

    • 학습률을 높여도 발산하지 않고 안정적 수렴 가능

    • 가중치 초기화 및 활성화 함수 선택에 덜 민감

  • 단점

    • 배치 크기가 너무 작으면 통계 추정이 불안정

    • 추가 연산 및 메모리 오버헤드 발생

5. 과적합과 일반화

가. Overfitting 정의 및 원인

① 정의
신경망이 학습 데이터에만 지나치게 적응되어, 학습 데이터에서는 높은 성능을 보이지만 새로운 시험 데이터에 대해서는 성능이 떨어지는 현상

② 원인

  • 매개 변수가 많고 표현력이 높은 모델 사용

  • 훈련 데이터 수가 부족하거나 다양성이 낮음

나. Underfitting

① 정의
모델이 너무 단순하거나 학습이 충분치 않아 학습 데이터의 패턴을 제대로 학습하지 못해, 학습 데이터와 시험 데이터 모두에서 성능이 낮은 상태

② 원인

  • 모델 복잡도(표현력)가 낮음

  • 학습 에폭 수가 부족하거나 학습률이 너무 낮음

다. Early Stopping

① 개념
validation 데이터의 성능이 더 이상 개선되지 않을 때 학습을 조기에 종료하여 과적합을 방지하는 정규화 기법

② 동작 방식

  • 매 epoch마다 validation loss 또는 validation accuracy 평가

  • 지정된 patience(허용 epoch) 동안 개선이 없으면 학습 종료

③ 효과

  • 과적합 시점을 자동으로 찾아 학습을 멈춤으로써, 일반화 성능을 향상

  • 불필요한 추가 학습을 줄여 연산 자원 절약에도 기여

6. 정규화 기법

가. L1 Regularization

① 개념
기본 손실에 가중치 절댓값 합을 penalty로 추가하여 모델 복잡도를 제한하고, 불필요한 특성을 제거하는 효과를 가짐

② 수식

Ltotal=Ldata+λiwi\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{data}} + \lambda \sum_i |w_i|

여기서 λ\lambda는 정규화 강도를 조절하는 하이퍼파라미터

③ 특징
- 일부 가중치를 정확히 0으로 만들어 불필요한 특성을 제거(희소성 유도)

- 모델 해석성을 높이고 과적합을 줄임

④ PyTorch 적용 예시

optimizer = torch.optim.SGD(
    model.parameters(),
    lr=0.01,
    weight_decay=0,        # 기본 weight decay는 L2이므로 0 설정
    l1_lambda=1e-4         # L1 정규화 λ 값 (직접 구현 필요)
)

# L1 패널티를 직접 계산해 loss에 더해주는 예
l1_penalty = sum(p.abs().sum() for p in model.parameters())
loss = criterion(output, target) + 1e-4 * l1_penalty

나. L2 Regularization (Ridge Regularization)

① 개념
기본 손실 함수에 각 가중치의 제곱합을 penalty로 추가하여, 과도하게 큰 가중치 값을 억제함으로써 모델의 복잡도를 낮추고 일반화 성능을 향상시키는 기법

② 수식

Ltotal=Ldata+λiwi2\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{data}} + \lambda \sum_i w_i^2

Ldata\mathcal{L}_{data}: 원래의 손실 함수

λ\lambda: 정규화 강도를 조절하는 하이퍼파라미터

wiw_i: 각 파라미터 값

③ 특징

  • 모든 가중치를 0에 가깝게 축소하지만 완전히 0으로 만들지는 않음

  • weight decay라고도 불리며, 학습 시 optimizer의 weight_decay 파라미터로 간편하게 적용 가능

④ PyTorch 적용 예시

optimizer = torch.optim.SGD(
    model.parameters(),
    lr=0.01,
    weight_decay=1e-4  # L2 정규화 λ 값 설정
)

7. 데이터 확장(Data Augmentation)

가. 기본 변형 기법

① 회전(Rotation)
이미지를 임의의 각도로 회전시켜 다양한 방향의 객체를 학습할 수 있도록 함

② 확대/축소(Scaling)
객체를 확대하거나 축소하여 다양한 크기에 대한 강인성을 높임

③ 이동(Shift)
이미지를 좌우·상하로 이동시켜 위치 변화에 대한 일반화 성능을 개선

④ 자르기(Crop)
이미지의 일부 영역을 잘라내어 부분 정보만으로도 인식할 수 있도록 훈련

⑤ 뒤집기(Flip)
수평 또는 수직으로 반전시켜 좌우·상하 대칭 상황에 대응

⑥ 노이즈 추가(Noise Injection)
가우시안 노이즈 등 임의의 잡음을 더해 잡음에 강한 모델로 학습

⑦ 기타(밝기·대비 변화 등)
밝기나 대비를 조절해 조명 변화에 대한 일반화 성능 향상

나. 고급 기법

① Cut-Out
이미지의 일부 영역을 검은색 패치로 마스킹(제거)하여, 모델이 주변 맥락을 이용해 인식하도록 유도

② CutMix
두 이미지를 패치 단위로 합성하고, 대응하는 레이블도 혼합하여 학습 데이터 다양성을 극대화

③ MixUp
두 이미지를 픽셀 단위로 선형 결합하고, 레이블 역시 동일 비율로 혼합하여 부드러운 결정 경계를 학습

8. 앙상블 학습과 드롭아웃

가. Ensemble Learning

① 개념
서로 다른 방식으로 학습된 여러 개의 신경망 모델의 예측 결과를 종합하여 최종 결론을 도출하는 기법

② Voting

  • Hard Voting: 각 모델의 분류 결과(레이블)에 다수결 투표 적용
  • Soft Voting: 각 모델이 예측한 클래스별 확률의 평균을 내어 가장 높은 확률을 선택

③ Averaging
회귀 문제에서 각 모델이 예측한 실수 값을 단순 평균 또는 가중 평균하여 최종 예측값 산출

④ 효과

  • 개별 모델의 약점을 서로 보완하여 일반화 성능 향상

  • 과적합 억제에 효과적인 일반화 기법 중 하나

나. Dropout

① 개념
학습 과정에서 은닉층의 뉴런을 확률 pp 만큼 무작위로 비활성화(drop)하며 학습함으로써, 특정 뉴런이나 경로(path)에 과도하게 의존하지 않도록 만드는 정규화 기법

② 동작 방식

  • 학습 중 각 순전파(forward pass)에서 뉴런 하나를 확률 pp 로 비활성화

  • 비활성화된 뉴런은 해당 학습 단계의 순전파·역전파 모두에서 제외

  • evaluation 시에는 모든 뉴런을 사용하되, 학습 중 적용된 비율에 맞춰 출력값을 스케일 보정

③ 효과

  • 무작위로 다양한 sub-network을 학습시켜 앙상블 효과를 내고 과적합을 억제

  • 네트워크의 robustness 및 일반화 성능 향상

  • PyTorch 적용 예시

    # 1) 단일 드롭아웃 레이어
    
    import torch.nn as nn
    
    # 은닉층 뉴런을 50% 확률로 드롭
    dropout = nn.Dropout(p=0.5)
    x = ...  # 입력 텐서
    y = dropout(x)
    
    # 2) 모델 정의 내부에서 사용
    
    import torch.nn as nn
    import torch.nn.functional as F
    
    class SimpleMLP(nn.Module):
        def __init__(self, input_dim, hidden_dim, output_dim, p=0.5):
            super().__init__()
            self.fc1 = nn.Linear(input_dim, hidden_dim)
            self.dropout = nn.Dropout(p=p)
            self.fc2 = nn.Linear(hidden_dim, output_dim)
    
        def forward(self, x):
            x = F.relu(self.fc1(x))
            x = self.dropout(x)  # 드롭아웃 적용
            return self.fc2(x)
    
    model = SimpleMLP(784, 256, 10, p=0.5)
    
    # 3) 2D 드롭아웃 (Conv 레이어 뒤)
    
    class ConvNet(nn.Module):
        def __init__(self, p=0.3):
            super().__init__()
            self.conv = nn.Conv2d(3, 32, kernel_size=3, padding=1)
            self.drop2d = nn.Dropout2d(p=p)
            self.fc = nn.Linear(32*32*32, 10)
    
        def forward(self, x):
            x = F.relu(self.conv(x))
            x = self.drop2d(x)   # 2D 드롭아웃 적용
            x = x.view(x.size(0), -1)
            return self.fc(x)
    
    model = ConvNet(p=0.3)
    
    # 4) 학습/평가 모드 전환
    
    # 학습 모드 (드롭아웃 활성화)
    model.train()
    output = model(input_batch)
    
    # 평가 모드 (드롭아웃 비활성화)
    model.eval()
    with torch.no_grad():
        preds = model(input_batch)

10. 전이 학습 (Transfer Learning)

① 개념
이미 A 작업(task A)에 대해 풍부한 학습 데이터로 사전 학습(pre-training)된 네트워크를 가져와, 데이터가 부족한 B 작업(task B)에 적용하는 기법

② 적용 조건

  • B 작업의 입력 형태(input shape)가 A 작업과 동일하거나 호환될 때
  • B 작업용 학습 데이터보다 A 작업용 데이터가 훨씬 많을 때 효과적

③ 적용 방법

  • Feature Extractor로 사용
    • A 네트워크의 앞부분(convolutional backbone 등) 가중치를 초기값으로 사용
    • 해당 부분을 고정(freeze) 시키고, 뒷부분(classifier head)만 교체하여 학습
  • Fine-tuning
    • 초기에는 뒷부분만 학습시키다가, 이후 전체 레이어를 풀어 전부 미세 조정
  • 교체 가능한 부분
    • 보통 분류기(classifier) 역할을 하는 마지막 FC layer 혹은 head 부분을 B 작업의 클래스 수에 맞춰 새로 정의

<참고 자료>
유성욱 교수님, 지능형 영상처리, 중앙대학교 전자전기공학부, 2024

profile
Chung-Ang Univ. EEE.

0개의 댓글