Takaisinkytkennän Toteutus
Yleinen lähestymistapa
Eteenpäinlevityksessä jokainen kerros l ottaa edellisen kerroksen al−1 tuottamat arvot syötteenä ja laskee omat lähtönsä. 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ä.
Taaksepäinlevityksessä 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 taaksepäinlevityksessä, aktivointifunktiot kuten ReLU ja sigmoid tulisi toteuttaa luokkina erillisten funktioiden sijaan. Tämä rakenne mahdollistaa molempien osien selkeän määrittelyn:
- Varsinainen aktivointifunktio — toteutetaan
__call__()-metodilla, jolloin sitä voidaan käyttää suoraanLayer-luokassa muodossaself.activation(z); - Sen derivaatta — toteutetaan
derivative()-metodilla, mikä mahdollistaa tehokkaan laskennan taaksepäinlevityksen aikanaself.activation.derivative(z).
Aktivointifunktioiden esittäminen olioina helpottaa niiden siirtämistä eri kerroksiin ja dynaamista käyttöä sekä eteen- että taaksepäinlevityksessä.
ReLu
ReLU-aktivointifunktion derivaatta on seuraava, missä zi on esiactivaatioiden 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)
Molemmissa aktivointifunktioissa operaatio kohdistetaan koko vektoriin z sekä sen derivaattaan. NumPy suorittaa laskennan alkiokohtaisesti, eli jokainen vektorin alkio käsitellään itsenäisesti.
Esimerkiksi, jos vektori z sisältää kolme alkiota, derivaatta lasketaan 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 np.dot()-funktio 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
Awesome!
Completion rate improved to 4
Takaisinkytkennän Toteutus
Pyyhkäise näyttääksesi valikon
Yleinen lähestymistapa
Eteenpäinlevityksessä jokainen kerros l ottaa edellisen kerroksen al−1 tuottamat arvot syötteenä ja laskee omat lähtönsä. 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ä.
Taaksepäinlevityksessä 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 taaksepäinlevityksessä, aktivointifunktiot kuten ReLU ja sigmoid tulisi toteuttaa luokkina erillisten funktioiden sijaan. Tämä rakenne mahdollistaa molempien osien selkeän määrittelyn:
- Varsinainen aktivointifunktio — toteutetaan
__call__()-metodilla, jolloin sitä voidaan käyttää suoraanLayer-luokassa muodossaself.activation(z); - Sen derivaatta — toteutetaan
derivative()-metodilla, mikä mahdollistaa tehokkaan laskennan taaksepäinlevityksen aikanaself.activation.derivative(z).
Aktivointifunktioiden esittäminen olioina helpottaa niiden siirtämistä eri kerroksiin ja dynaamista käyttöä sekä eteen- että taaksepäinlevityksessä.
ReLu
ReLU-aktivointifunktion derivaatta on seuraava, missä zi on esiactivaatioiden 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)
Molemmissa aktivointifunktioissa operaatio kohdistetaan koko vektoriin z sekä sen derivaattaan. NumPy suorittaa laskennan alkiokohtaisesti, eli jokainen vektorin alkio käsitellään itsenäisesti.
Esimerkiksi, jos vektori z sisältää kolme alkiota, derivaatta lasketaan 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 np.dot()-funktio suorittaa pistetulon NumPyssa. Attribuutti .T transponoi taulukon.
Kiitos palautteestasi!