NARX-Modell implementieren: Aufbau, Architektur und Ergebnisse
Implementierungsleitfaden
Definition
Was ist ein NARX-Modell?
Als Textformel: y(t) = f(y(t−1), …, y(t−ny), u(t−1), …, u(t−nu)). Dabei bezeichnet y den Systemausgang, u die exogene Eingabe und ny beziehungsweise nu die Länge der jeweiligen Historie. Die nichtlineare Funktion f kann ein Feedforward-Netz beziehungsweise Multi-Layer Perceptron annähern.
Begriffe
Die NARX-Logik in sieben Definitionen
| Begriff | Bedeutung |
|---|---|
| Autoregressiver Eingang | Frühere Werte jener Zielgröße, die das Modell vorhersagen soll. |
| Exogener Eingang | Eine bekannte externe Einflussgröße, die nicht vom vorhergesagten Ausgang erzeugt wird. |
| Lag | Anzahl vergangener Zeitschritte, die als Eingang genutzt werden. |
| Open Loop | Training oder Vorhersage mit realen früheren Zielwerten. |
| Closed Loop | Rekursive Vorhersage, bei der frühere Modellprognosen wieder als Eingang dienen. |
| Rollout | Abfolge mehrerer Prognoseschritte über einen längeren Horizont. |
| RRE | Relative Range Error: Prognosefehler im Verhältnis zur Spannweite des tatsächlichen Signals; niedrigere Werte sind besser. |
Architektur
Wie funktioniert die NARX-Architektur?
Vergangene Ausgänge beschreiben den jüngsten Zustand
Exogene Eingaben bilden äußere Einflüsse ab
Ein Feedforward-Netz lernt die nichtlineare Abbildung
Feedback erzeugt die Mehrschrittprognose
NARX-Netzwerk
Betriebsarten
Vorhersage mit echten oder eigenen vergangenen Werten
| Betriebsart | Eingang für den nächsten Schritt | Aussage |
|---|---|---|
| Open Loop (offene Schleife) | Reale historische Zielwerte | Zeigt, wie gut das Modell unter sauberen Eingabebedingungen einen nächsten Schritt vorhersagt. |
| Closed Loop (geschlossene Schleife) | Zunehmend eigene Modellprognosen | Zeigt, ob kleine Abweichungen über den praktischen Vorhersagehorizont stabil bleiben oder anwachsen. |
Ein gutes Einzelschrittergebnis beweist bei NARX noch keinen stabilen rekursiven Rollout. Schon eine kleine Abweichung verändert das nächste Eingabefenster und damit alle folgenden Schritte.
Datengrundlage
Welche Daten braucht ein NARX-Modell?
In der Bachelorarbeit waren Streckenunregelmäßigkeiten die exogene Anregung. Prognostiziert wurden unter anderem Beschleunigungen, Geschwindigkeiten, Positionen und Kräfte eines Schienenfahrzeugs.
Datenfenster
Informationsleck (Data Leakage)
Zeitreihen vor dem Fensterbau chronologisch trennen
- Zeitreihen zuerst chronologisch in Training, Validierung und Test teilen.
- Mittelwert und Standardabweichung ausschließlich auf dem Trainingssplit bestimmen.
- Dieselben Skalierungsparameter auf Validierung, Test und spätere Inferenz anwenden.
- Erst danach Lag-Fenster innerhalb jedes Splits bilden.
- Prüfen, dass kein Fenster über eine Split-Grenze reicht.
Zufälliges Mischen einzelner Zeitschritte verteilt nahezu identische Nachbarfenster auf Training und Test. Das erzeugt optimistische Metriken, aber keinen belastbaren Nachweis für Generalisierung.
Implementierung
Das NARX-Kernprinzip in Python und PyTorch umsetzen
In Python braucht NARX keine spezielle rekurrente Schicht. Das Modell kann ein gewöhnliches MLP sein; die NARX-Logik entsteht durch die Datenaufbereitung und das Verschieben des Fensters.
- Zielkanäle und exogene Kanäle definieren.
- Zeitreihen ohne zufälliges Vermischen teilen.
- Skalierungsparameter nur aus dem Trainingssplit berechnen.
- Für jeden Zeitpunkt die letzten Ziel- und exogenen Werte konkatenieren.
- Ein flaches nichtlineares Regressionsnetz trainieren.
- Lag, Breite und Trainingshorizont auf Validierungsdaten abstimmen.
- Das Modell im Closed Loop deutlich länger als den Trainingshorizont testen.
PyTorch-Modell
Das MLP verarbeitet beide Lag-Fenster gemeinsam
import torch
from torch import nn
class NarxMLP(nn.Module):
def __init__(self, target_dim, exog_dim, lag, hidden_dim):
super().__init__()
input_dim = lag * (target_dim + exog_dim)
self.net = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, target_dim),
)
def forward(self, y_lag, u_lag):
# Form: [batch, lag, features]
x = torch.cat([y_lag, u_lag], dim=-1)
return self.net(x.flatten(start_dim=1))Mehrschrittprognose
Wie wird der Closed-Loop-Rollout erzeugt?
Rollout-Code
Prognose und exogene Eingabe rekursiv nachführen
predictions = []
for u_next in future_exog:
y_next = model(y_lag, u_lag)
predictions.append(y_next)
y_lag = torch.cat(
[y_lag[:, 1:], y_next[:, None, :]], dim=1
)
u_lag = torch.cat(
[u_lag[:, 1:], u_next[:, None, :]], dim=1
)Produktionsreife
Was über das Code-Skelett hinaus nötig ist
Hyperparameter
Welche Hyperparameter entscheiden über die Qualität?
Lag und reale Zeitspanne
Breite und Tiefe
Trainingssequenzlänge
Frühes Stoppen und mehrere Seeds
Validierung
Lag-Auswahl und Rollout-Stabilität gemeinsam optimieren
Für die Optimierung zählen deshalb mindestens Einzelschrittfehler, Closed-Loop-Fehler über den Zielhorizont, Streuung über Zielkanäle und Seeds sowie Rechenaufwand. Gradient Clipping und konservative Lernraten adressieren die beobachtete Instabilität, ersetzen aber keinen langen Rollout-Test.
Gültigkeitsbereich
Die folgenden Werte sind kein allgemeiner NARX-Benchmark
Messergebnisse
Ergebnisse des finalen NARX-Modells
| Kennzahl | Finales NARX-Ergebnis |
|---|---|
| RRE über 1.024 Schritte, alle Geschwindigkeiten | 2,33 % |
| RRE über 1.024 Schritte, unbekannte Geschwindigkeiten | 2,67 % |
| RRE über 10.000 Schritte | 2,96 % |
| Mittlere Trainingszeit im dokumentierten Setup | 2 Stunden |
| Inferenzgeschwindigkeit | 184.601 Schritte/s |
Mit 2,33 % RRE erfüllte NARX im abgegrenzten MVP die Anforderung von weniger als 2,5 % über 1.024 Schritte. Absolute Laufzeiten und Durchsätze hängen von der verwendeten Hard- und Software ab.
Einordnung
Begrenzte Drift bedeutet nicht automatisch höchste Genauigkeit
Die Messwerte beantworten daher eine abgegrenzte Frage: Das finale Modell war schnell und erreichte das MVP-Ziel über 1.024 Schritte, war innerhalb des Architekturvergleichs jedoch am ungenauesten.
Abwägung
Stärken und Schwächen von NARX
| Stärken | Schwächen |
|---|---|
| Leicht verständliche Architektur | Erinnerung endet am festen Lag-Fenster |
| Exogene Einflüsse sind explizit modelliert | Eingangsdimension wächst linear mit Lag und Kanalzahl |
| Schnelle Inferenz mit einem Feedforward-Netz | Eigene Fehler können sich im rekursiven Rollout akkumulieren |
| Bereitgestellte Historie ist direkt nachvollziehbar | Zukünftige exogene Eingaben müssen bekannt oder prognostiziert sein |
| Transparente Baseline für dynamische Systeme | Empfindlich gegenüber Breite, Tiefe und Trainingshorizont |
Modellwahl
Wann ist NARX die richtige Wahl?
Die relevante Dynamik passt in ein begrenztes Fenster
Zukünftige externe Eingaben sind verfügbar
Einfache und schnelle Inferenz ist wichtig
Lange Closed-Loop-Tests sind möglich
Grenzen
Wann ein anderes Sequenzmodell näherliegt
Technische Anwendung
Vom NARX-Modell zum schnellen Simulationssurrogat
Der übergeordnete Use Case zeigt, wie ein genauer Simulationsprozess Referenzdaten erzeugt, ein Modell die schnelle Vorbewertung übernimmt und ausgewählte Fälle weiterhin physikalisch validiert werden.
FAQ
Häufige Fragen zur NARX-Implementierung
Ist NARX nur in MATLAB verfügbar?
Braucht NARX zukünftige exogene Eingaben?
Warum kann ein größeres Lag-Fenster schaden?
Wie verhindert man zu optimistische Testergebnisse?
Wann sollte ich statt NARX eine LSTM oder einen Transformer verwenden?
Quelle
Datengrundlage und weiterführende Dokumentation
Technische Dokumentation: MathWorks: NARX Network for Time Series Forecasting und SysIdentPy: Create a Neural NARX Network.
Modellvergleich
Wie schneidet NARX gegen LSTM und Transformer ab?
Vergleichen Sie dieses Modell mit den Alternativen – bei Genauigkeit über 1.024 Schritte, Stabilität über 10.000 Schritte, Generalisierung und Rechenaufwand.