Nombre maximum de paramètres
Cela dépend beaucoup de la structure de votre problème. Par exemple, mon expérience avec divers modèles linéaires hiérarchiques dans Stan était qu'elle commence à être très lente (heures ou jours pour terminer) à environ 10000 à 30000 params (certains nombres reproductibles sont sur mon blog sur Stan vs INLA ). Lorsque vous travaillez avec des modèles impliquant des équations différentielles ordinaires et une structure complexe, 10 paramètres peuvent être trop nombreux. Lors de l'ajustement d'un vecteur de normales indépendantes (voir ci-dessous), Stan prend environ 40 minutes pour compléter les paramètres 1e5, en utilisant les paramètres par défaut (1000 iter warmup, 1000 iter échantillonnage, 4 chaînes). Donc, avoir beaucoup plus de 1e5 paramètres est très probablement impraticable.
La partie la plus longue d'une exécution de Stan est cependant la phase d'échauffement lorsque les hyperparamètres de l'algorithme sont modifiés. Si vous pouvez fournir vous-même de bonnes valeurs (ce qui est difficile), vous pourrez peut-être pousser les performances encore plus loin.
En outre, le support de MPI pour le parallélisme intra-chaîne et le déchargement des opérations matricielles vers le GPU devrait être ajouté à Stan bientôt (voir par exemple la discussion ici http://discourse.mc-stan.org/t/parallelization-again-mpi-to- the-rescue / 455/11 , et ici http://discourse.mc-stan.org/t/stan-on-the-gpu/326/10 ) donc des modèles encore plus grands deviendront probablement pratiques dans un avenir proche.
Diagnostic en haute dimension
L'implémentation de la console HMC dans Stan fournit plusieurs diagnostics utiles qui fonctionnent même avec un grand nombre de paramètres: transitions divergentes, n_eff
(taille effective de l'échantillon) et fractionnée Rhat
(réduction d'échelle potentielle). Voir le manuel de Stan , section "Initialisation et surveillance de la convergence" pour une explication détaillée de ceux-ci.
Code R pour un modèle simple - juste un ensemble de normales indépendantes qui peuvent évoluer dans le nombre de paramètres, tenir dans 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))