PyTorch torch.nn.Embedding-Funktion
PyTorch torch.nn Referenzhandbuch
torch.nn.EmbeddingEs ist ein Modul in PyTorch, das für Wort-Embedding verwendet wird.
Es bildet diskrete Wortindizes auf einen kontinuierlichen Vektorraum ab und ist eine der grundlegendsten Operationen in der Verarbeitung natürlicher Sprache.
Funktionsdefinition
torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False)
Parameterbeschreibung:
num_embeddings(int): Vokabulargröße, d. h. die Anzahl der Zeilen in der Embedding-Matrix.embedding_dim(int): Die Dimension jedes Embedding-Vektors.padding_idx(int): Gibt den Padding-Index an, dessen Embedding-Vektor ein Nullvektor ist. Standard ist None.max_norm(float): Wenn nicht None, werden Embedding-Vektoren auf diese Norm normalisiert. Standard ist None.norm_type(float): Die Ordnung der zu berechnenden Norm. Standard ist 2.0.scale_grad_by_freq(bool): Ob Gradienten anhand der Worthäufigkeit skaliert werden. Standard ist False.sparse(bool): Ob die Gewichtsmatrix eine dünnbesetzte Matrix ist. Standard ist False.
Attribute:
weight(Tensor): Lernbare Gewichte der Form (num_embeddings, embedding_dim).
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Word-Embeddings erstellen und verwenden:
Beispiel
import torch.nn as nn
# Embedding-Schicht erstellen: Vokabular 10000, Embedding-Dimension 256
embedding = nn.Embedding(num_embeddings=10000, embedding_dim=256)
# Wortindizes (beginnend bei 0)
# Form: (batch, seq_len)
input_indices = torch.tensor([[12, 45, 678], [901, 23, 56]])
# Embedding-Vektoren nachschlagen
output = embedding(input_indices)
print("Form des Eingabeindex:", input_indices.shape)
print("Form des Ausgabe-Embeddings:", output.shape) # (2, 3, 256)
# Die Form der Embedding-Matrix anzeigen
print("Form der Embedding-Matrix:", embedding.weight.shape)
Beispiel 2: Verwendung von padding_idx
Geben Sie den Padding-Index an:
Beispiel
import torch.nn as nn
# Embedding-Schicht mit Padding erstellen
embedding = nn.Embedding(num_embeddings=1000, embedding_dim=64, padding_idx=0)
# 0 wird als Padding verwendet
input_indices = torch.tensor([[1, 2, 3], [4, 0, 0]]) # Der zweite Satz enthält Padding
output = embedding(input_indices)
print("Eingabeform:", input_indices.shape)
print("Ausgabeform:", output.shape)
print("Embedding-Vektor des Paddings:", output[1, 1].tolist()) # Alle Nullen
print("Einbettungsvektor der Nicht-Padding-Elemente:", output[0, 0].tolist()[:5]) # Nicht null
Beispiel 3: Vortrainierte Wortvektoren
Vortrainierte Wortvektoren laden:
Beispiel
import torch.nn as nn
import numpy as np
# Vortrainierte Wortvektoren simulieren (in der Praxis können GloVe, Word2Vec usw. verwendet werden)
vocab_size = 1000
embedding_dim = 300
# Zufällige Initialisierung (in der Praxis vortrainierte Vektoren laden)
pretrained_weights = np.random.randn(vocab_size, embedding_dim).astype('float32')
# Einbettungsschicht erstellen
embedding = nn.Embedding(vocab_size, embedding_dim)
# Vortrainierte Gewichte laden
embedding.weight.data = torch.from_numpy(pretrained_weights)
# Die Embedding-Schicht einfrieren (nicht trainiert)
embedding.weight.requires_grad = False
print("Embedding-Schicht trainierbar:", embedding.weight.requires_grad)
print("Form der Embedding-Matrix:", embedding.weight.shape)
Beispiel 4: Einschränken der Norm von Embedding-Vektoren
Verwenden Sie max_norm, um die Vektornorm zu beschränken:
import torch.nn as nn
# Maximale Norm der Embedding-Vektoren auf 1.0 beschränken
embedding = nn.Embedding(1000, 64, max_norm=1.0)
# Eingabe
input_indices = torch.tensor([1, 2, 3])
# Ursprüngliche Gewichtsnorm
original_norm = embedding.weight.data.norm(dim=1)[:3]
print("Ursprüngliche Gewichtsnorm:", original_norm.tolist())
# Vektornorm nach Lookup
output = embedding(input_indices)
output_norm = output.norm(dim=1)
print("Norm des Ausgabevektors:", output_norm.tolist())
Beispiel 5: Vollständiges Textklassifikationsmodell
Textklassifikation unter Verwendung einer Embedding-Schicht:
Beispiel
import torch.nn as nn
class TextClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes=2):
super(TextClassifier, self).__init__()
# Worteinbettungsschicht
self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=0)
# LSTM
self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)
# Klassifikator
self.classifier = nn.Linear(hidden_dim, num_classes)
def forward(self, x):
# x: (batch, seq_len)
embedded = self.embedding(x) # (batch, seq_len, embed_dim)
# LSTM verwendet die letzte Ausgabe
_, (hidden, _) = self.lstm(embedded)
hidden = hidden[-1] # Verborgener Zustand der letzten Schicht
# Klassifikation
logits = self.classifier(hidden)
return logits
# Parameter
VOCAB_SIZE = 10000
EMBED_DIM = 128
HIDDEN_DIM = 256
model = TextClassifier(VOCAB_SIZE, EMBED_DIM, HIDDEN_DIM)
# Eingabe: batch=4, Sequenzlänge=50
input_ids = torch.randint(1, VOCAB_SIZE, (4, 50))
output = model(input_ids)
print("Modellarchitektur:")
print(model)
print("Eingabeform:", input_ids.shape)
print("Ausgabeform:", output.shape)
Unterschied zwischen Embedding und EmbeddingBag
| Type | Eingabe | Ausgabe | Anwendungsszenarien |
|---|---|---|---|
nn.Embedding |
Wortindizes | Sequenz von Wortvektoren | Sequenzmodelle, LSTM, Transformer |
nn.EmbeddingBag |
Wortindizes + Offsets | Aggregierter Vektor | Textklassifikation, schnelle Verarbeitung |
Häufig gestellte Fragen
F1: Wie wählt man die Embedding-Dimension?
- Kleine Datensätze: 50-100 Dimensionen
- Mittlere Datensätze: 100-300 Dimensionen
- Große Datensätze: 300-500 Dimensionen
F2: Welchen Zweck hat padding_idx?
Er setzt den Embedding-Vektor am angegebenen Index auf einen Nullvektor und berechnet seinen Gradienten während der Backpropagation nicht.
F3: Wann sollte man die Embedding-Schicht einfrieren?
Bei der Verwendung vortrainierter Wortvektoren ist es üblich, die Schicht einzufrieren, eine Weile zu trainieren und dann feinabzustimmen.
Anwendungsfälle
nn.EmbeddingZu den wichtigsten Anwendungsszenarien gehören:
- Wortvektor-Darstellung: Wörter in dichte Vektoren umwandeln
- Textklassifikation: Als Eingabeschicht von NLP-Modellen
- Sequenzmodelle: Eingabe für LSTM, GRU
- Empfehlungssysteme: Embedding-Repräsentationen von Nutzern und Artikeln
Hinweis: embedding.weight ist ein lernbarer Parameter und kann direkt im Optimierer trainiert werden.
Andere Erweiterungen