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öarvovektorin ainoana parametrinaan, kun taas muu tarvittava tieto on tallennettu luokan sisälle.
Taaksepäin suuntautuvassa laskennassa jokainen kerros l tarvitsee vain dal laskeakseen vastaavat gradientit ja palauttaakseen dal−1, joten backward()-metodi ottaa parametrinaan dal-vektorin. Loput tarvittavat tiedot ovat jo tallennettuina Layer-luokkaan.
Aktivointifunktioiden derivaatat
Koska aktivointifunktioiden derivaattoja tarvitaan taaksepäin suuntautuvassa laskennassa, aktivointifunktiot kuten ReLU ja sigmoid kannattaa 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äin suuntautuvassa vaiheessaself.activation.derivative(z).
Aktivointifunktioiden esittäminen olioina helpottaa niiden siirtämistä eri kerroksiin ja dynaamista käyttöä sekä eteen- että taaksepäin suuntautuvassa laskennassa.
ReLu
ReLU-aktivointifunktion derivaatta on seuraava, missä zi on vektorin z esiaktivaatioiden 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)
Molempien aktivointifunktioiden kohdalla operaatio suoritetaan koko vektorille z sekä sen derivaatalle. 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 jatkolaskennassa:
Wlbl=Wl−α⋅dWl=bl−α⋅dblSiksi learning_rate (α) on toinen tämän menetelmän 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 dot-tulon NumPyssa. Attribuutti .T transponoi taulukon.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
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öarvovektorin ainoana parametrinaan, kun taas muu tarvittava tieto on tallennettu luokan sisälle.
Taaksepäin suuntautuvassa laskennassa jokainen kerros l tarvitsee vain dal laskeakseen vastaavat gradientit ja palauttaakseen dal−1, joten backward()-metodi ottaa parametrinaan dal-vektorin. Loput tarvittavat tiedot ovat jo tallennettuina Layer-luokkaan.
Aktivointifunktioiden derivaatat
Koska aktivointifunktioiden derivaattoja tarvitaan taaksepäin suuntautuvassa laskennassa, aktivointifunktiot kuten ReLU ja sigmoid kannattaa 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äin suuntautuvassa vaiheessaself.activation.derivative(z).
Aktivointifunktioiden esittäminen olioina helpottaa niiden siirtämistä eri kerroksiin ja dynaamista käyttöä sekä eteen- että taaksepäin suuntautuvassa laskennassa.
ReLu
ReLU-aktivointifunktion derivaatta on seuraava, missä zi on vektorin z esiaktivaatioiden 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)
Molempien aktivointifunktioiden kohdalla operaatio suoritetaan koko vektorille z sekä sen derivaatalle. 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 jatkolaskennassa:
Wlbl=Wl−α⋅dWl=bl−α⋅dblSiksi learning_rate (α) on toinen tämän menetelmän 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 dot-tulon NumPyssa. Attribuutti .T transponoi taulukon.
Kiitos palautteestasi!