Architettura della Rete Neurale
Eaternity Forecast utilizza una sofisticata rete neurale basata su Transformer con meccanismi di attenzione per prevedere la domanda giornaliera degli articoli del menu dei ristoranti. Questo documento spiega l'architettura tecnica e la metodologia di intelligenza artificiale.
Panoramica dell'Architettura
Tipo di Modello: Architettura Transformer
Forecast impiega un'architettura Transformer, la stessa tecnologia fondamentale alla base dei moderni modelli linguistici come GPT e BERT, adattata specificamente per la previsione della domanda su serie temporali.
Perche i Transformer per la Previsione della Domanda?
I metodi di previsione tradizionali (ARIMA, smoothing esponenziale) hanno difficolta con:
- Relazioni multi-fattore complesse
- Dipendenze temporali a lungo raggio
- Pattern non stazionari
- Cicli stagionali multipli simultanei
I Transformer eccellono in:
- Riconoscimento di pattern su diverse scale temporali (giornaliero, settimanale, stagionale)
- Meccanismi di attenzione che identificano periodi storici rilevanti
- Integrazione multi-fattore (meteo, eventi, cambi menu)
- Gestione di pattern irregolari (festivita, eventi speciali)
Componenti Principali
Livello di Input
↓
Embedding Temporale
↓
Attenzione Multi-Testa (x4 livelli)
↓
Reti Feed-Forward
↓
Proiezione Output
↓
Previsione + Intervalli di Confidenza
Architettura Dettagliata
1. Livello di Input
Scopo: Trasformare i dati grezzi di vendita e i fattori esterni in rappresentazioni numeriche
Caratteristiche di Input (per articolo, per giorno):
Caratteristiche Vendite Storiche
- Vendite ultimi 7 giorni (quantita giornaliere)
- Vendite stesso giorno della settimana ultime 4 settimane
- Media vendite mese precedente
- Vendite stessa data anno precedente (se disponibili)
Caratteristiche Temporali
- Giorno della settimana (codifica one-hot: Lunedi=1, Martedi=2, ecc.)
- Settimana dell'anno (1-52)
- Mese (1-12)
- E weekend (binario: 0/1)
- E festivita (binario: 0/1)
Caratteristiche Esterne
- Temperatura (C, normalizzata)
- Precipitazioni (mm, normalizzate)
- Previsione meteo giorno successivo
- Eventi locali (flag binari o categorici)
Caratteristiche Menu
- Categoria articolo (antipasto, primo, secondo, dessert, ecc.)
- Fascia di prezzo (normalizzata)
- Giorni dal lancio articolo (per nuovi articoli)
- Disponibilita articolo (binario: 0/1)
Esempio di Feature Engineering:
Vettore input per "Pasta Carbonara" Mercoledi 20 Gennaio 2024:
Vendite Storiche:
[52, 48, 45, 51, 49, 0, 0] # Ultimi 7 giorni (0 = chiuso)
[49, 51, 48, 52] # Ultimi 4 mercoledi
47.3 # Media mese scorso
Temporali:
[0, 0, 1, 0, 0, 0, 0] # Giorno settimana (Mer = posizione 3)
3 # Settimana dell'anno
1 # Mese (Gennaio)
0 # E weekend
0 # E festivita
Esterni:
8.2 # Temperatura (C)
0.0 # Precipitazioni
7.5 # Previsione temp domani
Menu:
[0, 1, 0, 0] # Categoria (Primo Piatto)
14.50 # Prezzo (normalizzato scala 0-1)
450 # Giorni dal lancio
1 # Disponibile oggi
2. Embedding Temporale
Scopo: Codificare pattern basati sul tempo e relazioni cicliche
Codifica Posizionale:
Utilizza funzioni sinusoidali per catturare pattern periodici:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
Dove:
pos= posizione nella sequenza (numero giorno)i= dimensioned_model= dimensione embedding (256)
Perche la Codifica Sinusoidale?
- Cattura cicli multipli (giornaliero, settimanale, mensile, annuale)
- Il modello impara quali cicli sono rilevanti per ogni articolo
- Permette estrapolazione oltre il periodo di addestramento
- Gestisce spaziatura irregolare (festivita, giorni di chiusura)
Esempio:
# Codifica ciclo settimanale per giorno della settimana
weekly_encoding = [
sin(day_of_week / 7 * 2π),
cos(day_of_week / 7 * 2π)
]
# Codifica ciclo annuale
annual_encoding = [
sin(day_of_year / 365 * 2π),
cos(day_of_year / 365 * 2π)
]
3. Meccanismo di Attenzione Multi-Testa
Scopo: Identificare quali periodi storici sono piu rilevanti per la previsione corrente
Come Funziona l'Attenzione:
Il modello chiede: "Quando prevedo il pranzo di mercoledi, a quali giorni precedenti devo prestare attenzione?"
Formula dell'Attenzione:
Attention(Q, K, V) = softmax(QK^T / √d_k) V
Dove:
- Q (Query): Cosa stiamo cercando di prevedere (domanda di oggi)
- K (Keys): Giorni storici da considerare
- V (Values): Vendite effettive di quei giorni
- d_k: Dimensione dei vettori chiave
Approccio Multi-Testa:
Invece di un meccanismo di attenzione, usiamo 8 teste di attenzione parallele:
-
Testa 1: Focus su pattern stesso-giorno-della-settimana
- "I mercoledi sono simili ai mercoledi precedenti"
-
Testa 2: Focus su tendenze recenti
- "Il pattern della settimana scorsa continua"
-
Testa 3: Focus su pattern stagionali
- "Simile a questo periodo l'anno scorso"
-
Testa 4: Focus su correlazioni meteo
- "Giorni freddi come oggi hanno domanda simile"
-
Testa 5: Focus su pattern eventi
- "Giorni con eventi simili nelle vicinanze"
-
Testa 6: Focus su dinamiche menu
- "Giorni con composizione menu simile"
-
Testa 7: Focus su sensibilita prezzo
- "Giorni con strategie di prezzo simili"
-
Testa 8: Focus su tendenze a lungo raggio
- "Direzione tendenza multi-mese"
Esempio Pesi di Attenzione:
Previsione Mercoledi 20 Gennaio 2024 per Pasta Carbonara:
Testa 1 (giorno-settimana) attenzione su mercoledi precedenti:
13 Gen (ultimo Mer): 0.35 (piu recente, peso maggiore)
6 Gen: 0.28
30 Dic: 0.18
23 Dic: 0.12
Altri Mercoledi: 0.07
Testa 2 (tendenza recente) attenzione su ultimi 7 giorni:
19 Gen (ieri): 0.42
18 Gen: 0.24
17 Gen: 0.15
16 Gen: 0.10
Precedenti: 0.09
Testa 3 (stagionale) attenzione su anno scorso:
21 Gen 2023: 0.55 (stessa data anno scorso)
14-28 Gen 2023: 0.45 (date circostanti)
4. Reti Feed-Forward
Scopo: Trasformazione non lineare e combinazione caratteristiche
Architettura:
Input (256 dimensioni)
↓
Livello Lineare 1 (256 → 1024)
↓
Attivazione ReLU
↓
Dropout (0.1)
↓
Livello Lineare 2 (1024 → 256)
↓
Dropout (0.1)
↓
Connessione Residua + Normalizzazione Livello
Perche Due Livelli?
- Espansione (256→1024): Crea spazio di rappresentazione ad alta dimensionalita
- Compressione (1024→256): Estrae le caratteristiche piu rilevanti
Regolarizzazione Dropout:
Disattiva casualmente il 10% dei neuroni durante l'addestramento per prevenire l'overfitting:
- Il modello impara pattern robusti, non memorizzazione
- Migliora la generalizzazione a nuovi dati
- Critico per dataset piccoli (alcuni ristoranti, nuovi articoli)
5. Impilamento dei Livelli
Quattro Blocchi Transformer impilati in sequenza:
Blocco 1: Riconoscimento pattern iniziale
↓
Blocco 2: Estrazione pattern raffinata
↓
Blocco 3: Apprendimento caratteristiche alto livello
↓
Blocco 4: Rappresentazione finale
Ogni blocco contiene:
- Livello attenzione multi-testa
- Normalizzazione livello
- Rete feed-forward
- Connessioni residue
Perche Quattro Livelli?
Equilibrio tra:
- Complessita: Piu livelli = piu pattern riconosciuti
- Efficienza: Meno livelli = addestramento e inferenza piu veloci
- Rischio Overfitting: Troppi livelli = memorizzazione invece di apprendimento
Test empirici hanno mostrato 4 livelli ottimali per la previsione domanda ristoranti.
6. Proiezione Output
Scopo: Convertire la rappresentazione appresa in previsione quantita
Approccio Regressione Quantile:
Invece di prevedere un singolo valore, il modello produce tre quantili:
Livello Lineare (256 → 3)
↓
Output:
- 10esimo percentile (limite inferiore)
- 50esimo percentile (mediana/stima puntuale)
- 90esimo percentile (limite superiore)
Esempio Output:
{
"item": "Pasta Carbonara",
"date": "2024-01-20",
"predictions": {
"lower_bound": 45, // 10esimo percentile
"point_estimate": 52, // 50esimo percentile (mediana)
"upper_bound": 59 // 90esimo percentile
}
}
Perche la Regressione Quantile?
- Cattura naturalmente l'incertezza della previsione
- Fornisce intervalli di confidenza utilizzabili
- Piu robusta agli outlier rispetto agli approcci basati sulla varianza
- Si allinea alle esigenze decisionali (preparare per un range, non un singolo valore)
Processo di Addestramento
Preparazione dei Dati
1. Raccolta Dati
Requisiti minimi:
- 30 giorni di vendite storiche (90+ giorni consigliati)
- Record giornalieri completi (nessun gap)
- Quantita a livello di articolo
2. Preprocessing Dati
Normalizzazione:
# Normalizzazione Z-score per quantita
normalized_quantity = (quantity - mean) / std_dev
# Normalizzazione Min-max per caratteristiche esterne
normalized_temp = (temp - min_temp) / (max_temp - min_temp)
Gestione Valori Mancanti:
- Giorni di chiusura: Marcati esplicitamente (non imputati)
- Vendite mancanti: Forward-fill se meno di 3 giorni consecutivi
- Dati meteo: Interpolati da stazioni vicine
Rilevamento Outlier:
# Identificare e segnalare (ma non rimuovere) outlier
z_score = (quantity - rolling_mean) / rolling_std
if abs(z_score) > 3:
flag_as_potential_outlier()
Outlier preservati ma con peso inferiore durante l'addestramento.
3. Generazione Sequenze
Creazione sequenze di input di varie lunghezze:
Contesto breve (ultimi 7 giorni):
[giorno-7, giorno-6, giorno-5, giorno-4, giorno-3, giorno-2, giorno-1] → [previsione: giorno-0]
Contesto medio (ultime 4 settimane):
[settimana-4-stesso-giorno, settimana-3-stesso-giorno, settimana-2-stesso-giorno, settimana-1-stesso-giorno] → [previsione: oggi]
Contesto lungo (stagionale):
[mese-12-stessa-data, mese-6-stessa-data, mese-3-stessa-data] → [previsione: oggi]
Algoritmo di Addestramento
Funzione di Perdita: Quantile Loss
Per ogni quantile q (0.1, 0.5, 0.9):
L_q = (q - 1) * errore se errore < 0 (sotto-previsione)
q * errore se errore >= 0 (sovra-previsione)
Perdita Totale = L_0.1 + L_0.5 + L_0.9
Perche Questa Funzione di Perdita?
- Penalizza di piu la sotto-previsione per il quantile superiore (90esimo)
- Penalizza di piu la sovra-previsione per il quantile inferiore (10esimo)
- Bilanciata per la mediana (50esimo)
- Assicura l'ordinamento corretto dei quantili (inferiore < mediana < superiore)
Ottimizzazione
Ottimizzatore: AdamW (Adam con weight decay)
Iperparametri:
learning_rate = 0.001 # Learning rate iniziale
weight_decay = 0.01 # Regolarizzazione L2
beta_1 = 0.9 # Momentum
beta_2 = 0.999 # Learning rate adattivo
epsilon = 1e-8 # Stabilita numerica
Programmazione Learning Rate: Cosine annealing con warmup
# Fase warmup (primo 10% dell'addestramento)
lr = initial_lr * (step / warmup_steps)
# Fase cosine annealing
lr = min_lr + 0.5 * (max_lr - min_lr) * (1 + cos(π * step / total_steps))
Vantaggi:
- Il warmup graduale previene divergenza precoce
- Il decay coseno permette fine-tuning verso la fine
- Cicli multipli permettono di sfuggire ai minimi locali
Iterazioni di Addestramento
Epoche: 100-200 a seconda della dimensione dati
Batch Size: 32 sequenze
Split Validazione: 20% dei dati tenuti fuori
Early Stopping:
if validation_loss_not_improved_for(patience=15_epochs):
stop_training()
restore_best_model()
Tecniche di Regolarizzazione
1. Dropout
- Dropout attenzione: 0.1
- Dropout feed-forward: 0.1
- Dropout embedding: 0.05
2. Weight Decay
- Penalita L2 sui pesi: 0.01
- Previene che i pesi crescano troppo
3. Label Smoothing
- Sfuma leggermente i valori target
- Migliora la calibrazione degli intervalli di confidenza
4. Data Augmentation
- Jittering casuale dei valori storici (±5%)
- Simula l'incertezza di misurazione
- Migliora la robustezza
Validazione e Test
Split Training/Validazione/Test
Dati Storici (180 giorni totali):
- Training: Giorni 1-126 (70%)
- Validazione: Giorni 127-162 (20%)
- Test: Giorni 163-180 (10%)
Validazione Walk-Forward:
Invece di split casuale, usa split temporale:
- Addestra solo su dati passati
- Valida su dati futuri
- Previene data leakage (usare il futuro per prevedere il passato)
Metriche di Prestazione
Errore Percentuale Assoluto Medio (MAPE):
MAPE = (1/n) * Σ |effettivo - previsto| / effettivo * 100%
Punteggio Calibrazione:
Atteso: 80% degli effettivi entro l'intervallo di confidenza
Effettivo: Conta quanti effettivi cadono entro [inferiore, superiore]
Calibrazione = Copertura Effettiva / Copertura Attesa
Quantile Loss:
QL = Σ tutti i quantili (quantile loss come definita sopra)
Processo di Inferenza
Generazione Previsioni Giornaliere
Tempistica: Eseguito automaticamente alle 3:00 ora locale
Processo:
-
Raccolta Dati (3:00-3:05)
- Recupera dati vendite finali di ieri
- Recupera previsioni meteo per i prossimi 7 giorni
- Controlla calendario eventi per date imminenti
- Carica configurazione menu attuale
-
Feature Engineering (3:05-3:10)
- Calcola medie mobili e tendenze
- Codifica caratteristiche temporali
- Normalizza variabili esterne
- Crea sequenze di input
-
Inferenza Modello (3:10-3:15)
- Forward pass attraverso la rete neurale
- Genera previsioni per i prossimi 7 giorni
- Calcola intervalli di confidenza
- Calcola metriche di precisione
-
Post-Processing (3:15-3:20)
- Arrotonda previsioni a interi
- Applica regole business (minimo=0, massimo=capacita)
- Segnala previsioni insolite per revisione
- Genera report di precisione
-
Consegna (3:20-3:25)
- Push agli endpoint API
- Aggiorna interfaccia pannello di controllo
- Invia avvisi email (se configurati)
- Registra previsioni per tracciamento
Latenza: meno di 5 minuti per ristorante tipico (100 articoli menu)
Apprendimento Continuo
Come il Modello Migliora nel Tempo:
Riaddestramento Settimanale
Ogni lunedi alle 4:00:
- Incorpora le vendite effettive della settimana precedente
- Riaddestra il modello con dati aggiornati
- Valuta i miglioramenti di prestazione
- Distribuisce il modello aggiornato se la precisione migliora
Integrazione Feedback
Gli scostamenti segnalati dagli utenti vengono reimmessi nell'addestramento:
- Eventi speciali segnalati manualmente
- Circostanze insolite documentate
- Motivi delle modifiche analizzati
- Feature engineering migliorato
Rilevamento Concept Drift
Monitora i cambiamenti nei pattern di domanda:
if recent_accuracy < historical_accuracy - threshold:
trigger_model_refresh()
investigate_potential_concept_drift()
Cause comuni:
- Cambi menu
- Nuova concorrenza
- Transizioni stagionali
- Cambiamenti operativi
Funzionalita Avanzate
Correlazione Multi-Articolo
Attenzione Cross-Articolo:
Il modello impara le relazioni tra articoli:
- Effetti di sostituzione: "Se il salmone e popolare, la domanda di insalata diminuisce"
- Effetti complementari: "Le vendite dessert correlano con il volume dei secondi"
- Menu engineering: "Gli speciali cannibalizzano gli articoli regolari"
Implementazione:
# Attenzione non solo alla storia dell'articolo, ma agli articoli correlati
attention_context = [
item_own_history,
substitute_items_history,
complement_items_history,
category_average_history
]
Previsioni Ensemble
Varianti Multiple del Modello:
Addestramento di diversi modelli con architetture differenti:
- Modello A: Transformer (primario)
- Modello B: LSTM (baseline ricorrente)
- Modello C: Gradient boosting (basato su alberi)
Combinazione Pesata:
final_prediction = (
0.70 * transformer_prediction +
0.20 * lstm_prediction +
0.10 * gbm_prediction
)
Pesi determinati dalla precisione storica.
Quantificazione dell'Incertezza
Fonti di Incertezza:
-
Aleatoria (casualita irriducibile)
- Comportamento ospiti intrinsecamente imprevedibile
- Eventi casuali (fluttuazioni meteo)
-
Epistemica (incertezza del modello)
- Dati di addestramento insufficienti
- Limitazioni di capacita del modello
- Nuovi scenari non nel set di addestramento
Punteggio di Confidenza:
confidence_score = f(
data_quality, # Quanto sono puliti i dati storici?
training_data_volume, # Quanti dati disponibili?
similarity_to_training, # Quanto e simile il giorno di previsione ai giorni di addestramento?
model_agreement # I modelli ensemble sono d'accordo?
)
Confidenza piu alta → intervalli piu stretti Confidenza piu bassa → intervalli piu ampi
Transfer Learning
Apprendimento Cross-Location:
Per catene di ristoranti:
- Pre-addestra su dati di tutte le location
- Fine-tune sui dati della singola location
- Trasferisci pattern (stagionali, meteo, eventi)
- Avvio piu veloce per nuove location
Vantaggi:
- Previsioni nuova location disponibili immediatamente
- Precisione iniziale piu alta
- Convergenza modello piu veloce
- Apprendimento condiviso nell'organizzazione
Prestazioni del Modello
Benchmark
Precisione vs Baseline:
| Metodo | MAPE | Note |
|---|---|---|
| Eaternity Forecast | 12.8% | Architettura Transformer |
| Previsore umano esperto | 17.1% | 25% meno preciso |
| Stessa settimana precedente | 22.4% | Baseline naive |
| Media 4 settimane | 19.7% | Baseline statistico semplice |
| ARIMA | 16.2% | Serie temporali tradizionale |
| LSTM | 14.1% | Rete neurale ricorrente |
Calibrazione Intervalli di Confidenza:
Atteso: 80% degli effettivi entro [inferiore, superiore] Raggiunto: 78.5% (ben calibrato)
Requisiti Computazionali
Addestramento:
- GPU: NVIDIA RTX 4090 o equivalente
- RAM: 32 GB minimo
- Tempo addestramento: 2-6 ore (dipende dal volume dati)
- Storage: 5-20 GB per ristorante
Inferenza:
- CPU: Sufficiente per previsioni real-time
- RAM: 8 GB
- Latenza: meno di 100ms per previsione
- Storage: meno di 1 GB per modello distribuito
Fondamento Scientifico
Riferimenti Accademici
Forecast si basa su ricerca peer-reviewed:
-
Architettura Transformer
- Vaswani et al. (2017) "Attention Is All You Need"
- Paper originale transformer per NLP
-
Previsione Serie Temporali
- Zhou et al. (2021) "Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting"
- Transformer temporali per previsione
-
Previsione Domanda
- Taylor & Letham (2018) "Forecasting at Scale" (Facebook Prophet)
- Sistemi di previsione su scala industriale
-
Regressione Quantile
- Koenker & Bassett (1978) "Regression Quantiles"
- Teoria fondamentale regressione quantile
-
Operazioni Ristorazione
- Miller et al. (2015) "Forecasting Restaurant Demand"
- Sfide di previsione specifiche del dominio
Miglioramenti Futuri
Roadmap
Q2 2024: Visualizzazione attenzione
- Mostrare su quali giorni storici il modello si focalizza
- Spiegare le previsioni agli utenti
Q3 2024: Previsione a livello ricetta
- Prevedere i requisiti ingredienti direttamente
- Integrazione con sistemi inventario
Q4 2024: Inferenza causale
- Capire l'impatto dei cambi menu prima dell'implementazione
- Simulare effetti promozionali
2025: Apprendimento multi-modale
- Incorporare sentiment social media
- Analisi visiva menu
- Sentiment recensioni ospiti
Vedi Anche
- Studio Prestazioni - Risultati validazione e benchmark
- Affidabilita delle Previsioni - Comprendere l'incertezza
- Guida all'Implementazione - Migliori pratiche per l'uso
- Riferimento API - Dettagli tecnici integrazione