Architecture du reseau de neurones
Eaternity Forecast utilise un reseau de neurones sophistique base sur les transformeurs avec des mecanismes d'attention pour predire la demande quotidienne des articles de menu des restaurants. Ce document explique l'architecture technique et la methodologie d'intelligence artificielle.
Apercu de l'architecture
Type de modele : Architecture Transformeur
Forecast emploie une architecture transformeur, la meme technologie fondamentale qui sous-tend les modeles de langage modernes comme GPT et BERT, adaptee specifiquement pour la prevision de demande de series temporelles.
Pourquoi les transformeurs pour la prevision de demande ?
Les methodes de prevision traditionnelles (ARIMA, lissage exponentiel) ont du mal avec :
- Les relations complexes multi-facteurs
- Les dependances temporelles a long terme
- Les tendances non stationnaires
- Les cycles saisonniers multiples simultanes
Les transformeurs excellent dans :
- La reconnaissance de tendances a differentes echelles temporelles (quotidienne, hebdomadaire, saisonniere)
- Les mecanismes d'attention qui identifient les periodes historiques pertinentes
- L'integration multi-facteurs (meteo, evenements, changements de menu)
- La gestion des tendances irregulieres (jours feries, evenements speciaux)
Composants principaux
Couche d'entree
↓
Encodage temporel
↓
Attention multi-tetes (×4 couches)
↓
Reseaux a propagation avant
↓
Projection de sortie
↓
Prevision + Intervalles de confiance
Architecture detaillee
1. Couche d'entree
Objectif : Transformer les donnees de ventes brutes et les facteurs externes en representations numeriques
Caracteristiques d'entree (par article, par jour) :
Caracteristiques des ventes historiques
- Ventes des 7 derniers jours (quantites quotidiennes)
- Ventes du meme jour de la semaine des 4 semaines precedentes
- Moyenne des ventes du mois precedent
- Ventes a la meme date l'annee precedente (si disponible)
Caracteristiques temporelles
- Jour de la semaine (encodage one-hot : Lundi=1, Mardi=2, etc.)
- Semaine de l'annee (1-52)
- Mois (1-12)
- Est un week-end (binaire : 0/1)
- Est un jour ferie (binaire : 0/1)
Caracteristiques externes
- Temperature (°C, normalisee)
- Precipitations (mm, normalisees)
- Previsions meteo du lendemain
- Evenements locaux (indicateurs binaires ou categoriques)
Caracteristiques du menu
- Categorie de l'article (entree, plat, dessert, etc.)
- Niveau de prix (normalise)
- Jours depuis le lancement de l'article (pour les nouveaux articles)
- Disponibilite de l'article (binaire : 0/1)
Exemple d'ingenierie des caracteristiques :
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 basees sur le temps et les relations cycliques
Encodage positionnel :
Utilise des fonctions sinusoidales pour capturer les tendances periodiques :
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
Ou :
pos= position dans la sequence (numero du jour)i= dimensiond_model= dimension de l'encodage (256)
Pourquoi l'encodage sinusoidal ?
- Capture des cycles multiples (quotidien, hebdomadaire, mensuel, annuel)
- Le modele apprend quels cycles sont pertinents pour chaque article
- Permet l'extrapolation au-dela de la periode d'entrainement
- Gere l'espacement irregulier (jours feries, 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-tetes
Objectif : Identifier quelles periodes historiques sont les plus pertinentes pour la prevision actuelle
Fonctionnement de l'attention :
Le modele demande : « Pour predire le dejeuner du mercredi, a quels jours precedents dois-je preter attention ? »
Formule d'attention :
Attention(Q, K, V) = softmax(QK^T / √d_k) V
Ou :
- Q (Requete) : Ce que nous essayons de predire (demande du jour)
- K (Cles) : Jours historiques a considerer
- V (Valeurs) : Ventes reelles de ces jours
- d_k : Dimension des vecteurs de cles
Approche multi-tetes :
Au lieu d'un seul mecanisme d'attention, nous utilisons 8 tetes d'attention paralleles :
-
Tete 1 : Se concentre sur les tendances du meme jour de la semaine
- « Les mercredis sont similaires aux mercredis precedents »
-
Tete 2 : Se concentre sur les tendances recentes
- « La tendance de la semaine derniere continue »
-
Tete 3 : Se concentre sur les tendances saisonnieres
- « Similaire a cette periode l'annee derniere »
-
Tete 4 : Se concentre sur les correlations meteorologiques
- « Les jours froids comme aujourd'hui ont une demande similaire »
-
Tete 5 : Se concentre sur les tendances d'evenements
- « Jours avec des evenements similaires a proximite »
-
Tete 6 : Se concentre sur la dynamique du menu
- « Jours avec une composition de menu similaire »
-
Tete 7 : Se concentre sur la sensibilite aux prix
- « Jours avec des strategies de prix similaires »
-
Tete 8 : Se concentre sur les tendances a 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. Reseaux a propagation avant
Objectif : Transformation non lineaire et combinaison des caracteristiques
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) : Cree un espace de representation de haute dimension
- Compression (1024→256) : Extrait les caracteristiques les plus pertinentes
Regularisation par abandon :
Desactive aleatoirement 10 % des neurones pendant l'entrainement pour prevenir le surapprentissage :
- Le modele apprend des tendances robustes, pas une memorisation
- Ameliore la generalisation aux nouvelles donnees
- Essentiel pour les petits ensembles de donnees (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-tetes
- Normalisation de couche
- Reseau a propagation avant
- Connexions residuelles
Pourquoi quatre couches ?
Equilibre entre :
- Complexite : Plus de couches = plus de tendances reconnues
- Efficacite : Moins de couches = entrainement et inference plus rapides
- Risque de surapprentissage : Trop de couches = memorisation au lieu d'apprentissage
Les tests empiriques ont montre que 4 couches sont optimales pour la prevision de demande en restauration.
6. Projection de sortie
Objectif : Convertir la representation apprise en prevision de quantite
Approche de regression quantile :
Au lieu de predire une seule valeur, le modele 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 prevision
- Fournit des intervalles de confiance exploitables
- Plus robuste aux valeurs aberrantes que les approches basees sur la variance
- S'aligne sur les besoins decisionnels (preparer pour une fourchette, pas une seule valeur)
Processus d'entrainement
Preparation des donnees
1. Collecte des donnees
Exigences minimales :
- 30 jours de donnees historiques de ventes (90 jours ou plus recommandes)
- Enregistrements quotidiens complets (pas de lacunes)
- Quantites par article
2. Pretraitement des donnees
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
- Donnees meteo : Interpolation a partir des stations voisines
Detection 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 ponderees plus faiblement pendant l'entrainement.
3. Generation de sequences
Creer des sequences d'entree 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 dernieres 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-prevision pour le quantile superieur (90e)
- Penalise davantage la sur-prevision pour le quantile inferieur (10e)
- Equilibree pour la mediane (50e)
- Assure l'ordre correct des quantiles (inferieur < mediane < superieur)
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 pres de la fin
- Les cycles multiples permettent d'echapper aux minima locaux
Iterations d'entrainement
Epoques : 100-200 selon la taille des donnees
Taille de lot : 32 sequences
Partition de validation : 20 % des donnees mises de cote
Arret anticipe :
if validation_loss_not_improved_for(patience=15_epochs):
stop_training()
restore_best_model()
Techniques de regularisation
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 etiquettes
- Floute legerement les valeurs cibles
- Ameliore le calibrage des intervalles de confiance
4. Augmentation des donnees
- Variation aleatoire des valeurs historiques (±5 %)
- Simule l'incertitude de mesure
- Ameliore 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 :
- Entrainer uniquement sur les donnees passees
- Valider sur les donnees futures
- Previent les fuites de donnees (utiliser le futur pour predire le passe)
Metriques 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'inference
Generation quotidienne des previsions
Calendrier : S'execute automatiquement a 3h00 heure locale
Processus :
-
Collecte des donnees (3h00-3h05)
- Recuperer les donnees de ventes finales de la veille
- Recuperer les previsions meteo pour les 7 prochains jours
- Verifier le calendrier des evenements pour les dates a venir
- Charger la configuration actuelle du menu
-
Ingenierie des caracteristiques (3h05-3h10)
- Calculer les moyennes mobiles et les tendances
- Encoder les caracteristiques temporelles
- Normaliser les variables externes
- Creer les sequences d'entree
-
Inference du modele (3h10-3h15)
- Passage avant dans le reseau de neurones
- Generer les previsions pour les 7 prochains jours
- Calculer les intervalles de confiance
- Calculer les metriques de precision
-
Post-traitement (3h15-3h20)
- Arrondir les previsions aux entiers
- Appliquer les regles metier (minimum=0, maximum=capacite)
- Marquer les previsions inhabituelles pour revision
- Generer les rapports de precision
-
Livraison (3h20-3h25)
- Publier vers les points d'acces de l'interface de programmation
- Mettre a jour l'interface du tableau de bord
- Envoyer des alertes par e-mail (si configure)
- Journaliser les previsions pour le suivi
Latence : moins de 5 minutes pour un restaurant typique (100 articles de menu)
Apprentissage continu
Comment le modele s'ameliore au fil du temps :
Re-entrainement hebdomadaire
Chaque lundi a 4h00 :
- Incorporer les ventes reelles de la semaine precedente
- Re-entrainer le modele avec les donnees mises a jour
- Evaluer les ameliorations de performance
- Deployer le modele mis a jour si la precision s'ameliore
Integration des retours
Ecarts signales par les utilisateurs reinjectes dans l'entrainement :
- Evenements speciaux marques manuellement
- Circonstances inhabituelles documentees
- Raisons des modifications analysees
- Ingenierie des caracteristiques amelioree
Detection 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 saisonnieres
- Changements operationnels
Fonctionnalites avancees
Correlation multi-articles
Attention inter-articles :
Le modele apprend les relations entre les articles :
- Effets de substitution : « Si le saumon est populaire, la demande de salade diminue »
- Effets complementaires : « Les ventes de desserts correlent avec le volume de plats principaux »
- Ingenierie du menu : « Les specials cannibalisent les articles reguliers »
Implementation :
# 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
]
Previsions d'ensemble
Variantes de modeles multiples :
Entrainer plusieurs modeles avec differentes architectures :
- Modele A : Transformeur (principal)
- Modele B : LSTM (base recurrente)
- Modele C : Gradient boosting (base sur les arbres)
Combinaison ponderee :
final_prediction = (
0.70 * transformer_prediction +
0.20 * lstm_prediction +
0.10 * gbm_prediction
)
Poids determines par la precision historique.
Quantification de l'incertitude
Sources d'incertitude :
-
Aleatoire (caractere aleatoire irreductible)
- Comportement des clients intrinsequement imprevisible
- Evenements aleatoires (fluctuations meteorologiques)
-
Epistemique (incertitude du modele)
- Donnees d'entrainement insuffisantes
- Limitations de capacite du modele
- Nouveaux scenarios 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 elevee → intervalles plus etroits Confiance plus faible → intervalles plus larges
Apprentissage par transfert
Apprentissage inter-sites :
Pour les chaines de restaurants :
- Pre-entrainement sur les donnees de tous les sites
- Affinage sur les donnees de chaque site
- Transfert des tendances (saisonnieres, meteo, evenements)
- Demarrage plus rapide pour les nouveaux sites
Avantages :
- Previsions disponibles immediatement pour un nouveau site
- Precision initiale plus elevee
- Convergence du modele plus rapide
- Apprentissage partage dans toute l'organisation
Performance du modele
Comparatifs
Precision vs references :
| Methode | MAPE | Notes |
|---|---|---|
| Eaternity Forecast | 12,8 % | Architecture transformeur |
| Previsionniste expert humain | 17,1 % | 25 % moins precis |
| Meme jour semaine precedente | 22,4 % | Reference naive |
| Moyenne sur 4 semaines | 19,7 % | Reference statistique simple |
| ARIMA | 16,2 % | Series temporelles traditionnelles |
| LSTM | 14,1 % | Reseau de neurones recurrent |
Calibrage des intervalles de confiance :
Attendu : 80 % des reels dans [inferieur, superieur] Atteint : 78,5 % (bien calibre)
Exigences de calcul
Entrainement :
- GPU : NVIDIA RTX 4090 ou equivalent
- RAM : 32 Go minimum
- Temps d'entrainement : 2-6 heures (selon le volume de donnees)
- Stockage : 5-20 Go par restaurant
Inference :
- CPU : Suffisant pour les previsions en temps reel
- RAM : 8 Go
- Latence : moins de 100 ms par prevision
- Stockage : moins de 1 Go pour le modele deploye
Fondements scientifiques
References academiques
Forecast s'appuie sur des recherches evaluees 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
-
Prevision de series temporelles
- Zhou et al. (2021) « Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting »
- Transformeurs temporels pour la prevision
-
Prevision de demande
- Taylor et Letham (2018) « Forecasting at Scale » (Facebook Prophet)
- Systemes de prevision a l'echelle industrielle
-
Regression quantile
- Koenker et Bassett (1978) « Regression Quantiles »
- Theorie fondamentale de la regression quantile
-
Operations de restauration
- Miller et al. (2015) « Forecasting Restaurant Demand »
- Defis de prevision specifiques au domaine
Ameliorations futures
Feuille de route
T2 2024 : Visualisation de l'attention
- Montrer sur quels jours historiques le modele se concentre
- Expliquer les previsions aux utilisateurs
T3 2024 : Prevision au niveau des recettes
- Predire directement les besoins en ingredients
- Integration avec les systemes d'inventaire
T4 2024 : Inference causale
- Comprendre l'incidence des changements de menu avant implementation
- Simuler les effets promotionnels
2025 : Apprentissage multimodal
- Incorporer le sentiment des reseaux sociaux
- Analyse visuelle du menu
- Sentiment des avis clients
Voir aussi
- Etude de performance — Resultats de validation et comparatifs
- Confiance des previsions — Comprendre l'incertitude
- Guide de mise en oeuvre — Meilleures pratiques d'utilisation
- Reference de l'interface de programmation — Details de l'integration technique