12.4 Le reti neurali

Le reti neurali artificiali sono metodi di previsione basati su semplici modelli matematici del cervello. Permettono relazioni non lineari complesse tra la variabile risposta e i suoi predittori.

L’architettura di una rete neurale

Una rete neurale può essere pensata come una rete di “neuroni” organizzati in strati. I predittori (o input) formano lo strato inferiore, e le previsioni (o output) formano lo strato superiore. Ci possono essere anche strati intermedi che contengono “neuroni nascosti”.

Una semplice rete neurale equivalente ad una regressione lineare.

Figura 12.15: Una semplice rete neurale equivalente ad una regressione lineare.

Le reti più semplici non contengono strati nascosti e sono equivalenti alle regressioni lineari. La figura 12.15 mostra la versione secondo una rete neurale di una regressione lineare con quattro predittori. I coefficienti collegati a questi predittori sono chiamati “pesi”. Le previsioni sono ottenute da una combinazione lineare degli input. I pesi sono selezionati nel quadro della rete neurale usando un “algoritmo di apprendimento” che minimizza una “funzione di costo” come il MSE. Naturalmente, in questo semplice esempio, possiamo usare la regressione lineare che è un metodo molto più efficiente per addestrare il modello.

Una volta che aggiungiamo uno strato intermedio con neuroni nascosti, la rete neurale diventa non lineare. Un semplice esempio è mostrato nella figura 12.16.

Una rete neurale con quattro input ed uno strato nascosto con tre neuroni.

Figura 12.16: Una rete neurale con quattro input ed uno strato nascosto con tre neuroni.

Questo è noto come una rete multistrato feed-forward, in cui ogni strato di nodi riceve input dagli strati precedenti. Gli output dei nodi di uno strato sono input per lo strato successivo. Gli input di ogni nodo sono combinati usando una combinazione lineare pesata. Il risultato è poi modificato da una funzione non lineare prima di essere emesso. Per esempio, gli input di ogni neurone nascosto nella figura 12.16 sono combinati linearmente per dare \[ z_j = b_j + \sum_{i=1}^4 w_{i,j} x_i. \]

Nello strato nascosto, questo viene poi modificato utilizzando una funzione non lineare come una sigmoide, \[ s(z) = \frac{1}{1+e^{-z}}, \]

per dare l’input per lo strato successivo. Questo tende a ridurre l’effetto di valori di input estremi, rendendo così la rete in qualche modo robusta agli outlier.

I parametri \(b_1,b_2,b_3\) e \(w_{1,1},\dots,w_{4,3}\) sono “appresi” (o stimati) dai dati. I valori dei pesi sono spesso limitati per evitare che diventino troppo grandi. Il parametro che limita i pesi è noto come “parametro di decadimento”, ed è spesso impostato su 0.1.

I pesi assumono valori casuali all’inizio, e questi sono poi aggiornati utilizzando i dati osservati. Di conseguenza, c’è un elemento di casualità nelle previsioni prodotte da una rete neurale. Pertanto, la rete viene solitamente addestrata più volte utilizzando diversi punti di partenza casuali, e i risultati vengono mediati.

Il numero di strati nascosti e il numero di nodi in ogni strato nascosto deve essere specificato in anticipo. Considereremo come questi possono essere scelti usando la convalida incrociata più avanti in questo capitolo.

Autoregressione con rete neurale

Con i dati delle serie temporali, i valori ritardati delle serie temporali possono essere usati come input per una rete neurale, proprio come abbiamo usato i valori ritardati in un modello di autoregressione lineare (capitolo 9). Chiamiamo questo modello di autoregressione a rete neurale o NNAR.

In questo libro, consideriamo solo reti feed-forward con uno strato nascosto, e usiamo la notazione NNAR(\(p,k\)) per indicare che ci sono \(p\) ingressi ritardati e \(k\) nodi nello strato nascosto. Per esempio, un modello NNAR(9,5) è una rete neurale con le ultime nove osservazioni \((y_{t-1},y_{t-2},\dots,y_{t-9}\)) usate come input per prevedere l’output \(y_t\), e con cinque neuroni nello strato nascosto. Un modello NNAR(\(p,0\)) è equivalente a un modello ARIMA(\(p,0,0\)), ma senza le restrizioni sui parametri necessarie a garantire la stazionarietà.

Con i dati stagionali, è utile aggiungere anche gli ultimi valori osservati della stessa stagione come input. Per esempio, un modello NNAR(3,1,2)\(_{12}\) ha ingressi \(y_{t-1}\), \(y_{t-2}\), \(y_{t-3}\) e \(y_{t-12}\), e due neuroni nel livello nascosto. Più in generale, un modello NNAR(\(p,P,k\))\(_m\) ha input \((y_{t-1},y_{t-2},\dots,y_{t-p},y_{t-m},y_{t-2m},\dots,y_{t-Pm})\) e \(k\) neuroni nello strato nascosto. Un modello NNAR(\(p,P,0\))\(_m\) è equivalente ad un modello ARIMA(\(p,0,0\))(\(P\),0,0)\(_m\) ma senza le restrizioni sui parametri che garantiscono la stazionarietà.

La funzione NNETAR() adatta un modello NNAR(\(p,P,k\))\(_m\). Se i valori di \(p\) e \(P\) non sono specificati, vengono selezionati automaticamente. Per le serie temporali non stagionali, il valore predefinito è il numero ottimale di ritardi (secondo l’AIC) per un modello AR(\(p\)) lineare. Per le serie temporali stagionali, i valori predefiniti sono \(P=1\) e \(p\) viene scelto dal modello lineare ottimale adattato ai dati destagionalizzati. Se \(k\) non è specificato, è impostato su \(k=(p+P+1)/2\) (arrotondato al numero intero più vicino).

Quando si tratta di previsioni, la rete viene applicata iterativamente. Per la previsione un passo avanti, usiamo semplicemente gli input storici disponibili. Per la previsione due passi avanti, usiamo la previsione di un passo avanti come input, insieme ai dati storici. Questo processo procede fino a quando abbiamo calcolato tutte le previsioni richieste.

Esempio: Macchie solari

La superficie del sole contiene regioni magnetiche che appaiono come macchie scure. Queste influenzano la propagazione delle onde radio, e così le compagnie di telecomunicazione amano prevedere l’attività delle macchie solari per pianificare eventuali difficoltà future. Le macchie solari seguono un ciclo di lunghezza compresa tra 9 e 14 anni. Nella figura 12.17, sono mostrate le previsioni di un NNAR(9,5) per i prossimi 30 anni. Abbiamo usato la trasformazione radice quadrata per assicurare che le previsioni rimangano positive.

sunspots <- sunspot.year %>% as_tsibble()
sunspots %>%
  model(NNETAR(sqrt(value))) %>%
  forecast(h = 30) %>%
  autoplot(sunspots) +
  labs(x = "Anno", y = "Macchie solari osservate",
       title = "Macchie solari annuali")
Previsioni da una rete neurale con nove input ritardati e uno strato nascosto contenente cinque neuroni.

Figura 12.17: Previsioni da una rete neurale con nove input ritardati e uno strato nascosto contenente cinque neuroni.

Qui, le ultime 9 sono usate come predittori, e ci sono 5 nello strato nascosto. La ciclicità dei dati è stata modellata bene. Possiamo anche vedere che l’asimmetria dei cicli è stata catturata dal modello, dove la parte crescente del ciclo è più ripida della parte decrescente del ciclo. Questa è una differenza tra un modello NNAR e un modello AR lineare — mentre i modelli AR lineari possono modellare la ciclicità, i cicli modellati sono sempre simmetrici.

Intervalli di previsione

A differenza della maggior parte dei metodi considerati in questo libro, le reti neurali non si basano su un modello stocastico ben definito, e quindi non è semplice ricavare intervalli di predizione per le previsioni risultanti. Tuttavia, possiamo ancora calcolare gli intervalli di predizione usando la simulazione in cui i futuri percorsi del campione sono generati usando i residui bootstrap (come descritto nella Sezione 5.5).

La rete neurale adattata ai dati delle macchie solari può essere scritta come \[ y_t = f(\bm{y}_{t-1}) + \varepsilon_t \]

dove \(bm{y}_{t-1} = (y_{t-1},y_{t-2},\dots,y_{t-9})'\) è un vettore contenente valori ritardati della serie, e \(f\) è una rete neurale con 5 nodi nascosti in un singolo strato. La serie di errori \({varepsilon_t}\) è assunta essere omoschedastica (e possibilmente anche normalmente distribuita).

Possiamo simulare i futuri percorsi campionari di questo modello iterativamente, generando casualmente un valore per \(\varepsilon_t\), sia da una distribuzione normale, sia ricampionando dai valori storici. Quindi, se \(\varepsilon^*_{T+1}\) è un’estrazione casuale dalla distribuzione degli errori al tempo \(T+1\), allora \[ y^*_{T+1} = f(\bm{y}_{T}) + \varepsilon^*_{T+1} \] è una possibile estrazione dalla distribuzione di previsione per \(y_{T+1}\). Impostando \(\bm{y}_{T+1}^* = (y^*_{T+1}, y_{T}, \dots, y_{T-7})'\), possiamo quindi ripetere la procedura per ottenere \[ y^*_{T+2} = f(\bm{y}^*_{T+1}) + \varepsilon^*_{T+2}. \]

In questo modo, possiamo simulare iterativamente un futuro percorso campionario. Simulando ripetutamente percorsi campionari, costruiamo la conoscenza della distribuzione di tutti i valori futuri sulla base della rete neurale stimata.

Ecco una simulazione di 9 possibili futuri percorsi campionari per i dati delle macchie solari. Ogni percorso campionario copre i prossimi 30 anni dopo i dati osservati.

fit %>%
  generate(times = 9, h = 30) %>%
  autoplot(.sim) +
  autolayer(sunspots, value) +
  theme(legend.position = "none")
Future sample paths for the  annual sunspot data.

Figura 12.18: Future sample paths for the annual sunspot data.

Se facciamo questo molte volte, possiamo ottenere un buon quadro delle distribuzioni di previsione. Questo è il modo in cui la funzione forecast() produce gli intervalli di previsione per i modelli NNAR. L’argomento times in forecast() controlla quante simulazioni vengono fatte (default 1000). Di default, gli errori sono estratti da una distribuzione normale. L’argomento bootstrap permette agli errori di essere “bootstrappati” (cioè, estratti a caso dagli errori storici).