Implementering av Backpropagation
Generell tilnærming
Ved fremoverpropagering tar hvert lag l utgangene fra forrige lag, al−1, som input og beregner sine egne utganger. Derfor tar forward()-metoden i Layer-klassen vektoren av forrige utganger som eneste parameter, mens resten av nødvendig informasjon lagres i klassen.
Ved bakoverpropagering trenger hvert lag l kun dal for å beregne de respektive gradientene og returnere dal−1, så backward()-metoden tar dal-vektoren som parameter. Resten av nødvendig informasjon er allerede lagret i Layer-klassen.
Derivater av aktiveringsfunksjoner
Siden derivater av aktiveringsfunksjoner er nødvendige for bakoverpropagering, bør aktiveringsfunksjoner som ReLU og sigmoid implementeres som klasser i stedet for frittstående funksjoner. Denne strukturen gjør det mulig å definere begge komponentene tydelig:
- Selve aktiveringsfunksjonen — implementert med
__call__()-metoden, slik at den kan brukes direkte iLayer-klassen medself.activation(z); - Dens derivat — implementert med
derivative()-metoden, som gir effektiv beregning under bakoverpropagering viaself.activation.derivative(z).
Å representere aktiveringsfunksjoner som objekter gjør det enkelt å sende dem til ulike lag og bruke dem dynamisk under både fremover- og bakoverpropagering.
ReLu
Derivatet av ReLU-aktiveringsfunksjonen er som følger, der zi er et element i vektoren av 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
Derivert av sigmoid aktiveringsfunksjon 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 aktiveringsfunksjonene blir operasjonen brukt på hele vektoren z, samt på dens derivert. NumPy utfører automatisk beregningen elementvis, noe som betyr at hvert element i vektoren behandles uavhengig.
For eksempel, hvis vektoren z inneholder tre elementer, beregnes den deriverte slik:
f′(z)=f′z1z2z3=f′(z1)f′(z2)f′(z3)Metoden backward()
Metoden backward() er ansvarlig for beregning av gradientene ved hjelp av følgende formler:
a^{l-1} og zl lagres som henholdsvis inputs og outputs attributter i Layer-klassen. Aktiveringsfunksjonen f lagres som attributtet activation.
Når alle nødvendige gradienter er beregnet, kan vektene og biasene oppdateres siden de ikke lenger trengs for videre beregning:
Wlbl=Wl−α⋅dWl=bl−α⋅dblDermed er learning_rate (α) en annen parameter for denne metoden.
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 * utfører elementvis multiplikasjon, mens funksjonen np.dot() utfører skalarprodukt i NumPy. Attributtet .T transponerer et array.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Awesome!
Completion rate improved to 4
Implementering av Backpropagation
Sveip for å vise menyen
Generell tilnærming
Ved fremoverpropagering tar hvert lag l utgangene fra forrige lag, al−1, som input og beregner sine egne utganger. Derfor tar forward()-metoden i Layer-klassen vektoren av forrige utganger som eneste parameter, mens resten av nødvendig informasjon lagres i klassen.
Ved bakoverpropagering trenger hvert lag l kun dal for å beregne de respektive gradientene og returnere dal−1, så backward()-metoden tar dal-vektoren som parameter. Resten av nødvendig informasjon er allerede lagret i Layer-klassen.
Derivater av aktiveringsfunksjoner
Siden derivater av aktiveringsfunksjoner er nødvendige for bakoverpropagering, bør aktiveringsfunksjoner som ReLU og sigmoid implementeres som klasser i stedet for frittstående funksjoner. Denne strukturen gjør det mulig å definere begge komponentene tydelig:
- Selve aktiveringsfunksjonen — implementert med
__call__()-metoden, slik at den kan brukes direkte iLayer-klassen medself.activation(z); - Dens derivat — implementert med
derivative()-metoden, som gir effektiv beregning under bakoverpropagering viaself.activation.derivative(z).
Å representere aktiveringsfunksjoner som objekter gjør det enkelt å sende dem til ulike lag og bruke dem dynamisk under både fremover- og bakoverpropagering.
ReLu
Derivatet av ReLU-aktiveringsfunksjonen er som følger, der zi er et element i vektoren av 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
Derivert av sigmoid aktiveringsfunksjon 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 aktiveringsfunksjonene blir operasjonen brukt på hele vektoren z, samt på dens derivert. NumPy utfører automatisk beregningen elementvis, noe som betyr at hvert element i vektoren behandles uavhengig.
For eksempel, hvis vektoren z inneholder tre elementer, beregnes den deriverte slik:
f′(z)=f′z1z2z3=f′(z1)f′(z2)f′(z3)Metoden backward()
Metoden backward() er ansvarlig for beregning av gradientene ved hjelp av følgende formler:
a^{l-1} og zl lagres som henholdsvis inputs og outputs attributter i Layer-klassen. Aktiveringsfunksjonen f lagres som attributtet activation.
Når alle nødvendige gradienter er beregnet, kan vektene og biasene oppdateres siden de ikke lenger trengs for videre beregning:
Wlbl=Wl−α⋅dWl=bl−α⋅dblDermed er learning_rate (α) en annen parameter for denne metoden.
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 * utfører elementvis multiplikasjon, mens funksjonen np.dot() utfører skalarprodukt i NumPy. Attributtet .T transponerer et array.
Takk for tilbakemeldingene dine!