τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Γνωρίστηκε πριν από πολύ καιρό 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, δεν είναι τόσο καλά όσο εσείς περιοχή σχολίων: 《Γιατί οι μετασχηματιστές χρησιμοποιούν κανόνα στρώματος αντί για κανόνα παρτίδας;》
Αυτή η ενότητα εξηγεί λεπτομερώς τόσο από θεωρητική όσο και από άποψη κώδικα BatchNorm
καιLayerNorm
μέθοδος υπολογισμού.
>>>>> 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<<<<
Είσαι ξεκάθαρος; Τι είναι "ο μέσος όρος και η διακύμανση της τρέχουσας μίνι παρτίδας"? Τι είναι "ο μέσος όρος και η διακύμανση κάθε χαρακτηριστικού δείγματος"Η απάντηση του ξένου είναι καλύτερη:
Ας κατανοήσουμε πρώτα τις βασικές έννοιες:
Αυτό αντικατοπτρίζεται στα δεδομένα:
[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
ο μέσος όρος και η διακύμανση, λοιπόνΚάθε περίπτωση τυποποιείται ανεξάρτηταΓια την ακρίβεια, μοιάζει με την παρακάτω εικόνα:
BatchNorm
καιLayerNorm
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)")
Παραδείγματα:
>>> 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{γάμα}, 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)
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)")
Παραδείγματα:
>>> 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)")
Παραδείγματα:
>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
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
Παράδειγμα εικόνας
>>> 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)
Δεν περιλαμβάνει δηλαδή μόνο τα «διάφορα στοιχείο Τυποποιήστε ανεξάρτητα» και «Κάθεπαράδειγμα "ανεξάρτητα κανονικοποιημένη" και μπορεί να υπολογίσει οποιαδήποτεκανονικοποίηση στις τελευταίες x διαστάσεις.
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))
Θα βρείτε ότι υπολογίζοντας χειροκίνητα και 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.
"""
Θέλω απλώς να επαληθεύσω τη διαδικασία υπολογισμού εδώ, όχι να εστιάσω σε unbiased
Απλά να αναφέρω εν συντομία: