le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Incontrato molto tempo fa BatchNorm
ELayerNorm
, a quel tempo si sapeva solo approssimativamente che avevano eseguito datistandardizzazione: x = x − μ σ bm{x} = frac{bm{x} - bm{mu}}{bm{sigma}}X=σX−μ Questo è ovviamente semplice, ma i dati reali sono più complicatiCompiti del CVIn termini di immagine dei dati, i dati di un batch solitamente si presentano così: [B, C, H, W]
; per Compiti della PNLIn termini di frase di dati, i dati di un batch solitamente si presentano così: [B, T, D]
. Quello XXNorm
Come viene calcolato? Sicuramente non tutti i numeri dell'intero lotto vengono calcolati contemporaneamente. μ bm{mu}μ E sigmaσ, e sono diversi.
Quindi ho controllato molte informazioni e sono davvero d'accordo con le parole dell'istruttore: non leggere quei blog disordinati, non sono bravi come te. Gli stranieri sono comunque fantastici, possono spiegare chiaramente i problemi semplicemente rispondendo alle domande nel area commenti: 《Perché i trasformatori utilizzano la norma a strati invece della norma a lotti?》
Questa sezione spiega in dettaglio sia dal punto di vista teorico che da quello del codice BatchNorm
ELayerNorm
metodo di calcolo.
>>>>> Tongyi Qianwen >>>>>
chiedere: Qual è la differenza tra norma dello strato e norma del lotto? Fornire una spiegazione della formula.
risposta: Normalizzazione dei livelli (LayerNorm) ENormalizzazione batch (BatchNorm) sono tecniche utilizzate per accelerare l'addestramento della rete neurale, attraverso lo strato di normalizzazioneImmettere o attivare il valore, rendendo l'apprendimento in rete più stabile ed efficienteImplementazioneEScena applicabilesono diversi.
Normalizzazione batch (BatchNorm)
BatchNorm
Principalmente durante l'allenamentoPer un mini-batch di datinormalizzareobiettivo principaleSÌRidurre gli spostamenti interni delle covariate(spostamento della covariata interna), ovvero durante il processo di propagazione in avanti della rete, la distribuzione degli input dello strato intermedio cambia con le iterazioni di training. BatchNorm
tramite calcoloLa media e la varianza del mini-batch correntePer normalizzare l'input, la formula è la seguente:
impostare x bm{x}X è il vettore di input all'interno di un mini-batch, μB bm{mu}_BμB E σB 2 bm{sigma}^2_BσB2 sono quindi rispettivamente la media e la varianza del mini-batchBatchNorm
Produzione e bm{e}e Può essere espresso come: x^ = x − μB μB 2 + ϵ y^ = γ x^ + β^io sonoX=io sonoX−io sonoμB√io sonoμ2B+ϵ^io sonoe=γ^io sonoX+β
X^e^=μB2+ϵX−μB=γX^+β In, gammaγ E beta-betaβ è un parametro apprendibile, ϵ epsilonϵ è una piccola costante utilizzata per la stabilità numerica.
Normalizzazione dei livelli (LayerNorm)
LayerNorm
Lo scopo è quelload ogni livello di campioneEsegui la normalizzazione senza fare affidamento sulle statistiche mini-batch. LayerNorm
Più adatto per modelli di sequenza (comeLSTM
OTransformer
), ecc., tra cuiPotrebbero esserci dipendenze tra i campioniO la dimensione del mini-batch potrebbe non essere fissa. LayerNorm
calcolareLa media e la varianza di ciascuna caratteristica del campione, la formula è la seguente:
impostare x bm{x}X è il vettore delle caratteristiche di un singolo campione, μL bm{mu}_LμL E σ L 2 bm{sigma}^2_LσL2 sono rispettivamente la media e la varianza delle caratteristiche del campioneLayerNorm
Produzione e bm{e}e Può essere espresso come: x^ = x − μL μL 2 + ϵ y^ = γ x^ + β^io sonoX=io sonoX−io sonoμL√io sonoμ2L+ϵ^io sonoe=γ^io sonoX+β
X^e^=μL2+ϵX−μL=γX^+β Lo stesso qui, gammaγ E beta-betaβ è un parametro apprendibile, ϵ epsilonϵ è una piccola costante.
la differenza
BatchNorm
dipende dastatistiche mini-batch, E LayerNorm
dipende daStatistiche caratteristiche di un singolo campione;BatchNorm
più adatto acompiti di visione artificiale, E LayerNorm
più adatto acompiti di elaborazione del linguaggio naturale, soprattutto quando si ha a che fare con dati di sequenza;BatchNorm
Può essere più efficiente nel calcolo parallelo perché può sfruttare il parallelismo all'interno del mini-batchLayerNorm
I calcoli su ciascun campione sono indipendenti e più adatti all'elaborazione di dati di sequenze di diversa lunghezza.Entrambi i metodi presentano vantaggi e svantaggi e il metodo da scegliere dipende solitamente dallo scenario applicativo specifico e dalle caratteristiche dei dati.
<<<<< Tongyi Qianwen<<<<
Sei chiaro? Qual è "la media e la varianza dell'attuale mini-batch"? Qual è "la media e la varianza di ciascuna caratteristica del campione"? La risposta dello straniero è migliore:
Comprendiamo innanzitutto i concetti base:
Ciò si riflette nei dati:
[B, C, H, W]
è un lotto,[C, H, W]
è un esempio,[C]
È un pixel, inclusoC
caratteristica.[B, T, L]
è un lotto,[T, L]
è un esempio,[L]
È una parola, compresoL
caratteristica.Come mostrato di seguito:
Guardando dal lato della dimensione batch, ogni quadratino esteso sul retro rappresenta un elemento, come la lunga barra viola nell'immagine a sinistra, la caratteristica RGB di un pixel o un vettore di parole.LayerNorm
Dareogni elemento Calcola la media e la varianza che puoi ottenereBxL
media e varianza (oBxHxW
). PoiOgni elemento è standardizzato in modo indipendenteLa patch viola nell'immagine a destra è una caratteristica, la prima caratteristica di tutte le parole del batch. Ciascuna di queste patch è una caratteristica. BatchNorm
DareOgni caratteristica Calcola la media e la varianza che puoi ottenereL
media e varianza (oC
). PoiOgni funzionalità è standardizzata in modo indipendente.
Va notato che Transformer non segue quanto sopra menzionatoLayerNorm
calcolato, ma datoogni istanza Calcola la media e la varianza che puoi ottenereB
media e varianza, quindiOgni istanza è standardizzata in modo indipendentePer essere precisi, assomiglia all'immagine qui sotto:
BatchNorm
ELayerNorm
BatchNorm
In PyTorch, BatchNorm
puntonn.BatchNorm1d
, nn.BatchNorm2d
Enn.BatchNorm3d
, rispettivamente per dati di diverse dimensioni:
nn.BatchNorm1d
: (N, C)
O(N, C, L)
nn.BatchNorm2d
: (N, C, H, W)
nn.BatchNorm3d
: (N, C, D, H, W)
Visualizza il codice sorgente:
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)")
Esempi:
>>> 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}γ,β è un parametro apprendibile eshape=(C,)
, il nome del parametro è .weight
E.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
EBatchNorm3d
sono uguali, la differenza è questa_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)")
Esempi:
>>> 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)")
Esempi:
>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
LayerNorm
diverso da BatchNorm(num_features)
, LayerNorm(normalized_shape)
I parametri sonoinput.shape
Dopox
individualedim
, Piace [B, T, L]
Le ultime due dimensioni di[T, L]
, allora ogni frase sarà standardizzata indipendentemente se L
O[L]
, allora ogni vettore di parole è standardizzato in modo indipendente.
Esempio di PNL
>>> 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
Esempio di immagine
>>> 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)
In altre parole, non comprende solo i “vari elementoo Standardizzare in modo indipendente” e “Ciascunoesempio normalizzato indipendentemente" e può calcolarne qualsiasinormalizzare sulle ultime x dimensioni.
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))
Lo troverai calcolando manualmente e nn.BatchNorm
I calcoli sono quasi esattamente gli stessi, forse ce ne sono alcuni ϵ epsilonϵ L'influenza di esso. Notalo quiunbiased=False
È importante notare, spiega la documentazione ufficiale:
"""
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.
"""
Voglio solo verificare il processo di calcolo qui, non concentrarmi su unbiased
Solo per citare brevemente: