Takaisinkytkennän Toteutus
Yleinen lähestymistapa
Eteenpäin suuntautuvassa laskennassa jokainen kerros l ottaa edellisen kerroksen tuottamat arvot, al−1, syötteinä 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äin suuntautuvassa laskennassa jokainen kerros l tarvitsee vain dal laskeakseen vastaavat gradientit ja palauttaakseen dal−1, joten backward()
-metodi ottaa parametrinaan dal-vektorin. Loput tarvittavasta tiedosta on jo tallennettu 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ä mahdollistaa sekä:
- Itse aktivointifunktion (toteutettu
__call__()
-metodilla), jolloin sitä voidaan käyttää suoraanLayer
-luokassa muodossaself.activation(z)
; - Sen derivaatan (toteutettu
derivative()
-metodilla), mikä mahdollistaa tehokkaan taaksepäin suuntautuvan laskennan ja käytö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 käytetään 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 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äin suuntautuvassa laskennassa jokainen kerros l ottaa edellisen kerroksen tuottamat arvot, al−1, syötteinä 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äin suuntautuvassa laskennassa jokainen kerros l tarvitsee vain dal laskeakseen vastaavat gradientit ja palauttaakseen dal−1, joten backward()
-metodi ottaa parametrinaan dal-vektorin. Loput tarvittavasta tiedosta on jo tallennettu 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ä mahdollistaa sekä:
- Itse aktivointifunktion (toteutettu
__call__()
-metodilla), jolloin sitä voidaan käyttää suoraanLayer
-luokassa muodossaself.activation(z)
; - Sen derivaatan (toteutettu
derivative()
-metodilla), mikä mahdollistaa tehokkaan taaksepäin suuntautuvan laskennan ja käytö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 käytetään 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 np.dot()
-funktio suorittaa pistetulon NumPyssa. Attribuutti .T
transponoi taulukon.
Kiitos palautteestasi!