Per trovare soluzione al problema comune a molte aziende della determinazione del volume acquisti per un dato prodotto in un momento futuro, uno degli approcci perseguibili si basa sull’analisi della serie temporale dei volumi storici effettivi. Spesso, infatti, è possibile riscontrare una certa periodicità (a diversi livelli) della domanda nel tempo, ad esempio in funzione dei giorni della settimana, dei mesi dell’anno, della presenza o meno di festività, della variabilità del prezzo, ecc. Per poter considerare più variabili in una rete neurale, e, al tempo stesso cercare di sfruttare le possibili correlazioni tra di esse tenendo conto della loro sequenza temporale, è possibile utilizzare una Recurrent Neural Network.
L’architettura delle Reti Neurali Ricorrenti
Le reti neurali Feed-Forward, come Multi Layer Perceptron e Convolutional Neural Network, operano su vettori di dimensione prefissata. Applicazioni diverse, in cui l’ordine delle variabili di input ha un effetto sulla determinazione del valore successivo, possono richiedere che l’input e/o l’output possano essere sequenze (anche di lunghezza variabile). Le reti neurali di tipo RNN prevedono anche collegamenti “all’indietro” o verso lo stesso livello. I modelli più comunemente diffusi, ad esempio Long Short-Term Memory, prevedono collegamenti verso lo stesso livello. Ad ogni step di una data sequenza, identificabile con un’istante temporale t), il livello in questione riceve oltre agli input relativi all’istante t=x(t) anche l’output dello step precedente, y(t-1). Questo consente alla rete neurale di basare il suo output all’istante t, y(t), anche sulla “storia passata”, ovvero su tutti gli elementi di una data sequenza temporale e sulla loro posizione reciproca, sfruttando un “effetto memoria”. Per addestrare una Recurrent Neural Network, è necessario utilizzare la retro-propagazione nel tempo (Back Propagation Through Time). L’architettura tipica di una RNN è riportata seguente figura.
Il disegno di sinistra utilizza la rappresentazione del ciclo mentre quello a destra esplode il ciclo in una riga unica nel tempo. Per i dettagli sulle rappresentazioni nascoste si può fare riferimento a innumerevoli testi in letteratura, per coerenza con la figura ci si riferisce a https://atcold.github.io/pytorch-Deep-Learning/it/week06/06-3/ da cui è stata estratta.
L’unità Long Short-Term Memory
Un’unità Long Short-Term Memory comune è composta da una cella, una porta di ingresso (input gate), una porta di uscita (output gate) e una cella di memoria “don’t forget gate”. La cella ricorda i valori su intervalli di tempo arbitrari e le tre porte regolano il flusso di informazioni in entrata e in uscita dalla cella.
In questa immagine sono illustrate le funzioni di trasformazione degli input per ogni cella ed è possibile concatenare più celle in sequenza. Per ulteriori dettagli sul funzionamento delle LSTM si rimanda a http://colah.github.io/posts/2015-08-Understanding-LSTMs/.
Un caso pratico di applicazione della Long Short-Term Memory
In uno degli ultimi progetti portati a termine in Premoneo per un cliente nel mercato della Logistica è stata utilizzata una LSTM per determinare la domanda per un dato prodotto date in input le seguenti serie: storico dei volumi di vendita, data, giorno della settimana (Lunedi=1, …. Domenica=7), mese dell’anno (da 1 a 12), prezzo giornaliero unitario del prodotto. L’architettura della network testata concatena 200 celle LSTM a un neurone di output. La periodicità scelta per ogni feature di input è di 7 giorni e il training è stato effettuato sullo storico comprendente i dati relativi a tutto il 2020. L’errore medio assoluto percentuale (MAPE) è stato utilizzato come loss function con ottimizzatore il metodo Adam (Adaptive momentum estimation). Il training è stato effettuato con 400 epoche e batch size 10. La prediction è stata ottenuta su 30 giorni e come figura di merito è stato osservato l’accordo tra predizione ed effettivo su un periodo di 30 giorni. Il risultato è riportato nella seguente figura in cui “Predicted” rappresenta l’andamento dei volumi in funzione della data in numero di giorni (traslata in 0 per il primo giorno) predetto dalla LSTM e “Actual” rappresenta la stessa variabile presa dallo storico degli effettivi per lo stesso periodo di tempo.
Il sample da cui sono stati considerati i valori effettivi riportati nell’immagine non è stato considerato nel training, ma rappresenta un sample indipendente di test.
I vantaggi delle predizioni condizionate con le Reti Neurali
Nonostante vi siano altri metodi di analisi, come ARIMA o GLM, le Neural Network Ricorsive consentono di sfruttare non solo la serie temporale storica dei prezzi, ma anche le correlazioni esistenti tra altre variabili. Inoltre, grazie alle molteplici librerie open-source esistenti (come Keras, utilizzata in questo test), implementare diversi modelli in modo versatile con minimi cambiamenti ai codici sorgenti, testando molteplici architetture, risulta pratico e veloce. Per dataset che eccedono una certa dimensionalità, l’utilizzo delle reti neurali garantisce certamente un vantaggio in termini velocità di calcolo e di accuratezza della previsione rispetto ai modelli analitici.