Published by

Il y a 3 mois -

Temps de lecture 7 minutes

Étude de la stabilité à la prédiction et au réentraînement de DeepAR

L’algorithme DeepAR a été développé par Amazon pour pouvoir entraîner un unique modèle de Deep Learning sur tout un ensemble de séries temporelles (les historiques de volumes de ventes pour chaque produit dans le problème initial d’Amazon). Il a été mis en open source en juin 2019 par Amazon au sein du package d’analyse de séries temporelles GluonTS. Cet article s’appuie sur les acquis de mon précédent article d’introduction à l’analyse de séries temporelles avec Prophet et DeepAR (issu de la conférence Time Series made easy de la Xebicon 2019), et s’intéresse à la stabilité des prédictions fournies.

Deux types d’instabilité à étudier

Les prédictions faites par DeepAR ne sont pas des valeurs mais des distributions de probabilité. Lors de la prédiction, le modèle réalise un nombre d’échantillonnages égal à la valeur du paramètre num_eval_samples de la fonction make_evaluation_predictions. La valeur retenue pour la prédiction finale est typiquement la médiane des prédictions de chaque échantillonnage à chaque pas de temps, et les autres valeurs permettent de construire des intervalles de confiance. La question se pose de savoir comment la médiane des échantillonnages varie lors d’exécutions successives de la fonction make_evaluation_predictions, et comment la valeur du paramètre num_eval_samples l’influe. C’est ce que j’appelle la stabilité à la prédiction.

Un autre aspect de la stabilité important à étudier est la stabilité au réentraînement du modèle. Supposons que les modèles DeepAR soient suffisamment stables à la prédiction à partir d’un num_eval_samples suffisamment grand. Obtient-on la même performance si l’on réentraîne exactement le même modèle avec les mêmes hyperparamètres et le même nombre d’itérations ? DeepAR n’échappe malheureusement pas à la règle générale qui veut qu’un modèle de Deep Learning puisse présenter de grandes disparités de performance lors d’entraînements successifs, à hyperparamètres égaux.

Pour rappel, l’architecture de DeepAR repose sur des réseaux de neurones récurrents (RNN) et l’apprentissage d’une distribution de probabilité en sortie du réseau. Les paramètres que j’ai utilisés pour cette étude sont les paramètres par défaut donnés par la documentation. Voici les principaux:

  • learning rate de 0,001
  • learning rate decay de 0,5
  • 50 batchs de taille 32 par itération
  • 2 couches de 40 cellules de type LSTM pour le RNN
  • gradient majoré à 10
  • initialisation de Xavier/Glorot pour les poids des connexions des neurones
  • taux de dropout de 0,1
  • distribution de probabilité à la sortie du RNN de type Student T

Parmi les paramètres énumérés ci-dessus, on peut déjà en identifier 3 qui portent une part d’aléatoire et peuvent donc être une source d’instabilité:

  • l’initialisation de Xavier/Glorot (voir cet article sur le problème de la disparition du gradient pour plus de détails)
  • le fait que la descente de gradient se fasse en mini-batchs, qui sont forcément créés aléatoirement
  • le taux de dropout de 0,1 (lors de chaque itération d’entraînement, chaque neurone a une probabilité de 10% d’être ignoré)

Données utilisées

Le jeu de données d’entraînement représente la consommation électrique de la région Île-de-France sur 2 ans entre le 1er janvier 2017 et le 31 décembre 2018, soit 17520 heures d’historique (source: données éCO2mix). Les prédictions sont ensuite faites sur 2 semaines à partir du 1er janvier 2019.

Stabilité à la prédiction

Le repo Github de mon précédent article contient le code permettant de tester la stabilité à la prédiction de DeepAR. La fonction run_num_eval_samples_stability_study du module src/evaluation/deepar_stability_study.py, exécutée dans le script main.py, va lancer 10 fois les prédictions de consommation d’électricité en Île-de-France sur 2 semaines au 1er janvier 2019 pour num_eval_samples égal à 10, 100 et 200.

Les résultats sont bons, avec un écart relatif moyen de la prédiction à la réalité (mean absolute percent error ou MAPE en Anglais) qui varie de moins de 0,2% entre chaque exécution de la fonction make_evaluation_predictions à partir de num_eval_samples=100 (qui semble être une bonne valeur par défaut).

Stabilité à l’entraînement du modèle

La stabilité n’est malheureusement pas aussi bonne lorsque l’on réentraîne plusieurs fois un modèle DeepAR avec les mêmes hyperparamètres et les mêmes données. J’ai mesuré la performance de ma prédiction sur 2 semaines au 1er janvier 2019 (avec num_eval_samples=100 pour ne pas avoir à me soucier de la stabilité à la prédiction) pour 10 entraînements de modèles avec les hyperparamètres par défaut et en faisant varier le nombre d’itérations d’entraînement (qui est de 100 par défaut) pour voir si le fait d’augmenter le nombre d’itérations amènerait plus de stabilité. Les résultats sont malheureusement très mauvais comme on peut le voir sur ce graphe qui montre une forte dispersion de l’écart relatif moyen:

Les graphiques suivant correspondent à 3 prédictions de 2 semaines au 1er janvier 2019 faites en réentraînant le modèle à hyperparamètres constants et un nombre d’itérations de 80:

On constate que les résultats peuvent varier grandement.

Une solution possible: fixer les chiffres aléatoires d’amorce (random seeds) de mxnet et numpy

La documentation de GluonTS fait commencer son tutoriel de prédiction par la fixation des random seeds de mxnet (le moteur de deep learning sur lequel s’appuie GluonTS donc DeepAR) et numpy:

import mxnet as msx
import numpy as np

mx.random.seed(0)
np.random.seed(0)

La stabilité au réentraînement du modèle est alors bien meilleure comme l’atteste ce graphique généré en entraînant un modèle avec les paramètres par défaut sur 20 itérations 10 fois en fixant les random seeds et 10 fois sans les fixer:

On observe qu’il reste une petite variabilité résiduelle qui vient très probablement de l’échantillonnage lors de la prédiction.

Mise en perspective: la performance des prédictions de DeepAR est en fait très variable d’une date de prédiction à l’autre, pour un même modèle

On observe un grande variabilité de performance si l’on fait une prédiction toutes les 2 semaines sur 6 mois, avec le même modèle:

Cette variabilité pour un même modèle faisant des prédictions sur des dates différentes est finalement assez semblable à la variabilité que l’on a observé lorsqu’un même modèle est réentraîné plusieurs fois sans fixer les random seeds et fait des prédictions sur une unique date:

Conclusion

Je ne prétends pas que cette petite étude permette de conclure à l’instabilité systématique de DeepAR. Je me suis en effet limité aux hyperparamètres par défaut de DeepAR et il est possible qu’un tuning approprié conduise à une meilleure robustesse. L’étude appelle néanmoins à une grande prudence sur 2 points:

  • les éventuels réentraînements du modèle, surtout si ceux-ci se font de façon automatique dans le contexte d’un modèle industrialisé. Attention également aux réentraînements sur les mêmes données et avec les mêmes hyperparamètres pendant la phase d’exploration, dont on a vu qu’ils peuvent donner des résultats parfois très différents.
  • les métriques de performance du modèle. Dans le cas d’étude présenté dans cet article, un data scientist ayant entraîné le modèle une seule fois et ayant obtenu par chance une bonne performance sur sa première prédiction pourrait être tenté de conclure que le modèle est performant. Or nous avons vu que non seulement le modèle donne parfois de mauvais résultats sur la première prédiction, mais qu’en plus il présente une performance très variable lorsque l’on observe plusieurs prédictions. Il faut donc dès le départ prévoir de mesurer la performance du modèle sur plusieurs dates de prédiction différentes.

Je n’ai pas fait la même étude avec Prophet (un autre algorithme d’analyse de séries temporelles, développé par Facebook et que j’ai présenté dans mon précédent article) car l’expérience de la manipulation du modèle ne donnait pas à penser qu’il souffrait du même genre d’instabilité au réentraînement. Toute contribution au code source de l’étude pour l’étendre à Prophet est néanmoins bienvenue !

Published by

Commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Sapient, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.