PyTorch torch.nn.ReLU-Funktion

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


torch.nn.ReLUSie ist eine der am häufigsten verwendeten Aktivierungsfunktionen in PyTorch. Sie führt die ReLU-Operation (Rectified Linear Unit) elementweise auf dem Eingabe-Tensor aus.

ReLU ist eine der erfolgreichsten Aktivierungsfunktionen im Deep Learning, weil sie rechnerisch einfach ist, schnell konvergiert und das Problem des verschwindenden Gradienten wirksam mildert.

Funktionsdefinition

torch.nn.ReLU(inplace=False)

Parameterbeschreibung:

  • inplace(bool): Wenn aufTrue, wird es den Eingabe-Tensor direkt in-place ändern und dabei Speicher sparen. Standard istFalse。

Mathematisches Prinzip

nn.ReLUDie Berechnungsformel lautet wie folgt:

f(x) = max(0, x)

Das heißt, für jedes Element in der Eingabe: Wenn der Wert größer als 0 ist, bleibt er unverändert; wenn der Wert kleiner oder gleich 0 ist, ist die Ausgabe 0.

Diese einfache nichtlineare Transformation ermöglicht es dem Netzwerk, komplexe Muster zu lernen und gleichzeitig den Gradientenfluss aufrechtzuerhalten.


Anwendungsbeispiele

Beispiel 1: Grundlegende Verwendung

Erstelle eine ReLU-Aktivierungsschicht und wende die Aktivierung auf die Eingabe an:

Beispiel

import torch
import torch.nn as nn

# ReLU-Aktivierungsschicht erstellen
relu = nn.ReLU()

# Einen Eingabe-Tensor mit negativen Werten erstellen
input_tensor = torch.tensor([[-1.0, 2.0, -3.0], [4.0, -5.0, 6.0]])

# Vorwärtspropagierung
output = relu(input_tensor)

print("Input:\n", input_tensor)
print("Ausgabe:\n", output)

Das Ausgabeergebnis ist:

输入:
 tensor([[-1.,  2., -3.],
        [ 4., -5.,  6.]])
输出:
 tensor([[0., 2., 0.],
        [4., 0., 6.]])

Wie Sie sehen können, werden alle negativen Werte auf 0 gesetzt, und positive Werte bleiben unverändert.

Beispiel 2: In-Place-Operation

Die Verwendung des inplace-Parameters kann Speicher sparen:

Beispiel

import torch
import torch.nn as nn

# Eine ReLU mit aktivierter In-Place-Operation erstellen
relu_inplace = nn.ReLU(inplace=True)

# Eingabe-Tensor erstellen
input_tensor = torch.randn(2, 4)
original_id = id(input_tensor)

# An Ort und Stelle ändern
output = relu_inplace(input_tensor)

# Prüfen, ob der ursprüngliche Tensor geändert wurde
print("Wurde der ursprüngliche Tensor geändert:", id(output) == original_id)
print("Eingabe/Ausgabe:\n", input_tensor)

Das Ausgabeergebnis ist:

是否修改了原张量: True
输入/输出:
 tensor([[0.0000, 0.0000, 1.2345, 0.0000],
        [0.5432, 0.0000, 0.0000, 2.3456]])

Hinweis: In-place-Operationen können Speicher sparen, aber in manchen Fällen können sie die Gradientenberechnung beeinflussen. In den frühen Trainingsphasen oder wenn Zwischenaktivierungswerte erhalten werden müssen, wird die Verwendung der Standardeinstellung empfohleninplace=False。

Beispiel 3: Verwendung in neuronalen Netzen

In konvolutionellen neuronalen Netzen folgt ReLU üblicherweise auf die Konvolutionsschicht:

Beispiel

import torch
import torch.nn as nn

# Ein einfaches konvolutionelles neuronales Netz definieren
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        # Konvolutionsschicht: Eingabe 3 Kanäle, Ausgabe 32 Kanäle, Kernel 3x3
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        # ReLU-Aktivierung
        self.relu1 = nn.ReLU()
        # Zweite Faltungsschicht
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.relu2 = nn.ReLU()
        # Pooling-Schicht
        self.pool = nn.MaxPool2d(2, 2)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu1(x)
        x = self.pool(x)

        x = self.conv2(x)
        x = self.relu2(x)
        x = self.pool(x)

        return x

# Modell erstellen
model = SimpleCNN()

# Modellstruktur ausgeben
print("Modellstruktur:")
print(model)

# Teste die Vorwärtspropagation
# Ein 3x32x32-Farbbild simulieren
input_image = torch.randn(1, 3, 32, 32)
output = model(input_image)

print("\nEingabeform:", input_image.shape)
print("Ausgabeform:", output.shape)

Das Ausgabeergebnis ist:

模型结构:
SimpleCNN(
  (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (relu1): ReLU()
  (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (relu2): ReLU()
  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)

输入形状: torch.Size([1, 3, 32, 32])
输出形状: torch.Size([1, 64, 8, 8])

Beispiel 4: Verwendung von nn.functional.relu

PyTorch bietet auch eine funktionale Schnittstelletorch.nn.functional.relu:

Beispiel

import torch
import torch.nn.functional as F

# Verwendung der funktionalen Schnittstelle
input_tensor = torch.randn(1, 5, 5)

# Methode 1: Verwendung der funktionalen Schnittstelle
output1 = F.relu(input_tensor)

# Methode 2: Verwendung der In-Place-Version der Funktion
F.relu_(input_tensor)

print("Output:\n", output1)

Die Unterschiede zwischen den beiden:

  • nn.ReLUIst eine Modulklasse, die in Modelldefinitionen verwendet werden kann und Parameter speichert.
  • F.reluIst eine funktionale Schnittstelle, die häufig in der forward-Methode oder in Fällen verwendet wird, in denen es keine lernbaren Parameter gibt.
  • F.relu_Ist die Unterstrich-Funktion der In-Place-Version.

Vergleich mit anderen Aktivierungsfunktionen

Aktivierungsfunktion Formel Eigenschaften Geeignete Szenarien
nn.ReLU max(0, x) Einfache Berechnung, sparse Aktivierung Allgemeines Deep Learning (Standardwahl)
nn.LeakyReLU x > 0 ? x : 0.01x Kleiner Gradient auf der negativen Achse Verhindert "sterbende Neuronen"
nn.GELU x * Φ(x) Glatte Approximation, Standard für Transformer Transformer, BERT usw.
nn.Sigmoid 1/(1+e^(-x)) Ausgabe 0-1, Gradientensättigung Ausgabeschicht, binäre Klassifikation
nn.Tanh (e^x - e^(-x))/(e^x + e^(-x)) Ausgabe -1 bis 1, nullzentriert RNN、LSTM

Häufig gestellte Fragen

F1: Warum verursacht ReLU das Problem "sterbender Neuronen"?

Wenn die Eingabe negativ bleibt, ist die Ausgabe von ReLU immer 0 und der Gradient ebenfalls 0, wodurch diese Neuronen nicht weiter lernen können.

Lösungen:

  • Verwenden Sienn.LeakyReLUodernn.ELUum zu ersetzen
  • Verwenden Sie eine kleinere anfängliche Lernrate
  • Batch-Normalisierung einsetzen

F2: Ist ReLU für die Ausgabeschicht geeignet?

Normalerweise nicht geeignet. Die Ausgabeschicht verwendet häufigerSigmoid(zur Klassifikation) oder die Identitätsfunktion (zur Regression), da die Ausgabe von ReLU unbeschränkt ist.


Anwendungsfälle

nn.ReLUSie ist die am häufigsten verwendete Aktivierungsfunktion im Deep Learning. Die wichtigsten Anwendungsszenarien umfassen:

  • Faltungsnetzwerke: Einführung von Nichtlinearität nach Faltungsschichten oder vollständig verbundenen Schichten.
  • Mehrschichtiges Perzeptron: Als Aktivierungsfunktion für versteckte Schichten.
  • Transformer: Als Aktivierungsfunktion in FFN (Feed-Forward Network) (obwohl GELU heutzutage häufiger verwendet wird).
  • Generative Adversarial Networks: Als Aktivierungsfunktion für den Generator.

Tipp: Sofern keine besonderen Anforderungen bestehen, ist ReLU beim Entwurf neuronaler Netze die erste Wahl für Aktivierungsfunktionen in versteckten Schichten.


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

Andere Erweiterungen