pytorch LayerNorm 매개 변수의 용법 및 계산 과정

설명 하 다.
Layer Norm 에 서 는 BatchNorm 처럼 전체적인 평균 값 차 이 를 추적 하지 않 기 때문에 train()과 eval()은 Layer Norm 에 영향 을 주지 않 습 니 다.
LayerNorm 매개 변수

torch.nn.LayerNorm(
        normalized_shape: Union[int, List[int], torch.Size],
        eps: float = 1e-05,
        elementwise_affine: bool = True)
normalized_shape
정수,예 를 들 어 4 가 들 어 오 면 하나의 정수 만 있 는 list 로 간주 된다.이때 Layer Norm 은 입력 의 마지막 1 차원 을 획일 화 할 것 이다.이 int 값 은 입력 의 마지막 1 차원 과 똑 같이 커 야 한다.
이때 입력 한 데이터 차원 이[3,4]라 고 가정 하면 3 개의 길이 가 4 인 벡터 에 대해 평균 값 의 차 이 를 구하 고 3 개의 평균 값 과 3 개의 방 차 를 얻어 각각 이 3 줄 을 귀 일화 한다(각 줄 의 4 개의 숫자 는 모두 평균 값 이 0 이 고 방 차 는 1 이다).Layer Norm 의 weight 와 bias 도 각각 4 개의 숫자 를 포함 하고 3 번 반복 해서 사용 하 며 각 줄 에 대해 모방 변환(모방 변환 즉 weight 에 대응 하 는 숫자 를 곱 한 후 bias 에 대응 하 는 숫자 를 추가)을 하고 역방향 으로 전 파 될 때 배 웁 니 다.
만약 에 list 나 torch.size,예 를 들 어[3,4]또는 torch.size([3,4])를 입력 하면 네트워크 의 마지막 2 차원 을 획일 화 시 키 고 데 이 터 를 입력 하 라 고 요구 하 는 마지막 2 차원 사이즈 도[3,4]이다.
이때 입력 한 데이터 차원 도[3,4]라 고 가정 하면 먼저 이 12 개의 숫자 에 대해 평균 값 과 방 차 를 구 한 다음 에 이 12 개의 숫자 를 획일 화 시킨다.weight 와 bias 도 각각 12 개의 숫자 를 포함 하여 각각 12 개의 귀 일 화 된 숫자 를 모방 하여 변환(모방 변환 즉 weight 에 대응 하 는 숫자 를 곱 한 후 bias 에 대응 하 는 숫자 를 추가)하고 역방향 으로 전 파 될 때 학습 을 받는다.
이때 입력 한 데이터 차원 이[N,3,4]라 고 가정 하면 N 개[3,4]에 대해 상기 와 같은 조작 을 한다.다만 이때 모방 변환 을 할 때 weight 와 bias 는 N 회 중복 사용 된다.
이때 입력 한 데이터 차원 이[N,T,3,4]라 고 가정 하면 차원 이 더 많 을 수 있다.
메모:Layer Norm 에서 weight 와 bias 의 shape 가 들 어 오 는 normalized 임 이 분명 합 니 다.shape。
eps
귀 일화 시 분모 에 덧 붙 여 제로 제 거 를 방지 하 다.
elementwise_affine
False 로 설정 하면 Layer Norm 층 에 학습 가능 한 인자 가 없습니다.
True(기본 값 은 True)로 설정 하면 학습 가능 한 매개 변수 weight 와 bias 를 포함 하여 복사 변환 에 사용 합 니 다.즉,입력 데 이 터 를 평균 값 0 분산 1 로 분류 한 후 weight,즉 bias 를 곱 합 니 다.
Layer Norm 전방 향 전파(normalizedshape 는 int 의 예 이다)
1.다음 과 같이 입력 한 데이터 의 shape 는(3,4)이 고 이때 normalizedshape 가 4(입력 차원 의 마지막 1 차원 size)에 들 어가 면 마지막 1 차원(마지막 1 차원 을 따라 마지막 1 차원 의 데 이 터 를 조작 한 다 는 뜻)을 따라 이 두 가지 결과 로 batch 를 마지막 1 차원 을 따라 획일 화 시 켜 평균 값 을 0,방 차 를 1 로 한다.정규 화 공식 은 eps(),즉을 사용 했다.

tensor = torch.FloatTensor([[1, 2, 4, 1],
                            [6, 3, 2, 4],
                            [2, 4, 6, 1]])

[[-0.8165,  0.0000,  1.6330, -0.8165],
 [ 1.5213, -0.5071, -1.1832,  0.1690],
 [-0.6509,  0.3906,  1.4321, -1.1717]]
2、elementwiseaffine==True 는 귀 일 화 된 batch 를 모방 하여 변환 합 니 다.즉,모듈 내부 의 weight(초기 값 은[1.,1.,1.,1.)를 곱 한 다음 에 모듈 내부 의 bias(초기 값 은[0.,0.,0.)를 더 하면 이 두 변 수 는 역방향 으로 전 파 될 때 업 데 이 트 됩 니 다.
3、elementwiseaffine==False 는 Layer Norm 에 weight 와 bias 두 변 수 를 포함 하지 않 고 귀 일화 만 하고 모방 변환 을 하지 않 습 니 다.
총결산
Layer Norm 을 사용 할 때 보통 normalized 만 지정 합 니 다.shape 면 돼 요.
보충:[Pytorch]F.layernorm 과 N.Layer Norm 은 어떤 차이 가 있 습 니까?
배경
최근 에 영상 방향 을 만 들 고 있 는데 타 이 밍 특징 을 다 루 고 있 는데 Batch Normalization 으로 영상 특징 BN 층 을 만 들 수 있 을 까?인터넷 에서 자 료 를 찾 아 보 니 순서 특징 은 Batch Normalization 을 사용 할 수 없 는 것 으로 나 타 났 다.왜냐하면 하나의 batch 의 순서 가 길 고 짧 기 때문이다.
그 밖 에 BN 의 단점 중 하 나 는 비교적 큰 batchsize 가 있어 야 훈련 데이터 의 평균 값 과 분산 을 합 리 적 으로 평가 할 수 있다 는 것 이다.이 로 인해 메모리 가 부족 할 수 있 고 훈련 데이터 길이 가 다른 RNN 모델 에 도 적용 하기 어렵다.
Layer Normalization(LN)의 장점 중 하 나 는 일괄 훈련 없 이 단일 데이터 내부 에서 획일 화 할 수 있다 는 것 이다.
RNN 등 타 이 밍 모델 에 대해 서 는 같은 batch 내부 의 훈련 인 스 턴 스 길이 가 다 를 때 가 있 습 니 다(길이 가 다른 문장).서로 다른 타 이 밍 에서 서로 다른 통 계량 을 저장 해 야 합 니 다.BN 층 을 정확하게 사용 할 수 없고 Layer Normalization 만 사용 할 수 있 습 니 다.
Layer Normalization(이하 LN)을 찾 아 보 니 이 물건 은 두 가지 용법 이 있 는데 하 나 는 F.layer 입 니 다.norm,하 나 는 torch.nn.Layer Norm 이 고 본 고 는 그들의 차 이 를 연구한다.
F.layer_norm
사용법

F.layer_norm(x, normalized_shape, self.weight.expand(normalized_shape), self.bias.expand(normalized_shape))
그 중:
x 는 입력 한 Tensor 입 니 다.
normalized_shape 는 획일 화 된 차원 으로 x 의 뒤의 몇 차원 일 수 있다.
self.weight.expand(normalized_shape),선택 가능 한 인자,사용자 정의 weight
self.bias.expand(normalized_shape),선택 가능 한 인자,사용자 정의 bias
예시
F.normalize 와 마찬가지 로 배 울 수 있 는 인자 나 사용자 정의 인자 가 없다 는 것 을 쉽게 알 수 있 습 니 다.구체 적 인 사용 예 는 다음 과 같다.

import torch.nn.functional as F
 
input = torch.tensor(a)
y = F.layer_norm(input,(4,))
print(y)
 
#####################  ################
tensor([[[-0.8095, -1.1224,  1.2966,  0.6354],
         [-1.0215, -0.9661,  0.8387,  1.1488],
         [-0.3047,  1.0412, -1.4978,  0.7613]],
 
        [[ 0.4605,  1.2144, -1.5122, -0.1627],
         [ 1.5676,  0.1340, -1.0471, -0.6545],
         [ 1.5388, -0.3520, -1.2273,  0.0405]]])
크기 조정 추가:

w = torch.tensor([1,1,2,2])
b = torch.tensor([1,1,1,1])
y = F.layer_norm(input,(4,),w,b)
print(y)
 
#########################  ######################
tensor([[[ 0.1905, -0.1224,  3.5931,  2.2708],
         [-0.0215,  0.0339,  2.6775,  3.2976],
         [ 0.6953,  2.0412, -1.9956,  2.5225]],
 
        [[ 1.4605,  2.2144, -2.0243,  0.6746],
         [ 2.5676,  1.1340, -1.0942, -0.3090],
         [ 2.5388,  0.6480, -1.4546,  1.0810]]])
nn.LayerNorm
사용법

torch.nn.LayerNorm(
        normalized_shape: Union[int, List[int], torch.Size],
        eps: float = 1e-05,
        elementwise_affine: bool = True)
normalized_shape:사이즈 입력,[∗]×normalized_shape[0]×normalized_shape[1]×…×normalized_shape[−1]]
eps:수치 안정성(분모 가 가 까 워 지 거나 0 을 취하 지 못 함)을 확보 하기 위해 분모 에 가 하 는 값 입 니 다.기본 값 은 1e-5 입 니 다.
elementwise_affine:불 값,true 로 설정 하면 이 층 에 학습 가능 한 복사 변환 파 라 메 터 를 추가 합 니 다.
예시
elementwise_affine 이 false 로 설정 되면 Layer Norm 층 은 학습 가능 한 매개 변 수 를 포함 하지 않 습 니 다.
True(기본 값 은 True)로 설정 하면 학습 가능 한 매개 변수 weight 와 bias 를 포함 하여 복사 변환 에 사용 합 니 다.즉,입력 데 이 터 를 평균 값 0 분산 1 로 분류 한 후 weight,즉 bias 를 곱 합 니 다.

import torch
input = torch.randn(2,3,2,2)
import torch.nn as nn
#         
#m = nn.LayerNorm(input.size()[1:], elementwise_affine=False)
m1 = nn.LayerNorm(input.size()[1:])#input.size()[1:] torch.Size([3, 2, 2])
output1 = m1(input)
# normalize     
m2 = nn.LayerNorm([2,2])
output2 = m2(input)
# normalize      
m3 = nn.LayerNorm(2)
output3 = m3(input)
총결산
F.layer_norm 에는 학습 가능 한 인자 가 없고 N.Layer Norm 에는 학습 가능 한 인자 가 있 습 니 다.elementwiseaffine 이 False 로 설정 되 었 을 때 N.Layer Norm 은 F.layer 로 퇴화 되 었 습 니 다.norm。
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기