Rete Neurale Ricorrente (RNN): differenze tra le versioni

Da Wiki AI.
Nessun oggetto della modifica
 
(52 versioni intermedie di 6 utenti non mostrate)
Riga 1: Riga 1:
= Reti Neurali Ricorrenti =
{{template architettura
|NomeInglese=Recurrent Neural Networks
|Sigla=RNN
|AnnoDiCreazione=1990
|Pubblicazione=Finding Structure in Time
|URLHomePage=https://onlinelibrary.wiley.com/doi/epdf/10.1207/s15516709cog1402_1
|Topic=sequenze, Reti neurali
}}
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]]
[[File:Rete Neurale Ricorrente - Funzionamento.png|nessuno|miniatura|600x600px|Rete Neurale Ricorrente - Funzionamento]]


== Funzionamento delle RNN ==
== Tutorial ==
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]


== Sfide nell'addestramento delle RNN ==
== Link ==
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.
[https://onlinelibrary.wiley.com/doi/epdf/10.1207/s15516709cog1402_1 Finding Structure in Time (Elman, 1990)]
 
https://karpathy.github.io/2015/05/21/rnn-effectiveness/
 
[https://arxiv.org/pdf/1308.0850.pdf Generating Sequences With Recurrent Neural Networks (2014)]
 
[https://www.youtube.com/watch?v=AsNTP8Kwu80 Miglior Tutorial su Youtube]
 
[https://gist.github.com/karpathy/d4dee566867f8291f086 Karpathy: Minimal character-level Vanilla RNN model in C]


== Applicazioni delle RNN ==
[[Category:architettura]]
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.


== Link ==
{{#seo:
https://karpathy.github.io/2015/05/21/rnn-effectiveness/
            |title=Your page title
            |title_mode=append
            |keywords=reti neurali, "deep learning", "intelligenza artificiale", "apprendimento automatico", "RNN", "reti neurali ricorrenti", "elaborazione del linguaggio naturale", "serie temporali", "modelli predittivi", "algoritmi di apprendimento"
            |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"
            }}

Versione attuale delle 13:47, 17 ago 2024

Rete Neurale Ricorrente (RNN)
Nome Inglese Recurrent Neural Networks
Sigla RNN
Anno Di Creazione 1990
Pubblicazione Finding Structure in Time
URL https://onlinelibrary.wiley.com/doi/epdf/10.1207/s15516709cog1402 1
Topic sequenze, Reti neurali

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 RNN
Rete Neurale Ricorrente (RNN) - RNN Standard e RNN Srotolata
Rete Neurale Ricorrente - Funzionamento

Tutorial

Come creare una RNN da zero con PyTorch

Tutorial ufficiale di Pytorch

Link

Finding Structure in Time (Elman, 1990)

https://karpathy.github.io/2015/05/21/rnn-effectiveness/

Generating Sequences With Recurrent Neural Networks (2014)

Miglior Tutorial su Youtube

Karpathy: Minimal character-level Vanilla RNN model in C