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