single
Sfida: Addestramento del Percettrone
Scorri per mostrare il menu
Prima di procedere con l'addestramento del percettrone, è importante ricordare che utilizza la funzione di perdita di entropia incrociata binaria discussa in precedenza. L'ultimo concetto chiave prima di implementare la retropropagazione è la formula per la derivata di questa funzione di perdita rispetto alle attivazioni di output, $a^n$. Di seguito sono riportate le formule per la funzione di perdita e la sua derivata:
Ldan=−(ylog(y^)+(1−y)log(1−y^))=y^(1−y^)y^−ydove an=y^
Per verificare che il percettrone si stia addestrando correttamente, il metodo fit() stampa anche la perdita media a ogni epoca. Questa viene calcolata facendo la media della perdita su tutti gli esempi di addestramento in quell'epoca:
for epoch in range(epochs):
loss = 0
for i in range(training_data.shape[0]):
loss += -(target * np.log(output) + (1 - target) * np.log(1 - output))
average_loss = loss[0, 0] / training_data.shape[0]
print(f'Loss at epoch {epoch + 1}: {average_loss:.3f}')
L=−N1i=1∑N(yilog(y^i)+(1−yi)log(1−y^i))
Infine, le formule per il calcolo dei gradienti in ciascun livello sono le seguenti:
dzldWldbldal−1=dal⊙f′l(zl)=dzl⋅(al−1)T=dzl=(Wl)T⋅dzlDettagli di implementazione da ricordare
Durante la traduzione di queste formule in codice Python per il metodo backward(), ricordare le operazioni NumPy discusse nei capitoli precedenti:
- L'operatore ⊙ indica la moltiplicazione elemento per elemento, che si esegue con l'operatore
*standard in Python. - L'operatore ⋅ indica il prodotto scalare, implementato tramite la funzione
np.dot(). - L'apice T indica la trasposizione di una matrice, gestita tramite l'attributo
.T. - Per calcolare f′l(zl), è possibile chiamare dinamicamente la derivata della funzione di attivazione del livello tramite
self.activation.derivative(self.outputs).
Questo rende la struttura generale del metodo backward() simile alla seguente:
def backward(self, da, learning_rate):
dz = ... # using da and self.activation.derivative()
d_weights = ... # using np.dot() and .T
d_biases = ...
da_prev = ...
self.weights -= learning_rate * d_weights
self.biases -= learning_rate * d_biases
return da_prev
Analogamente, quando si integra tutto nel metodo fit(), è importante ricordare che occorre iterare attraverso la rete all'indietro per propagare l'errore. La struttura generale è la seguente:
def fit(self, training_data, labels, epochs, learning_rate):
# ... (Epoch loop and data shuffling) ...
# Forward propagation
output = ...
# Computing the gradient of the loss function w.r.t. output (da^n)
da = ...
# Backward propagation through all layers
for layer in self.layers[::-1]:
da = ... # Call the backward() method of the layer
I dati di addestramento di esempio (X_train) insieme alle etichette corrispondenti (y_train) sono memorizzati come array NumPy nel file utils.py. Inoltre, anche le istanze delle funzioni di attivazione sono definite lì:
relu = ReLU()
sigmoid = Sigmoid()
Scorri per iniziare a programmare
L'obiettivo è completare il processo di addestramento per un percettrone multistrato implementando la retropropagazione e aggiornando i parametri del modello.
Seguire attentamente questi passaggi:
- Implementazione del metodo
backward()nella classeLayer:
- Calcolare i seguenti gradienti:
dz: derivata della funzione di perdita rispetto ai valori di pre-attivazione, utilizzando la derivata della funzione di attivazione;
d_weights: gradiente della perdita rispetto ai pesi, calcolato come prodotto scalare tradze il vettore di input trasposto;d_biases: gradiente della perdita rispetto ai bias, uguale adz;da_prev: gradiente della perdita rispetto alle attivazioni dello strato precedente, ottenuto moltiplicando la matrice dei pesi trasposta perdz.- Aggiornare pesi e bias utilizzando il learning rate.
- Completamento del metodo
fit()nella classePerceptron:
- Calcolare l'output del modello chiamando il metodo
forward(); - Calcolare la perdita utilizzando la formula dell'entropia incrociata;
- Calcolare dan — la derivata della perdita rispetto alle attivazioni di output;
- Scorrere all'indietro tra gli strati, eseguendo la retropropagazione chiamando il metodo
backward()di ciascun layer.
- Verifica del comportamento dell'addestramento:
- Se tutto è implementato correttamente, la perdita dovrebbe diminuire costantemente a ogni epoca utilizzando un learning rate di
0.01.
Soluzione
Grazie per i tuoi commenti!
single
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione