기술나눔

배치표준

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

0. 초록

오랜만에 만난 BatchNorm 그리고LayerNorm, 당시에는 데이터를 수행했다는 사실만 대략적으로만 알려져 있었습니다.표준화: x = x − μ σ bm{x} = 분수 bm{x} - bm{mu}}{bm{시그마}}엑스=σ엑스μ 물론 이것은 간단하지만 실제 데이터는 더 복잡합니다.이력서 작업데이터 이미지 측면에서 데이터 배치는 일반적으로 다음과 같습니다. [B, C, H, W]; 을 위한 NLP 작업데이터 문장의 측면에서 배치의 데이터는 일반적으로 다음과 같습니다. [B, T, D]. 저것 XXNorm 어떻게 계산되나요? 전체 배치의 모든 숫자가 한 번에 계산되는 것은 아닙니다. μ bm{뮤}μ 그리고 σ bm{시그마}σ, 그리고 그것들은 다릅니다.

그래서 많은 정보를 확인했고 강사님의 말씀에 정말 동의했습니다. 그 지저분한 블로그를 읽지 마세요. 그들은 당신만큼 좋지 않습니다! 외국인들은 여전히 ​​굉장합니다. 그들은 질문에 대답하는 것만으로도 문제를 명확하게 설명할 수 있습니다. 댓글 영역: 《변압기는 왜 배치 표준 대신 레이어 표준을 사용합니까?》

1. 계산하는 방법은 무엇입니까?

이 섹션에서는 이론적인 관점과 코드 관점에서 자세히 설명합니다. BatchNorm 그리고LayerNorm 계산 방법.

1.1 먼저 이론적으로 이야기해보고 Qianwen의 일반적인 의미를 묻겠습니다.

>>>>> Tongyi Qianwen >>>>>
묻다: 레이어 표준과 배치 표준의 차이점은 무엇입니까?

답변: 레이어 정규화(LayerNorm) 그리고배치 정규화(BatchNorm) 정규화 계층을 통해 신경망 훈련을 가속화하는 데 사용되는 기술입니다.값 입력 또는 활성화, 네트워크 학습을 더욱 안정적이고 효율적으로 만듭니다.구현그리고적용 가능한 장면에 다릅니다.

배치 정규화(BatchNorm)
BatchNorm 주로 훈련 중에미니 배치 데이터의 경우정규화하는 것입니다.주요 타겟내부 공변량 이동 감소(내부 공변량 이동), 즉 네트워크의 순방향 전파 과정에서 중간 계층의 입력 분포가 훈련 반복에 따라 변경됩니다. BatchNorm 계산을 통해현재 미니 배치의 평균과 분산입력을 정규화하기 위한 공식은 다음과 같습니다.
설정 x 비엠{x}엑스 미니 배치 내의 입력 벡터입니다. μ B bm{mu}_Bμ 그리고 σ B 2 bm{시그마}^2_Bσ2 는 각각 미니 배치의 평균과 분산입니다.BatchNorm 산출 와 비엠{와이}와이 이는 다음과 같이 표현될 수 있습니다: x^ = x − μ B μ B 2 + ϵ y^ = γ x ^ + β^비엠엑스=비엠엑스비엠μ비엠μ2+ϵ^비엠와이=γ^비엠엑스+β 엑스^와이^=μ2+ϵ 엑스μ=γ엑스^+β 안에, 감마(γ)γ 그리고 β 베타β 학습 가능한 매개변수입니다. ϵ 엡실론ϵ 수치적 안정성을 위해 사용되는 작은 상수입니다.

레이어 정규화(LayerNorm)
LayerNorm 목적은각 샘플 수준에서미니 배치 통계에 의존하지 않고 정규화를 수행합니다. LayerNorm 시퀀스 모델(예:LSTM 또는Transformer) 등이 있습니다.샘플 간에 종속성이 있을 수 있습니다.또는 미니 배치 크기가 고정되지 않을 수 있음. LayerNorm 계산하다각 표본 특징의 평균과 분산, 공식은 다음과 같습니다.
설정 x 비엠{x}엑스 단일 샘플의 특징 벡터입니다. μ L bm{mu}_Lμ 그리고 σ L 2 비엠{시그마}^2_Lσ2 는 각각 표본 특성의 평균과 분산입니다.LayerNorm 산출 와 비엠{와이}와이 이는 다음과 같이 표현될 수 있습니다: x^ = x − μL μL2 + ϵ y^ = γ x ^ + β^비엠엑스=비엠엑스비엠μ비엠μ2+ϵ^비엠와이=γ^비엠엑스+β 엑스^와이^=μ2+ϵ 엑스μ=γ엑스^+β 여기도 마찬가지, 감마(γ)γ 그리고 β 베타β 학습 가능한 매개변수입니다. ϵ 엡실론ϵ 작은 상수입니다.

차이점

  • 데이터에 따라 다름: BatchNorm 에 달려있다미니 배치 통계, 그리고 LayerNorm 에 달려있다단일 표본의 특성 통계;
  • 애플리케이션 시나리오: BatchNorm 에 더 적합컴퓨터 비전 작업, 그리고 LayerNorm 에 더 적합자연어 처리 작업, 특히 시퀀스 데이터를 다룰 때;
  • 계산 효율성: BatchNorm 미니 배치 내에서 병렬성을 활용할 수 있기 때문에 병렬 컴퓨팅이 더 효율적일 수 있습니다.LayerNorm 각 샘플에 대한 계산은 독립적이며 다양한 길이의 시퀀스 데이터를 처리하는 데 더 적합합니다.

두 방법 모두 장점과 단점이 있으며 일반적으로 어떤 방법을 선택할지는 특정 애플리케이션 시나리오와 데이터 특성에 따라 다릅니다.
<<<<< 통이 첸웬<<<<

혼란스러워요? "현재 미니 배치의 평균과 분산"은 무엇입니까?? "각 표본 특징의 평균과 분산"이란 무엇입니까?? 외국인의 대답이 더 좋습니다.

먼저 기본 개념을 이해해 보겠습니다.

  • 사례: 샘플, 영상 이력서를 위해,문장 NLP를 위해
  • 요소: 샘플의 구성 요소, 픽셀 이미지를 위해,단어 문장을 위해;
  • 특징: 요소의 특성, RGB 값 펙셀의 경우,임베딩 단어로 표현하면.

이는 데이터에 반영됩니다.

  • [B, C, H, W] 배치입니다.[C, H, W] 예시이고,[C] 다음을 포함하는 픽셀입니다.C 특징.
  • [B, T, L] 배치입니다.[T, L] 예시이고,[L] 포함하는 단어입니다.L 특징.

아래 그림과 같이:

배치 차원 측면에서 보면 뒤쪽으로 확장된 각각의 작은 사각형은 왼쪽 그림의 긴 보라색 막대, 픽셀의 RGB 기능 또는 단어 벡터와 같은 요소를 나타냅니다.LayerNorm 주다각 요소 평균과 분산을 계산하면 다음을 얻을 수 있습니다.BxL 평균과 분산(또는BxHxW). 그 다음에각 요소는 독립적으로 표준화됩니다.오른쪽 그림의 보라색 패치는 배치에 있는 모든 단어의 첫 번째 기능입니다. BatchNorm 주다각 기능 평균과 분산을 계산하면 다음을 얻을 수 있습니다.L 평균과 분산(또는C). 그 다음에각 기능은 독립적으로 표준화됩니다..


Transformer는 위에서 언급한 내용을 따르지 않는다는 점에 유의해야 합니다.LayerNorm 계산되었지만 주어진각 인스턴스 평균과 분산을 계산하면 다음을 얻을 수 있습니다.B 평균과 분산각 인스턴스는 독립적으로 표준화됩니다.. 정확히 말하면 아래 그림과 같습니다.

1.2 파이토치에서 BatchNorm 그리고LayerNorm
1.2.1 BatchNorm

파이토치에서는 BatchNorm 가리키다nn.BatchNorm1d, nn.BatchNorm2d 그리고nn.BatchNorm3d, 각각 다른 차원의 데이터에 대해 다음을 수행합니다.

  • nn.BatchNorm1d: (N, C) 또는(N, C, L)
  • nn.BatchNorm2d: (N, C, H, W)
  • nn.BatchNorm3d: (N, C, D, H, W)

소스 코드 보기:

class BatchNorm1d(_BatchNorm):
	r"""
	Args:
		num_features: number of features or channels `C` of the input

	Shape:
		- Input: `(N, C)` or `(N, C, L)`, where `N` is the batch size,
		  `C` is the number of features or channels, and `L` is the sequence length
		- Output: `(N, C)` or `(N, C, L)` (same shape as input)
	"""
	def _check_input_dim(self, input):
		if input.dim() != 2 and input.dim() != 3:
			raise ValueError(f"expected 2D or 3D input (got {input.dim()}D input)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

예시:

>>> m = nn.BatchNorm1d(100)  # C=100	   # With Learnable Parameters
>>> m = nn.BatchNorm1d(100, affine=False)  # Without Learnable Parameters
>>> input = torch.randn(20, 100)  # (N, C)
>>> output = m(input)
>>> # 或者
>>> input = torch.randn(20, 100, 30)  # (N, C, L)
>>> output = m(input)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

γ , β bm{감마}, bm{베타}γ,β 학습 가능한 매개변수이고,shape=(C,), 매개변수 이름은 다음과 같습니다. .weight 그리고.bias:

>>> m = nn.BatchNorm1d(100)
>>> m.weight
Parameter containing:
tensor([1., 1., ..., 1.], requires_grad=True) 
>>> m.weight.shape
torch.Size([100])
>>> m.bias
Parameter containing:
tensor([0., 0., ..., 0.], requires_grad=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

BatchNorm2d 그리고BatchNorm3d 똑같습니다, 차이점은_check_input_dim(input):

class BatchNorm2d(_BatchNorm):
	r"""
	Args:
		num_features: `C` from an expected input of size `(N, C, H, W)`
	Shape:
		- Input: :math:`(N, C, H, W)`
		- Output: :math:`(N, C, H, W)` (same shape as input)
	"""
	def _check_input_dim(self, input):
		if input.dim() != 4:
			raise ValueError(f"expected 4D input (got {input.dim()}D input)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

예시:

>>> m = nn.BatchNorm2d(100)
>>> input = torch.randn(20, 100, 35, 45)
>>> output = m(input)
  • 1
  • 2
  • 3
class BatchNorm3d(_BatchNorm):
	r"""
	Args:
		num_features: `C` from an expected input of size `(N, C, D, H, W)`
	Shape:
		- Input: :math:`(N, C, D, H, W)`
		- Output: :math:`(N, C, D, H, W)` (same shape as input)
	"""
	def _check_input_dim(self, input):
		if input.dim() != 5:
			raise ValueError(f"expected 5D input (got {input.dim()}D input)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

예시:

>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
  • 1
  • 2
  • 3
1.2.2 LayerNorm

와는 다르다 BatchNorm(num_features), LayerNorm(normalized_shape) 매개변수는 다음과 같습니다.input.shape ~ 후에x 개인dim, 좋다 [B, T, L] 마지막 두 차원은[T, L], 다음 경우 각 문장은 독립적으로 표준화됩니다. L 또는[L], 각 단어 벡터는 독립적으로 표준화됩니다.

NLP 예제

>>> batch, sentence_length, embedding_dim = 20, 5, 10
>>> embedding = torch.randn(batch, sentence_length, embedding_dim)
>>> layer_norm = nn.LayerNorm(embedding_dim)
>>> layer_norm(embedding)  # Activate module
  • 1
  • 2
  • 3
  • 4

이미지 예시

>>> N, C, H, W = 20, 5, 10, 10
>>> input = torch.randn(N, C, H, W)
>>> # Normalize over the last three dimensions (i.e. the channel and spatial dimensions)
>>> layer_norm = nn.LayerNorm([C, H, W])
>>> output = layer_norm(input)
  • 1
  • 2
  • 3
  • 4
  • 5

즉, “다양한 것”만을 포함하는 것이 아니다. 요소 독립적으로 표준화” 및 “각각사례 독립적으로 정규화되어" 임의의 계산이 가능합니다.마지막 x차원에 대해 정규화.

1.3 계산과정 조사
import torch
from torch import nn

# >>> 手动计算 BatchNorm2d >>>
weight = torch.ones([1, 3, 1, 1])
bias = torch.zeros([1, 3, 1, 1])

x = 10 * torch.randn(2, 3, 4, 4) + 100
mean = x.mean(dim=[0, 2, 3], keepdim=True)
std = x.std(dim=[0, 2, 3], keepdim=True, unbiased=False)
print(x)
print(mean)
print(std)

y = (x - mean) / std
y = y * weight + bias
print(y)
# <<< 手动计算 BatchNorm2d <<<

# >>> nn.BatchNorm2d >>>
bnm2 = nn.BatchNorm2d(3)
z = bnm2(x)
print(z)
# <<< nn.BatchNorm2d <<<
print(torch.norm(z - y, p=1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

수동으로 계산하고 nn.BatchNorm 계산은 거의 똑같습니다. 아마도 일부가 있을 수도 있습니다. ϵ 엡실론ϵ 여기서 영향을 받습니다.unbiased=False 공식 문서에서는 다음과 같이 설명합니다.

"""
At train time in the forward pass, the standard-deviation is calculated via the biased estimator,
equivalent to `torch.var(input, unbiased=False)`.
However, the value stored in the moving average of the standard-deviation is calculated via
the unbiased  estimator, equivalent to `torch.var(input, unbiased=True)`.

Also by default, during training this layer keeps running estimates of its computed mean and
variance, which are then used for normalization during evaluation.
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

여기서는 계산 과정을 확인하고 싶을 뿐이지 unbiased. 간단히 언급하자면:

  • 훈련 단계에서는 편향된 분산 추정치를 계산하는 반면, 분산이 있는 이동 평균의 분산은 편향되지 않은 추정치입니다.
  • 학습 중에는 평균과 변수의 이동 평균이 저장되어 테스트 단계에서 사용됩니다.