Wie Man Transformer-Blöcke Stapelt
Swipe um das Menü anzuzeigen
123456789101112131415161718192021222324252627282930313233343536373839404142434445import torch import torch.nn as nn class EncoderBlock(nn.Module): def __init__(self, embed_dim, num_heads, ff_dim): super().__init__() self.attn = nn.MultiheadAttention(embed_dim, num_heads, batch_first=True) self.norm1 = nn.LayerNorm(embed_dim) self.ff = nn.Sequential( nn.Linear(embed_dim, ff_dim), nn.ReLU(), nn.Linear(ff_dim, embed_dim) ) self.norm2 = nn.LayerNorm(embed_dim) def forward(self, x): attn_output, _ = self.attn(x, x, x) x = self.norm1(x + attn_output) ff_output = self.ff(x) x = self.norm2(x + ff_output) return x class StackedEncoder(nn.Module): def __init__(self, num_layers, embed_dim, num_heads, ff_dim): super().__init__() self.layers = nn.ModuleList([ EncoderBlock(embed_dim, num_heads, ff_dim) for _ in range(num_layers) ]) def forward(self, x): for layer in self.layers: x = layer(x) return x # Example usage: stack 4 encoder blocks for input text embeddings embed_dim = 64 num_heads = 4 ff_dim = 256 num_layers = 4 stacked_encoder = StackedEncoder(num_layers, embed_dim, num_heads, ff_dim) input_tensor = torch.rand(2, 10, embed_dim) # batch_size=2, seq_len=10 output = stacked_encoder(input_tensor) print("Stacked encoder output shape:", output.shape)
Bei der Verarbeitung von Text mit einem Transformer werden häufig mehrere Encoder- oder Decoder-Blöcke übereinandergestapelt. Im obigen Code wird gezeigt, wie ein Stapel von Encoder-Blöcken mit PyTorch erstellt wird. Jeder EncoderBlock enthält Multi-Head Self-Attention, ein Feedforward-Netzwerk und Layer-Normalisierung. Die Klasse StackedEncoder baut eine Sequenz dieser Blöcke auf, wobei die Ausgabe eines Blocks als Eingabe für den nächsten dient. Durch dieses Stapeln kann das Modell auf jeder Ebene zunehmend komplexere Repräsentationen des Textes erlernen. Für NLP-Aufgaben wie Textklassifikation oder Übersetzung hilft das Stapeln von Blöcken, tiefere Zusammenhänge und Kontexte in den Daten zu erfassen. Die anfängliche Eingabe – Text, der in Embeddings umgewandelt wurde – durchläuft jeden Encoder-Block, wobei jeder Block die Repräsentation basierend auf der Eingabe und dem in vorherigen Schichten gelernten Kontext verfeinert.
Transformer-Architekturen lassen sich in drei Haupttypen unterteilen, die jeweils für unterschiedliche NLP-Aufgaben geeignet sind:
Nur-Encoder-Modelle
- Struktur: Bestehend aus einem Stapel von Encoder-Blöcken.
- Typische Anwendungsfälle: Diese Modelle eignen sich ideal zum Verstehen oder Analysieren von Text. Häufige Anwendungen sind Textklassifikation, Sentiment-Analyse und Named Entity Recognition. Ein bekanntes Beispiel für diesen Typ ist BERT.
Nur-Decoder-Modelle
- Struktur: Bestehend aus einem Stapel von Decoder-Blöcken.
- Typische Anwendungsfälle: Diese Modelle sind für die Textgenerierung konzipiert, etwa beim Sprachmodellieren und bei Aufgaben wie Code-Vervollständigung. GPT ist ein prominentes Beispiel für ein Nur-Decoder-Modell.
Encoder-Decoder-Modelle
- Struktur: Kombination aus Encoder-Blöcken, die die Eingabe verarbeiten, und Decoder-Blöcken, die die Ausgabe generieren, wobei Informationen vom Encoder zum Decoder fließen.
- Typische Anwendungsfälle: Diese werden für Sequenz-zu-Sequenz-Aufgaben eingesetzt, bei denen sowohl Eingabe als auch Ausgabe Sequenzen sind. Anwendungen umfassen maschinelle Übersetzung, Zusammenfassung und Fragebeantwortung. T5 und der ursprüngliche Transformer sind Beispiele für Encoder-Decoder-Architekturen.
Zusammenfassend bestimmt die Wahl der Architektur, welche Arten von NLP-Problemen gelöst werden können: Nur-Encoder-Modelle für Analyse, Nur-Decoder-Modelle für Generierung und Encoder-Decoder-Modelle für Aufgaben, bei denen eine Sequenz in eine andere abgebildet werden muss.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen