Κοινή χρήση τεχνολογίας

BatchNorm

2024-07-12

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

0. Περίληψη

Γνωρίστηκε πριν από πολύ καιρό BatchNorm καιLayerNorm, εκείνη την εποχή ήταν μόνο κατά προσέγγιση γνωστό ότι είχαν εκτελέσει δεδομένατυποποίηση: x = x − μ σ bm{x} = frac{bm{x} - bm{mu}}{bm{sigma}}Χ=σΧμ Αυτό είναι φυσικά απλό, αλλά τα πραγματικά δεδομένα είναι πιο περίπλοκαΕργασίες βιογραφικούΌσον αφορά την εικόνα δεδομένων, μια παρτίδα δεδομένων συνήθως μοιάζει με αυτό: [B, C, H, W]; Για Εργασίες NLPΌσον αφορά την πρόταση δεδομένων, τα δεδομένα μιας παρτίδας συνήθως μοιάζουν με αυτό: [B, T, D]. Οτι XXNorm Πώς υπολογίζεται σίγουρα δεν υπολογίζονται όλοι οι αριθμοί σε ολόκληρη την παρτίδα. μ bm{mu}μ και σ bm{sigma}σ, και είναι διαφορετικά.

Έτσι, έλεγξα πολλές πληροφορίες και πραγματικά συμφώνησα με τα λόγια του εκπαιδευτή: Μην διαβάζετε αυτά τα ακατάστατα blogs, δεν είναι τόσο καλά όσο εσείς περιοχή σχολίων: 《Γιατί οι μετασχηματιστές χρησιμοποιούν κανόνα στρώματος αντί για κανόνα παρτίδας;》

1. Πώς να υπολογίσετε;

Αυτή η ενότητα εξηγεί λεπτομερώς τόσο από θεωρητική όσο και από άποψη κώδικα BatchNorm καιLayerNorm μέθοδος υπολογισμού.

1.1 Ας μιλήσουμε πρώτα για αυτό θεωρητικά, ρωτώντας για τη γενική έννοια του Qianwen

>>>>> Tongyi Qianwen >>>>>
παρακαλώ: Ποια είναι η διαφορά μεταξύ κανόνα στρώματος και κανόνα παρτίδας Δώστε μια εξήγηση για τον τύπο;

απάντηση: Κανονοποίηση επιπέδου (LayerNorm) καιΚανονοποίηση παρτίδας (BatchNorm) είναι τεχνικές που χρησιμοποιούνται για την επιτάχυνση της εκπαίδευσης νευρωνικών δικτύων, μέσω του επιπέδου κανονικοποίησηςΕισαγάγετε ή ενεργοποιήστε την τιμή, καθιστώντας τη μάθηση δικτύου πιο σταθερή και αποτελεσματικήΕκτέλεσηκαιΕφαρμόσιμη σκηνήείναι διαφορετικά σε.

Κανονοποίηση παρτίδας (BatchNorm)
BatchNorm Κυρίως κατά τη διάρκεια της προπόνησηςΓια μια μίνι παρτίδα δεδομένωννα ομαλοποιηθείκύριος στόχοςΝαίΜειώστε τις εσωτερικές μεταβλητές μεταβλητές(internal covariate shift), δηλαδή, κατά τη διαδικασία διάδοσης προς τα εμπρός του δικτύου, η κατανομή εισόδου του ενδιάμεσου στρώματος αλλάζει με τις επαναλήψεις εκπαίδευσης. BatchNorm μέσω υπολογισμούΟ μέσος όρος και η διακύμανση της τρέχουσας μίνι-παρτίδαςΓια την κανονικοποίηση της εισαγωγής, ο τύπος είναι ο ακόλουθος:
στήνω x bm{x}Χ είναι το διάνυσμα εισόδου σε μια μίνι παρτίδα, μ B bm{mu}_Bμσι και σ B 2 bm{sigma}^2_Bσσι2 είναι ο μέσος όρος και η διακύμανση της μίνι-παρτίδας αντίστοιχα, λοιπόνBatchNorm Παραγωγή y bm{y}y Μπορεί να εκφραστεί ως: x ^ = x − μ B μ B 2 + ϵ y ^ = γ x ^ + β^bmΧ=bmΧbmμσιbmμ2σι+ϵ^bmy=γ^bmΧ+β Χ^y^=μσι2+ϵ Χμσι=γΧ^+β σε, γ γάμμαγ και β βήταβ είναι μια μαθησιακή παράμετρος, ϵ έψιλονϵ είναι μια μικρή σταθερά που χρησιμοποιείται για αριθμητική σταθερότητα.

Κανονοποίηση επιπέδου (LayerNorm)
LayerNorm Ο σκοπός είναι νασε κάθε επίπεδο δείγματοςΕκτελέστε κανονικοποίηση χωρίς να βασίζεστε σε στατιστικά mini-batch. LayerNorm Πιο κατάλληλο για μοντέλα ακολουθίας (όπως π.χLSTM ήTransformer), κ.λπ., μεταξύ των οποίωνΜπορεί να υπάρχουν εξαρτήσεις μεταξύ των δειγμάτωνή Το μέγεθος της μίνι παρτίδας ενδέχεται να μην έχει καθοριστεί. LayerNorm υπολογίζωΟ μέσος όρος και η διακύμανση κάθε χαρακτηριστικού δείγματος, ο τύπος έχει ως εξής:
στήνω x bm{x}Χ είναι το διάνυσμα χαρακτηριστικών ενός μόνο δείγματος, μ L bm{mu}_Lμμεγάλο και σ L 2 bm{sigma}^2_Lσμεγάλο2 είναι ο μέσος όρος και η διακύμανση των χαρακτηριστικών του δείγματος αντίστοιχα, λοιπόνLayerNorm Παραγωγή y bm{y}y Μπορεί να εκφραστεί ως: x ^ = x − μ L μ L 2 + ϵ y ^ = γ x ^ + β^bmΧ=bmΧbmμμεγάλοbmμ2μεγάλο+ϵ^bmy=γ^bmΧ+β Χ^y^=μμεγάλο2+ϵ Χμμεγάλο=γΧ^+β Το ίδιο και εδώ, γ γάμμαγ και β βήταβ είναι μια μαθησιακή παράμετρος, ϵ έψιλονϵ είναι μια μικρή σταθερά.

η διαφορά

  • Εξαρτάται από τα δεδομένα: BatchNorm εξαρτάται απόστατιστικά mini-batch, και LayerNorm εξαρτάται απόΧαρακτηριστικά στατιστικά ενός μόνο δείγματος;
  • Σενάρια εφαρμογής: BatchNorm πιο κατάλληλο γιαεργασίες όρασης υπολογιστή, και LayerNorm πιο κατάλληλο γιαεργασίες επεξεργασίας φυσικής γλώσσας, ειδικά όταν έχουμε να κάνουμε με δεδομένα ακολουθίας.
  • Υπολογιστική αποτελεσματικότητα: BatchNorm Μπορεί να είναι πιο αποτελεσματικό στον παράλληλο υπολογισμό, επειδή μπορεί να εκμεταλλευτεί τον παραλληλισμό εντός mini-batch, ενώLayerNorm Οι υπολογισμοί σε κάθε δείγμα είναι ανεξάρτητοι και πιο κατάλληλοι για την επεξεργασία δεδομένων αλληλουχίας διαφορετικού μήκους.

Και οι δύο μέθοδοι έχουν τα δικά τους πλεονεκτήματα και μειονεκτήματα, και ποια μέθοδος να επιλέξετε εξαρτάται συνήθως από το συγκεκριμένο σενάριο εφαρμογής και τα χαρακτηριστικά δεδομένων.
<<<<< Tongyi Qianwen<<<<

Είσαι ξεκάθαρος; Τι είναι "ο μέσος όρος και η διακύμανση της τρέχουσας μίνι παρτίδας"? Τι είναι "ο μέσος όρος και η διακύμανση κάθε χαρακτηριστικού δείγματος"Η απάντηση του ξένου είναι καλύτερη:

Ας κατανοήσουμε πρώτα τις βασικές έννοιες:

  • παράδειγμα: ένα δείγμα, εικόνα για βιογραφικό,πρόταση για το NLP?
  • στοιχείο: συστατικά του δείγματος, εικονοκύτταρο για εικόνα,λέξη για ποινή?
  • χαρακτηριστικό: Χαρακτηριστικά στοιχείου, Τιμή RGB για pexel,ενσωμάτωση για λέξη.

Αυτό αντικατοπτρίζεται στα δεδομένα:

  • [B, C, H, W] είναι μια παρτίδα,[C, H, W] είναι ένα παράδειγμα,[C] Είναι ένα pixel, συμπεριλαμβανομένωνC χαρακτηριστικό.
  • [B, T, L] είναι μια παρτίδα,[T, L] είναι ένα παράδειγμα,[L] Είναι μια λέξη, συμπεριλαμβανομένωνL χαρακτηριστικό.

Οπως φαίνεται παρακάτω:

Κοιτάζοντας από την πλευρά της διάστασης παρτίδας, κάθε μικρό τετράγωνο που εκτείνεται προς τα πίσω αντιπροσωπεύει ένα στοιχείο, όπως η μακριά μωβ γραμμή στην αριστερή εικόνα, το χαρακτηριστικό RGB ενός pixel ή ένα διάνυσμα λέξης.LayerNorm Δίνωκάθε στοιχείο Υπολογίστε τον μέσο όρο και τη διακύμανση, μπορείτε να πάρετεBxL μέσος όρος και διακύμανση (ήBxHxW). ΕπειταΚάθε στοιχείο τυποποιείται ανεξάρτηταΤο μωβ έμπλαστρο στην εικόνα στα δεξιά είναι ένα χαρακτηριστικό, το πρώτο χαρακτηριστικό όλων των λέξεων της παρτίδας είναι ένα χαρακτηριστικό. BatchNorm ΔίνωΚάθε χαρακτηριστικό Υπολογίστε τον μέσο όρο και τη διακύμανση, μπορείτε να πάρετεL μέσος όρος και διακύμανση (ήC). ΕπειταΚάθε χαρακτηριστικό τυποποιείται ανεξάρτητα.


Να σημειωθεί ότι το Transformer δεν ακολουθεί τα παραπάνωLayerNorm υπολογισμένο, αλλά δεδομένοκάθε περίπτωση Υπολογίστε τον μέσο όρο και τη διακύμανση, μπορείτε να πάρετεB ο μέσος όρος και η διακύμανση, λοιπόνΚάθε περίπτωση τυποποιείται ανεξάρτηταΓια την ακρίβεια, μοιάζει με την παρακάτω εικόνα:

1.2 Στο PyTorch BatchNorm καιLayerNorm
1.2.1 BatchNorm

Στο PyTorch, BatchNorm σημείοnn.BatchNorm1d, nn.BatchNorm2d καιnn.BatchNorm3d, αντίστοιχα για δεδομένα διαφορετικών διαστάσεων:

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

Προβολή πηγαίου κώδικα:

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

Παραδείγματα:

>>> 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{γάμα}, bm{beta}γ,β είναι μια εκμαθήσιμη παράμετρος καιshape=(C,), το όνομα της παραμέτρου είναι .weight και.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 καιBatchNorm3d είναι τα ίδια, η διαφορά είναι ότι_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

Παραδείγματα:

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

Παραδείγματα:

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

διαφορετικός από BatchNorm(num_features), LayerNorm(normalized_shape) Οι παράμετροι είναιinput.shape μετάx ατομικήdim, αρέσει [B, T, L] Οι δύο τελευταίες διαστάσεις του[T, L], τότε κάθε πρόταση θα τυποποιηθεί ανεξάρτητα αν L ή[L], τότε κάθε διάνυσμα λέξης τυποποιείται ανεξάρτητα.

Παράδειγμα NLP

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

Παράδειγμα εικόνας

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

Δεν περιλαμβάνει δηλαδή μόνο τα «διάφορα στοιχείο Τυποποιήστε ανεξάρτητα» και «Κάθεπαράδειγμα "ανεξάρτητα κανονικοποιημένη" και μπορεί να υπολογίσει οποιαδήποτεκανονικοποίηση στις τελευταίες x διαστάσεις.

1.3 Διερεύνηση διαδικασίας υπολογισμού
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

Θα βρείτε ότι υπολογίζοντας χειροκίνητα και nn.BatchNorm Οι υπολογισμοί είναι σχεδόν ακριβώς οι ίδιοι, ίσως υπάρχουν κάποιοι ϵ έψιλονϵ Η επιρροή του Σημειώστε ότι εδώunbiased=False Είναι σημαντικό να σημειωθεί, εξηγεί η επίσημη τεκμηρίωση:

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

Θέλω απλώς να επαληθεύσω τη διαδικασία υπολογισμού εδώ, όχι να εστιάσω σε unbiasedΑπλά να αναφέρω εν συντομία:

  • Το στάδιο εκπαίδευσης υπολογίζει μια προκατειλημμένη εκτίμηση της διακύμανσης, ενώ η διακύμανση στον κινητό μέσο όρο με τη διακύμανση είναι μια αμερόληπτη εκτίμηση.
  • Κατά τη διάρκεια της προπόνησης, ο κινητός μέσος όρος του μέσου όρου και του var θα αποθηκευτεί και στη συνέχεια θα χρησιμοποιηθεί στο στάδιο της δοκιμής.