레이어 정규화는 색칠되어 있는 값을 가지고 평균과 분산을 계산해 정규화를 수행하는 방법이다.
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 |