본문 바로가기
딥러닝

[딥러닝] Layer Normalization과 Batch Normalization 정리

by Tiabet 2025. 2. 17.

이번 포스팅에선 Neural Network에서 자주 사용되는 두 정규화 기법인 Layer Normalization과 Batch Normalization에 대해 정리해보고자 한다.

 

우선 Normalization이 왜 필요한지는 다소 직관적으로 느껴진다.

출처 : https://news.skhynix.co.kr/post/all-around-ai-4

 

Neural Network, 즉 인공신경망 모델에서 모델을 학습시키는 과정은 역전파다. 역전파를 위해선 경사하강법이 사용되고, 경사하강법이란 정답과 모델의 예측치의 차이를 바탕으로 구해진다. 그런데 만약 학습시키는 데이터마다 스케일이 다르다면? 정답과 예측치의 차이가 들쑥날쑥할 것이고, 그러면 역전파로 인해 모델의 가중치도 들쑥날쑥 바뀔 것이다. 또한 인공신경망이 사용하는 활성화함수에 따라서 Gradient 소실/폭발 문제가 발생할 수도 있다. 역전파에 대한 포스팅은 아래를 약간 참조.

 

https://tiabet0929.tistory.com/79

 

[딥러닝] 역전파를 단 한 줄로 가능하게 해주는 backward() 함수 탐구

많은 사람들이 딥러닝 이론을 공부할 때 가장 열심히 공부하는 부분이 역전파 부분일 것이다.그 이유는 단순한데, 역전파가 있어야 딥러닝이고 또 그 과정이 만만치 않게 복잡하기 때문이다.http

tiabet0929.tistory.com

 

즉 가중치가 행렬이라는 것을 이해한 시점이라면, 인공신경망을 학습시킬 때 데이터를 정규화해주는 것이 더 안정적으로 느껴지는 것은 직관적이기까지 하다. 그런데 여기서 어떻게 정규화를 진행하냐에 따라서 기법이 달라지는데, 이번 포스팅에선 대표적으로 Batch Normalization과 Layer Normalization, 한국어로 하면 배치 정규화와 층 정규화에 대해서만 간단하게 정리해보고자 한다. 아래 포스팅은 두 정규화 말고 다른 정규화들에 대해서도 정리를 깔끔히 해놨다.

 

https://theaisummer.com/normalization/

 

In-layer normalization techniques for training very deep neural networks | AI Summer

How can we efficiently train very deep neural network architectures? What are the best in-layer normalization options? We gathered all you need about normalization in transformers, recurrent neural nets, convolutional neural networks.

theaisummer.com

 

 

두 정규화 기법의 차이에 대해 확실히 알기 위해 배치크기가 4인 4*12*256 크기의 배치, 즉 인풋 행렬 하나를 생각해보자. 도메인이 자연어라고 생각해보면, 문장 길이가 12, 문장 임베딩 크기가 256인 상황이라고 생각해도 될 것 같다. 배치 정규화는, 256, 즉 인풋의 Feature에 대해서 정규화를 진행한다. 층 정규화는, 4*12, 즉 인풋의 개별 문장에 대해서 정규화를 진행한다. (축이 각각 Feature와 토큰이라는 의미다.)

 

이렇게 글로만 보면 한 번에 이해가지 않을 수 있다.

 

출처 : https://paperswithcode.com/method/layer-normalization

 

위 그림은 사용 모델이 CNN이라고 가정했을 때의 모습이다. 텍스트 상황으로 비교하자면 N이 배치 크기, C가 임베딩 차원, H,W가 문장 내 토큰을 의미한다. Batch Normalization은 같은 차원 내에서, 모든 배치와 토큰에 대해 정규화를 진행한다. Layer Normalization은 반대로 같은 배치와 토큰 내에서 모든 Feature에 대해 정규화를 진행한다. 

그런데 이렇게 그림으로만 봐도 모호한 감이 있다. 그래서 파이썬 코드로 확인해보면

import numpy as np
import pandas as pd

# 입력 데이터 (Batch, Sequence Length, Feature Size) = (4, 12, 256)
np.random.seed(42)  # 재현성을 위해 고정된 랜덤 시드 사용
input_data = np.random.randn(4, 12, 256)  # 가우시안 정규분포에서 샘플링

# Batch Normalization (Across Batch and Sequence Length for Each Feature)
batch_mean = np.mean(input_data, axis=(0, 1), keepdims=True)  # 평균 계산 (Across Batch and Sequence)
batch_std = np.std(input_data, axis=(0, 1), keepdims=True) + 1e-5  # 분산 계산 (Across Batch and Sequence), 작은 값 추가하여 안정성 확보
batch_norm = (input_data - batch_mean) / batch_std  # 정규화 수행

# Layer Normalization (Across Feature for Each Token)
layer_mean = np.mean(input_data, axis=2, keepdims=True)  # 평균 계산 (Across Feature for Each Token)
layer_std = np.std(input_data, axis=2, keepdims=True) + 1e-5  # 분산 계산 (Across Feature for Each Token)
layer_norm = (input_data - layer_mean) / layer_std  # 정규화 수행

 

위 코드를 돌리고 batch_mean과 layer_mean 등을 디버깅해보면

batch_mean은 (1,1,256)의 shape을, layer_norm은 (4,12,1)의 shape을 갖는다. 즉 배치 정규화에서 정규화 계산은 Feature의 개수인 256번, 층 정규화에서 정규화 계산은 Batch_size * input_len = 48번 일어나게 되는 것이다.

 

즉 문장의 관점에서 다시 말하면, 배치 정규화는 각각의 임베딩 차원에 대해 정규화하고, 층 정규화는 각각의 문장에 대해 정규화한다. 이게 두 정규화 방식의 결정적인 차이고, 이후 특별한 스케일링 팩터까지 추가해주면 실제 모델에서 구현되는 배치 정규화와 층 정규화가 완성된다.

\[ \hat{x} = \frac{x - \mu}{\sigma} \]
\[ y = \gamma \hat{x} + \beta \]

 

여기서 $\gamma$와 $\beta$가 하이퍼파라미터로, 딥러닝 모델을 훈련할 때 같이 학습되는 부분이다.

 

 

그렇다면 배치 정규화와 층 정규화의 차이는 어쩌다 발생했을까.

 

Transformer 아키텍쳐에서 Add & Norm부분의 Norm이 층 정규화다.

 

우선 먼저 고안된 배치 정규화는 CNN 기반 모델들에서 발견되어 사용되던 방식이다. 배치 정규화가 처음 소개된 논문도 이미지 분류 모델로 실험을 진행했다. 그 이유는 CNN의 각 커널이 Feature로 해석된다는 점에서 짐작 가능하다. 커널을 여러 개 사용하는 CNN 기반 모델들은 그 커널의 수가 많아질수록 커널 내에서 정규화를 진행해야 학습이 더욱 안정적으로 이루어졌을 것이다. 반면 층 정규화는 처음엔 RNN 기반 모델을 위해 소개됐으나 별 인기가 없었는데, 이후 트랜스포머에서 층 정규화를 사용하면서 그 주목도가 엄청나게 올라갔다고 한다. 문장을 처리하는 트랜스포머나 그 이전 RNN에서 사용되는 Feature는 임베딩 벡터인데, 이 각각의 임베딩 차원을 정규화한다고 해서(배치 정규화를 한다고 해서) 큰 의미는 없다는 것이 직관적으로 느껴진다. 따라서 층 정규화는 자연어 처리, 특히 트랜스포머에서 채택되었고 이후 큰 인기를 얻은 것으로 보인다.