Encoder-Decoder-Transformer für Zeitreihen implementieren
Use Case
Kurz erklärt
Von einer bekannten Historie zu einer zukünftigen Wertesequenz
Anders als eine LSTM verarbeitet der Transformer Positionen nicht Schritt für Schritt durch einen rekurrenten Zustand. Attention setzt Zeitschritte direkt zueinander in Beziehung. Das ermöglicht parallele Matrixoperationen und macht auch weiter auseinanderliegende Stellen im Kontextfenster unmittelbar vergleichbar.
Bausteine
Encoder und Decoder haben getrennte Aufgaben
| Baustein | Aufgabe bei Zeitreihen |
|---|---|
| Encoder | Verdichtet die bekannte Historie zu kontextabhängigen Repräsentationen. |
| Decoder | Erzeugt den Zukunftshorizont unter Nutzung der Encoder-Ausgabe. |
| Self-Attention | Modelliert Beziehungen innerhalb der Eingabe- oder Zielsequenz. |
| Cross-Attention | Verbindet Decoder-Queries mit Keys und Values aus dem Encoder. |
| Positionsinformation | Erhält Reihenfolge und zeitlichen Abstand der Werte. |
| Output-Projektion | Bildet die Modelldimension auf die kontinuierlichen Zielkanäle ab. |
Architektur
Encoder
Wie Self-Attention die Historie verarbeitet
d_model ab. Anschließend wird Positionsinformation addiert. Ohne sie wäre Self-Attention permutationsinvariant: Das Modell könnte Beziehungen zwischen Werten erkennen, aber nicht unterscheiden, welches Ereignis zuerst kam.Jede Attention-Schicht erzeugt Queries Q, Keys K und Values V. Vereinfacht gilt: Attention(Q, K, V) = softmax(QKᵀ / √dₖ)V. Das Produkt QKᵀ bewertet, wie stark Positionen zueinander passen; die gewichtete Summe der Values erzeugt eine kontextualisierte Repräsentation. Multi-Head Attention wiederholt diesen Vorgang in mehreren Projektionen, bevor Residual-Verbindungen, Normalisierung und ein Feedforward-Netz die Repräsentation weiterverarbeiten.
Attention
Self-Attention und Cross-Attention unterscheiden
| Mechanismus | Query | Key und Value | Zweck |
|---|---|---|---|
| Encoder Self-Attention | Encoder-Sequenz | Encoder-Sequenz | Beziehungen innerhalb der bekannten Historie modellieren. |
| Decoder Self-Attention | Decoder-Sequenz | Decoder-Sequenz | Bisher verfügbare Zielinformation unter Beachtung der Kausalität verarbeiten. |
| Cross-Attention | Decoder-Repräsentation | Encoder-Ausgabe | Die Zielerzeugung gezielt mit der kodierten Historie verbinden. |
Decoder
Zwei Wege zur Multi-Step-Prognose
Klassisch autoregressiv
Blockweise für einen festen Horizont
Design explizit benennen
Maskierung
Drei Grenzen gegen Informationslecks
| Grenze | Was sie verhindert | Prüffrage |
|---|---|---|
| Kausale Target-Maske | Dass Position t beim Teacher Forcing auf spätere Zielpositionen zugreift. | Ist oberhalb der zulässigen zeitlichen Diagonale alles maskiert? |
| Padding-Maske | Das Modell lernt aus künstlichen Füllwerten oder deren Anzahl. | Werden aufgefüllte Source- und Target-Positionen sicher ignoriert? |
| Source-Grenze | Der Encoder erhält Features, die zum Prognosezeitpunkt noch unbekannt sind. | Nutzen Aggregationen ausschließlich Historie oder tatsächlich geplante Zukunftswerte? |
Besonders kritisch sind Features wie Minimum, Maximum oder Mittelwert, wenn sie versehentlich über das gesamte Fenster inklusive des zukünftigen Zielbereichs berechnet werden.
Tensorformen
Source und Target getrennt vorbereiten
| Tensor | Form bei batch_first=True | Inhalt |
|---|---|---|
source | [batch, source_length, source_features] | Historische und zum Prognosezeitpunkt bekannte Eingaben. |
target_in | [batch, target_length, target_features] | Startwert und bisherige reale Ziele beim Teacher Forcing, um einen Schritt verschoben. |
| Trainingsziel | [batch, target_length, target_features] | Die jeweils nächsten Zielschritte, gegen die der Loss berechnet wird. |
Source und Target benötigen separate lineare Projektionen auf d_model, da Feature-Anzahl und semantische Rolle unterschiedlich sein können.
Datenpipeline
Sieben Schritte für ein belastbares Training
1. Chronologisch aufteilen
2. Scaling nur auf Training fitten
3. Source- und Target-Fenster bilden
4. Decoder-Eingabe verschieben
5. Masken anwenden
6. Freie Inferenz separat bewerten
7. Über den Trainingshorizont hinaus testen
PyTorch-Implementierung
Ein kompaktes Encoder-Decoder-Skelett
Das Skelett enthält separate Source-/Target-Projektionen, Positionsinformation, batch_first=True, den Transformer und die Rückprojektion auf kontinuierliche
Zielkanäle.
import torch
from torch import nn
class TimeSeriesTransformer(nn.Module):
def __init__(
self,
source_dim,
target_dim,
d_model=128,
nhead=8,
encoder_layers=4,
decoder_layers=2,
dropout=0.1,
):
super().__init__()
self.source_projection = nn.Linear(source_dim, d_model)
self.target_projection = nn.Linear(target_dim, d_model)
self.position = nn.Parameter(torch.zeros(1, 2048, d_model))
self.transformer = nn.Transformer(
d_model=d_model,
nhead=nhead,
num_encoder_layers=encoder_layers,
num_decoder_layers=decoder_layers,
dropout=dropout,
batch_first=True,
)
self.output_projection = nn.Linear(d_model, target_dim)
def forward(self, source, target_in, target_mask=None):
src_len = source.size(1)
tgt_len = target_in.size(1)
source = self.source_projection(source) + self.position[:, :src_len]
target = self.target_projection(target_in) + self.position[:, :tgt_len]
hidden = self.transformer(
source,
target,
tgt_mask=target_mask,
)
return self.output_projection(hidden) Vor dem Einsatz muss eine kausale Target-Maske ergänzt und geprüft werden. Form sowie Bool-/Float-Semantik der Maske richten sich nach der konkret verwendeten PyTorch-Version.
Produktionsreife
Was das Code-Skelett bewusst offenlässt
Positionsmodell und exogene Eingaben
Masken und Normalisierung
Trainingsstabilität
Inferenz und Gültigkeitsbereich
Hyperparameter
Die entscheidenden Stellschrauben aus der Untersuchung
| Parameter | Finale Konfiguration | Übertragbare Erkenntnis |
|---|---|---|
| Modelldimension / Heads | d_model=128 / 16 Heads | Mehr Heads sind nicht automatisch besser; bei fester Modelldimension wird der Teilraum pro Head kleiner. |
| Encoder- / Decoder-Tiefe | 20 / 6 Layer | Beide Tiefen separat variieren. Mehr Encoder-Kapazität half, zusätzliche Decoder-Layer konnten schneller überfitten. |
| Historisches Kontextfenster | Lag 90 | Das lokale Optimum lag ungefähr bei 100 Samples; noch längere Fenster erhöhten den Aufwand ohne verlässlichen Zusatznutzen. |
| Trainings- und Blockhorizont | 1.024 Schritte | Lokale Studien sättigten früher, der längere überwachte Horizont stabilisierte jedoch den späteren Rollout. |
| Lernrate / Warm-up | 0,00069 / 1.758 Schritte | Warm-up senkte den RRE in der Studie um bis zu zehn Prozent und muss zusammen mit Batch-Größe und Gradient Clipping abgestimmt werden. |
Kontextfenster
Long-Horizon-Test
Gute Blockgenauigkeit garantiert noch keinen stabilen Rollout
Parallele Multi-Step-Genauigkeit und Stabilität weit jenseits des trainierten Horizonts sind deshalb zwei getrennte Bewertungskriterien.
Fehlerakkumulation
Evaluation
Drei Tests für eine belastbare Aussage
In-Horizon
Multi-Block-Rollout
Unbekannte Betriebsbedingungen
Messergebnisse
Ergebnisse des finalen Transformers im dokumentierten MVP
| Kennzahl | Finaler Transformer |
|---|---|
| RRE über 1.024 Schritte, alle Geschwindigkeiten | 0,74 % |
| RRE bei unbekannten Geschwindigkeiten | 0,85 % |
| RRE über 10.000 Schritte | 1,78 % |
| Mittlere Trainingszeit im Setup | 1 Stunde 15 Minuten |
| Inferenzgeschwindigkeit | 770.721 Schritte/s |
RRE steht für Relative Range Error und setzt die Prognoseabweichung ins Verhältnis zur Signalspannweite. Niedrigere Werte sind besser. Alle Zahlen gelten ausschließlich für die dokumentierte Hard- und Softwareumgebung.
Einordnung
Der Transformer gewann den 1.024-Schritte-Test – nicht jede beliebig lange Aufgabe
Über 10.000 Schritte stieg sein Fehler jedoch stärker als bei der LSTM. Der mittlere RRE von 1,78 % blieb zwar unter dem NARX-Wert von 2,96 %, aber über dem LSTM-Wert von 1,277 %. Die Architekturwahl muss daher den tatsächlichen Prognosehorizont berücksichtigen.
Trade-offs
Stärken und Grenzen des Encoder-Decoder-Transformers
| Stärken | Grenzen |
|---|---|
| Direkter Zugriff auf den gesamten Kontext per Attention | Attention-Speicher wächst quadratisch mit der Sequenzlänge. |
| Hohe Parallelisierbarkeit von Encoder und Blockausgabe | Lernrate, Warm-up und Tiefe erfordern sorgfältige Abstimmung. |
| Flexible Multi-Step-Prognosen | Maskierungsfehler können unbemerktes Leakage verursachen. |
| Längere nutzbare Historie im untersuchten Datensatz | Positionsinformation muss explizit ergänzt werden. |
| Sehr schnelle Inferenz auf geeigneter Hardware | Über Blockgrenzen können sich Fehler akkumulieren. |
| Klare Trennung von Historie und Zielerzeugung | Bei kleinen Datensätzen besteht ein höheres Overfitting-Risiko. |
Eignung
Wann die Architektur sinnvoll ist
Längerer multivariater Kontext
Fester Multi-Step-Horizont
Bekannte zukünftige Einflüsse
Ausreichend Daten und Tuning-Budget
Alternativen
Die Modellwahl folgt dem Gedächtnis und dem Prognosehorizont
Rekurrente Alternative
LSTM statt Transformer implementieren
Anwendung
Transformer als schnelles Surrogat für technische Simulationen
FAQ
Häufige Fragen zum Encoder-Decoder-Transformer
Braucht ein Zeitreihen-Transformer immer einen Decoder?
Welche Maske verhindert zukünftige Information?
Ist ein Transformer automatisch schneller als eine LSTM?
Warum kann der Fehler nach dem Trainingshorizont steigen?
Wann sollte ich einen Encoder-Decoder-Transformer wählen?
Architekturentscheidung
Vor der Modellkonfiguration muss der Informationsfluss geklärt sein
Wenn diese Grenzen explizit sind, lassen sich Maskierung, Tensorformen und Evaluationsmodus ableiten. Ohne diese Klarheit kann ein technisch funktionierendes Modell sehr gute Kennzahlen liefern und trotzdem Informationen nutzen, die im realen Einsatz nicht verfügbar wären.
Quellen
Datengrundlage und technische Referenzen
Architektur: Vaswani et al.: Attention Is All You Need. Implementierungsreferenz: PyTorch: torch.nn.Transformer.
Modellvergleich
Wie schlägt sich der Transformer gegen NARX und LSTM?
Vergleichen Sie Genauigkeit, Inferenzgeschwindigkeit und Fehlerakkumulation über 1.024 und 10.000 Vorhersageschritte.