Implementering av Backpropagation
Generell tilnærming
Ved fremoverpropagering tar hvert lag l utdataene fra forrige lag, al−1, som input og beregner sine egne utdata. Derfor tar forward()
-metoden i Layer
-klassen vektoren av forrige utdata 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 struktureres som klasser i stedet for frittstående funksjoner. Dette gjør det mulig å definere både:
- Selve aktiveringsfunksjonen (implementert via
__call__()
-metoden), slik at den kan brukes direkte iLayer
-klassen medself.activation(z)
; - Dens derivat (implementert via
derivative()
-metoden), som gir effektiv bakoverpropagering og brukes iLayer
-klassen somself.activation.derivative(z)
.
Ved å strukturere aktiveringsfunksjoner som objekter kan vi enkelt sende dem til Layer
-klassen og bruke dem dynamisk.
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
Den deriverte av sigmoid-aktiveringsfunksjonen 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 disse aktiveringsfunksjonene anvendes de på hele vektoren z, og det samme gjelder for deres deriverte. NumPy anvender operasjonen på hvert element i vektoren internt. For eksempel, hvis vektoren z inneholder 3 elementer, er derivasjonen som følger:
f′(z)=f′(z1z2z3)=f′(z1)f′(z2)f′(z3)Metoden backward()
Metoden backward()
er ansvarlig for å beregne gradientene ved å bruke 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 prikkprodukt 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
Can you explain how the backward() method uses the stored attributes in the Layer class?
What is the purpose of the activation function's derivative in backpropagation?
Could you provide an example of how to use these activation function classes in a neural network layer?
Awesome!
Completion rate improved to 4
Implementering av Backpropagation
Sveip for å vise menyen
Generell tilnærming
Ved fremoverpropagering tar hvert lag l utdataene fra forrige lag, al−1, som input og beregner sine egne utdata. Derfor tar forward()
-metoden i Layer
-klassen vektoren av forrige utdata 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 struktureres som klasser i stedet for frittstående funksjoner. Dette gjør det mulig å definere både:
- Selve aktiveringsfunksjonen (implementert via
__call__()
-metoden), slik at den kan brukes direkte iLayer
-klassen medself.activation(z)
; - Dens derivat (implementert via
derivative()
-metoden), som gir effektiv bakoverpropagering og brukes iLayer
-klassen somself.activation.derivative(z)
.
Ved å strukturere aktiveringsfunksjoner som objekter kan vi enkelt sende dem til Layer
-klassen og bruke dem dynamisk.
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
Den deriverte av sigmoid-aktiveringsfunksjonen 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 disse aktiveringsfunksjonene anvendes de på hele vektoren z, og det samme gjelder for deres deriverte. NumPy anvender operasjonen på hvert element i vektoren internt. For eksempel, hvis vektoren z inneholder 3 elementer, er derivasjonen som følger:
f′(z)=f′(z1z2z3)=f′(z1)f′(z2)f′(z3)Metoden backward()
Metoden backward()
er ansvarlig for å beregne gradientene ved å bruke 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 prikkprodukt i NumPy. Attributtet .T
transponerer et array.
Takk for tilbakemeldingene dine!