https://arxiv.org/abs/1607.06450
LayerNorm은 딥러닝 모델에서 데이터 샘플별로 특징들의 평균과 분산을 계산하여 데이터의 분포를 일정한 범위로 정규화 하는 기법


pytorch에
nn.LayerNorm은 input tensor에 각 요소별로 alpha와 beta 값을 구하는, pytorch 웹사이트에는 gamma와 beta로 표시된
값을 구하는 함수
input크기와 동일한 weight와 bias가 학습된다.
nn.LayerNorm은 input이 [1,5,5] size로 들어가면 weight
import math
import random
import numpy as np
import torch
import torch.nn as nn
from pprint import pprint
class model(nn.Module):
def __init__(self,normalized_shape=[5,5]):
super().__init__()
self.layer = nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True, bias=True, device=None, dtype=None)
def forward(self,x):
x = self.act(x)
return x
v = []
for i in range(1):
l1 = []
for j in range(5):
l2 = []
for k in range(5):
l2.append(random.randint(-5,5))
l1.append(l2)
v.append(l1)
i_arr = torch.Tensor(v)
m(i_arr)
Avg = i_arr.numpy().mean()
Var = i_arr.numpy().var()
eps = 1e-5
arr = i_arr.numpy()[0]
result = []
for i in range(5):
r_l1 = []
for j in range(5):
val = arr[i][j]
single_result = round((val - eps) / math.sqrt(Var + eps),5)
r_l1.append( single_result )
result.append(r_l1)
pprint(result)
위 코드를 돌려보면
이해가 되는데
single_result 부분을 보면 실제 학습에 쓰는 gamma와 beta 값이 안적혀 있다.
gamma와 beta 값이 nn.LayerNorm의 weight와 bias 값으로
학습하는 값인데 초기 값은 1,0으로 되어 있어서 그렇다.
궁금하면 m.layer.weight 와 m.layer.bias를 넣어보면된다.
weight가 gamma, bias가 beta다
ViT에서는
input_data = torch.randn(1, 196, 768)
이런 input이 들어오면
ln = nn.LayerNorm(768)
이렇게 받으면 되는데
print(ln.weight.shape) 해보면 768나오고
print(ln.bias.shape) 이것도 768 나온다.
물론 초기값은 ln.weight는 1, ln.bias는 0이다.