Dieser Artikel ist Teil einer Serie über die Transformer-Architektur. Wenn Sie die anderen nicht gelesen haben, lesen Sie den Einführungsartikel Hier.
Ohne Zweifel hängt der Erfolg von Deep Studying (DL)-Modellen stark von Durchbrüchen bei den Trainingstechniken ab, wie die ReLU-Aktivierungsfunktion und der Adam-Optimierer zeigen (Nair und Hinton, 2010; Kingma und Ba, 2017). Typischerweise beinhalten Trainingstechniken die Optimierung der Operationen/Komponenten eines Modells, aber ein Ansatz verbessert insbesondere die Trainingseffizienz drastisch, ohne seine Operationen anzupassen. Stattdessen liegt der Schwerpunkt auf der Änderung der zwischen den Schichten übertragenen Daten. Willkommen in der Welt der Normalisierung.
Bevor wir uns mit der Layer-Normalisierung (LN; Ba et al., 2016) befassen, besprechen wir zunächst, was Normalisierung ist, und betrachten dann einen Meilenstein in diesem Bereich, die Batch-Normalisierung (BN; Ioffe und Szegedy, 2015), die die Grundlage von LN bildet.
Die Normalisierung bildet zusammen mit der Standardisierung ein eigenes Forschungsgebiet im maschinellen Lernen (ML). Auf einer grundlegenden Ebene bezieht sich Normalisierung normalerweise auf die Größenänderung von Werten zwischen einem Bereich von [0, 1]und die Standardisierung konzentriert sich auf die Neuskalierung von Daten, um einer Standardnormalverteilung (Gaußverteilung) mit einem (μ = 0, σ² = 1) (Mittelwert bzw. Varianz). Im Laufe des letzten Jahrzehnts sind diese beiden zu einer Einheit verschmolzen, wobei „Normalisierung“ ein allgemeiner Begriff für beide ist. Darüber hinaus umfasst die Normalisierung in ML (oder genauer gesagt DL speziell) zwei Kategorien: Gewichtsnormalisierung und Aktivierungsnormalisierung. BN und LN konzentrieren sich auf Letzteres.
BN standardisiert Neuronenaktivierungen vor (oder nach) seiner nichtlinearen Funktion innerhalb verborgener NN-Schichten unter Verwendung des ersten und zweiten statistischen Moments (Mittelwert bzw. Varianz). Es verwendet einen einzigartigen Ansatz zur Berechnung des Mittelwerts und der Varianz mithilfe von Mini-Merkmalsbatches.
Betrachten Sie beispielsweise einen Datensatz mit drei Variablen (x₁, x₂Und x₃). Wir entnehmen zufällig drei Stichproben aus jedem Merkmal und berechnen den Mittelwert μ und Varianz σ² unabhängig voneinander über sie hinweg. Mit diesen Werten berechnen wir die normalisierte Variante der Merkmale wie in Gleichung 2.1 (3) beschrieben. Beachten Sie, dass wir einen konstanten Wert hinzufügen ϵ zur Varianz während der Normalisierung für numerische Stabilität. Zuletzt multiplizieren wir die normalisierten Merkmale mit einem Skalierungsfaktor (γVerstärkung) und fügen Sie einen Offset hinzu (β, Voreingenommenheit). Weitere Einzelheiten finden Sie in Gleichung 2.1.
Was macht BN so bemerkenswert? Nun, eines macht es sehr intestine: die Optimierungslandschaft zu glätten. Typischerweise erzeugt die nicht-konvexe Natur der Verlustfunktion zahlreiche flache Bereiche (im Zusammenhang mit verschwindenden Gradienten) und scharfe lokale Minima (die explodierende Gradienten verursachen), wodurch das Modell daran gehindert wird, die optimale Lösung zu finden. Indem wir die Daten skalieren und in ein ähnliches Format verschieben, reduzieren wir die Landschaft auf einen viel einfacheren (konvexeren) Problemraum und ermöglichen so breitere Bereiche von Lernraten, was zu einer deutlichen Steigerung des Modelltrainings führt und die Empfindlichkeit gegenüber Hyperparametern verringert. Das Geheimnis seiner Macht? Zwei trainierbare Parameter – Bias und Acquire. Sie ermöglichen es dem Modell, die optimale Verteilung für jede verborgene Schicht auszuwählen und die Optimierungslandschaft bei Bedarf dynamisch zu glätten.
- Der Gewinn γ – Passt die Standardabweichung (Skala) des normalisierten Werts an
- Die Voreingenommenheit β – verschiebt die Kurve der normalisierten Werte nach hyperlinks oder rechts
Ziemlich cool, oder? Sie verwandelten eine einfache Operation in eine vollständige Optimierungsstrategie, indem sie zwei dynamische Parameter einführten. Eine kleine Ergänzung für einen großen Leistungsschub – großartig!
Hinweis: Die wahre Natur, warum BN die Modellleistung steigert, ist unklar, abgesehen von der Tatsache, dass es zur Glättung des Optimierungsraums beiträgt (Santurkar et al., 2019). Es handelt sich immer noch um ein aktives Forschungsgebiet mit mehreren Hypothesen. Für interessierte Leser: Schauen Sie vorbei Das Blogbeitrag von Johann Huber, der einen detaillierten Einblick in einige davon gibt.
Seit seiner Gründung hat BN eine breite Anwendung bei Pc-Imaginative and prescient-Aufgaben gefunden. Die Möglichkeiten für sequenz- und transformatorbasierte Modelle sind jedoch begrenzt, vor allem aufgrund der unterschiedlichen Eingabegrößen. Wenn die Eingabegrößen klein sind, kann BN den Mittelwert und die Varianz der gesamten Grundgesamtheit (Datensatz) nicht genau vorhersagen. Stellen Sie sich vor, was passieren würde, wenn eine Eingabesequenz 10 Token (Wörter) lang wäre und die nächste dann 250 Token umfasst. Der statistische Unterschied zwischen ihnen könnte enorm sein und sich negativ auf die Trainingsstabilität auswirken. Wir brauchen eine bessere Choice – LN zur Rettung!
Ein Jahr nach BN, Ba et al. (2016) führten eine neue Normalisierungsstrategie ein, LN, eine Transponierte von BN. Ihr Ansatz wurde speziell für sequenzbasierte Modelle (Recurrent Neural Networks (RNNs)) entwickelt und wurde kürzlich von Transformers übernommen.
Semantisch funktioniert es genauso wie BN, aber der Mittelwert und die Varianz werden über mehrere Merkmale hinweg und nicht über Mini-Batches berechnet.
In unserem vorherigen Beispiel haben wir einen Datensatz mit drei Funktionen (x₁, x₂Und x₃). Wir berechnen den Mittelwert μ und Varianz σ² unabhängig voneinander über jede Variable hinweg. Verwenden Sie sie dann, um die normalisierte Variante der Merkmale zu berechnen (Gleichung 3.1 (3)) und fahren Sie mit ähnlichen Operationen wie BN fort, einschließlich der beiden trainierbaren Parameter, Gewinn γ und Voreingenommenheit β.
Und das ist es! Wir haben die reibungslose Landschaft beibehalten und die Anwendbarkeit für unterschiedliche Eingabesequenzgrößen ohne Leistungseinbußen ermöglicht, indem wir die BNs-Funktionen auf sequenz- und transformatorbasierte Modelle erweitert haben.
Um es in PyTorch zu erstellen, verwenden Sie den folgenden Codeausschnitt:
import torch
import torch.nn as nnclass LayerNormalization(nn.Module):
"""
A module devoted to Layer Normalization formulated within the paper https://arxiv.org/abs/1607.06450.
:param feature_dims: (tuple[int, ...] | torch.dimension) the form of the info to normalize
:param epsilon: (float, optionally available) a price added to the denominator for numerical stability. Default: 1e-6
"""
def __init__(self, feature_dims: tuple[int, ...], epsilon: float = 1e-6) -> None:
tremendous().__init__()
self.feature_dims = feature_dims
self.acquire = nn.Parameter(torch.ones(feature_dims)) # gamma
self.bias = nn.Parameter(torch.zeros(feature_dims)) # beta
self.eps = epsilon
def ahead(self, x: torch.Tensor) -> torch.Tensor:
"""Applies Layer Normalization to a torch.Tensor of knowledge."""
dims = [-(i + 1) for i in range(len(self.feature_dims))] # reverse dimensions
imply = x.imply(dim=dims, keepdim=True)
variance = x.var(dim=dims, keepdim=True)
x_norm = (x - imply) / torch.sqrt(variance + self.eps)
return self.acquire * x_norm + self.bias # scale and shift