Technologieaustausch

BatchNorm

2024-07-12

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

0. Zusammenfassung

Habe mich vor langer Zeit kennengelernt BatchNorm UndLayerNormDamals war nur ungefähr bekannt, dass sie Daten durchgeführt hattenStandardisierung: x = x − μ σ bm{x} = frac{bm{x} - bm{mu}}{bm{sigma}}X=σXμ Das ist natürlich einfach, aber die tatsächlichen Daten sind komplizierterLebenslaufaufgabenIn Bezug auf das Datenbild sieht ein Datenstapel normalerweise so aus: [B, C, H, W]; für NLP-AufgabenBezogen auf den Datensatz sehen die Daten eines Stapels normalerweise so aus: [B, T, D]. Das XXNorm Wie wird es berechnet? Es werden definitiv nicht alle Zahlen im gesamten Stapel auf einmal berechnet. μ bm{mu}μ Und σ bm{sigma}σ, und sie sind unterschiedlich.

Also habe ich viele Informationen überprüft und bin mit den Worten des Lehrers wirklich einverstanden: Lesen Sie nicht diese chaotischen Blogs, sie sind nicht so gut wie Sie. Ausländer sind immer noch großartig, sie können die Probleme klar erklären, indem sie einfach Fragen beantworten! Kommentarbereich: „Warum verwenden Transformatoren die Layer-Norm statt der Batch-Norm?“

1. Wie berechnet man?

In diesem Abschnitt wird sowohl aus theoretischer als auch aus Code-Perspektive ausführlich erläutert BatchNorm UndLayerNorm Rechenmethode.

1.1 Lassen Sie uns zunächst theoretisch darüber sprechen und nach der allgemeinen Bedeutung von Qianwen fragen

>>>>> Tongyi Qianwen >>>>>
fragen: Was ist der Unterschied zwischen Schichtnorm und Chargennorm? Erklären Sie die Formel.

Antwort: Ebenennormalisierung (LayerNorm) UndBatch-Normalisierung (BatchNorm) sind Techniken zur Beschleunigung des neuronalen Netzwerktrainings über die NormalisierungsschichtWert eingeben oder aktivieren, wodurch das Netzwerklernen stabiler und effizienter wirdImplementierungUndAnwendbare Szenesind unterschiedlich auf.

Batch-Normalisierung (BatchNorm)
BatchNorm Hauptsächlich während des TrainingsFür einen Mini-Datensatzum es zu normalisierenHauptzielJaReduzieren Sie interne Kovariatenverschiebungen(interne Kovariatenverschiebung), das heißt, während des Vorwärtsausbreitungsprozesses des Netzwerks ändert sich die Eingabeverteilung der Zwischenschicht mit den Trainingsiterationen. BatchNorm durch BerechnungDer Mittelwert und die Varianz der aktuellen MinichargeUm die Eingabe zu normalisieren, lautet die Formel wie folgt:
aufstellen x bm{x}X ist der Eingabevektor innerhalb eines Mini-Batches, μ B bm{mu}_BμB Und σ B 2 bm{sigma}^2_BσB2 sind dann der Mittelwert bzw. die Varianz der MinichargeBatchNorm Ausgabe y bm{y}j Es kann ausgedrückt werden als: x ^ = x − μ B μ B 2 + ϵ y ^ = γ x ^ + β^bmX=bmXbmμBbmμ2B+ϵ^bmj=γ^bmX+β X^j^=μB2+ϵ XμB=γX^+β In, γ-Gammaγ Und β betaβ ist ein lernbarer Parameter, ϵ Epsilonϵ ist eine kleine Konstante, die für die numerische Stabilität verwendet wird.

Ebenennormalisierung (LayerNorm)
LayerNorm Der Zweck besteht darinauf jeder ProbenebeneFühren Sie eine Normalisierung durch, ohne sich auf Mini-Batch-Statistiken verlassen zu müssen. LayerNorm Eher geeignet für Sequenzmodelle (z. BLSTM oderTransformer) usw., darunterEs können Abhängigkeiten zwischen den Proben bestehenoder Die Mini-Chargengröße ist möglicherweise nicht festgelegt. LayerNorm BerechnungDer Mittelwert und die Varianz jedes Stichprobenmerkmals, die Formel lautet wie folgt:
aufstellen x bm{x}X ist der Merkmalsvektor einer einzelnen Probe, μ L bm{mu}_LμM Und σ L 2 bm{sigma}^2_LσM2 sind dann der Mittelwert bzw. die Varianz der StichprobenmerkmaleLayerNorm Ausgabe y bm{y}j Es kann ausgedrückt werden als: x ^ = x − μ L μ L 2 + ϵ y ^ = γ x ^ + β^bmX=bmXbmμMbmμ2M+ϵ^bmj=γ^bmX+β X^j^=μM2+ϵ XμM=γX^+β Ebenfalls, γ-Gammaγ Und β betaβ ist ein lernbarer Parameter, ϵ Epsilonϵ ist eine kleine Konstante.

der Unterschied

  • Hängt von den Daten ab: BatchNorm kommt drauf anMini-Batch-Statistiken, Und LayerNorm kommt drauf anCharakteristische Statistik einer einzelnen Stichprobe;
  • Anwendungsszenarien: BatchNorm besser geeignet fürComputer-Vision-Aufgaben, Und LayerNorm besser geeignet fürAufgaben zur Verarbeitung natürlicher Sprache, insbesondere beim Umgang mit Sequenzdaten;
  • Recheneffizienz: BatchNorm Möglicherweise ist die parallele Datenverarbeitung effizienter, da sie die Vorteile der Parallelität innerhalb von Mini-Batches nutzen kannLayerNorm Die Berechnungen für jede Probe sind unabhängig und besser für die Verarbeitung von Sequenzdaten unterschiedlicher Länge geeignet.

Beide Methoden haben ihre eigenen Vor- und Nachteile. Die Wahl der Methode hängt in der Regel vom jeweiligen Anwendungsszenario und den Dateneigenschaften ab.
<<<<< Tongyi Qianwen<<<<

Sind Sie verwirrt? Was ist „Mittelwert und Varianz der aktuellen Minicharge“?? Was ist „der Mittelwert und die Varianz jedes Stichprobenmerkmals“?? Die Antwort des Ausländers ist besser:

Lassen Sie uns zunächst die Grundkonzepte verstehen:

  • Beispiel: eine Probe, Bild für Lebenslauf,Satz für NLP;
  • Element: Bestandteile der Probe, Pixel für Bild,Wort für Satz;
  • Besonderheit: Eigenschaften des Elements, RGB-Wert für Pexel,Einbettung für Wort.

Dies spiegelt sich in den Daten wider:

  • [B, C, H, W] ist eine Charge,[C, H, W] ist eine Instanz,[C] Es ist ein Pixel, einschließlichC Besonderheit.
  • [B, T, L] ist eine Charge,[T, L] ist eine Instanz,[L] Es ist ein Wort, einschließlichL Besonderheit.

Wie nachfolgend dargestellt:

Von der Seite der Batch-Dimension aus betrachtet stellt jedes nach hinten verlängerte kleine Quadrat ein Element dar, beispielsweise den langen violetten Balken im linken Bild, das RGB-Merkmal eines Pixels oder einen Wortvektor.LayerNorm Gebenjedes Element Berechnen Sie den Mittelwert und die Varianz, die Sie erhalten könnenBxL Mittelwert und Varianz (oderBxHxW). DannJedes Element ist unabhängig standardisiert. Der violette Fleck im Bild rechts ist ein Merkmal, das erste Merkmal aller Wörter im Stapel. Jeder dieser Flecken ist ein Merkmal. BatchNorm GebenJede Funktion Berechnen Sie den Mittelwert und die Varianz, die Sie erhalten könnenL Mittelwert und Varianz (oderC). DannJede Funktion ist unabhängig standardisiert.


Es ist zu beachten, dass Transformer die oben genannten Punkte nicht befolgtLayerNorm berechnet, aber gegebenjede Instanz Berechnen Sie den Mittelwert und die Varianz, die Sie erhalten könnenB Mittelwert und Varianz alsoJede Instanz ist unabhängig standardisiertGenauer gesagt sieht es wie auf dem Bild unten aus:

1.2 In PyTorch BatchNorm UndLayerNorm
1.2.1 BatchNorm

In PyTorch, BatchNorm Punktnn.BatchNorm1d, nn.BatchNorm2d Undnn.BatchNorm3dbzw. für Daten unterschiedlicher Dimensionen:

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

Quellcode ansehen:

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

Beispiele:

>>> 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{gamma}, bm{beta}γ,β ist ein lernbarer Parameter undshape=(C,), der Parametername ist .weight Und.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 UndBatchNorm3d sind gleich, der Unterschied besteht darin_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

Beispiele:

>>> 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

Beispiele:

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

anders als BatchNorm(num_features), LayerNorm(normalized_shape) Die Parameter sindinput.shape nachx individuelldim, wie [B, T, L] Die letzten beiden Dimensionen von[T, L], dann wird jeder Satz unabhängig standardisiert; L oder[L], dann wird jeder Wortvektor unabhängig standardisiert.

NLP-Beispiel

>>> 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

Bildbeispiel

>>> 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

Mit anderen Worten: Es umfasst nicht nur das „Verschiedene“. Element Unabhängig standardisieren“ und „JederBeispiel „unabhängig normalisiert“ und kann beliebige berechnenüber die letzten x Dimensionen normalisieren.

1.3 Untersuchung des Berechnungsprozesses
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

Sie werden feststellen, dass die manuelle Berechnung und nn.BatchNorm Die Berechnungen sind fast genau gleich, vielleicht gibt es welche ϵ Epsilonϵ Beachten Sie den Einfluss hierunbiased=False Es ist wichtig zu beachten, dass in der offiziellen Dokumentation Folgendes erklärt wird:

"""
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

Ich möchte hier nur den Berechnungsprozess überprüfen und mich nicht darauf konzentrieren unbiased. Um es kurz zu erwähnen:

  • In der Trainingsphase wird eine voreingenommene Schätzung der Varianz berechnet, während die Varianz im gleitenden Durchschnitt mit Varianz eine unvoreingenommene Schätzung ist.
  • Während des Trainings wird der gleitende Durchschnitt von Mittelwert und Var gespeichert und dann in der Testphase verwendet.