Teknologian jakaminen

BatchNorm

2024-07-12

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

0. Abstrakti

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

1. Kuinka laskea?

Tämä osa selittää yksityiskohtaisesti sekä teoreettisesta että koodin näkökulmasta BatchNorm jaLayerNorm laskentamenetelmä.

1.1 Puhutaanpa siitä ensin teoreettisesti kysyen Qianwenin yleistä merkitystä

>>>>> 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=bmxbmμBbmμ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=bmxbmμLbmμ2L+ϵ^bmy=γ^bmx+β x^y^=μL2+ϵ xμL=γx^+β Sama täällä, γ gammaγ ja β betaβ on opittava parametri, ϵ epsilonϵ on pieni vakio.

ero

  • Riippuu tiedoista: BatchNorm riippuumini-erätilastot, ja LayerNorm riippuuYksittäisen otoksen tunnusomaiset tilastot;
  • Sovellusskenaariot: BatchNorm sopivampitietokonenäkötehtävät, ja LayerNorm sopivampiluonnollisen kielen käsittelytehtävät, varsinkin kun käsitellään sekvenssitietoja;
  • Laskennallinen tehokkuus: 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:

  • ilmentymä: näyte, kuva CV:tä varten,tuomita NLP:lle;
  • elementtiti: näytteen komponentit, pikseli kuvan vuoksi,sana lausetta varten;
  • ominaisuus: elementin ominaisuudet, RGB-arvo pexelille,upottaminen sanan puolesta.

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:

1.2 PyTorchissa BatchNorm jaLayerNorm
1.2.1 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)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

γ , β 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Esimerkkejä:

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

Esimerkkejä:

>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
  • 1
  • 2
  • 3
1.2.2 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
  • 1
  • 2
  • 3
  • 4

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)
  • 1
  • 2
  • 3
  • 4
  • 5

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.

1.3 Laskentaprosessin tutkiminen
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

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.
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Haluan vain tarkistaa laskentaprosessin täällä, en keskittyä siihen unbiased. Lyhyesti mainitakseni:

  • Harjoitusvaihe laskee varianssin puolueettoman arvion, kun taas liukuvan keskiarvon varianssi varianssilla on puolueeton arvio;
  • Harjoittelun aikana keskiarvon ja var:n liukuva keskiarvo tallennetaan ja sitä käytetään sitten testausvaiheessa.