- Es wird gezeigt, dass sich anstelle von Layer Norm/RMSNorm, die in Transformern bislang nahezu unverzichtbar waren, Dynamic Tanh (DyT) einsetzen lässt und dabei eine ähnliche oder bessere Leistung als bei herkömmlichen normalisierungsbasierten Modellen erzielt wird
- DyT ist eine elementweise Operation in der Form
DyT(x) = tanh(αx) und geht von der Beobachtung aus, dass Layer Normalization innerhalb von Transformern oft ein S-förmiges Eingabe-Ausgabe-Mapping erzeugt, das tanh ähnelt
- Die Implementierung umfasst nur wenige Zeilen in PyTorch und wendet mit lernbaren Parametern
alpha, weight und bias Skalierung und Bias auf die Ausgabe von tanh(alpha * x) an
- Die Auswertung deckt ein breites Spektrum von Vision-, Sprach-, Audio- und DNA-Sequenzmodellierung ab, darunter ViT, ConvNeXt, MAE, DINO, DiT, LLaMA, wav2vec 2.0, HyenaDNA, Caduceus
- Auch ohne separates Hyperparameter-Tuning liefern die Modelle in mehreren Konfigurationen ähnliche oder bessere Ergebnisse als normalisierungsbasierte Vergleichsmodelle, was die Annahme infrage stellt, dass Normalisierungsschichten zwingend erforderlich sind
Was Dynamic Tanh verändert
- DyT ist eine einfache Schicht, die Layer Norm oder RMSNorm in Transformer-Blöcken ersetzt
- Die Kernoperation ist das elementweise angewendete
DyT(x) = tanh(αx)
- Es wird gezeigt, dass Transformer ohne Normalisierungsschichten eine ähnliche oder sogar höhere Leistung als klassische normalisierte Transformer erreichen können
- Ausgangspunkt der Idee ist die Beobachtung, dass die von Layer Normalization in Transformern häufig erzeugte Eingabe-Ausgabe-Beziehung einer skalierten tanh-Funktion ähnelt
Implementierung
- Das DyT-Modul lässt sich in PyTorch kurz implementieren
class DyT(nn.Module):
def __init__(self, num_features, alpha_init_value=0.5):
super().__init__()
self.alpha = nn.Parameter(torch.ones(1) * alpha_init_value)
self.weight = nn.Parameter(torch.ones(num_features))
self.bias = nn.Parameter(torch.zeros(num_features))
def forward(self, x):
x = torch.tanh(self.alpha * x)
return x * self.weight + self.bias
alpha ist ein lernbarer Parameter und sein Initialwert ist auf 0.5 gesetzt
- Auch
weight und bias sind lernbare Parameter und werden auf die Ausgabe von tanh(alpha * x) angewendet
Beobachtungen aus der Layer Normalization
- Die Layer Normalization (LN) von Transformern erzeugt ein Eingabe-Ausgabe-Mapping, das einer skalierten
tanh-Funktion nahekommt
- In frühen Schichten ist dieses Mapping meist annähernd linear
- In tieferen Schichten tritt die für
tanh typische S-förmige Kurve deutlicher hervor
- Zu den beobachteten Modellen gehören Vision Transformer (ViT), das Sprach-Transformer-Modell wav2vec 2.0 sowie ausgewählte LN-Schichten des Diffusion Transformer (DiT)
Umfang der Auswertung und Ergebnisse
- DyT wurde über verschiedene Architekturen und Aufgaben hinweg evaluiert
- Überwachtes Lernen im Vision-Bereich: ViT, ConvNeXt
- Selbstüberwachtes Lernen im Vision-Bereich: MAE, DINO
- Diffusionsmodell: DiT
- Großes Sprachmodell: LLaMA
- Selbstüberwachtes Lernen für Audio: wav2vec 2.0
- DNA-Sequenzmodellierung: HyenaDNA, Caduceus
- In allen Fällen zeigen Transformer mit DyT eine ähnliche oder bessere Leistung als normalisierungsbasierte Vergleichsmodelle
- Die Auswertung reicht breit von Erkennung bis Generierung, von überwachtem bis selbstüberwachtem Lernen und von Computer Vision bis zu Sprachmodellen
Referenzmaterial
- Download Paper: Das Paper mit allen Details der Forschung
- View on GitHub: Repository mit Implementierungsdetails
- View Summary: Kurze Zusammenfassung der Forschungsergebnisse
Transformers without Normalization ist als Paper für die CVPR 2025 aufgenommen
1 Kommentare
Meinungen auf Hacker News
Das Anpassen von alpha hatte kaum Wirkung, daher könnten erhebliches Hyperparameter-Tuning oder eine ausgefeiltere Initialisierung nötig sein. Ich habe sowohl die PyTorch-Standardinitialisierung als auch orthogonale Initialisierung ausprobiert, aber es gab keinen Unterschied.
Oder es könnte daran liegen, dass der von mir verwendete skalare Optimizer nicht gut dazu passt. Ich nutze einen eigenen skalaren Optimizer, der schneller konvergiert als Adam, aber bei DyT-Schichten schien er nur etwa auf dem Niveau von Adam zu liegen.
Oder es holt vielleicht erst nach zig Milliarden Tokens auf; für so lange Tests habe ich aber kein Budget.
Wenn man solche Schichten ersetzen kann, hilft das dabei, die Rechenkosten deutlich zu senken.
tanh wird allerdings auch andere Auswirkungen haben, denn Normalisierung löst manchmal Konditionierungsprobleme. Trotzdem ist es begrüßenswert, mehr Alternativen zu haben.
Ich empfehle das ursprüngliche ResNet-Paper von Kaiming He et al. und die Folgearbeiten.
Als modernen Ansatz für RNNs lohnt sich DeepMinds https://arxiv.org/abs/2303.06349.
Der Kernpunkt ist, dass der größte Eigenwert, also der Spektralradius, nahe bei 1 liegen sollte. Das bedeutet, dass Aktivierungswerte bei wiederholter Anwendung linearer Transformationen weder größer noch kleiner werden.
y = x + f(x).LNinputundLNoutputzu vergleichen und dabei auch nachtanh(a*x)noch Gewicht und Bias anzuhängen.Um die Ähnlichkeit zu betrachten, müsste man doch eigentlich mit dem Output von LayerNorm vergleichen, nachdem man Gewicht und Bias entfernt hat.
Wenn das Endergebnis gut ist, ist es egal, aber wenn man nur den tatsächlich ersetzten Teil isoliert betrachtet, könnte man besser verstehen, was passiert.