본문 바로가기

책/파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습

04 파이토치 심화 (1) 과대적합과 과소적합, 배치 정규화

과대적합과 과소적합

과대적합(Overfitting)은 훈련 데이터에서는 우수하게 예측하지만, 새로운 데이터에서는 제대로 예측하지 못해 오차가 크게 발생하는 것을 의미한다.

 

과소적합(Underfitting)은 훈련 데이터와 새로운 데이터 모두 성능이 좋지 않은 경우이다. 둘 다 다음과 같은 공통점이 있다.

 

성능 저하

모델 선택 실패

과대적합과 과소적합은 모델을 변경해 문제를 완화할 수 있다. 과대적합의 경우 모델의 구조가 너무 복잡해 훈련 데이터에만 의존하게 되어 성능이 저하된다. 반대로 과소적합의 경우 모델의 구조가 너무 단순해 데이터의 특징을 제대로 학습하지 못한 경우로 볼 수 있다. 그러므로 모델을 변경하거나 모델 구조를 개선해야 한다.

편향 분산 트레이드오프

 

모델이 복잡해질수록 분산은 커지고 편향은 작아진다. 반대로 모델이 단순해질수록 분산은 작아지고 편향은 커진다. 오류를 최소하기 위해 분산과 편향의 균형을 맞춰야 한다.

 

모델의 편향과 분산에 대해 더 자세한 내용은 이전 글을 참고

2023.12.11 - [Machine Learning/Business Analytics 2] - 4-2 : Ensemble Learning - Bias-Variance Decomposition

 

4-2 : Ensemble Learning - Bias-Variance Decomposition

자료 출처 서로 다른 모델들은 다른 클래스 바운더리나 fitted functions을 제공한다. 어떠한 single best model도 다른 알고리즘들에 비해서 우월하다는 결론을 내릴 수 없기 때문에 다양한 모델들이 기

ai-junha.tistory.com

 

과대적합과 과소적합 문제 해결

다음과 같은 방법을 적용할 수 있다.

  • 데이터 수집
  • 피쳐 엔지니어링 : 변수나 특징을 추출하거나 피처를 더 작은 차원으로 축소
  • 모델 변경
  • 조기 중단
  • 배치 정규화
  • 가중치 초기화
  • 규제 : L1, L2, dropout, weight decay 등

 

배치 정규화

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

 

각 계층은 배치 단위의 데이터로 인해 계속 변화되는 입력 분포를 학습해야 하기 때문에 신경망의 성능과 안정성이 낮아져 학습 속도가 느려진다. 내부 공변량 변화란 계층마다 입력 분포가 변경되는 현상을 의미한다.

 

내부 공변량 변화가 발생하는 경우 은닉층에서 다음 은닉층으로 전달될 때 입력값이 균일해지지 않아 가중치가 제대로 갱신되지 않을 수 있다. 또한 초기 가중치 값에 민감해져 일반화하기가 어려워져 더 많은 학습 데이터를 요구하게 된다. 이러한 문제를 해결하기 위해 각 계층에 배치 정규화를 적용한다.

 

배치 정규화는 미니 배치의 입력을 정규화하는 방식으로 동작한다. 예를 들어 미니 배치에 전달되는 입력값이 [100, 1, 1]이거나 [1, 0.01, 0.01]이라면 둘 다 [1.4142, -0.7071, -0.7071]로 정규화 한다.

 

배치 정규화를 적용하면 각 계층에 대한 입력이 일반화되고 독립적으로 정규화가 수행되므로 더 빠르게 값을 수렴할 수 있다. 입력이 정규화 되므로 초기 가중치에 대한 영향을 줄일 수 있다.

 

정규화 종류

배치 정규화 이외에도 계층 정규화(Layer Normalization), 인스턴스 정규화(Instance Normalization), 그룹 정규화(Group Normalization)이 있다.

 

계층 정규화는 채널 축으로 계산되어 미니 배치 샘플간의 의존관계가 없다. 그러므로 샘플이 서로 다른 길이를 가지더라도 정규화를 수행할 수 있다. 주로 자연어 처리에서 사용되며 RNN이나 트랜스포머 기반 모델에서 주로 사용된다.

 

인스턴스 정규화는 채널과 샘플을 기준으로 정규화를 수행한다. 정규화가 각 샘플에 대해 개별적으로 수행되므로 입력이 다른 분포를 갖는 작업에 적합하다. GAN이나 이미지의 스타일을 변환하는 모델에서 주로 사용된다.

 

그룹 정규화는 채널을 N개의 그룹으로 나누고 각 그룹 내에서 정규화를 수행한다. 그룹을 하나로 설정하면 인스턴스 정규화와 동일하며, 그룹의 개수를 채널의 개수와 동일하게 설정하면 계층 정규화와 동일한 기능을 한다. 그룹 정규화는 배치 크기가 작거나 채널 수가 매우 많은 경우에 주로 사용된다. CNN의 배치 크기가 작으면 배치 정규화가 배치의 평균과 분산이 데이터세트를 대표한다고 보기 어렵기 때문에 배치 정규화의 대안으로 사용된다.

 

파이토치에서 배치 정규화를 사용하는 방법을 알아보자.

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

print(torch.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>)

BatchNorm1d 클래스는 특징 개수(num_features)를 입력 받아 배치 정규화를 수행한다. BatchNorm1d는 2, 3차원 입력 데이터에 배치 정규화를 수행하고, 4차원은 BatchNorm2d, 5차원은 BatchNorm3d 클래스를 사용한다.