본문 바로가기

Python/PyTorch

[PyTorch] LayerNorm

 

레이어 정규화는 색칠되어 있는 값을 가지고 평균과 분산을 계산해 정규화를 수행하는 방법이다. 

 

N, C, H, W shape을 가진 4차원 입력에 대해 위의 그림과 동일하게 LayerNorm을 적용하는 방식은 다음과 같다.

import torch
import torch.nn as nn


N, C, H, W = 10, 3, 32, 32
normalized_shape = [C, H, W]
x = torch.randn(N, C, H, W)
layer_norm = nn.LayerNorm(normalized_shape=normalized_shape)
x_norm = layer_norm(x)

 

LayerNorm은 D차원의 normalized_shape을 입력으로 받아 입력의 마지막 D차원에 대해 평균과 분산을 계산해 정규화를 수행한다. 예를 들어, 위와 같은 입력에 대해  normalized_shape을 [32, 32]로 전달할 수도 있다.

 

레이어 정규화가 잘 수행되었는지는 다음과 같이 평균과 표준편차를 확인해 볼 수 있다.

x_norm.mean(dim=[1, 2, 3]), x_norm.std(dim=[1, 2, 3])
(tensor([ 1.4280e-08,  4.9671e-09, -6.3640e-09,  7.4506e-09, -8.2267e-09,
         -2.7940e-09, -1.1176e-08,  4.9671e-09,  5.2775e-09,  1.8626e-09],
        grad_fn=<MeanBackward1>),
 tensor([1.0002, 1.0002, 1.0002, 1.0002, 1.0002, 1.0002, 1.0002, 1.0002, 1.0002,
         1.0002], grad_fn=<StdBackward0>))

 

 

 

LayerNorm에는 bool 형식의 입력을 받는 elementwise_affine 매개변수가 있다. 이는 다음 수식에서 학습되는 파라미터인 $\gamma, \beta$를 의미한다.

 

elementwise인 이유는 $\gamma, \beta$의 shape이 normalized_shape과 동일하기 때문이다. 각각의 초기 값은 1과 0이고 LayerNorm의 인스턴스를 생성한 뒤 weight과 bias 변수로 접근할 수 있다.

 

layer_norm.weight.shape, layer_norm.bias.shape
(torch.Size([3, 32, 32]), torch.Size([3, 32, 32]))

 

 

레이어 정규화는 샘플별로 평균과 분산을 계산하여 정규화를 수행하기 때문에 채널 정보가 유지되는 장점이 있다.

'Python > PyTorch' 카테고리의 다른 글

파이토치 재현성  (0) 2024.04.21
파이토치 GPU 설치 Windows  (0) 2024.03.16