2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tavattiin kauan sitten BatchNorm
jaLayerNorm
, tuolloin tiedettiin vain karkeasti, että he olivat suorittaneet dataastandardointi: x = x − μ σ bm{x} = frac{bm{x} - bm{mu}}{bm{sigma}}x=σx−μ Tämä on tietysti yksinkertaista, mutta todelliset tiedot ovat monimutkaisempiaCV tehtävätDatakuvan kannalta erän tiedot näyttävät yleensä tältä: [B, C, H, W]
; NLP-tehtävätDatalauseen suhteen erän tiedot näyttävät yleensä tältä: [B, T, D]
Se XXNorm
Kuinka se lasketaan. Kaikkia lukuja ei todellakaan lasketa kerralla? μ bm{mu}μ ja σ bm{sigma}σ, ja ne ovat erilaisia.
Tarkistin siis paljon tietoa, ja olin todella samaa mieltä ohjaajan sanoista: Älä lue niitä sotkuisia blogeja, ne eivät ole yhtä hyviä kuin sinä Ulkomaalaiset ovat edelleen mahtavia, he osaavat selittää asiat selkeästi vain vastaamalla kysymyksiin! kommenttialue: 《Miksi muuntajat käyttävät kerrosnormia eränormin sijaan?》
Tämä osa selittää yksityiskohtaisesti sekä teoreettisesta että koodin näkökulmasta BatchNorm
jaLayerNorm
laskentamenetelmä.
>>>>> Tongyi Qianwen >>>>>
kysyä: Mitä eroa on kerrosnormilla ja eränormilla. Selitä kaava?
vastaus: Tason normalisointi (LayerNorm) jaErän normalisointi (BatchNorm) ovat tekniikoita, joita käytetään nopeuttamaan hermoverkkojen koulutusta normalisointikerroksen kauttaSyötä tai aktivoi arvo, mikä tekee verkko-oppimisesta vakaampaa ja tehokkaampaaToteutusjaSovellettava kohtausovat erilaisia päällä.
Erän normalisointi (BatchNorm)
BatchNorm
Pääasiassa harjoittelun aikanaPieni dataerä vartennormalisoida senpääkohdeJooVähennä sisäisiä kovariaattisiirtymiä(sisäinen kovariaattisiirtymä), eli verkon eteenpäin etenemisprosessin aikana välikerroksen tulojakauma muuttuu opetusiteraatioiden mukana. BatchNorm
laskennan kauttaNykyisen minierän keskiarvo ja varianssiSyötteen normalisoimiseksi kaava on seuraava:
perustaa x bm{x}x on syöttövektori mini-erässä, μ B bm{mu}_BμB ja σ B 2 bm{sigma}^2_BσB2 ovat mini-erän keskiarvo ja varianssi vastaavastiBatchNorm
Lähtö v bm{y}y Se voidaan ilmaista seuraavasti: x ^ = x − μ B μ B 2 + ϵ y ^ = γ x ^ + β^bmx=bmx−bmμB√bmμ2B+ϵ^bmy=γ^bmx+β
x^y^=μB2+ϵx−μB=γx^+β sisään, γ gammaγ ja β betaβ on opittava parametri, ϵ epsilonϵ on pieni vakio, jota käytetään numeerista vakautta varten.
Tason normalisointi (LayerNorm)
LayerNorm
Tarkoituksena onkullakin näytetasollaSuorita normalisointi luottamatta mini-erätilastoihin. LayerNorm
Sopii paremmin sarjamalleihin (esimLSTM
taiTransformer
) jne., joiden joukossaNäytteiden välillä voi olla riippuvuuksiatai minierän kokoa ei ehkä ole vahvistettu. LayerNorm
laskeaKunkin näyteominaisuuden keskiarvo ja varianssi, kaava on seuraava:
perustaa x bm{x}x on yksittäisen näytteen piirrevektori, μ L bm{mu}_LμL ja σ L 2 bm{sigma}^2_LσL2 ovat otosominaisuuksien keskiarvo ja varianssiLayerNorm
Lähtö v bm{y}y Se voidaan ilmaista seuraavasti: x ^ = x − μ L μ L 2 + ϵ y ^ = γ x ^ + β^bmx=bmx−bmμL√bmμ2L+ϵ^bmy=γ^bmx+β
x^y^=μL2+ϵx−μL=γx^+β Sama täällä, γ gammaγ ja β betaβ on opittava parametri, ϵ epsilonϵ on pieni vakio.
ero
BatchNorm
riippuumini-erätilastot, ja LayerNorm
riippuuYksittäisen otoksen tunnusomaiset tilastot;BatchNorm
sopivampitietokonenäkötehtävät, ja LayerNorm
sopivampiluonnollisen kielen käsittelytehtävät, varsinkin kun käsitellään sekvenssitietoja;BatchNorm
Voi olla tehokkaampi rinnakkaislaskennassa, koska se voi hyödyntää rinnakkaisuutta mini-erän sisälläLayerNorm
Kunkin näytteen laskelmat ovat riippumattomia ja sopivat paremmin eripituisten sekvenssitietojen käsittelyyn.Molemmilla menetelmillä on omat etunsa ja haittansa, ja se, mikä menetelmä valitaan, riippuu yleensä tietystä sovellusskenaariosta ja tietojen ominaisuuksista.
<<<<< Tongyi Qianwen<<<<
Oletko hämmentynyt? Mikä on "nykyisen minierän keskiarvo ja varianssi"? Mikä on "kunkin näyteominaisuuden keskiarvo ja varianssi"Ulkomaalaisen vastaus on parempi:
Ymmärretään ensin peruskäsitteet:
Tämä näkyy tiedoissa:
[B, C, H, W]
on erä,[C, H, W]
on esimerkki,[C]
Se on pikseli, mukaan lukienC
ominaisuus.[B, T, L]
on erä,[T, L]
on esimerkki,[L]
Se on sana, mukaan lukienL
ominaisuus.Kuten alla:
Erämitan puolelta katsottuna jokainen taakse ulottuva pieni neliö edustaa jotakin elementtiä, kuten pitkää violettia palkkia vasemmassa kuvassa, pikselin RGB-ominaisuutta tai sanavektoria.LayerNorm
Antaajokainen elementti Laske keskiarvo ja varianssi, voit saadaBxL
keskiarvo ja varianssi (taiBxHxW
).Jokainen elementti on standardoitu itsenäisestiOikeanpuoleisen kuvan violetti paikka on ominaisuus, joka on erän kaikkien sanojen ensimmäinen ominaisuus. BatchNorm
AntaaJokainen ominaisuus Laske keskiarvo ja varianssi, voit saadaL
keskiarvo ja varianssi (taiC
).Jokainen ominaisuus on standardoitu itsenäisesti.
On huomattava, että Transformer ei noudata edellä mainittujaLayerNorm
laskettu, mutta annettujokainen tapaus Laske keskiarvo ja varianssi, voit saadaB
keskiarvo ja varianssi siisJokainen esiintymä on standardoitu itsenäisestiTarkemmin sanottuna se näyttää alla olevalta kuvalta:
BatchNorm
jaLayerNorm
BatchNorm
PyTorchissa, BatchNorm
kohtann.BatchNorm1d
, nn.BatchNorm2d
jann.BatchNorm3d
, vastaavasti erikokoisille tiedoille:
nn.BatchNorm1d
: (N, C)
tai(N, C, L)
nn.BatchNorm2d
: (N, C, H, W)
nn.BatchNorm3d
: (N, C, D, H, W)
Näytä lähdekoodi:
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)")
Esimerkkejä:
>>> 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}γ,β on opittava parametri jashape=(C,)
, parametrin nimi on .weight
ja.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
jaBatchNorm3d
ovat samat, ero on siinä_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)")
Esimerkkejä:
>>> 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)")
Esimerkkejä:
>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
LayerNorm
erilainen BatchNorm(num_features)
, LayerNorm(normalized_shape)
Parametrit ovatinput.shape
jälkeenx
yksilöllinendim
, Kuten [B, T, L]
Kaksi viimeistä ulottuvuutta[T, L]
, niin jokainen lause standardoidaan itsenäisesti, jos L
tai[L]
, silloin jokainen sanavektori standardoidaan itsenäisesti.
NLP esimerkki
>>> 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
Esimerkki kuvasta
>>> 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)
Toisin sanoen se ei sisällä vain "erilaisia elementtiti Standardoi itsenäisesti" ja "Jokainenilmentymä itsenäisesti normalisoitu" ja voi laskea minkä tahansanormalisoi viimeisen x ulottuvuuden aikana.
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))
Löydät, että laskee manuaalisesti ja nn.BatchNorm
Laskelmat ovat melkein täsmälleen samat, ehkä niitä on ϵ epsilonϵ Sen vaikutus huomioi tämäunbiased=False
On tärkeää huomata, että virallisessa dokumentaatiossa selitetään:
"""
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.
"""
Haluan vain tarkistaa laskentaprosessin täällä, en keskittyä siihen unbiased
. Lyhyesti mainitakseni: