Gradiente e Funzione di Costo
Minimizzare la funzione di costo.
Full e mini batch, gradiente stocastico
Il gradiente è un concetto fondamentale nelle reti neurali e nell'ottimizzazione dei modelli di machine learning.
Rappresenta la direzione e l'ampiezza della massima crescita di una funzione rispetto ai suoi parametri.
Nei contesti di apprendimento automatico, il gradiente è spesso utilizzato per aggiornare i pesi del modello durante il processo di addestramento al fine di minimizzare la funzione di costo.
Ci sono tre principali approcci di gradient descent utilizzati nell'addestramento delle reti neurali:
-
Full Batch Gradient Descent: In questo approccio, il modello viene addestrato utilizzando l'intero set di dati di addestramento in ogni iterazione.
Ciò significa che il gradiente viene calcolato utilizzando tutti gli esempi di addestramento contemporaneamente. Se il set di dati di addestramento è grande, questo metodo può essere computazionalmente oneroso poiché richiede di memorizzare tutti i dati in memoria e di calcolare il gradiente su di essi. -
Gradient Descent Stocastico SGD: il modello viene addestrato utilizzando un singolo esempio di addestramento (o una piccola parte di essi) per ogni iterazione.
Ciò significa che il gradiente viene calcolato e utilizzato per aggiornare i pesi del modello su dati singoli e casuali. L'aggiornamento dei pesi è molto più frequente rispetto a Full Batch Gradient Descent, il che può portare a una convergenza più rapida. Tuttavia, la direzione del gradiente può essere molto rumorosa a causa dell'utilizzo di un singolo esempio, e questo può portare a oscillazioni nell'addestramento. - Mini-Batch Gradient Descent: Questo approccio è un compromesso tra Full Batch Gradient Descent e SGD. In Mini-Batch Gradient Descent, il modello viene addestrato utilizzando un sottoinsieme dei dati di addestramento, chiamato mini-batch, per ogni iterazione. Il mini-batch è più grande di uno singolo esempio ma più piccolo dell'intero set di dati di addestramento. Questo permette di ottenere un buon compromesso tra efficienza computazionale e stabilità della direzione del gradiente. Inoltre, l'utilizzo di mini-batch può consentire l'utilizzo di parallelismo e ottimizzazioni hardware durante l'addestramento.
Ecco un esempio di come utilizzare il metodo Mini-Batch Gradient Descent utilizzando il dataset Fashion MNIST con TensorFlow:
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import fashion_mnist
# Caricamento del dataset Fashion MNIST
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
# Preprocessing dei dati
X_train = X_train.reshape(-1, 28 * 28) / 255.0
X_test = X_test.reshape(-1, 28 * 28) / 255.0
y_train = tf.keras.utils.to_categorical(y_train, num_classes=10)
y_test = tf.keras.utils.to_categorical(y_test, num_classes=10)
# Creazione del modello
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# Compilazione del modello
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
# Addestramento del modello con mini-batch gradient descent
batch_size = 32
model.fit(X_train, y_train, epochs=10, batch_size=batch_size, validation_data=(X_test, y_test))
# Valutazione del modello
loss, accuracy = model.evaluate(X_test, y_test)
print("Test Loss:", loss)
print("Test Accuracy:", accuracy)
In questo esempio, abbiamo caricato il dataset Fashion MNIST e preprocessato i dati normalizzandoli.
Successivamente, abbiamo creato un modello sequenziale con tre strati densi e lo abbiamo compilato utilizzando l'ottimizzatore SGD e la funzione di costo categorical crossentropy.
Infine, abbiamo addestrato il modello utilizzando Mini-Batch Gradient Descent con un batch size di 32 per 10 epoche e valutato le prestazioni del modello sul set di test.