GELU (Gaussian Error Linear Unit)
GELU (gaußsche Fehler-Lineareinheit) skaliert jede Eingabe anhand der kumulativen Verteilungsfunktion der Normalverteilung. Diese glatte Aktivierungsfunktion wird in BERT, GPT-2 und Vision-Transformern verwendet. Mit Code.
Die Gaußsche lineare Einheit (GELU) ist eine Aktivierungsfunktion, definiert als GELU(x) = x · Φ(x), wobei Φ die kumulative Verteilungsfunktion der Standardnormalverteilung ist. Sie gewichtet jede Eingabe danach, wie wahrscheinlich es ist, dass eine standardnormalverteilte Zufallsvariable kleiner als die Eingabe ist. Daher werden große positive Werte nahezu unverändert durchgelassen, große negative Werte fast auf null gesetzt und Werte nahe null ungefähr halbiert. Dan Hendrycks und Kevin Gimpel stellten GELU 2016 in ihrem Artikel Gaußsche lineare Einheiten (GELUs) vor. GELU wurde zur Standardaktivierungsfunktion von Transformer-Modellen wie BERT, GPT-2, GPT-3 und dem Vision Transformer (ViT). Dort befindet sie sich zwischen den beiden linearen Schichten jedes Feed-Forward-Blocks.
So funktioniert GELU#
Hendrycks und Gimpel leiteten GELU aus der stochastischen Regularisierung her. Stell dir vor, jede Eingabe x wird mit einer zufälligen Maske multipliziert, die sie mit der Wahrscheinlichkeit Φ(x) beibehält und sie andernfalls auf null setzt – ähnlich wie bei Dropout, jedoch mit einer Beibehaltungswahrscheinlichkeit, die mit der Eingabe steigt. GELU ist der Erwartungswert dieses Vorgangs, Φ(x) · x. Sie steuert Eingaben also anhand ihres Werts sanft, während ReLU sie anhand ihres Vorzeichens abrupt steuert.
Die resultierende Kurve hat drei für das Training wichtige Eigenschaften:
- Überall glatt: GELU und ihre Ableitung sind stetig und haben bei null keinen Knick. Kleine Gewichtsänderungen führen daher während der Backpropagation zu kleinen Änderungen der Ausgabe.
- Nicht monoton: Bei negativen Eingaben fällt die Ausgabe zunächst ab und steigt dann wieder in Richtung null. Bei x ≈ −0,75 erreicht sie mit ungefähr −0,17 ihr Minimum.
- Gradient bei negativen Eingaben: Einheiten mit mäßig negativen Eingaben erhalten weiterhin einen Gradienten und lernen daher weiter, während ReLU-Einheiten dabei zum Stillstand kämen.
Da Φ die Fehlerfunktion enthält, sind zwei Näherungen gebräuchlich. Die tanh-Form, 0.5x(1 + tanh(√(2/π)(x + 0.044715x³))), weicht höchstens um etwa 0,0005 von der exakten GELU ab und wurde in GPT-2 verwendet. Die Sigmoid-Form, x · σ(1.702x), weicht um etwa 0,02 ab und ist die QuickGELU in OpenAIs CLIP. PyTorchs nn.GELU berechnet standardmäßig die exakte Form und mit approximate="tanh" die tanh-Form:
import torch
from torch import nn
x = torch.tensor([-3.0, -1.0, -0.75, 0.0, 1.0, 3.0])
# Exact GELU: x * Phi(x), where Phi is the standard normal CDF
exact = nn.GELU()(x)
# Tanh approximation, as used in GPT-2
approx = nn.GELU(approximate="tanh")(x)
print(f"GELU exact: {[round(v, 4) for v in exact.tolist()]}")
print(f"GELU tanh: {[round(v, 4) for v in approx.tolist()]}")
print(f"ReLU: {nn.ReLU()(x).tolist()}")Die exakte GELU gibt [-0.004, -0.1587, -0.17, 0.0, 0.8413, 2.996] aus, die tanh-Form [-0.0036, -0.1588, -0.17, 0.0, 0.8412, 2.9964] und ReLU [0.0, 0.0, 0.0, 0.0, 1.0, 3.0]. GELU erreicht bei ihrem Minimum nahe −0,75 den Wert −0,17, ordnet 1 den Wert 0,8413 zu, weil Φ(1) = 0,8413, und entspricht bei ±3 nahezu ReLU. Die beiden GELU-Formen unterscheiden sich nur an der vierten Nachkommastelle.
Einsatzbereiche von GELU#
- GPT-Modelle: OpenAIs erstes GPT verwendete 2018 GELU. GPT-2 und GPT-3 behielten die Funktion bei.
- BERT: Googles BERT entschied sich nach dem Vorbild von GPT für GELU statt ReLU. Die meisten Encoder im Stil von BERT verwenden GELU weiterhin.
- Vision Transformer: ViT verwendet GELU im MLP jedes Encoder-Blocks. Viele Backbones für die Bildverarbeitung folgten diesem Beispiel, darunter ConvNeXt, das bei der Modernisierung von ResNet ReLU durch GELU ersetzte.
- Erkennungs-Transformer: Im Ultralytics-Paket verwendet der AIFI-Transformer-Encoder von RT-DETR, Baidus Transformer für Echtzeit-Erkennung, GELU zwischen seinen beiden Feed-Forward-Schichten.
Viele neuere große Sprachmodelle (LLMs) sind von einfachem GELU zu gegateten Feed-Forward-Schichten übergegangen. Googles Gemma verwendet GEGLU, das eine GELU-aktivierte Projektion mit einer zweiten linearen Projektion multipliziert. Llama, PaLM und Qwen verwenden das auf SiLU basierende SwiGLU.
GELU und verwandte Aktivierungsfunktionen#
- ReLU: max(0, x) ist effizienter, gibt exakte Nullen aus und hat bei null einen Knick. Im GELU-Artikel wurden gegenüber ReLU und ELU Verbesserungen bei allen untersuchten Aufgaben aus Bildverarbeitung, Sprachverarbeitung und Spracherkennung gemeldet.
- SiLU (Swish): x · σ(x) hat eine ähnliche Gesamtform und ein tieferes Minimum von ungefähr −0,28. Bei Transformern ist GELU die übliche Wahl, während SiLU bei faltenden Detektoren verbreiteter ist.
- Leaky ReLU: Behält bei negativen Eingaben eine feste lineare Steigung bei. GELUs Kurve auf der negativen Seite kehrt dagegen wieder zu null zurück.
- GEGLU: Die gegatete Variante ergänzt eine zweite erlernte Projektion. In Noam Shazeers Vergleich von 2020 mit T5 erreichten GEGLU-Feed-Forward-Schichten bei gleicher Parameteranzahl eine Log-Perplexität von 1,633 auf den zurückgehaltenen Daten, gegenüber 1,679 für GELU und 1,677 für ReLU.










