Maximale Anzahl von Parametern
Es hängt sehr von der Struktur Ihres Problems ab. Zum Beispiel war meine Erfahrung mit verschiedenen hierarchischen linearen Modellen in Stan, dass es bei etwa 10 000 - 30 000 Parametern sehr langsam ist (Stunden oder Tage) (einige reproduzierbare Zahlen finden Sie in meinem Blog über Stan vs. INLA ). Bei der Arbeit mit Modellen mit gewöhnlichen Differentialgleichungen und komplexer Struktur können 10 Parameter zu viele sein. Wenn nur ein Vektor unabhängiger Normalen angepasst wird (siehe unten), benötigt Stan etwa 40 Minuten, um die 1e5-Parameter mit den Standardeinstellungen (1000-Iter-Aufwärmen, 1000-Iter-Abtastung, 4 Ketten) zu vervollständigen. Es ist also sehr wahrscheinlich, dass es sehr unpraktisch ist, mehr als 1e5 Parameter zu haben.
Der längste Teil eines Stan-Laufs ist jedoch die Aufwärmphase, in der die Hyperparameter des Algorithmus angepasst werden. Wenn Sie selbst gute Werte für diese liefern könnten (was schwierig ist), könnten Sie die Leistung möglicherweise noch weiter steigern.
Die Unterstützung von MPI für Parallelität innerhalb der Kette und das Auslagern von Matrixoperationen auf die GPU sollte Stan bald hinzugefügt werden (siehe z. B. Diskussion hier http://discourse.mc-stan.org/t/parallelization-again-mpi-to- The-Rescue / 455/11 und hier http://discourse.mc-stan.org/t/stan-on-the-gpu/326/10 ), sodass wahrscheinlich auch größere Modelle in naher Zukunft praktisch werden.
Diagnose in hoher Dimension
Die HMC-Implementierung in Stan bietet mehrere nützliche Diagnosen, die auch bei einer großen Anzahl von Parametern funktionieren: divergierende Übergänge n_eff
(effektive Stichprobengröße) und Split Rhat
(potenzielle Skalenreduzierung). Ausführliche Erläuterungen hierzu finden Sie im Stan-Handbuch , Abschnitt "Initialisierungs- und Konvergenzüberwachung".
R-Code für ein einfaches Modell - nur eine Reihe unabhängiger Normalen, die in der Anzahl der Parameter skaliert werden können, passen in Stan:
library(rstan)
model_code = "
data {
int N;
}
parameters {
vector[N] a;
}
model {
a ~ normal(0,1);
}
"
model = stan_model(model_code = model_code)
fit_large = sampling(model, data = list(N = 1e5))