Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Regolarizzazione L1 e L2


La regolarizzazione L1 e L2 sono due tecniche utilizzate per prevenire l'overfitting nelle reti neurali e nel machine Learning

La regolarizzazione L1 e L2 sono due tecniche utilizzate per prevenire l'overfitting in modelli di machine learning, incluso nelle reti neurali.
L'obiettivo principale della regolarizzazione è quello di ridurre la complessità del modello limitando la magnitudine dei pesi dei parametri del modello.

Regolarizzazione L1 (Lasso)

  • La regolarizzazione L1 aggiunge un termine di penalizzazione proporzionale alla somma dei valori assoluti dei coefficienti del modello.

  • La formula per il termine di regolarizzazione L1 è data da: \( \lambda \sum_{i=1}^{n} |w_i| \), dove \( \lambda \) è il parametro di regolarizzazione e \( w_i \) sono i pesi del modello.

  • L'effetto principale della regolarizzazione L1 è quello di spingere i pesi dei coefficienti a diventare zero. Questo porta ad una sorta di "selezione delle feature", dove alcune caratteristiche hanno un peso significativo mentre altre hanno peso zero, riducendo così la complessità del modello.

  • La regolarizzazione L1 è utile quando si desidera ottenere un modello più sparsi, cioè con un numero minore di parametri non nulli.

Vantaggi Regolarizzazione L1

  • Aggiunge un termine alla funzione di costo del modello, che è proporzionale alla somma assoluta dei valori dei pesi dei parametri.

  • Influenza il modello inducendo molti pesi dei parametri a diventare zero, rendendo il modello più sparso.

  • Utile per la selezione delle feature, poiché può ridurre il numero di feature rilevanti per la predizione.

  • L'intensità della regolarizzazione è controllata dal parametro λ (lambda), che può essere regolato per ottenere il giusto equilibrio tra riduzione della complessità e accuratezza del modello.

Regolarizzazione L2 (Ridge)

  • La regolarizzazione L2 aggiunge un termine di penalizzazione proporzionale alla somma dei quadrati dei coefficienti del modello.

  • La formula per il termine di regolarizzazione L2 è data da: \( \lambda \sum_{i=1}^{n} w_i^2 \), dove \( \lambda \) è il parametro di regolarizzazione e \( w_i \) sono i pesi del modello.

  • L'effetto principale della regolarizzazione L2 è quello di ridurre la magnitudine dei pesi dei coefficienti, senza necessariamente ridurli a zero. Questo aiuta a prevenire l'overfitting limitando la crescita dei pesi dei coefficienti.

  • La regolarizzazione L2 è utile quando si desidera ridurre l'importanza relativa dei pesi dei coefficienti senza eliminarli completamente.

Vantaggi Regolarizzazione L2

  • Aggiunge un termine alla funzione di costo del modello, che è proporzionale alla somma dei quadrati dei valori dei pesi dei parametri.

  • Influenza il modello spingendo i valori dei pesi dei parametri verso lo zero, ma generalmente non li riduce esattamente a zero.

  • Previene l'overfitting mantenendo tutti i pesi dei parametri piccoli.

  • Anche in questo caso, l'intensità della regolarizzazione è controllata dal parametro λ.

Criteri per usare una delle due o entrambe insieme:

  • Si dovrebbe considerare l'uso della regolarizzazione L1 quando si desidera una selezione sparsa delle caratteristiche o una maggiore interpretabilità del modello.

  • La regolarizzazione L2 può essere preferita quando si desidera mantenere tutti i pesi dei coefficienti, ma limitarne la magnitudine per prevenire l'overfitting.

  • L'uso combinato di L1 e L2 (elastic net) è consigliato quando si desidera ottenere i benefici di entrambe le regolarizzazioni, cioè la selezione delle feature e il controllo della magnitudine dei pesi.

Entrambe le tecniche di regolarizzazione possono essere combinate insieme, dando origine alla regolarizzazione elastic net, che combina sia la penalizzazione L1 che L2.
Questo permette di ottenere i benefici di entrambe le tecniche, mantenendo la sparsità dei pesi dei parametri (come nella L1) e la robustezza contro i valori estremi (come nella L2).

Esempio L1_L2


import matplotlib.pyplot as plt
from keras.datasets import fashion_mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l1_l2
from keras.utils import to_categorical

# Caricamento del dataset
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()

# Normalizzazione delle immagini
X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0

# Reshape delle immagini
X_train = X_train.reshape((X_train.shape[0], 28 * 28))
X_test = X_test.reshape((X_test.shape[0], 28 * 28))

# Codifica one-hot per le etichette
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# Creazione del modello
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(28 * 28,), kernel_regularizer=l1_l2(l1=0.01, l2=0.01)))
model.add(Dense(256, activation='relu', kernel_regularizer=l1_l2(l1=0.01, l2=0.01)))
model.add(Dense(128, activation='relu', kernel_regularizer=l1_l2(l1=0.01, l2=0.01)))
model.add(Dense(10, activation='softmax'))

# Compilazione del modello
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Addestramento del modello
history = model.fit(X_train, y_train, epochs=20, batch_size=128, validation_data=(X_test, y_test), verbose=1)

# Valutazione del modello sul set di test
test_loss, test_acc = model.evaluate(X_test, y_test)
print('Test accuracy:', test_acc)

# Stampa della funzione di costo al termine di ogni epoca
train_loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(train_loss) + 1)

plt.plot(epochs, train_loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

# Stampa il valore della funzione di costo per il training e il test
print("Training loss:", train_loss)
print("Validation loss:", val_loss)

Al termine delle eopche la funzione di costo è simile  tra data set di test e Training
Training loss: 3.00142765045166
Test loss:  3.000424385070801

Nel codice fornito, la regolarizzazione L1 e L2 è stata introdotta utilizzando il parametro `kernel_regularizer` nei layer `Dense`.
La funzione `l1_l2(l1=0.01, l2=0.01)` specifica i coefficienti di regolarizzazione per entrambe le tecniche.
Infine, il grafico della funzione di costo per il training e il test è stato visualizzato per valutare l'effetto della regolarizzazione sul modello.