Mastering Deep Learning L’arte dell’approssimazione delle non linearità con stime a tratti – Parte 1

Padroneggiare Deep Learning L'arte dell'approssimazione delle non linearità con stime a tratti - Parte 1

Nell’ultimo anno, abbiamo assistito a un’esplosione di popolarità del Deep Learning. Grandi modelli linguistici come GPT-4 e modelli generativi come DALL·E dominano le conversazioni su Internet. L’entusiasmo che circonda il Deep Learning ha spinto lo sviluppo di supercomputer come il DGX GH200 di Nvidia. È un potente calcolatore con una straordinaria performance di 1 exaflops, appositamente progettato per calcoli di reti neurali. Ogni volta che si parla di Deep Learning, si fa inevitabilmente riferimento alle Deep Neural Networks e viceversa. Le Deep Neural Networks sono equazioni che possono rappresentare una vasta gamma di relazioni tra input e output. Spesso queste relazioni sono estremamente complesse, non lineari e difficili da visualizzare, ma come le Deep Neural Networks riescono a rappresentarle in modo confortevole?

Per capire come una rete neurale profonda approssima funzioni così intricate, cominciamo esaminando una semplice rete neurale superficiale e analizzando come modella queste associazioni. Le reti neurali in generale sono funzioni f(x,ϕ) che mappano input multivariati x in output multivariati y, dove ϕ è l’insieme di parametri della funzione f. Ad esempio, se f(x,ϕ) = ax +b, ϕ è l’insieme {a, b}. Le reti neurali superficiali in generale sono composte da unità computazionali fondamentali chiamate neuroni. Questi neuroni agiscono come stimatori lineari, ognuno dei quali stima diverse funzioni lineari.

Una semplice rete neurale superficiale con 3 unità nascoste

In generale, una semplice rete neurale superficiale come mostrato nella figura sopra, con un input x e un output y con D neuroni può essere rappresentata come:

dove ϕ₀ e ϕᵢ sono il bias e il peso di output corrispondente all’unità nascosta i, rispettivamente. Ogni hᵢ corrisponde alla funzione lineare approssimata dall’unità nascosta i. Ciascuna unità nascosta calcola hᵢ come segue:

come abbiamo già detto θ₀ è il bias e θᵢ è il peso di input corrispondente all’unità nascosta i. Qui, a[.] è una funzione di attivazione. Fino ad ora abbiamo stimato solo una funzione lineare utilizzando la rete neurale, che dovrebbe stimare una funzione non lineare. La funzione di attivazione è quella che introduce questa non linearità. Per essere precisi, genera quella che è nota come una funzione lineare a tratti, che serve come approssimazione per gestire funzioni non lineari.

Facciamo un semplice esperimento per vedere come questa funzione di attivazione introduce la non linearità. Per questo esperimento prendiamo tre semplici funzioni lineari date da:

Ora combiniamo y₁, y₂ e y₃ troviamo y utilizzando l’equazione sopra e visualizziamo il risultato.

Possiamo vedere che il risultato è una funzione lineare, ora inviamo y₁, y₂ e y₃ attraverso una funzione di attivazione e visualizziamo il risultato.

Possiamo vedere che la funzione non è più lineare ma è lineare a tratti. Queste funzioni lineari a tratti sono un’ottima approssimazione di funzioni non lineari. Quando il numero di regioni lineari inizia ad aumentare, le regioni lineari iniziano a restringersi, dando l’impressione di una funzione non lineare, anche se la funzione sottostante è lineare a tratti. Esistono effettivamente funzioni di attivazione non lineari come la sigmoide che produce una stima non lineare come mostrato di seguito.

Anche se possiamo stimare una funzione non lineare con l’aiuto della funzione di attivazione sigmoide, ReLu o una delle sue varianti è la scelta quando si tratta della maggior parte delle moderne reti neurali. Diversi fattori rendono ReLu la scelta più influente quando si tratta di funzioni di attivazione, il fattore più influente è che ReLu e la sua derivata della funzione di Heaviside sono estremamente semplici da calcolare rispetto a Sigmoid o Tanh. Utilizzare ReLu può ridurre notevolmente il tempo di calcolo senza compromettere le prestazioni.

Ora addestriamo una rete neurale poco profonda con attivazione ReLu per stimare sin(x) aumentando il numero di unità nascoste ogni volta e visualizzando la funzione stimata fino a quando la stima non è soddisfacente. Confrontiamo infine questa funzione stimata con le funzioni stimata con funzioni di attivazione sigmoide e tanh e verifichiamo se ci sono compromessi nelle prestazioni.

Rete neurale poco profonda con 5 unità nascoste e attivazione ReLu
Rete neurale poco profonda con 50 unità nascoste e attivazione ReLu
Rete neurale poco profonda con 500 unità nascoste e attivazione ReLu
Rete neurale poco profonda con 1500 unità nascoste e attivazione ReLu

Dai grafici sopra, possiamo vedere che le stime porzionatamente fatte con l’aiuto di ReLu approssimano molto bene una funzione non lineare come sin(x). È evidente che all’aumentare del numero di unità nascoste, i segmenti lineari perzionati assomigliano da vicino alle regioni non lineari. Infatti, con D unità nascoste, è possibile creare fino a D+1 regioni lineari. Durante il processo di addestramento, il modello apprende le pendenze rappresentate da θ₁ e gli offset indicati da θ₀ per questi D+1 segmenti lineari, migliorando l’efficacia complessiva di questo approccio.

Ora confrontiamo questo con le stime effettuate utilizzando le funzioni Sigmoid e Tanh.

Rete neurale poco profonda con 1500 unità nascoste e attivazione Sigmoid
Rete neurale poco profonda con 1500 unità nascoste e attivazione Tanh

Dai grafici sopra, possiamo osservare che anche se queste stime sono non lineari, non sono così buone come le stime fatte con l’aiuto della funzione ReLu. Un modo per spiegare ciò è quando addestriamo una rete neurale poco profonda con D unità nascoste con attivazione ReLu, otteniamo essenzialmente D+1 regioni lineari separate. Queste regioni lineari possiedono la flessibilità di essere orientate e posizionate come necessario, adattandosi alla distribuzione dei dati sottostante. Capiremo questo con una semplice analogia del mondo reale, guardando la figura qui sotto

Immaginiamo di dover creare un cerchio usando solo stecchini rigidi. Come rappresentato nella figura, aumentando il numero di stecchini, la forma risultante gradualmente assomiglia sempre di più a un cerchio. Ogni stecchino può essere paragonato a una regione lineare che ogni unità nascosta all’interno della rete neurale stima. Quando assembliamo questi stecchini, il risultato collettivo rappresenta la stima finale ottenuta dalla rete neurale, è semplice come quello.

Questo blog è fortemente ispirato al libro “Understanding Deep Learning” di Simon J.D. Prince (udlbook.github.io/udlbook/). Ho intenzione di ampliare questo blog con altre due parti per approfondire ulteriormente l’argomento. Il codice che ho utilizzato per generare i grafici può essere trovato di seguito. Se hai trovato questo blog istruttivo, apprezzerei molto il tuo supporto con un like.

Understanding-Deep-Learning/Mastering_Deep_Learning_L’arte_di_approximare_le_non_linearità_con_Pi…

Contribuisci a Raagulbharatwaj/Understanding-Deep-Learning sviluppando un account su GitHub.

github.com