single
Uitdaging: Het Trainen van de Perceptron
Veeg om het menu te tonen
Voordat je doorgaat met het trainen van de perceptron, houd er rekening mee dat deze gebruikmaakt van de binaire cross-entropy verliesfunctie die eerder is besproken. Het laatste belangrijke concept voordat backpropagation wordt geïmplementeerd, is de formule voor de afgeleide van deze verliesfunctie ten opzichte van de outputactivaties, $a^n$. Hieronder staan de formules voor de verliesfunctie en de afgeleide:
Ldan=−(ylog(y^)+(1−y)log(1−y^))=y^(1−y^)y^−ywaarbij an=y^
Om te controleren of de perceptron correct traint, print de fit()-methode ook het gemiddelde verlies bij elke epoch. Dit wordt berekend door het verlies te middelen over alle trainingsvoorbeelden in die epoch:
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))
Tot slot zijn de formules voor het berekenen van de gradiënten in elke laag als volgt:
dzldWldbldal−1=dal⊙f′l(zl)=dzl⋅(al−1)T=dzl=(Wl)T⋅dzlImplementatiedetails om te onthouden
Bij het vertalen van deze formules naar Python-code voor de backward()-methode, houd rekening met de NumPy-operaties die in de vorige hoofdstukken zijn besproken:
- De ⊙-operator geeft elementgewijze vermenigvuldiging aan, wat wordt uitgevoerd met de standaard
*-operator in Python. - De ⋅-operator geeft een dotproduct aan, geïmplementeerd met de functie
np.dot(). - De T-superscript geeft een matrixtransponering aan, afgehandeld door het
.T-attribuut. - Om f′l(zl) te berekenen, kun je dynamisch de afgeleide van de activatiefunctie van de laag aanroepen met
self.activation.derivative(self.outputs).
Hierdoor ziet de algemene structuur van de backward()-methode er als volgt uit:
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
Op vergelijkbare wijze, wanneer alles wordt samengevoegd in de fit()-methode, moet u eraan denken dat u door het netwerk achterwaarts moet itereren om de fout te propageren. De algemene structuur ziet er als volgt uit:
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
De voorbeeldtrainingsgegevens (X_train) samen met de bijbehorende labels (y_train) zijn opgeslagen als NumPy-arrays in het bestand utils.py. Daarnaast zijn instanties van de activatiefuncties daar ook gedefinieerd:
relu = ReLU()
sigmoid = Sigmoid()
Veeg om te beginnen met coderen
Je doel is om het trainingsproces voor een multilayer perceptron te voltooien door backpropagation te implementeren en de modelparameters bij te werken.
Volg deze stappen zorgvuldig:
- Implementeer de
backward()-methode in deLayer-klasse:
- Bereken de volgende gradiënten:
dz: afgeleide van het verlies ten opzichte van de pre-activatiewaarden, met behulp van de afgeleide van de activatiefunctie;
d_weights: gradiënt van het verlies ten opzichte van de gewichten, berekend als het dotproduct vandzen de getransponeerde invoervector;d_biases: gradiënt van het verlies ten opzichte van de biases, gelijk aandz;da_prev: gradiënt van het verlies ten opzichte van de activaties van de vorige laag, verkregen door de getransponeerde gewichtenmatrix te vermenigvuldigen metdz.- Werk de gewichten en biases bij met behulp van de leersnelheid.
- Maak de
fit()-methode in dePerceptron-klasse af:- Bereken de modeloutput door de
forward()-methode aan te roepen; - Bereken het verlies met behulp van de cross-entropyformule;
- Bereken de modeloutput door de
- Bereken dan — de afgeleide van het verlies ten opzichte van de outputactivaties;
- Loop achterwaarts door de lagen en voer backpropagation uit door de
backward()-methode van elke laag aan te roepen.
- Loop achterwaarts door de lagen en voer backpropagation uit door de
- Controleer het trainingsgedrag:
- Als alles correct is geïmplementeerd, zou het verlies gestaag moeten afnemen bij elke epoch wanneer een leersnelheid van
0.01wordt gebruikt.
Oplossing
Bedankt voor je feedback!
single
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.