Vai al contenuto principale

Guida per principianti alla Rectified Linear Unit (ReLU)

Scopri le basi di una delle funzioni di attivazione più popolari per le reti neurali
Javier Canales Luna
Javier Canales Luna

Crea il tuo account gratuito

Pratica and corso your progress.

Continua con GoogleContinuando, accetti la nostra Termini di utilizzo, i nostri Informativa sulla privacy e il fatto che i tuoi dati sono archiviati negli USA.

Funzioni di attivazione come la Rectified Linear Unit (ReLU) sono una pietra angolare delle moderne reti neurali. Senza di esse, molte applicazioni di IA nel mondo reale—dal riconoscimento di immagini ai sistemi di raccomandazione—non sarebbero possibili. Questa guida esplora le basi di ReLU, i suoi vantaggi, le limitazioni e come implementarla.

Basi di ReLU

Alcune delle applicazioni più potenti dell’IA non sarebbero possibili senza le reti neurali artificiali. Le reti neurali sono modelli computazionali ispirati al cervello umano. Queste reti sono costituite da nodi interconnessi, o "neuroni", che lavorano insieme per elaborare informazioni e prendere decisioni. Ciò che rende una rete neurale "profonda" è il numero di livelli tra input e output. Una rete neurale profonda ha più strati, il che le consente di apprendere caratteristiche più complesse e fare previsioni più accurate.

Rete neurale profonda

Rete neurale profonda. Fonte: DataCamp

Tuttavia, questi modelli sono molto più di semplici strati. Altri componenti sono altrettanto cruciali perché le reti neurali possano fare la loro magia. 

Uno di questi componenti sono le funzioni di attivazione. Puoi vederle come dei decisori: determinano quali informazioni devono essere trasmesse allo strato successivo, fornendo un nuovo livello di complessità che consente alle reti neurali di prendere decisioni sfumate.

Qui presenteremo una delle funzioni di attivazione più popolari e ampiamente utilizzate: la Rectified Linear Unit (ReLU). Spiegheremo le basi di questa funzione e alcune sue varianti, i suoi vantaggi e le limitazioni, e come implementarle con Pytorch. Si continua?

Cosa sono le funzioni di attivazione?

Le funzioni di attivazione sono un elemento costitutivo fondamentale delle reti neurali. Trasformano il segnale di input di un nodo in una rete neurale in un segnale di output che viene poi passato allo strato successivo. Senza funzioni di attivazione, le reti neurali sarebbero limitate a modellare solo relazioni lineari tra input e output, ad esempio tramite moltiplicazione di matrici.

Tuttavia, la maggior parte dei dati reali non può essere modellata con linearità. Le non linearità catturano schemi come il modo in cui passare da zero figli a un figlio può influire sulle tue transazioni bancarie in modo diverso rispetto a passare da tre a quattro figli. Se le reti neurali non avessero funzioni di attivazione, non riuscirebbero a imparare i complessi schemi non lineari che esistono negli eventi del mondo reale.

Funzioni lineari vs non lineari

Funzioni lineari vs non lineari. Fonte: DataCamp

Le funzioni di attivazione consentono alle reti neurali di apprendere le relazioni introducendo comportamenti non lineari. In altre parole, le funzioni di attivazione creano una soglia numerica per decidere se attivare un neurone, introducendo un grado di flessibilità che è fondamentale per permettere alle reti neurali di modellare dati complessi e sfumati.

Che cos’è ReLU?

Una delle funzioni di attivazione più popolari e ampiamente utilizzate è ReLU (rectified linear unit). Come altre funzioni di attivazione, fornisce non linearità al modello per prestazioni computazionali migliori. 

La funzione di attivazione ReLU ha la forma:

f(x) = max(0, x)

La funzione ReLU restituisce il massimo tra il suo input e zero, come mostrato dal grafico. Per input positivi, l’output della funzione è uguale all’input. Per input strettamente negativi, l’output della funzione è pari a zero.

Funzione di attivazione Rectified Linear Unit (ReLU).

Funzione di attivazione Rectified Linear Unit (ReLU). Fonte: DataCamp

Vantaggi dell’uso di ReLU

Uno dei vantaggi più significativi di ReLU è che aiuta a mitigare il problema del gradiente evanescente. Il problema del gradiente evanescente è una sfida che si verifica durante l’addestramento di reti neurali profonde usando la backpropagation. Si verifica quando il gradiente utilizzato per aggiornare i pesi della rete diventa molto piccolo o "svanisce" man mano che si propaga all’indietro attraverso la rete. Questo impedisce ai pesi di aggiornarsi correttamente, rallentando o bloccando il processo di apprendimento. Puoi leggere una spiegazione completa del problema del gradiente evanescente nel nostro corso Introduction to Deep Learning in PyTorch.

Poiché la funzione ReLU non ha un limite superiore e i gradienti non convergono a zero per valori alti di x, ReLU supera il problema del gradiente evanescente, comune quando si usano le funzioni di attivazione sigmoid e softmax. Dai un’occhiata al nostro articolo dedicato per scoprire altre popolari funzioni di attivazione.

Inoltre, poiché ReLU restituisce zero per tutti gli input negativi, porta naturalmente ad attivazioni sparse. In altre parole, dato che solo un sottoinsieme di neuroni è attivato durante l’addestramento, si ottiene una computazione più efficiente.

Infine, questo comportamento permette alle reti di scalare a molti strati senza un aumento significativo del carico computazionale, rispetto a funzioni più complesse come tanh o sigmoid. Questo rende ReLU la funzione di attivazione predefinita più comune ed è di solito una buona scelta se non sei sicuro di quale funzione di attivazione usare nel tuo modello.

Implementare ReLU in PyTorch

Implementare ReLU in PyTorch è abbastanza semplice. Ti basta usare la funzione nn.ReLU() per creare la funzione e aggiungerla al tuo modello.

Nel seguente esempio, applichiamo una funzione ReLU a un semplice neurone e calcoliamo il gradiente nel caso di un valore negativo.

# Create a ReLU function with PyTorch
relu_pytorch = nn.ReLU()

# Apply your ReLU function on x, and calculate gradients
x = torch.tensor(-1.0, requires_grad=True)
y = relu_pytorch(x)
y.backward()

# Print the gradient of the ReLU function for x
gradient = x.grad
print(gradient)
>>> tensor(0.)

Nota che il valore di input era -1 e la funzione ReLU ha restituito zero. Ricorda che per valori negativi di x, l’output di ReLU è sempre zero e, infatti, il gradiente è ovunque zero perché non c’è variazione della funzione per alcun valore negativo di x.

Varianti di ReLU

ReLU è probabilmente la funzione di attivazione più usata, ma a volte potrebbe non funzionare per il problema che stai cercando di risolvere. Fortunatamente, i ricercatori di deep learning hanno sviluppato alcune varianti di ReLU che vale la pena testare nei tuoi modelli. Ecco le alternative più popolari

Leaky ReLU

Leaky ReLU ha la forma:

f(x) = max(0.01x, x)

L’obiettivo della Leaky ReLU è affrontare il cosiddetto problema della "dying ReLU". Abbiamo già menzionato che ReLU restituisce sempre valori nulli per input negativi. Quando ciò accade, i gradienti dei nodi con valori negativi verranno impostati a zero per il resto dell’addestramento, impedendo a questo parametro di apprendere. Per superare questa sfida, la Leaky ReLU usa un fattore moltiplicativo per gli input negativi. Di conseguenza, la funzione non sarà zero ma avrà una piccola pendenza negativa, come rappresentato nel grafico seguente:

Funzione di attivazione Leaky ReLU.

Funzione di attivazione Leaky ReLU. Fonte: DataCamp

Parametric ReLU (PReLU)

La Leaky ReLU offre un fattore moltiplicativo per superare il problema della dying ReLU. La Parametric ReLU (PReLU) va un passo oltre, offrendo un parametro apprendibile (a) invece di una semplice costante per calcolare il valore degli input negativi: 

f(x) = max(ax, x)

Sebbene la PReLU offra un miglioramento rispetto a ReLU e Leaky ReLU in termini di accuratezza e adattabilità (è particolarmente adatta a catturare schemi in compiti complessi, come la computer vision o il riconoscimento vocale), aggiunge anche complessità al modello. L’addestramento di questo parametro può richiedere tempo e necessita di un’attenta messa a punto e regolarizzazione. 

Funzione di attivazione Parametric ReLU

Funzione di attivazione Parametric ReLU. Fonte: DataCamp

Exponential Linear Unit (ELU)

Un’altra ottima alternativa a ReLU è la Exponential Linear Unit (ELU), che ha la seguente formula:

A differenza di ReLU, le ELU hanno valori negativi, il che consente loro di spingere la media delle attivazioni delle unità più vicino a zero, rendendole così meno soggette a gradienti evanescenti. Inoltre, avere attivazioni medie più vicine allo zero porta ad apprendimento e convergenza più rapidi.

Funzione di attivazione ELU

Funzione di attivazione ELU. Fonte: DataCamp

Problemi comuni con ReLU

ReLU è un’ottima funzione di attivazione, ma non è una bacchetta magica. In particolare, ReLU può soffrire di due problemi ben noti.

Il primo è il problema della dying ReLU. Come già accennato, ReLU restituisce sempre valori nulli per input negativi. Questo può far sì che i pesi si aggiornino in modo tale che il neurone non si attivi mai più su nessun punto dati. 

Se ciò accade, allora il gradiente che attraversa l’unità sarà per sempre zero da quel momento in poi, impedendo a questo parametro di apprendere. Le varianti di ReLU, come Leaky ReLU e PReLU, sono state create per affrontare questo problema.

Gradienti instabili possono verificarsi anche dall’altro lato. Il problema dei gradienti esplosivi si manifesta quando i gradienti diventano sempre più grandi, portando ad aggiornamenti enormi dei parametri e a un addestramento divergente. 

In questo caso, si accumulano errori di gradiente maggiori e i pesi del modello diventano troppo grandi. Questo problema può causare tempi di addestramento più lunghi e scarse prestazioni del modello. Esistono diverse tecniche per affrontare il problema dei gradienti esplosivi, tra cui gradient clipping e batch normalization. 

Applicazioni di ReLU nelle reti neurali

Grazie alle sue proprietà uniche, ReLU è diventata la funzione di attivazione più popolare, essendo l’opzione predefinita in framework come PyTorch e TensorFlow, e ampiamente usata in molte applicazioni di deep learning, tra cui:

  • Riconoscimento di immagini: ReLU è un componente fondamentale nelle reti neurali convoluzionali (CNN), reti specializzate comunemente utilizzate per l’estrazione di caratteristiche e l’elaborazione di immagini.
  • NLP: ReLU è usata anche in molti compiti di Natural Language Processing (NLP). Questa funzione di attivazione è stata utilizzata con successo per fornire non linearità in aree come il riconoscimento vocale e l’elaborazione audio.
  • Sistemi di raccomandazione: ReLU è utilizzata nei sistemi di raccomandazione per fornire suggerimenti personalizzati. 

Conclusione

Abbiamo esplorato il ruolo fondamentale delle funzioni di attivazione ReLU durante l’addestramento delle reti neurali. Nonostante la sua semplicità, ReLU è una delle funzioni di attivazione più efficaci in circolazione e, con ogni probabilità, la più popolare. 

Man mano che le reti neurali continuano a evolversi, l’esplorazione delle funzioni di attivazione si espanderà senza dubbio, includendo forse nuove forme in grado di affrontare sfide specifiche di architetture emergenti. 

La scelta accurata delle funzioni di attivazione è un atto di equilibrio—una combinazione di comprensione scientifica e intuizione esperta—che può influire in modo significativo sulle prestazioni delle reti neurali. 

Vuoi saperne di più sul deep learning? Dai un’occhiata ai nostri materiali dedicati e preparati a una delle tecnologie più dirompenti dell’IA:

FAQ su ReLU

Cosa rende ReLU diversa dalle funzioni di attivazione sigmoid e tanh?

ReLU è diversa da sigmoid e tanh perché non comprime l’output in un intervallo fisso (ad es., [0,1] per sigmoid o [-1,1] per tanh). Invece, restituisce direttamente l’input per valori positivi e zero per valori negativi. Questa semplicità rende ReLU computazionalmente efficiente e aiuta ad affrontare il problema del gradiente evanescente che si verifica comunemente con sigmoid e tanh.

Quando dovrei usare ReLU rispetto ad altre funzioni di attivazione?

ReLU è un’ottima scelta predefinita per la maggior parte degli strati nascosti nelle reti neurali profonde, soprattutto quando si addestrano modelli di grandi dimensioni o si gestiscono dataset con relazioni complesse e non lineari. Tuttavia, se incontri problemi come la "dying ReLU" o se il tuo modello ha prestazioni scarse, prendi in considerazione l’uso di varianti come Leaky ReLU, PReLU o ELU.

ReLU può essere usata nello strato di output di una rete neurale?

ReLU in genere non viene utilizzata nello strato di output di una rete neurale perché il suo intervallo non è limitato, il che può rendere difficile interpretare l’output. Scelte comuni per gli strati di output includono:

  • Sigmoid: per problemi di classificazione binaria.
  • Softmax: per classificazione multiclasse.
  • Attivazione lineare: per compiti di regressione.
In che modo ReLU contribuisce alle attivazioni sparse e perché è importante?

ReLU contribuisce ad attivazioni sparse restituendo zero per tutti gli input negativi, il che significa che solo un sottoinsieme di neuroni è attivo in un dato momento. Le attivazioni sparse riducono il carico computazionale, prevengono l’overfitting e incoraggiano la rete a concentrarsi sulle caratteristiche più rilevanti dei dati.

Quali sono alcuni consigli pratici per il debug dei problemi causati da ReLU durante l’addestramento?

Ecco alcuni suggerimenti:

  • Controlla il problema della dying ReLU: monitora le attivazioni durante l’addestramento. Se un gran numero di neuroni restituisce costantemente zeri, valuta l’uso di Leaky ReLU o PReLU.
  • Usa la batch normalization: può aiutare a stabilizzare i gradienti e prevenire problemi come i gradienti esplosivi, che possono verificarsi quando ReLU produce grandi valori positivi.
  • Gradient clipping: se si verificano gradienti esplosivi, il clipping può limitare l’ampiezza del gradiente a un valore specificato, migliorando la stabilità.
  • Sperimenta con l’inizializzazione dei pesi: un’inizializzazione appropriata (ad es., He initialization) può ridurre la probabilità di problemi come neuroni morti o convergenza lenta.
Javier Canales Luna

Autore

Javier Canales Luna

Sono una data analyst freelance e collaboro con aziende e organizzazioni di tutto il mondo in progetti di data science. Sono anche un'insegnante di data science con oltre 2 anni di esperienza. Scrivo regolarmente articoli su temi legati alla data science in inglese e spagnolo, alcuni dei quali sono stati pubblicati su siti affermati come DataCamp, Towards Data Science e Analytics Vidhya. Come data scientist con un background in scienze politiche e diritto, il mio obiettivo è lavorare all'intersezione tra politiche pubbliche, diritto e tecnologia, sfruttando la forza delle idee per promuovere soluzioni e narrazioni innovative che ci aiutino ad affrontare le sfide urgenti, in primis la crisi climatica. Mi considero autodidatta, una persona in continuo apprendimento e una convinta sostenitrice dell'approccio multidisciplinare. Non è mai troppo tardi per imparare cose nuove.

Argomenti

Correlato