Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Haaste: Perceptronin Kouluttaminen | Osio
Neuroverkkojen Perusteet
Osio 1. Luku 17
single

single

bookHaaste: Perceptronin Kouluttaminen

Pyyhkäise näyttääksesi valikon

Ennen kuin jatkat perceptronin kouluttamista, muista, että se käyttää aiemmin käsiteltyä binääristä ristientropiahäviöfunktiota. Viimeinen keskeinen käsite ennen takaisinkytkennän (backpropagation) toteuttamista on tämän häviöfunktion derivaatan kaava verrattuna ulostuloaktivaatioihin, $a^n$. Alla on esitetty häviöfunktion ja sen derivaatan kaavat:

L=(ylog(y^)+(1y)log(1y^))dan=y^yy^(1y^)\begin{aligned} L &= -(y \log(\hat{y}) + (1-y) \log(1 - \hat{y}))\\ da^n &= \frac {\hat{y} - y} {\hat{y}(1 - \hat{y})} \end{aligned}

missä an=y^a^n = \hat{y}

Perceptronin koulutuksen oikeellisuuden varmistamiseksi fit()-metodi tulostaa myös keskimääräisen häviön jokaisella epookilla. Tämä lasketaan ottamalla keskiarvo häviöstä kaikille kyseisen epookin harjoitusesimerkeille:

for epoch in range(epochs):
    loss = 0

    for i in range(training_data.shape[0]):
        loss += -(target * np.log(output) + (1 - target) * np.log(1 - output))

average_loss = loss[0, 0] / training_data.shape[0]
print(f'Loss at epoch {epoch + 1}: {average_loss:.3f}')
L=1Ni=1N(yilog(y^i)+(1yi)log(1y^i))L = -\frac1N \sum_{i=1}^N (y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i))

Lopuksi, gradienttien laskentakaavat jokaisessa kerroksessa ovat seuraavat:

dzl=dalfl(zl)dWl=dzl(al1)Tdbl=dzldal1=(Wl)Tdzl\begin{aligned} dz^l &= da^l \odot f'^l(z^l)\\ dW^l &= dz^l \cdot (a^{l-1})^T\\ db^l &= dz^l\\ da^{l-1} &= (W^l)^T \cdot dz^l \end{aligned}

Toteutuksen yksityiskohtia muistettavaksi

Kun käännät näitä kaavoja Python-koodiksi backward()-metodia varten, muista aiemmissa luvuissa käsitellyt NumPy-operaatiot:

  • Operaattori \odot tarkoittaa alkiokohtaista kertolaskua, joka tehdään Pythonissa tavallisella *-operaattorilla.
  • Operaattori \cdot tarkoittaa pistetuloa (dot product), joka toteutetaan np.dot()-funktiolla.
  • Yläindeksi TT tarkoittaa matriisin transponointia, joka tehdään .T-attribuutilla.
  • Laskettaessa fl(zl)f'^l(z^l), voit kutsua kerroksen aktivointifunktion derivaattaa dynaamisesti käyttämällä self.activation.derivative(self.outputs).

Tämä tekee backward()-metodin yleisestä rakenteesta seuraavanlaisen:

def backward(self, da, learning_rate):
    dz = ... # using da and self.activation.derivative()
    d_weights = ... # using np.dot() and .T
    d_biases = ...
    da_prev = ...

    self.weights -= learning_rate * d_weights
    self.biases -= learning_rate * d_biases

    return da_prev

Vastaavasti, kun kokoat kaiken yhteen fit()-metodissa, muista, että sinun täytyy käydä verkko läpi taaksepäin virheen levittämiseksi. Yleinen rakenne näyttää tältä:

def fit(self, training_data, labels, epochs, learning_rate):
    # ... (Epoch loop and data shuffling) ...
            # Forward propagation
            output = ...

            # Computing the gradient of the loss function w.r.t. output (da^n)
            da = ...

            # Backward propagation through all layers
            for layer in self.layers[::-1]:
                da = ... # Call the backward() method of the layer

Esimerkkiharjoitusaineisto (X_train) sekä vastaavat luokat (y_train) on tallennettu NumPy-taulukoina tiedostoon utils.py. Lisäksi aktivointifunktioiden instanssit on määritelty siellä:

relu = ReLU()
sigmoid = Sigmoid()
Tehtävä

Pyyhkäise aloittaaksesi koodauksen

Tavoitteena on saattaa loppuun monikerroksisen perceptronin koulutusprosessi toteuttamalla takaisinkytkentä (backpropagation) ja päivittämällä mallin parametrit.

Noudata näitä vaiheita huolellisesti:

  1. Toteuta backward()-metodi Layer-luokkaan:
  • Laske seuraavat gradientit:
    • dz: tappion derivaatta suhteessa pre-aktivaatioarvoihin, käyttäen aktivointifunktion derivaattaa;
  • d_weights: tappion gradientti painojen suhteen, laskettuna dz:n ja transponoidun syötevektorin pistetulona;
    • d_biases: tappion gradientti bias-arvojen suhteen, yhtä suuri kuin dz;
  • da_prev: tappion gradientti edellisen kerroksen aktivaatioiden suhteen, saadaan kertomalla transponoitu painomatriisi dz:lla.
    • Päivitä painot ja bias-arvot käyttäen oppimisnopeutta.
  1. Täydennä fit()-metodi Perceptron-luokassa:
    • Laske mallin ulostulo kutsumalla forward()-metodia;
    • Laske tappio käyttäen ristientropia-kaavaa;
  • Laske danda^n — tappion derivaatta ulostuloaktivaation suhteen;
    • Käy kerrokset taaksepäin läpi ja suorita takaisinkytkentä kutsumalla jokaisen kerroksen backward()-metodia.
  1. Tarkista koulutuksen eteneminen:
  • Jos kaikki on toteutettu oikein, tappion tulisi vähentyä tasaisesti jokaisella epookilla, kun käytetään oppimisnopeutta 0.01.

Ratkaisu

Switch to desktopVaihda työpöytään todellista harjoitusta vartenJatka siitä, missä olet käyttämällä jotakin alla olevista vaihtoehdoista
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 17
single

single

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

some-alt