Creazione di un’animazione di discesa del gradiente in Python

Creazione di un'animazione dell'effetto di sfumatura in Python

Come tracciare la traiettoria di un punto su una superficie complessa

Foto di Todd Diemer su Unsplash

Lasciate che vi racconti come ho creato un’animazione della discesa del gradiente solo per illustrare un punto in un articolo del blog. Ne è valsa la pena poiché ho imparato di più su Python facendolo e ho acquisito una nuova abilità: creare grafici animati.

Animazione della discesa del gradiente creata in Python. Immagine dell'autore.

Vi guiderò attraverso i passaggi del processo che ho seguito.

Un po’ di contesto

Qualche giorno fa ho pubblicato un articolo sulle discese del gradiente come algoritmo di ottimizzazione utilizzato per l’addestramento delle reti neurali artificiali.

Volevo includere un’immagine animata per mostrare come la scelta di diversi punti iniziali per un’ottimizzazione con discesa del gradiente possa produrre risultati diversi.

Ecco quando sono incappato in queste straordinarie animazioni create da Alec Radford anni fa, e condivise in un commento su Reddit, che illustrano la differenza tra alcuni avanzati algoritmi di discesa del gradiente, come Adagrad, Adadelta e RMSprop.

Dato che mi sto sforzando di sostituire Matlab con Python, ho deciso di provare e codificare da solo un’animazione simile, utilizzando inizialmente un algoritmo di discesa del gradiente “vanilla”.

Andiamo avanti, passo dopo passo.

Tracciare la superficie utilizzata per l’ottimizzazione

La prima cosa che facciamo è importare le librerie di cui avremo bisogno e definire la funzione matematica che vogliamo rappresentare.

Volevo utilizzare una superficie a punto sella, quindi ho definito la seguente equazione:

Creiamo anche una griglia di punti per tracciare la superficie. np.mgrid è perfetto per questo. Il numero complesso 81j passato come lunghezza dello step indica quanti punti creare tra i valori di inizio e di fine (81 punti).

import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as plt# Crea una funzione per calcolare la superficiesdef f(theta):  x = theta[0]  y = theta[1]  return x**2 - y**2# Crea una griglia di punti per tracciare la superficex, y = np.mgrid[-1:1:81j, -1:1:81j]