2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Habe mich vor langer Zeit kennengelernt BatchNorm
UndLayerNorm
Damals 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?“
In diesem Abschnitt wird sowohl aus theoretischer als auch aus Code-Perspektive ausführlich erläutert BatchNorm
UndLayerNorm
Rechenmethode.
>>>>> 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=bmX−bmμB√bmμ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=bmX−bmμM√bmμ2M+ϵ^bmj=γ^bmX+β
X^j^=μM2+ϵX−μM=γX^+β Ebenfalls, γ-Gammaγ Und β betaβ ist ein lernbarer Parameter, ϵ Epsilonϵ ist eine kleine Konstante.
der Unterschied
BatchNorm
kommt drauf anMini-Batch-Statistiken, Und LayerNorm
kommt drauf anCharakteristische Statistik einer einzelnen Stichprobe;BatchNorm
besser geeignet fürComputer-Vision-Aufgaben, Und LayerNorm
besser geeignet fürAufgaben zur Verarbeitung natürlicher Sprache, insbesondere beim Umgang mit Sequenzdaten;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:
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:
BatchNorm
UndLayerNorm
BatchNorm
In PyTorch, BatchNorm
Punktnn.BatchNorm1d
, nn.BatchNorm2d
Undnn.BatchNorm3d
bzw. 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)")
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)
γ , β 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)
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)")
Beispiele:
>>> 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)")
Beispiele:
>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
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
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)
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.
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))
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.
"""
Ich möchte hier nur den Berechnungsprozess überprüfen und mich nicht darauf konzentrieren unbiased
. Um es kurz zu erwähnen: