Takaisinkytkennän Toteutus
Yleinen lähestymistapa
Eteenpäin suuntautuvassa laskennassa jokainen kerros l ottaa edellisen kerroksen tuottamat arvot, al−1, syötteenä ja laskee omat lähtöarvonsa. Tämän vuoksi forward()-luokan Layer-metodi ottaa edellisen kerroksen lähtövektorin ainoana parametrinaan, kun taas muu tarvittava tieto säilytetään luokan sisällä.
Takaisinlevityksessä jokainen kerros l tarvitsee vain dal laskeakseen vastaavat gradientit ja palauttaakseen dal−1, joten backward()-metodi ottaa dal-vektorin parametrinaan. Loput tarvittavat tiedot ovat jo tallennettuina Layer-luokkaan.
Aktivointifunktioiden derivaatat
Koska aktivointifunktioiden derivaattoja tarvitaan takaisinlevityksessä, aktivointifunktiot kuten ReLU ja sigmoid tulisi toteuttaa luokkina erillisten funktioiden sijaan. Tämä mahdollistaa sekä:
- Varsinaisen aktivointifunktion (toteutettu
__call__()-metodilla), jolloin sitä voidaan käyttää suoraanLayer-luokassa muodossaself.activation(z); - Sen derivaatan (toteutettu
derivative()-metodilla), mikä mahdollistaa tehokkaan takaisinlevityksen ja käytetäänLayer-luokassa muodossaself.activation.derivative(z).
Rakentamalla aktivointifunktiot olioiksi ne voidaan helposti välittää Layer-luokalle ja käyttää dynaamisesti.
ReLU
ReLU-aktivointifunktion derivaatta on seuraava, missä zi on esiaaktivaatioiden vektorin z alkio:
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
Sigmoid-aktivointifunktion derivaatta on seuraava:
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)
Molempia näitä aktivointifunktioita sovelletaan koko vektoriin z, samoin niiden derivaattoja. NumPy suorittaa operaation automaattisesti jokaiselle vektorin alkiolle. Esimerkiksi, jos vektori z sisältää 3 alkiota, derivointi tapahtuu seuraavasti:
f′(z)=f′(z1z2z3)=f′(z1)f′(z2)f′(z3)backward()-metodi
backward()-metodi vastaa gradienttien laskemisesta alla olevien kaavojen mukaisesti:
a^{l-1} ja zl tallennetaan inputs- ja outputs-attribuutteihin Layer-luokassa. Aktivointifunktio f tallennetaan activation-attribuuttiin.
Kun kaikki tarvittavat gradientit on laskettu, painot ja biasit voidaan päivittää, koska niitä ei enää tarvita jatkolaskentaan:
Wlbl=Wl−α⋅dWl=bl−α⋅dblTäten learning_rate (α) on toinen tämän metodin parametri.
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
Operaattori * suorittaa alkiokohtaisen kertolaskun, kun taas funktio np.dot() suorittaa pistetulon NumPyssa. Attribuutti .T transponoi taulukon.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
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
Takaisinkytkennän Toteutus
Pyyhkäise näyttääksesi valikon
Yleinen lähestymistapa
Eteenpäin suuntautuvassa laskennassa jokainen kerros l ottaa edellisen kerroksen tuottamat arvot, al−1, syötteenä ja laskee omat lähtöarvonsa. Tämän vuoksi forward()-luokan Layer-metodi ottaa edellisen kerroksen lähtövektorin ainoana parametrinaan, kun taas muu tarvittava tieto säilytetään luokan sisällä.
Takaisinlevityksessä jokainen kerros l tarvitsee vain dal laskeakseen vastaavat gradientit ja palauttaakseen dal−1, joten backward()-metodi ottaa dal-vektorin parametrinaan. Loput tarvittavat tiedot ovat jo tallennettuina Layer-luokkaan.
Aktivointifunktioiden derivaatat
Koska aktivointifunktioiden derivaattoja tarvitaan takaisinlevityksessä, aktivointifunktiot kuten ReLU ja sigmoid tulisi toteuttaa luokkina erillisten funktioiden sijaan. Tämä mahdollistaa sekä:
- Varsinaisen aktivointifunktion (toteutettu
__call__()-metodilla), jolloin sitä voidaan käyttää suoraanLayer-luokassa muodossaself.activation(z); - Sen derivaatan (toteutettu
derivative()-metodilla), mikä mahdollistaa tehokkaan takaisinlevityksen ja käytetäänLayer-luokassa muodossaself.activation.derivative(z).
Rakentamalla aktivointifunktiot olioiksi ne voidaan helposti välittää Layer-luokalle ja käyttää dynaamisesti.
ReLU
ReLU-aktivointifunktion derivaatta on seuraava, missä zi on esiaaktivaatioiden vektorin z alkio:
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
Sigmoid-aktivointifunktion derivaatta on seuraava:
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)
Molempia näitä aktivointifunktioita sovelletaan koko vektoriin z, samoin niiden derivaattoja. NumPy suorittaa operaation automaattisesti jokaiselle vektorin alkiolle. Esimerkiksi, jos vektori z sisältää 3 alkiota, derivointi tapahtuu seuraavasti:
f′(z)=f′(z1z2z3)=f′(z1)f′(z2)f′(z3)backward()-metodi
backward()-metodi vastaa gradienttien laskemisesta alla olevien kaavojen mukaisesti:
a^{l-1} ja zl tallennetaan inputs- ja outputs-attribuutteihin Layer-luokassa. Aktivointifunktio f tallennetaan activation-attribuuttiin.
Kun kaikki tarvittavat gradientit on laskettu, painot ja biasit voidaan päivittää, koska niitä ei enää tarvita jatkolaskentaan:
Wlbl=Wl−α⋅dWl=bl−α⋅dblTäten learning_rate (α) on toinen tämän metodin parametri.
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
Operaattori * suorittaa alkiokohtaisen kertolaskun, kun taas funktio np.dot() suorittaa pistetulon NumPyssa. Attribuutti .T transponoi taulukon.
Kiitos palautteestasi!