Implementatie van Backpropagation
Algemene aanpak
Bij voorwaartse propagatie neemt elke laag l de uitgangen van de vorige laag, al−1, als invoer en berekent zijn eigen uitgangen. Daarom neemt de forward()
-methode van de Layer
-klasse de vector van vorige uitgangen als enige parameter, terwijl de overige benodigde informatie binnen de klasse wordt opgeslagen.
Bij achterwaartse propagatie heeft elke laag l alleen dal nodig om de respectievelijke gradiënten te berekenen en dal−1 terug te geven, dus de backward()
-methode neemt de dal-vector als parameter. De rest van de benodigde informatie is al opgeslagen in de Layer
-klasse.
Afgeleiden van activatiefuncties
Omdat afgeleiden van activatiefuncties nodig zijn voor achterwaartse propagatie, moeten activatiefuncties zoals ReLU en sigmoid worden opgezet als klassen in plaats van losse functies. Dit stelt ons in staat om zowel:
- De activatiefunctie zelf (geïmplementeerd via de
__call__()
-methode), zodat deze direct kan worden toegepast in deLayer
-klasse metself.activation(z)
; - De afgeleide ervan (geïmplementeerd via de
derivative()
-methode), wat efficiënte achterwaartse propagatie mogelijk maakt en wordt gebruikt in deLayer
-klasse alsself.activation.derivative(z)
.
Door activatiefuncties als objecten te structureren, kunnen we ze eenvoudig doorgeven aan de Layer
-klasse en dynamisch gebruiken.
ReLu
De afgeleide van de ReLU-activatiefunctie is als volgt, waarbij zi een element is van de vector van pre-activaties 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
De afgeleide van de sigmoid activatiefunctie is als volgt:
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)
Voor beide activatiefuncties passen we deze toe op de volledige vector z, evenals hun afgeleiden. NumPy past de bewerking intern toe op elk element van de vector. Bijvoorbeeld, als de vector z 3 elementen bevat, is de afleiding als volgt:
f′(z)=f′(z1z2z3)=f′(z1)f′(z2)f′(z3)De backward()-methode
De backward()
-methode is verantwoordelijk voor het berekenen van de gradiënten met behulp van de onderstaande formules:
a^{l-1} en zl worden respectievelijk opgeslagen als de attributen inputs
en outputs
in de Layer
-klasse. De activatiefunctie f wordt opgeslagen als het attribuut activation
.
Zodra alle benodigde gradiënten zijn berekend, kunnen de gewichten en biases worden bijgewerkt, omdat ze niet langer nodig zijn voor verdere berekeningen:
Wlbl=Wl−α⋅dWl=bl−α⋅dblDaarom is learning_rate
(α) een andere parameter van deze methode.
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
De *
-operator voert elementgewijze vermenigvuldiging uit, terwijl de functie np.dot()
een dotproduct uitvoert in NumPy. Het attribuut .T
transponeert een array.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 4
Implementatie van Backpropagation
Veeg om het menu te tonen
Algemene aanpak
Bij voorwaartse propagatie neemt elke laag l de uitgangen van de vorige laag, al−1, als invoer en berekent zijn eigen uitgangen. Daarom neemt de forward()
-methode van de Layer
-klasse de vector van vorige uitgangen als enige parameter, terwijl de overige benodigde informatie binnen de klasse wordt opgeslagen.
Bij achterwaartse propagatie heeft elke laag l alleen dal nodig om de respectievelijke gradiënten te berekenen en dal−1 terug te geven, dus de backward()
-methode neemt de dal-vector als parameter. De rest van de benodigde informatie is al opgeslagen in de Layer
-klasse.
Afgeleiden van activatiefuncties
Omdat afgeleiden van activatiefuncties nodig zijn voor achterwaartse propagatie, moeten activatiefuncties zoals ReLU en sigmoid worden opgezet als klassen in plaats van losse functies. Dit stelt ons in staat om zowel:
- De activatiefunctie zelf (geïmplementeerd via de
__call__()
-methode), zodat deze direct kan worden toegepast in deLayer
-klasse metself.activation(z)
; - De afgeleide ervan (geïmplementeerd via de
derivative()
-methode), wat efficiënte achterwaartse propagatie mogelijk maakt en wordt gebruikt in deLayer
-klasse alsself.activation.derivative(z)
.
Door activatiefuncties als objecten te structureren, kunnen we ze eenvoudig doorgeven aan de Layer
-klasse en dynamisch gebruiken.
ReLu
De afgeleide van de ReLU-activatiefunctie is als volgt, waarbij zi een element is van de vector van pre-activaties 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
De afgeleide van de sigmoid activatiefunctie is als volgt:
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)
Voor beide activatiefuncties passen we deze toe op de volledige vector z, evenals hun afgeleiden. NumPy past de bewerking intern toe op elk element van de vector. Bijvoorbeeld, als de vector z 3 elementen bevat, is de afleiding als volgt:
f′(z)=f′(z1z2z3)=f′(z1)f′(z2)f′(z3)De backward()-methode
De backward()
-methode is verantwoordelijk voor het berekenen van de gradiënten met behulp van de onderstaande formules:
a^{l-1} en zl worden respectievelijk opgeslagen als de attributen inputs
en outputs
in de Layer
-klasse. De activatiefunctie f wordt opgeslagen als het attribuut activation
.
Zodra alle benodigde gradiënten zijn berekend, kunnen de gewichten en biases worden bijgewerkt, omdat ze niet langer nodig zijn voor verdere berekeningen:
Wlbl=Wl−α⋅dWl=bl−α⋅dblDaarom is learning_rate
(α) een andere parameter van deze methode.
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
De *
-operator voert elementgewijze vermenigvuldiging uit, terwijl de functie np.dot()
een dotproduct uitvoert in NumPy. Het attribuut .T
transponeert een array.
Bedankt voor je feedback!