내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
오랜만에 만난 BatchNorm
그리고LayerNorm
, 당시에는 데이터를 수행했다는 사실만 대략적으로만 알려져 있었습니다.표준화: x = x − μ σ bm{x} = 분수 bm{x} - bm{mu}}{bm{시그마}}엑스=σ엑스−μ 물론 이것은 간단하지만 실제 데이터는 더 복잡합니다.이력서 작업데이터 이미지 측면에서 데이터 배치는 일반적으로 다음과 같습니다. [B, C, H, W]
; 을 위한 NLP 작업데이터 문장의 측면에서 배치의 데이터는 일반적으로 다음과 같습니다. [B, T, D]
. 저것 XXNorm
어떻게 계산되나요? 전체 배치의 모든 숫자가 한 번에 계산되는 것은 아닙니다. μ bm{뮤}μ 그리고 σ bm{시그마}σ, 그리고 그것들은 다릅니다.
그래서 많은 정보를 확인했고 강사님의 말씀에 정말 동의했습니다. 그 지저분한 블로그를 읽지 마세요. 그들은 당신만큼 좋지 않습니다! 외국인들은 여전히 굉장합니다. 그들은 질문에 대답하는 것만으로도 문제를 명확하게 설명할 수 있습니다. 댓글 영역: 《변압기는 왜 배치 표준 대신 레이어 표준을 사용합니까?》
이 섹션에서는 이론적인 관점과 코드 관점에서 자세히 설명합니다. BatchNorm
그리고LayerNorm
계산 방법.
>>>>> 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
각 샘플에 대한 계산은 독립적이며 다양한 길이의 시퀀스 데이터를 처리하는 데 더 적합합니다.두 방법 모두 장점과 단점이 있으며 일반적으로 어떤 방법을 선택할지는 특정 애플리케이션 시나리오와 데이터 특성에 따라 다릅니다.
<<<<< 통이 첸웬<<<<
혼란스러워요? "현재 미니 배치의 평균과 분산"은 무엇입니까?? "각 표본 특징의 평균과 분산"이란 무엇입니까?? 외국인의 대답이 더 좋습니다.
먼저 기본 개념을 이해해 보겠습니다.
이는 데이터에 반영됩니다.
[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
평균과 분산각 인스턴스는 독립적으로 표준화됩니다.. 정확히 말하면 아래 그림과 같습니다.
BatchNorm
그리고LayerNorm
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)")
예시:
>>> 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)
γ , β 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)
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)")
예시:
>>> m = nn.BatchNorm2d(100)
>>> input = torch.randn(20, 100, 35, 45)
>>> output = m(input)
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)")
예시:
>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
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
이미지 예시
>>> 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)
즉, “다양한 것”만을 포함하는 것이 아니다. 요소 독립적으로 표준화” 및 “각각사례 독립적으로 정규화되어" 임의의 계산이 가능합니다.마지막 x차원에 대해 정규화.
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))
수동으로 계산하고 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.
"""
여기서는 계산 과정을 확인하고 싶을 뿐이지 unbiased
. 간단히 언급하자면: