Cos’è la funzione ReLU e perché è così popolare?

Tempo di lettura: 3 minuti

In questo articolo introduciamo la funzione ReLU, una delle principali funzioni di attivazione per le reti neurali. L’acronimo ReLU sta per REctified Linear Unit.

Questa funzione di attivazione è definita come segue

$\mathrm{ReLU}(x) = \max\{0,x\}.$

In altre parole, questa funzione restituisce l’input stesso quando questo è positivo, e restituisce zero altrimenti. Il suo grafico è infatti il seguente:

A Practical Guide to ReLU. Start using and understanding ReLU… | by Danqing  Liu | Medium

Questa funzione può essere applicata a tutte le componenti di un vettore, come viene di solito fatto con una generica funzione attivazione:

$\mathbf{x}\in\mathbb{R}^d,\,\,\mathbf{x} = \begin{bmatrix} x_1 \\ \vdots \\ x_d\end{bmatrix},\,\,\mathrm{ReLU}(\mathbf{x}) = \begin{bmatrix} \max{0,x_1} \\ \vdots \\ \max{0,x_d} \end{bmatrix}.$

Questa funzione è lineare a tratti ed è anche continua. Ha però un potenziale problema, ovvero non è differenziabile in zero, in quanto la derivata destra e sinistra sono rispettivamente +1 e 0.

Principali proprietà di questa funzione

Positivamente omogenea

La prima proprietà fondamentale è che è positivamente omogenea, e quindi molto facile da trattare dato che si comporta in modo relativamente simile alle funzioni lineari. Più precisamente, ReLU è positivamente omogenea visto che, dato un generico $\alpha>0$, vale che

$\mathrm{ReLU}(\alpha\mathbf{x})=\alpha\mathrm{ReLU}(\mathbf{x}),\,\,\forall\mathbf{x}\in\mathbb{R}^d.$

Permette di rappresentare i monomi

Un’altra proprietà interessante è che ReLU ci permette di rappresentare parecchie funzioni elementari. Questo è il motivo principale per cui molti ricercatori la apprezzano particolarmente, dato che questo comportamento permette di recuperare classici risultati dell’analisi numerica e della teoria dell’approssimazione nel mondo delle reti neurali.

Un esempio è che possiamo scrivere

$x^q = \mathrm{ReLU}(x)^q + (-1)^q \mathrm{ReLU}(-x),\,\,\forall q\in\mathbb{N},\,x\in\mathbb{R}$.

Ho usato questa proprietà in un mio articolo che è stato recentemente pubblicato sulla rivista Journal of Computational Physics , e lo trovi qui: Predictions Based on Pixel Data: Insights from PDEs and Finite Differences.

Per convincerci che questa proprietà sia corretta, concentriamoci un secondo sul caso q=1. In tal caso, verificare l’identità è relativamente veloce e si può fare come segue

$x\in\mathbb{R},\,\,\begin{split} x&>0\implies \mathrm{ReLU}(x)=x,\,\mathrm{ReLU}(-x)=0\implies \mathrm{ReLU}(x)-\mathrm{ReLU}(-x) = x \\
x&\leq 0\implies \mathrm{ReLU}(x)=0,\,\mathrm{ReLU}(-x)=-x\implies \mathrm{ReLU}(x)-\mathrm{ReLU}(-x) = x.
\end{split}$

Come esercizio, ti consiglio di provare a fare la stessa verifica per il monomio di secondo grado.

Funzioni cappello

Altre funzioni fondamentali nel campo dell’analisi numerica sono le funzioni cappello o hat functions che sono basi dello spazio delle funzioni lineari a tratti.

Approximation of functions

Queste sono fondamentali nel campo del metodo degli elementi finiti. Queste funzioni si basano su una griglia definita da nodi in un intervallo, per esempio

$x_i = i\Delta x,\,\,\Delta x = \frac{b-a}{K},\,\,i=0,…,K,\,a=x_0<x_1<…<x_K=b.$

Per ogni nodo esiste una funzione cappello, che vale zero in tutti i nodi tranne nel corrispondente, dove vale uno. Questo ci permette di rappresentare una generica funzione lineare a tratti con valori fissati sui nodi in maniera super semplice:

$f(x) = \sum_{i=0}^K f(x_i)\varphi_i(x),\,\,\varphi_i(x_j) = \delta_{ij}= \begin{cases} 1,\,\,i=j\\ 0,\,\,i\neq j\end{cases}.$

Queste funzioni cappello possono essere scritte esattamente tramite la funzione ReLU. Ho spiegato bene come farlo nel video associato a questo articolo, che trovi qui:

Ci sarebbero molte altre proprietà da evidenziare, ma voglio concludere con una che ritengo molto interessante.

Rappresentazione del massimo e minimo tra due numeri

Una proprietà che mi è risultata estremamente utile nell’ultimo articolo a cui ho lavorato, Approximation theory for 1-Lipschitz ResNets, è che la funzione ReLU ci permette di calcolare esattamente il massimo ed il minimo tra due numeri. Lo possiamo fare come segue:

$x,y\in\mathbb{R},\,\,\begin{split}
\max{x,y} &= x + \mathrm{ReLU}(y-x) = y + \mathrm{ReLU}(x-y), \\
\min{x,y} &= x – \mathrm{ReLU}(x-y) = y – \mathrm{ReLU}(y-x).
\end{split}$

Per prendere la mano con la funzione ReLU, ti consiglio di verificare che queste identità siano corrette. È molto semplice ma istruttivo!

Conclusione

Direi che abbiamo visto abbastanza cose su questa funzione. Se ti interessano più approfondimenti su questo tema fammelo sapere che ne parlo molto volentieri!

P.S. Ho in programma di parlare più approfonditamente della teoria matematica delle reti neurali, con l’obiettivo di condividere circa un nuovo post ogni settimana.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

Vai ad inizio articolo