Sono una delle due tipologie in cui si dividono le Reti Neurali, insieme a quella [[Feed-Forward]], dalla quale si differenziano per avere la capacità di "memoria": l'output a una determinata esecuzione non dipende solamente dall'input corrente, ma anche dagli output passati. Questo le rende particolarmente adatte all'elaborazione di '''sequenze di lunghezza arbitraria'''.
Le '''Reti Neurali Ricorrenti''' ('''RNN''', dall'inglese ''Recurrent Neural Networks'') sono un tipo di architettura di rete neurale particolarmente efficace nel trattare dati sequenziali. A differenza delle reti neurali tradizionali e delle reti neurali convoluzionali, le RNN sono capaci di gestire sequenze di vettori in input, output, o entrambi, rendendole strumenti potenti per applicazioni che richiedono la modellazione di dati temporali o sequenziali.
=== Funzionamento ===
Al centro del funzionamento della RNN vi è un '''vettore monodimensionale''' chiamato "hidden layer", di lunghezza arbitraria a seconda della dimensione del contenuto che si vuole la rete apprenda: questo parametro è chiamato normalmente ''dimensione del layer nascosto, o hidden_layer_size.'' Un vettore troppo piccolo per l'obiettivo dell'addestramento non convergerà, un vettore troppo grande provocherà overfitting.
== Caratteristiche delle RNN ==
In un determinato step di esecuzione, chiamato normalmente ''t'', come mostrato in Figura 1:
Le RNN si distinguono per la loro capacità di operare su sequenze di lunghezza variabile, senza vincoli predeterminati sulla dimensione degli input o degli output. Questa flessibilità le rende ideali per una varietà di compiti, come la classificazione di sequenze temporali, la generazione di testo, la traduzione automatica e altre applicazioni nel campo del trattamento automatico del linguaggio naturale e della visione artificiale.
Una caratteristica fondamentale delle RNN è la loro ''memoria interna'', che permette di conservare informazioni degli stati precedenti per influenzare le elaborazioni future. Questa memoria è realizzata attraverso connessioni ricorrenti all'interno della rete, che permettono di mantenere uno stato interno tra l'elaborazione di elementi successivi della sequenza.
* all'input della rete viene passato un vettore di input ''X_t'' di lunghezza predefinita (''input_size_'': questa può essere ad esempio una rappresentazione one-hot, embedding, le posizioni sui tre assi cartesiani, i pixel di un'immagine oppure una concatenazione di features provenienti da sensori
* ''X_t'' viene moltiplicato per la matrixe ''Wih'' e vengono aggiunti i bias ''Bih''
* Il contenuto precendente (''H_1)'' del vettore nascosto viene moltiplicato per la matrice ''Whh'', e vengono aggiunti i bias ''Bhh''
* I vettori precedenti vengono sommati, e questa somma è il nuovo valore del vettore del layer nascosto, '''H_t'''
* Questo valore viene poi passato da un Layer di pesi e bias per ottenere i [[Logit (Reti Neurali)|logit]] in output
[[File:Calcolo Matriciale RNN.png|nessuno|miniatura|600x600px|Figura 1: Calcolo matriciale all'interno di una RNN]]
[[File:Rete Neurale Ricorrente (RNN).png|nessuno|miniatura|600x600px|Rete Neurale Ricorrente (RNN) - RNN Standard e RNN Srotolata]]
Le RNN sono un'evoluzione delle reti [[Feed Forward]]. Nel suo funzionamento più basilare infatti, una RNN elabora ogni elemento della sequenza uno alla volta, aggiornando il proprio stato interno in funzione dell'input corrente e dello stato precedente. Questo processo consente alla rete di tenere conto delle dipendenze temporali tra gli elementi della sequenza, offrendo così la capacità di modellare contesti e relazioni a lungo termine tra i dati.
[[Come creare una RNN da zero con PyTorch]]
La funzione di aggiornamento dello stato interno e l'output della rete sono tipicamente realizzati mediante strati densamente connessi e funzioni di attivazione non lineari, come la tangente iperbolica o la funzione ReLU. I parametri della rete (pesi sinaptici) vengono adattati durante la fase di addestramento utilizzando tecniche di ottimizzazione basate sul gradiente, come la discesa stocastica del gradiente, per minimizzare una funzione di perdita che misura la discrepanza tra gli output della rete e gli output desiderati.
[https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html Tutorial ufficiale di Pytorch]
= Okay ma come si fa? =
== Link ==
[https://onlinelibrary.wiley.com/doi/epdf/10.1207/s15516709cog1402_1 Finding Structure in Time (Elman, 1990)]
Per costruire una rete neurale si possono adottare vari approcci e framework, ciascuno con le proprie caratteristiche, vantaggi e comunità di utenti.
Di seguito, una panoramica dei principali strumenti e tecnologie disponibili per lavorare con le RNN.
[https://arxiv.org/pdf/1308.0850.pdf Generating Sequences With Recurrent Neural Networks (2014)]
== Framework e Librerie ==
[https://www.youtube.com/watch?v=AsNTP8Kwu80 Miglior Tutorial su Youtube]
L'evoluzione nel campo del deep learning ha portato allo sviluppo di numerosi framework e librerie che semplificano la costruzione, l'addestramento e il deployment delle RNN. Ecco alcuni dei più popolari:
=== TensorFlow ===
[https://gist.github.com/karpathy/d4dee566867f8291f086 Karpathy: Minimal character-level Vanilla RNN model in C]
[TensorFlow](https://www.tensorflow.org/) è un framework open-source per il machine learning sviluppato da Google. Offre un'ampia gamma di strumenti e librerie per la costruzione di modelli di deep learning, inclusi modelli RNN per applicazioni come il riconoscimento vocale, la traduzione automatica e la generazione di testo. TensorFlow supporta sia l'esecuzione su CPU che su GPU e offre una flessibilità elevata per la ricerca e lo sviluppo di nuovi algoritmi.
=== PyTorch ===
[[Category:architettura]]
[PyTorch](https://pytorch.org/) è un framework di machine learning open-source sviluppato da Facebook. È particolarmente apprezzato nella comunità di ricerca per la sua flessibilità e il suo design orientato agli oggetti, che facilita la costruzione e l'esperimentazione di modelli complessi. PyTorch offre supporto completo per le RNN, comprese le variazioni come LSTM e GRU, e permette un'integrazione profonda con librerie Python per la scienza dei dati.
=== Keras ===
{{#seo:
[Keras](https://keras.io/) è un'interfaccia di alto livello per la costruzione di reti neurali, progettata per essere semplice da utilizzare pur mantenendo la flessibilità necessaria per la ricerca. Inizialmente sviluppata come interfaccia indipendente, Keras è ora integrata in TensorFlow come `tf.keras`. Offre moduli, layer e utility pre-costruiti per la creazione rapida di RNN, semplificando l'implementazione di modelli complessi.
Sebbene lo sviluppo di [Theano](http://deeplearning.net/software/theano/) sia stato ufficialmente interrotto nel 2017, questa libreria è stata pionieristica nel campo del deep learning. Ha offerto un potente ambiente di calcolo simbolico per la definizione, ottimizzazione e valutazione di espressioni matematiche complesse, inclusi i modelli RNN. Theano ha gettato le basi per molti dei framework moderni.
|description=Le Reti Neurali Ricorrenti (RNN) sono un tipo di rete neurale artificiale particolarmente adatta all'elaborazione di sequenze di dati. Questo articolo spiega il funzionamento delle RNN, la loro struttura e le loro applicazioni, come l'elaborazione del linguaggio naturale e le serie temporali.
|image="Calcolo Matriciale RNN.png"
== Considerazioni sull'Utilizzo ==
}}
Quando si sceglie un framework per lavorare con le RNN, è importante considerare diversi fattori:
- **Community e Supporto**: Una comunità attiva e una buona documentazione possono facilitare l'apprendimento e la risoluzione di problemi.
- **Flessibilità vs. Semplicità**: Mentre alcuni framework come PyTorch offrono maggiore flessibilità e controllo, altri come Keras puntano a semplificare la costruzione di modelli a scapito di una minore personalizzazione.
- **Performance**: Le differenze nelle prestazioni tra framework possono variare in base al tipo di modello RNN costruito e all'hardware utilizzato.
- **Ecosistema**: L'integrazione con altre librerie e strumenti di sviluppo può essere un fattore decisivo, specialmente per progetti complessi che richiedono più della semplice costruzione di modelli.
== Sfide nell'addestramento delle RNN ==
Nonostante la loro potenza, le RNN possono essere difficili da addestrare efficacemente a causa di problemi come la ''dissipazione'' o l''esplosione'' dei gradienti, che si verificano quando le informazioni relative agli errori si riducono o aumentano esponenzialmente lungo le sequenze durante la retropropagazione. Per mitigare questi problemi, sono state proposte variazioni sul tema delle RNN, come le ''Long Short-Term Memory'' ([[LSTM]]) e le ''Gated Recurrent Unit'' ([[GRU]]), che introducono meccanismi specifici per regolare il flusso di informazioni e mantenere stabile l'apprendimento lungo sequenze di grande lunghezza.
== Applicazioni delle RNN ==
Le applicazioni delle RNN sono molteplici e spaziano in diversi campi dell'intelligenza artificiale. Nel campo del trattamento del linguaggio naturale, le RNN vengono utilizzate per la traduzione automatica, la generazione di testo e la comprensione del linguaggio. Nella visione artificiale, trovano impiego nella classificazione video e nella generazione di descrizioni per immagini. Altre applicazioni includono la previsione di serie temporali, la modellazione di sequenze musicali e la robotica.
Sono una delle due tipologie in cui si dividono le Reti Neurali, insieme a quella Feed-Forward, dalla quale si differenziano per avere la capacità di "memoria": l'output a una determinata esecuzione non dipende solamente dall'input corrente, ma anche dagli output passati. Questo le rende particolarmente adatte all'elaborazione di sequenze di lunghezza arbitraria.
Funzionamento
Al centro del funzionamento della RNN vi è un vettore monodimensionale chiamato "hidden layer", di lunghezza arbitraria a seconda della dimensione del contenuto che si vuole la rete apprenda: questo parametro è chiamato normalmente dimensione del layer nascosto, o hidden_layer_size. Un vettore troppo piccolo per l'obiettivo dell'addestramento non convergerà, un vettore troppo grande provocherà overfitting.
In un determinato step di esecuzione, chiamato normalmente t, come mostrato in Figura 1:
all'input della rete viene passato un vettore di input X_t di lunghezza predefinita (input_size_: questa può essere ad esempio una rappresentazione one-hot, embedding, le posizioni sui tre assi cartesiani, i pixel di un'immagine oppure una concatenazione di features provenienti da sensori
X_t viene moltiplicato per la matrixe Wih e vengono aggiunti i bias Bih
Il contenuto precendente (H_1) del vettore nascosto viene moltiplicato per la matrice Whh, e vengono aggiunti i bias Bhh
I vettori precedenti vengono sommati, e questa somma è il nuovo valore del vettore del layer nascosto, H_t
Questo valore viene poi passato da un Layer di pesi e bias per ottenere i logit in output
Figura 1: Calcolo matriciale all'interno di una RNNRete Neurale Ricorrente (RNN) - RNN Standard e RNN SrotolataRete Neurale Ricorrente - Funzionamento