Architecture du réseau de neurones
Eaternity Forecast utilise un réseau de neurones sophistique base sur les transformeurs avec des mécanismes d'attention pour prédire la demande quotidienne des articles de menu des restaurants. Ce document explique l'architecture technique et la méthodologie d'intelligence artificielle.
Aperçu de l'architecture
Type de modèle : Architecture Transformeur
Forecast emploie une architecture transformeur, la même technologie fondamentale qui sous-tend les modèles de langage modernes comme GPT et BERT, adaptee spécifiquement pour la prévision de demande de series temporelles.
Pourquoi les transformeurs pour la prévision de demande ?
Les méthodes de prévision traditionnelles (ARIMA, lissage exponentiel) ont du mal avec :
- Les relations complexes multi-facteurs
- Les dépendances temporelles à long terme
- Les tendances non stationnaires
- Les cycles saisonniers multiples simultanes
Les transformeurs excellent dans :
- La reconnaissance de tendances à différentes échelles temporelles (quotidienne, hebdomadaire, saisonnière)
- Les mécanismes d'attention qui identifient les périodes historiques pertinentes
- L'intégration multi-facteurs (météo, événements, changements de menu)
- La gestion des tendances irregulieres (jours fériés, événements spéciaux)
Composants principaux
Couche d'entree
↓
Encodage temporel
↓
Attention multi-tetes (×4 couches)
↓
Reseaux a propagation avant
↓
Projection de sortie
↓
Prevision + Intervalles de confiance
Architecture détaillée
1. Couche d'entrée
Objectif : Transformer les données de ventes brutes et les facteurs externes en représentations numériques
Caractéristiques d'entrée (par article, par jour) :
Caractéristiques des ventes historiques
- Ventes des 7 derniers jours (quantités quotidiennes)
- Ventes du même jour de la semaine des 4 semaines precedentes
- Moyenne des ventes du mois precedent
- Ventes à la même date l'année précédente (si disponible)
Caractéristiques temporelles
- Jour de la semaine (encodage one-hot : Lundi=1, Mardi=2, etc.)
- Semaine de l'année (1-52)
- Mois (1-12)
- Est un week-end (binaire : 0/1)
- Est un jour ferie (binaire : 0/1)
Caractéristiques externes
- Température (°C, normalisée)
- Précipitations (mm, normalisées)
- Prévisions météo du lendemain
- Événements locaux (indicateurs binaires ou categoriques)
Caractéristiques du menu
- Catégorie de l'article (entrée, plat, dessert, etc.)
- Niveau de prix (normalisé)
- Jours depuis le lancement de l'article (pour les nouveaux articles)
- Disponibilité de l'article (binaire : 0/1)
Exemple d'ingenierie des caractéristiques :
Vecteur d'entree pour « Pasta Carbonara » le mercredi 20 janvier 2024 :
Ventes historiques :
[52, 48, 45, 51, 49, 0, 0] # 7 derniers jours (0 = ferme)
[49, 51, 48, 52] # 4 derniers mercredis
47.3 # Moyenne du mois dernier
Temporel :
[0, 0, 1, 0, 0, 0, 0] # Jour de la semaine (Mer = position 3)
3 # Semaine de l'annee
1 # Mois (janvier)
0 # Est un week-end
0 # Est un jour ferie
Externe :
8.2 # Temperature (°C)
0.0 # Precipitations
7.5 # Temperature prevue demain
Menu :
[0, 1, 0, 0] # Categorie (Plat principal)
14.50 # Prix (normalise sur l'echelle 0-1)
450 # Jours depuis le lancement
1 # Disponible aujourd'hui
2. Encodage temporel
Objectif : Encoder les tendances basées sur le temps et les relations cycliques
Encodage positionnel :
Utilise des fonctions sinusoidales pour capturer les tendances périodiques :
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
Ou :
pos= position dans la séquence (numero du jour)i= dimensiond_model= dimension de l'encodage (256)
Pourquoi l'encodage sinusoidal ?
- Capture des cycles multiples (quotidien, hebdomadaire, mensuel, annuel)
- Le modèle apprend quels cycles sont pertinents pour chaque article
- Permet l'extrapolation au-delà de la période d'entrainement
- Gère l'espacement irregulier (jours fériés, jours de fermeture)
Exemple :
# Encodage du cycle hebdomadaire pour le jour de la semaine
weekly_encoding = [
sin(day_of_week / 7 * 2π),
cos(day_of_week / 7 * 2π)
]
# Encodage du cycle annuel
annual_encoding = [
sin(day_of_year / 365 * 2π),
cos(day_of_year / 365 * 2π)
]
3. Mecanisme d'attention multi-têtes
Objectif : Identifier quelles périodes historiques sont les plus pertinentes pour la prévision actuelle
Fonctionnement de l'attention :
Le modèle demande : « Pour prédire le déjeuner du mercredi, à quels jours precedents dois-je preter attention ? »
Formule d'attention :
Attention(Q, K, V) = softmax(QK^T / √d_k) V
Ou :
- Q (Requête) : Ce que nous essayons de prédire (demandé du jour)
- K (Clés) : Jours historiques à considérer
- V (Valeurs) : Ventes réelles de ces jours
- d_k : Dimension des vecteurs de clés
Approche multi-têtes :
Au lieu d'un seul mecanisme d'attention, nous utilisons 8 têtes d'attention paralleles :
-
Tête 1 : Se concentre sur les tendances du même jour de la semaine
- « Les mercredis sont similaires aux mercredis precedents »
-
Tête 2 : Se concentre sur les tendances récentes
- « La tendance de la semaine dernière continue »
-
Tête 3 : Se concentre sur les tendances saisonnières
- « Similaire à cette période l'année dernière »
-
Tête 4 : Se concentre sur les corrélations météorologiques
- « Les jours froids comme aujourd'hui ont une demande similaire »
-
Tête 5 : Se concentre sur les tendances d'événements
- « Jours avec des événements similaires à proximité »
-
Tête 6 : Se concentre sur la dynamique du menu
- « Jours avec une composition de menu similaire »
-
Tête 7 : Se concentre sur la sensibilité aux prix
- « Jours avec des stratégies de prix similaires »
-
Tête 8 : Se concentre sur les tendances à long terme
- « Direction de la tendance sur plusieurs mois »
Exemple de poids d'attention :
Prevision pour le mercredi 20 janvier 2024 pour Pasta Carbonara :
Attention de la tete 1 (jour de la semaine) aux mercredis precedents :
13 jan (dernier mer) : 0.35 (le plus recent, poids le plus eleve)
6 jan : 0.28
30 dec : 0.18
23 dec : 0.12
Autres mercredis : 0.07
Attention de la tete 2 (tendance recente) aux 7 derniers jours :
19 jan (hier) : 0.42
18 jan : 0.24
17 jan : 0.15
16 jan : 0.10
Plus anciens : 0.09
Attention de la tete 3 (saisonniere) a l'annee derniere :
21 jan 2023 : 0.55 (meme date l'annee derniere)
14-28 jan 2023 : 0.45 (dates environnantes)
4. Réseaux à propagation avant
Objectif : Transformation non linéaire et combinaison des caractéristiques
Architecture :
Entree (256 dimensions)
↓
Couche lineaire 1 (256 → 1024)
↓
Activation ReLU
↓
Abandon (0.1)
↓
Couche lineaire 2 (1024 → 256)
↓
Abandon (0.1)
↓
Connexion residuelle + Normalisation de couche
Pourquoi deux couches ?
- Expansion (256→1024) : Crée un espace de représentation de haute dimension
- Compression (1024→256) : Extrait les caractéristiques les plus pertinentes
Régularisation par abandon :
Desactive aleatoirement 10 % des neurones pendant l'entrainement pour prevenir le surapprentissage :
- Le modèle apprend des tendances robustes, pas une memorisation
- Améliore la generalisation aux nouvelles données
- Essentiel pour les petits ensembles de données (certains restaurants, nouveaux articles)
5. Empilement des couches
Quatre blocs transformeurs empiles sequentiellement :
Bloc 1 : Reconnaissance initiale des tendances
↓
Bloc 2 : Extraction affinee des tendances
↓
Bloc 3 : Apprentissage des caracteristiques de haut niveau
↓
Bloc 4 : Representation finale
Chaque bloc contient :
- Couche d'attention multi-têtes
- Normalisation de couche
- Réseau à propagation avant
- Connexions residuelles
Pourquoi quatre couches ?
Equilibre entre :
- Complexité : Plus de couches = plus de tendances reconnues
- Efficacité : Moins de couches = entrainement et inférence plus rapides
- Risque de surapprentissage : Trop de couches = memorisation au lieu d'apprentissage
Les tests empiriques ont montré que 4 couches sont optimales pour la prévision de demande en restauration.
6. Projection de sortie
Objectif : Convertir la représentation apprise en prévision de quantité
Approche de regression quantile :
Au lieu de prédire une seule valeur, le modèle produit trois quantiles :
Couche lineaire (256 → 3)
↓
Sorties :
- 10e percentile (borne inferieure)
- 50e percentile (mediane/estimation ponctuelle)
- 90e percentile (borne superieure)
Exemple de sortie :
{
"item": "Pasta Carbonara",
"date": "2024-01-20",
"predictions": {
"lower_bound": 45, // 10e percentile
"point_estimate": 52, // 50e percentile (mediane)
"upper_bound": 59 // 90e percentile
}
}
Pourquoi la regression quantile ?
- Capture naturellement l'incertitude de la prévision
- Fournit des intervalles de confiance exploitables
- Plus robuste aux valeurs aberrantes que les approches basées sur la variance
- S'aligne sur les besoins decisionnels (préparer pour une fourchette, pas une seule valeur)
Processus d'entrainement
Préparation des données
1. Collecte des données
Exigences minimales :
- 30 jours de données historiques de ventes (90 jours ou plus recommandés)
- Enregistrements quotidiens complets (pas de lacunes)
- Quantités par article
2. Prétraitement des données
Normalisation :
# Normalisation z-score pour les quantites
normalized_quantity = (quantity - mean) / std_dev
# Normalisation min-max pour les caracteristiques externes
normalized_temp = (temp - min_temp) / (max_temp - min_temp)
Gestion des valeurs manquantes :
- Jours de fermeture : Explicitement marques (pas d'imputation)
- Ventes manquantes : Report si moins de 3 jours consecutifs
- Données météo : Interpolation à partir des stations voisines
Détection des valeurs aberrantes :
# Identifier et marquer (mais ne pas supprimer) les valeurs aberrantes
z_score = (quantity - rolling_mean) / rolling_std
if abs(z_score) > 3:
flag_as_potential_outlier()
Valeurs aberrantes conservees mais pondérées plus faiblement pendant l'entrainement.
3. Génération de sequences
Créer des sequences d'entrée de longueurs variables :
Contexte court (7 derniers jours) :
[jour-7, jour-6, jour-5, jour-4, jour-3, jour-2, jour-1] → [predire : jour-0]
Contexte moyen (4 dernières semaines) :
[sem-4-meme-jour, sem-3-meme-jour, sem-2-meme-jour, sem-1-meme-jour] → [predire : aujourd'hui]
Contexte long (saisonnier) :
[mois-12-meme-date, mois-6-meme-date, mois-3-meme-date] → [predire : aujourd'hui]
Algorithme d'entrainement
Fonction de perte : Perte quantile
Pour chaque quantile q (0.1, 0.5, 0.9) :
L_q = (q - 1) * erreur si erreur < 0 (sous-prevision)
q * erreur si erreur ≥ 0 (sur-prevision)
Perte totale = L_0.1 + L_0.5 + L_0.9
Pourquoi cette perte ?
- Penalise davantage la sous-prévision pour le quantile supérieur (90e)
- Penalise davantage la sur-prévision pour le quantile inférieur (10e)
- Équilibrée pour la médiane (50e)
- Assure l'ordre correct des quantiles (inférieur < médiane < supérieur)
Optimisation
Optimiseur : AdamW (Adam avec decroissance des poids)
Hyperparametres :
learning_rate = 0.001 # Taux d'apprentissage initial
weight_decay = 0.01 # Regularisation L2
beta_1 = 0.9 # Momentum
beta_2 = 0.999 # Taux d'apprentissage adaptatif
epsilon = 1e-8 # Stabilite numerique
Calendrier du taux d'apprentissage : Recuit cosinus avec phase de chauffe
# Phase de chauffe (premiers 10 % de l'entrainement)
lr = initial_lr * (step / warmup_steps)
# Phase de recuit cosinus
lr = min_lr + 0.5 * (max_lr - min_lr) * (1 + cos(π * step / total_steps))
Avantages :
- La chauffe graduelle previent la divergence precoce
- La decroissance cosinus permet un affinage près de la fin
- Les cycles multiples permettent d'echapper aux minima locaux
Itérations d'entrainement
Epoques : 100-200 selon la taille des données
Taille de lot : 32 sequences
Partition de validation : 20 % des données mises de cote
Arret anticipe :
if validation_loss_not_improved_for(patience=15_epochs):
stop_training()
restore_best_model()
Techniques de régularisation
1. Abandon
- Abandon d'attention : 0.1
- Abandon de propagation avant : 0.1
- Abandon d'encodage : 0.05
2. Decroissance des poids
- Penalite L2 sur les poids : 0.01
- Empeche les poids de devenir trop grands
3. Lissage des étiquettes
- Floute légèrement les valeurs cibles
- Améliore le calibrage des intervalles de confiance
4. Augmentation des données
- Variation aleatoire des valeurs historiques (±5 %)
- Simule l'incertitude de mesure
- Améliore la robustesse
Validation et test
Partition Entrainement/Validation/Test
Donnees historiques (180 jours au total) :
- Entrainement : Jours 1-126 (70 %)
- Validation : Jours 127-162 (20 %)
- Test : Jours 163-180 (10 %)
Validation progressive :
Au lieu d'une partition aleatoire, utiliser une partition temporelle :
- Entraîner uniquement sur les données passees
- Valider sur les données futures
- Previent les fuites de données (utiliser le futur pour prédire le passe)
Métriques de performance
Erreur absolue moyenne en pourcentage (MAPE) :
MAPE = (1/n) * Σ |reel - prevu| / reel * 100 %
Note de calibrage :
Attendu : 80 % des reels dans l'intervalle de confiance
Reel : Compter combien de reels tombent dans [inferieur, superieur]
Calibrage = Couverture reelle / Couverture attendue
Perte quantile :
QL = Σ tous les quantiles (perte quantile comme definie ci-dessus)
Processus d'inférence
Génération quotidienne des prévisions
Calendrier : S'execute automatiquement à 3h00 heure locale
Processus :
-
Collecte des données (3h00-3h05)
- Recuperer les données de ventes finales de la veille
- Recuperer les prévisions météo pour les 7 prochains jours
- Vérifier le calendrier des événements pour les dates à venir
- Charger la configuration actuelle du menu
-
Ingenierie des caractéristiques (3h05-3h10)
- Calculer les moyennes mobiles et les tendances
- Encoder les caractéristiques temporelles
- Normaliser les variables externes
- Créer les sequences d'entrée
-
Inférence du modèle (3h10-3h15)
- Passage avant dans le réseau de neurones
- Générer les prévisions pour les 7 prochains jours
- Calculer les intervalles de confiance
- Calculer les métriques de précision
-
Post-traitement (3h15-3h20)
- Arrondir les prévisions aux entiers
- Appliquer les règles metier (minimum=0, maximum=capacité)
- Marquer les prévisions inhabituelles pour révision
- Générer les rapports de précision
-
Livraison (3h20-3h25)
- Publier vers les points d'accès de l'interface de programmation
- Mettre à jour l'interface du tableau de bord
- Envoyer des alertes par e-mail (si configure)
- Journaliser les prévisions pour le suivi
Latence : moins de 5 minutes pour un restaurant typique (100 articles de menu)
Apprentissage continu
Comment le modèle s'améliore au fil du temps :
Re-entrainement hebdomadaire
Chaque lundi à 4h00 :
- Incorporer les ventes réelles de la semaine précédente
- Re-entraîner le modèle avec les données mises à jour
- Évaluer les améliorations de performance
- Deployer le modèle mis à jour si la précision s'améliore
Intégration des retours
Écarts signales par les utilisateurs reinjectes dans l'entrainement :
- Événements spéciaux marques manuellement
- Circonstances inhabituelles documentées
- Raisons des modifications analysées
- Ingenierie des caractéristiques améliorée
Détection de derive conceptuelle
Surveiller les changements dans les tendances de demande :
if recent_accuracy < historical_accuracy - threshold:
trigger_model_refresh()
investigate_potential_concept_drift()
Causes courantes :
- Changements de menu
- Nouvelle concurrence
- Transitions saisonnières
- Changements opérationnels
Fonctionnalités avancées
Corrélation multi-articles
Attention inter-articles :
Le modèle apprend les relations entre les articles :
- Effets de substitution : « Si le saumon est populaire, la demande de salade diminué »
- Effets complémentaires : « Les ventes de desserts correlent avec le volume de plats principaux »
- Ingenierie du menu : « Les specials cannibalisent les articles réguliers »
Implémentation :
# Attention non seulement a l'historique propre de l'article, mais aussi aux articles lies
attention_context = [
item_own_history,
substitute_items_history,
complement_items_history,
category_average_history
]
Prévisions d'ensemble
Variantes de modèles multiples :
Entraîner plusieurs modèles avec différentes architectures :
- Modèle A : Transformeur (principal)
- Modèle B : LSTM (base recurrente)
- Modèle C : Gradient boosting (base sur les arbres)
Combinaison pondérée :
final_prediction = (
0.70 * transformer_prediction +
0.20 * lstm_prediction +
0.10 * gbm_prediction
)
Poids determines par la précision historique.
Quantification de l'incertitude
Sources d'incertitude :
-
Aleatoire (caractere aleatoire irreductible)
- Comportement des clients intrinsequement imprevisible
- Événements aleatoires (fluctuations météorologiques)
-
Epistemique (incertitude du modèle)
- Données d'entrainement insuffisantes
- Limitations de capacité du modèle
- Nouveaux scénarios absents de l'ensemble d'entrainement
Notation de confiance :
confidence_score = f(
data_quality, # Quelle est la qualite des donnees historiques ?
training_data_volume, # Combien de donnees disponibles ?
similarity_to_training, # A quel point le jour de prevision ressemble aux jours d'entrainement ?
model_agreement # Les modeles de l'ensemble sont-ils d'accord ?
)
Confiance plus élevée → intervalles plus etroits Confiance plus faible → intervalles plus larges
Apprentissage par transfert
Apprentissage inter-sites :
Pour les chaînes de restaurants :
- Pre-entrainement sur les données de tous les sites
- Affinage sur les données de chaque site
- Transfert des tendances (saisonnières, météo, événements)
- Démarrage plus rapide pour les nouveaux sites
Avantages :
- Prévisions disponibles immédiatement pour un nouveau site
- Précision initiale plus élevée
- Convergence du modèle plus rapide
- Apprentissage partage dans toute l'organisation
Performance du modèle
Comparatifs
Précision vs références :
| Méthode | MAPE | Notes |
|---|---|---|
| Eaternity Forecast | 12,8 % | Architecture transformeur |
| Prévisionniste expert humain | 17,1 % | 25 % moins précis |
| Même jour semaine précédente | 22,4 % | Référence naive |
| Moyenne sur 4 semaines | 19,7 % | Référence statistique simple |
| ARIMA | 16,2 % | Series temporelles traditionnelles |
| LSTM | 14,1 % | Réseau de neurones récurrent |
Calibrage des intervalles de confiance :
Attendu : 80 % des reels dans [inférieur, supérieur] Atteint : 78,5 % (bien calibre)
Exigences de calcul
Entrainement :
- GPU : NVIDIA RTX 4090 ou équivalent
- RAM : 32 Go minimum
- Temps d'entrainement : 2-6 heures (selon le volume de données)
- Stockage : 5-20 Go par restaurant
Inférence :
- CPU : Suffisant pour les prévisions en temps réel
- RAM : 8 Go
- Latence : moins de 100 ms par prévision
- Stockage : moins de 1 Go pour le modèle deploye
Fondements scientifiques
Références académiques
Forecast s'appuie sur des recherches évaluées par des pairs :
-
Architecture Transformeur
- Vaswani et al. (2017) « Attention Is All You Need »
- Article original sur les transformeurs pour le traitement du langage naturel
-
Prévision de series temporelles
- Zhou et al. (2021) « Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting »
- Transformeurs temporels pour la prévision
-
Prévision de demande
- Taylor et Letham (2018) « Forecasting at Scale » (Facebook Prophet)
- Systèmes de prévision a l'échelle industrielle
-
Regression quantile
- Koenker et Bassett (1978) « Regression Quantiles »
- Theorie fondamentale de la regression quantile
-
Opérations de restauration
- Miller et al. (2015) « Forecasting Restaurant Demand »
- Défis de prévision spécifiques au domaine
Améliorations futures
Feuille de route
T2 2024 : Visualisation de l'attention
- Montrer sur quels jours historiques le modèle se concentre
- Expliquer les prévisions aux utilisateurs
T3 2024 : Prévision au niveau des recettes
- Prédire directement les besoins en ingrédients
- Intégration avec les systèmes d'inventaire
T4 2024 : Inférence causale
- Comprendre l'incidence des changements de menu avant implémentation
- Simuler les effets promotionnels
2025 : Apprentissage multimodal
- Incorporer le sentiment des réseaux sociaux
- Analyse visuelle du menu
- Sentiment des avis clients
Voir aussi
- Étude de performance — Résultats de validation et comparatifs
- Confiance des prévisions — Comprendre l'incertitude
- Guide de mise en oeuvre — Meilleures pratiques d'utilisation
- Référence de l'interface de programmation — Détails de l'intégration technique