PyTorch torch.nn.GELU-Funktion

PyTorch torch.nn 参考手册PyTorch torch.nn Referenzhandbuch


torch.nn.GELUEs ist die Gaussian Error Linear Unit-Aktivierungsfunktion in PyTorch.

Es ist die Standard-Aktivierungsfunktion der Transformer-Architektur, mit besserer Leistung und glatteren Gradienten im Vergleich zu ReLU.

Funktionsdefinition

torch.nn.GELU(approximate='none')

Parameterbeschreibung:

  • approximate(str): Approximationsalgorithmus. Optional'none'、'tanh'. Standardwert ist'none'。

Mathematisches Prinzip

Die mathematische Formel von GELU:

GELU(x) = x * Φ(x)

wobei Φ(x) die kumulative Verteilungsfunktion (CDF) der Standardnormalverteilung ist.

Bei Verwendung der tanh-Approximation:

GELU(x) ≈ 0.5x * (1 + tanh(√(2/π) * (x + 0.044715 * x³)))

Anwendungsbeispiele

Beispiel 1: Grundlegende Verwendung

GELU-Aktivierung erstellen und verwenden:

Beispiel

import torch
import torch.nn as nn

# GELU-Aktivierungsschicht erstellen
gelu = nn.GELU()

# Testeingabe
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# Vorwärtsdurchlauf
output = gelu(x)

print("Eingabe:", x.tolist())
print("Ausgabe:", output.tolist())
print("nBeobachtung: negative Werte haben eine leichte Aktivierung (ungleich null), positive Werte wachsen weiter")

Beispiel 2: Vergleich verschiedener Aktivierungsfunktionen

Vergleiche GELU, ReLU, Sigmoid:

Beispiel

import torch
import torch.nn as nn

x = torch.linspace(-4, 4, 21)

# Verschiedene Aktivierungsfunktionen
gelu = nn.GELU()
relu = nn.ReLU()
sigmoid = nn.Sigmoid()
tanh = nn.Tanh()

print("x GELU ReLU Sigmoid Tanh")
print("-" * 50)
for i in range(0, 21, 3):
    xi = x[i:i+3]
    print(f"{xi[0]:6.2f} {gelu(xi)[0]:8.4f} {relu(xi)[0]:8.4f} {sigmoid(xi)[0]:8.4f} {tanh(xi)[0]:8.4f}")

Beispiel 3: Verwendung in Transformer

Typische Transformer-FFN-Schicht:

h2 class="example">Beispiel
import torch
import torch.nn as nn

class FeedForward(nn.Module):
    def __init__(self, d_model, dim_feedforward=2048, dropout=0.1):
        super(FeedForward, self).__init__()
        self.linear1 = nn.Linear(d_model, dim_feedforward)
        self.dropout = nn.Dropout(dropout)
        self.activation = nn.GELU()
        self.linear2 = nn.Linear(dim_feedforward, d_model)

    def forward(self, x):
        x = self.linear1(x)
        x = self.activation(x)
        x = self.dropout(x)
        x = self.linear2(x)
        return x

# Test FFN
ffn = FeedForward(d_model=512, dim_feedforward=2048)
x = torch.randn(32, 100, 512)  # (batch, seq, d_model)

output = ffn(x)
print("Eingabeform:", x.shape)
print("Ausgabeform:", output.shape)

Beispiel 4: Verwendung der tanh-Approximation

Verwenden Sie die tanh-Approximation, um die Berechnung zu beschleunigen:

Beispiel

import torch
import torch.nn as nn

# Exakte Version
gelu_exact = nn.GELU(approximate='none')

# tanh-Approximationsversion
gelu_approx = nn.GELU(approximate='tanh')

x = torch.randn(1000)

output_exact = gelu_exact(x)
output_approx = gelu_approx(x)

# Differenz berechnen
diff = (output_exact - output_approx).abs().max().item()
print(f"Maximale Differenz: {diff:.8f}")

# Leistungsvergleich
import time

for _ in range(100):
    _ = gelu_exact(x)

start = time.time()
for _ in range(1000):
    _ = gelu_exact(x)
time_exact = time.time() - start

start = time.time()
for _ in range(1000):
    _ = gelu_approx(x)
time_approx = time.time() - start

print(f"Exakte Versionszeit: {time_exact:.4f}s")
print(f"Ungefähre Versionszeit: {time_approx:.4f}s")

Vergleich von Aktivierungsfunktionen

Aktivierungsfunktion Funktionen Geeignete Szenarien
nn.GELU Glatt, negative Werte ungleich null, Transformer-Standard Transformer, BERT, GPT
nn.ReLU Einfach, dünnbesetzte Aktivierung, tote Neuronen CNN, allgemeines Deep Learning
nn.SiLU Glatt, Self-Gating MobileNet, EfficientNet

Häufige Fragen

F1: Was sind die Vorteile von GELU im Vergleich zu ReLU?

  • Negative Werte haben eine leichte Aktivierung, Informationen gehen nicht verloren
  • Glattere Gradienten, hilfreich für das Training
  • Bessere Leistung im Transformer

F2: Wann verwendet man die Näherungsversion?

Wenn Inferenzgeschwindigkeit gefordert ist und die Präzisionsanforderungen nicht streng sind, ist die tanh-Approximation schneller.

F3: Kann GELU in der Ausgabeschicht verwendet werden?

Wird normalerweise nicht in der Ausgabeschicht verwendet. Verwenden Sie Softmax für Klassifikationsaufgaben und die Identitätsfunktion für Regressionsaufgaben.


Anwendungsfälle

nn.GELUZu den wichtigsten Anwendungsszenarien gehören:

  • Transformer-Architektur: Modelle wie BERT, GPT
  • Tiefe neuronale Netze: Situationen, die eine glatte Aktivierung erfordern
  • Vortrainierte Modelle: Moderne NLP-Modelle

Tipp: GELU ist die am häufigsten verwendete Aktivierungsfunktion im NLP-Bereich und Standardausstattung für Transformer.


PyTorch torch.nn 参考手册PyTorch torch.nn Referenzhandbuch

Andere Erweiterungen