심드렁하게 저장

정규화 - Layer Normalization (레이어 정규화) 본문

Artificial intelligence/Deep Learning

정규화 - Layer Normalization (레이어 정규화)

Ggoosae 2025. 3. 12. 00:11

1. Layer Normalization이란?

Layer Normalization 그림

 

Layer Normalization은 각 샘플(배치 내 개별 데이터)의 모든 뉴런을 정규화하는 기법이다.  Batch Normalization은 배치 단위로 정규화 하지만, Layer Normalization은 배치 크기에 독립적으로 동작한다. Layer Normalization은 배치 크기에 의존하지 않으며 Transformer, NLP 모델, 순환 신경망에서 효과적이다. 

2. Layer Normalization의 동작 방식

Layer Normalization은 각 샘플(인스턴스) 내 뉴런 전체를 정규화 하는 방식이다. 정규화 수식은 아래와 같다.

Layer normalization의 정규화 수식

  • $x_(n,i}$ : 입력 데이터 (배치 내 샘플 n , 뉴런 i)
  • $\mu_{n}$ : 샘플(레이어) 내 뉴런들의 평균
  • $\sigma^2_{n}$ : 샘플 내 뉴런들의 분산
  • $\gamma_{i}\beta_{i}$ : 학습 가능한 Scale 및 Shift 이동 파라미터 (BN과 동일)
  • $\epsilon$ : 수치적 안정성을 위한 작은 값 
    • Layer Nomalization은 각 샘플 단위로 정규화하여 배치 크기에 무관하게 동작
    • BN과 달리 배치 크기가 1이거나, 순서가 중요한 시퀀스 데이터에서도 효과적 
    • Batch Normalization은 배치 크기가 작아지면 성능이 저하되지만, Layer Noramlization은 그대로 유지

3. Layer Normalization 구현 (Pytorch)

Scratch 구현

class LayerNorm(nn.Module):
    def __init__(self, num_features, epsilon=1e-5):
        '''
        num_features = 입력 차원
        epsilon: 0으로 나누는 것 방지
        '''
        super(LayerNorm,self).__init__()
        
        # 학습가능한 파라미터
        self.gamma = nn.Parameter(torch.ones(1, num_features))
        self.beta = nn.Parameter(torch.zeros(1, num_features))
        
        self.epsilon = epsilon

    def forward(self,x):
        # x: (N,D) # N: 배치 크기, D: 특성 수

        # 인스턴스 별 평균과 분산 계산
        mean = x.mean(dim=-1,keepdim=True) # (N,1)
        print(mean.shape)
        var = x.var(dim=-1,keepdim=True,unbiased=False) # (N,1)

        # 정규화
        x_hat = (x - mean) / torch.sqrt(var + self.epsilon)

        # Scale & Shift 적용
        return self.gamma * x_hat + self.beta
#
# 사용 예시
x = torch.randn(4, 5)  # 배치 크기 4, 특성 수 5
layer_norm = LayerNorm(num_features=5)
output = layer_norm(x)

print("Layer Normalization 적용 후 출력:", output)

결과:
Layer Normalization 적용 후 출력: tensor([[ 0.7920,  0.8190, -0.6239, -1.6821,  0.6950],
        [-0.4835, -0.6417, -1.1334,  1.6387,  0.6199],
        [ 0.2372, -0.2102,  1.6278, -1.4909, -0.1639],
        [-1.9368,  0.7724,  0.0871,  0.7181,  0.3592]], grad_fn=<AddBackward0>)
  • 각 샘플(배치 내 개별 데이터) 단위로 뉴런 전체를 정규화
  • Transformer, BERT 등의 모델에서 사용가능

pytorch method로 구현

import torch.nn as nn

# Layer Normalization 적용
layer_norm = nn.LayerNorm(normalized_shape=5, elementwise_affine=True)  # 학습 가능 γ, β 포함

 

4. Layer Normalization 정리

  • Layer Normalization은 각 샘플 내 뉴런 전체를 정규화 하는 기법
  • 배치 크기에 독립적이며 NLP 및 Transformer에서 사용
  • 배치 정규화와 달리 배치 크기가 작아도 안정적인 학습 가능
  • Pytorch에서 nn.LayerNorm()으로 적용 가능