Passa al contenuto principale

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 = dimensione
  • d_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:

  1. Testa 1: Focus su pattern stesso-giorno-della-settimana

    • "I mercoledi sono simili ai mercoledi precedenti"
  2. Testa 2: Focus su tendenze recenti

    • "Il pattern della settimana scorsa continua"
  3. Testa 3: Focus su pattern stagionali

    • "Simile a questo periodo l'anno scorso"
  4. Testa 4: Focus su correlazioni meteo

    • "Giorni freddi come oggi hanno domanda simile"
  5. Testa 5: Focus su pattern eventi

    • "Giorni con eventi simili nelle vicinanze"
  6. Testa 6: Focus su dinamiche menu

    • "Giorni con composizione menu simile"
  7. Testa 7: Focus su sensibilita prezzo

    • "Giorni con strategie di prezzo simili"
  8. 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:

  1. 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
  2. Feature Engineering (3:05-3:10)

    • Calcola medie mobili e tendenze
    • Codifica caratteristiche temporali
    • Normalizza variabili esterne
    • Crea sequenze di input
  3. 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
  4. 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
  5. 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:

  1. Incorpora le vendite effettive della settimana precedente
  2. Riaddestra il modello con dati aggiornati
  3. Valuta i miglioramenti di prestazione
  4. 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:

  1. Aleatoria (casualita irriducibile)

    • Comportamento ospiti intrinsecamente imprevedibile
    • Eventi casuali (fluttuazioni meteo)
  2. 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:

MetodoMAPENote
Eaternity Forecast12.8%Architettura Transformer
Previsore umano esperto17.1%25% meno preciso
Stessa settimana precedente22.4%Baseline naive
Media 4 settimane19.7%Baseline statistico semplice
ARIMA16.2%Serie temporali tradizionale
LSTM14.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:

  1. Architettura Transformer

    • Vaswani et al. (2017) "Attention Is All You Need"
    • Paper originale transformer per NLP
  2. Previsione Serie Temporali

    • Zhou et al. (2021) "Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting"
    • Transformer temporali per previsione
  3. Previsione Domanda

    • Taylor & Letham (2018) "Forecasting at Scale" (Facebook Prophet)
    • Sistemi di previsione su scala industriale
  4. Regressione Quantile

    • Koenker & Bassett (1978) "Regression Quantiles"
    • Teoria fondamentale regressione quantile
  5. 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