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

Dropout


Disabilitare casualmente un numero predefinito di unità neuronali, cioè "scartando" temporaneamente i loro output.

dropout

La tecnica di dropout è una tecnica di regolarizzazione utilizzata nelle reti neurali artificiali per combattere l'overfitting.
L'overfitting si verifica quando il modello memorizza troppo bene i dati di addestramento e quindi non generalizza bene su nuovi dati di test.

Il dropout funziona disabilitando casualmente un numero predefinito di unità neuronali durante l'addestramento, cioè "scartando" temporaneamente i loro output, in modo che il modello non possa fare affidamento eccessivo su alcune unità specifiche.
Questo obbliga il modello a trovare più modi diversi per rappresentare le stesse informazioni, riducendo così la dipendenza da particolari caratteristiche o correlazioni nei dati di addestramento.

Durante l'addestramento, ogni unità neuronale nell'output di un layer con dropout ha una probabilità $p$ di essere temporaneamente disabilitata.
Questa probabilità $p$, chiamata tasso di dropout, è un parametro che deve essere specificato dall'utente e generalmente varia tra lo 0.2 e lo 0.5.
Durante la fase di test, tutte le unità neuronali sono attive e le loro uscite vengono ridotte di un fattore $p$ per compensare il numero maggiore di unità attive.

La tecnica di dropout può essere applicata a diversi layer all'interno di una rete neurale, tipicamente strati completamente connessi o densamente connessi.
È particolarmente efficace in reti neurali profonde con un gran numero di parametri, dove l'overfitting è più probabile. La sua semplicità e la sua efficacia nel migliorare la generalizzazione del modello ne fanno una tecnica ampiamente utilizzata in pratica.

Esempio di dropout

Ecco un esempio di come utilizzare la tecnica di dropout in una rete neurale utilizzando il dataset Fashion MNIST:

import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import fashion_mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import to_categorical

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

# Preprocessing dei dati
X_train = X_train.reshape((X_train.shape[0], -1)) / 255.0
X_test = X_test.reshape((X_test.shape[0], -1)) / 255.0
y_train = to_categorical(y_train, num_classes=10)
y_test = to_categorical(y_test, num_classes=10)

# Creazione del modello
model = Sequential()
model.add(Dense(512, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.5))  # Aumento del dropout rate
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))  # Aumento del dropout rate
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))  # Aumento del dropout rate
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))

# Valutazione del modello sul test set
loss, accuracy = model.evaluate(X_test, y_test)
print("Test Loss:", loss)
print("Test Accuracy:", accuracy)

# Plot della funzione di costo
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()


Questo codice utilizza la regolarizzazione L1 e L2, insieme alla tecnica di dropout, per combattere l'overfitting nella rete neurale. La rete viene addestrata per 20 epoche e vengono stampati i valori di loss e accuracy sia per il training set che per il test set.
Infine, viene tracciato un grafico dell'evoluzione della funzione di costo nel tempo durante l'addestramento.
In questo codice, il dropout rate è aumentato a 0.5 per ogni layer nascosto utilizzando la funzione Dropout(0.5), per ottenere un buon risultato della funzione di costo