Implementering af Backpropagation
Stryg for at vise menuen
Generel tilgang
Ved fremadpropagering tager hvert lag l outputtet fra det forrige lag, al−1, som input og beregner sit eget output. Derfor tager forward()-metoden i Layer-klassen vektoren af tidligere output som sin eneste parameter, mens resten af den nødvendige information gemmes i klassen.
Ved tilbagepropagering behøver hvert lag l kun dal for at beregne de respektive gradienter og returnere dal−1, så backward()-metoden tager dal-vektoren som parameter. Den resterende nødvendige information er allerede gemt i Layer-klassen.
Afledte af aktiveringsfunktioner
Da afledte af aktiveringsfunktioner er nødvendige for tilbagepropagering, bør aktiveringsfunktioner som ReLU og sigmoid implementeres som klasser i stedet for selvstændige funktioner. Denne struktur gør det muligt at definere begge komponenter tydeligt:
- Selve aktiveringsfunktionen — implementeret ved hjælp af
__call__()-metoden, så den kan anvendes direkte iLayer-klassen medself.activation(z); - Dens afledte — implementeret ved hjælp af
derivative()-metoden, hvilket muliggør effektiv beregning under tilbagepropagering viaself.activation.derivative(z).
Repræsentation af aktiveringsfunktioner som objekter gør det nemt at videregive dem til forskellige lag og anvende dem dynamisk under både fremad- og tilbagepropagering.
ReLu
Den afledte af ReLU-aktiveringsfunktionen er som følger, hvor zi er et element i vektoren af pre-aktiveringer z:
f′(zi)={1,zi>00,zi≤0class ReLU:
def __call__(self, z):
return np.maximum(0, z)
def derivative(self, z):
return (z > 0).astype(float)
Sigmoid
Afledte af sigmoid aktiveringsfunktion er som følger:
f′(zi)=f(zi)⋅(1−f(zi))class Sigmoid:
def __call__(self, x):
return 1 / (1 + np.exp(-z))
def derivative(self, z):
sig = self(z)
return sig * (1 - sig)
For begge aktiveringsfunktioner anvendes operationen på hele vektoren z samt på dens afledte. NumPy udfører automatisk beregningen elementvist, hvilket betyder, at hvert element i vektoren behandles uafhængigt.
For eksempel, hvis vektoren z indeholder tre elementer, beregnes den afledte som:
f′(z)=f′z1z2z3=f′(z1)f′(z2)f′(z3)Metoden backward()
Metoden backward() er ansvarlig for beregning af gradienterne ved hjælp af formlerne nedenfor:
a^{l-1} og zl gemmes som henholdsvis attributterne inputs og outputs i klassen Layer. Aktiveringsfunktionen f gemmes som attributten activation.
Når alle nødvendige gradienter er beregnet, kan vægte og biases opdateres, da de ikke længere er nødvendige for yderligere beregning:
Wlbl=Wl−α⋅dWl=bl−α⋅dblDerfor er learning_rate (α) en anden parameter for denne metode.
def backward(self, da, learning_rate):
dz = ...
d_weights = ...
d_biases = ...
da_prev = ...
self.weights -= learning_rate * d_weights
self.biases -= learning_rate * d_biases
return da_prev
*-operatoren udfører elementvis multiplikation, mens funktionen np.dot() udfører dot-produkt i NumPy. Attributten .T transponerer et array.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat