카테고리 없음

LayerNorm 정리

mvsw 2026. 1. 12. 00:56

 

https://arxiv.org/abs/1607.06450

 

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

 

Layer Normalization Paper에 13p Supplementary Material

 

https://docs.pytorch.org/docs/stable/generated/torch.nn.modules.normalization.LayerNorm.html

 

 

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이다.