관리 메뉴

Bull

[ML] 과대적합과 과소적합 / 배치 정규화 | study book 본문

Artificial Intelligence/Machine Learning

[ML] 과대적합과 과소적합 / 배치 정규화 | study book

Bull_ 2024. 8. 26. 04:31

과대적합과 과소적합

과대적합은 모델이 훈련 데이터에서 우수하게 예측하지만 새로운 데이터에서 제대로 예측하지 못해 오차가 크게 발생하는 것을 의미한다. 즉 모델이 훈련 데이터에만 적합하게 학습되어 새로운 데이터에 대해서는 성능이 저하되는 경우를 일컫는다.

과소적합은 과대적합 문제점처럼 입력된 데이터를 잘 예측할 수 없는 상태를 의미한다. 하지만 과대적합과는 다르게 훈련 데이터에서도 좋지 않고 새로운 데이터에서도 좋지 않다.

모델이 훈련 데이터와 새로운 데이터에 대해서도 우수한 성능을 모이려면 낮은 편향과 낮은 분산을 가져야 한다. 분산이 높으면 추정치에 대한 변동 폭이 커지며 데이터가 갖고 있는 노이즈까지 학습 과정에 포함돼 과대적합 문제를 발생시킨다.

편향이 높으면 추정치가 항상 일정한 값을 갖게 될 확률이 높아져 데이터의 특징을 제대로 학습하지 못해 과소적합 문제를 발생시킨다. 편향과 분산은 서로 반비례하여 분산을 감소시키면 편향이 증가하고 분산을 증가시키면 편향이 감소한다.

과대적합과 과소적합 문제를 해결하기 위해 다음과 같은 방법을 적용할 수 있다.

  • 우수한 데이터를 수집한다. 모델이 훈련 데이터에서 노이즈를 학습하지 않으면서 일반적인 규칙을 찾을 수 있게 학습 데이터 수를 늘린다.
  • 신규 데이터 수집이 어려우면 기존 데이터에서 변수나 특징을 추출하거나 피처를 더 작은 차원으로 축소한다.
  • 너무 간단하거나 강력한 모델이면 과대/과소적합이 일어난다. 일반적으로 모델의 층이 깊으면 강력한 모델이라고 한다. 이러한 층을 줄이는 것도 하나의 방법이다. 과소적합은 반대로 층을 추가하는 것이다.
  • 모델 학습 시 검증 데이터 셋으로 성능을 지속적으로 평가해 모델의 성능이 저하되기 전에 조기 중단한다.
  • 모델에 배치 정규화를 적용해 모델 성능과 모델 안정성을 향상시킨다. 모델 계층마다 평균과 분산을 조정해 내부 공변량 변화를 줄여 과대적합을 방지한다.
  • 가중치 초기화를 통해 기울기 소실/폭주 문제도 해결할 수 있다.
  • 모델의 정칙화를 통해 손실함수에 패널티를 부가하는 방식이다.

배치 정규화

배치 정규화란 내부 공변량 변화를 줄여 과대적합을 방지하는 기술이다. 인공 신경망을 학습할 때 입력값을 배치 단위로 나눠 학습을 진행한다. 배치 단위로 나눠 학습하는 경우 상위 계층이 매개변수가 갱신될 때 마다 현재 게층에 전달되는 데이터의 분포도 변경된다.

각 계층은 배치 단위의 데이터로 인해 계속 변화되는 입력 분포를 학습해야 하기 때문에 인공 신경망의 성능과 안정성이 낮아져 학습 속도가 느려진다. 이렇게 내부 공변량 변화란 계층마다 입력 분포가 변경되는 현상을 의미한다. 내부 공변량 변화가 발생할 경우 은닉층에서 다중 은닉츠응로 전달될 때 입력값이 균일해지지 않아 가중치가 제대로 갱신되지 않을 수 있다.

정규화 종류

배치 정규화는 이미지 분류 모델에서 14배 더 적은 학습으로 동일한 정확도를 달성할 수 있다. 배치 정규화 이외에도 계층, 인스턴스, 그룹 정규화가 있다.

배치 정규화 방식

$$
y_i = \frac{x_i - E[X]}{\sqrt{Var[X]+\epsilon}}\times r + \beta
$$
여기서 엡실론은 분모가 0이 되는 현상을 막기 위한 작은 상수 $10^{-5}$ 이다. $\gamma$와$\beta$는 학습 가능한 매개변수로 Scale과 Shift 값이다. 주로 $\gamma=1,\beta=0$으로 할당한다.

import torch


x = torch.FloatTensor(
    [
        [-0.6577, -0.5797, 0.6360],
        [0.7392, 0.2145, 1.523],
        [0.2432, 0.5662, 0.322]
    ]
)

$$X_1 = [-0.6577, -0.5797, 0.6360]$$
$$X_2 = [0.7392, 0.2145, 1.523]$$
$$X_3 = [0.2432, 0.5662, 0.322]$$
이를 $X_1$에 대해서 먼저 구해보겠다.
$$E[X]=0.1082$$
$$V[X]=0.3343$$
이제 수식에 따라 각 원소 $x_i$에 대해 나머지를 계산해주면 $Y_1$은 다음과 같다.
$$Y_1 = [-1.3246,1.0912,0.2334]$$
이를 동일하게 하면
$$Y_2 = [-1.3492,0.3077,1.0415]$$
$$Y_3 = [-0.3756,1.3685,-0.9930]$$

import torch
from torch import nn


x = torch.FloatTensor(
    [
        [-0.6577, -0.5797, 0.6360],
        [0.7392, 0.2145, 1.523],
        [0.2432, 0.5662, 0.322]
    ]
)

print(nn.BatchNorm1d(3)(x))
tensor([[-1.3246, -1.3492, -0.3756],
        [ 1.0912,  0.3077,  1.3685],
        [ 0.2334,  1.0415, -0.9930]], grad_fn=<NativeBatchNormBackward0>)

 

정규화 클래스

 

type class mean
배치 정규화 torch.nn.BatchNorm1d(num_features) 2/3D 입력 데이터 배치 정규화
배치 정규화 torch.nn.BatchNorm2d(num_features) 4D 입력 데이터 배치 정규화
배치 정규화 torch.nn.BatchNorm3d(num_features) 5D 입력 데이터 배치 정규화
계층 정규화 torch.nn.LayerNorm(normalized_shape) 정규화하려는 차원 크기로 계층 정규화
인스턴스 정규화 torch.nn.InstanceNorm1d(num_features) 2/3D 입력 데이터 인스턴스 정규화
인스턴스 정규화 torch.nn.InstanceNorm2d(num_features) 4D 입력 데이터 인스턴스 정규화
인스턴스 정규화 torch.nn.InstanceNorm3d(num_features) 5D 입력 데이터 인스턴스 정규화

참고 자료

https://product.kyobobook.co.kr/detail/S000209621433

 

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습 | 윤대희 - 교보문고

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습 | 트랜스포머는 딥러닝 분야에서 성능이 우수한 모델로 현대 인공지능 분야의 핵심 기술입니다. 트랜스포머와 비전 트랜스

product.kyobobook.co.kr