Opdatering af vægte i et simpelt neuralt netværk med to skjulte lag

A-niveau
Kort
  • Simple neurale netværk.
  • Sigmoid aktiveringsfunktion.
  • Gradientnedstigning.

Forudsætningerne kan med fordel dækkes ved hjælp af noten om simple neurale netværk, da notationen derfra vil blive anvendt i dette forløb.

Tidsforbrug: Ca. 90 minutter for den teoretiske del med manuellen beregninger. Yderligere 30-60 minutter for den mere eksperimentelle del med brug af app til at træne netværket.

Formål

Formålet med dette forløb er gennem detaljerede beregninger at forstå, hvordan vægtene i et simpelt neuralt netværk til klassifikation med to skjulte lag opdateres med brug af sigmoid som aktiveringsfunktion og gradientnedstigning med squared error som tabsfunktion.

Dette kan ses som et skridt på vejen til at forstå, hvordan vægtene opdateres i et generelt neuralt netværk.

Et meget lille datasæt

I neurale netværk er der ofte rigtige mange inputvariable (features), rigtigt mange vægte og rigtig mange træningsdata.

For bedre at forstå, hvordan vægtene opdateres i et neuralt netværk, vil vi her se på et meget lille eksempel, så det manuelt er muligt at lave opdateringen af vægtene.

Vi vil lave et netværk med 2 inputvariable (\(x_1\) og \(x_2\)), 1 neuron i det første skjulte lag (\(y\)), 1 neuron i det andet skjulte lag (\(z\)) og 1 neuron i outputlaget (\(o\)). Netværket er illustreret i figur 1.

Figur 1: Grafisk illustration af et neuralt netværk med 2 inputvariable og to skjulte lag, som hver består af én neuron.

Konkret vil vi se på to features \(x_1\) og \(x_2\) og en targetværdi \(t\) ud fra følgende træningsdatasæt:

\(x_1\) \(x_2\) \(t\)
1 2 0
2 3 1
3 5 0

Vi vælger en learning rate på

\[\eta = 0.1,\]

sigmoid-funktionen som aktiveringsfunktion mellem lagene

\[\sigma(x)=\frac{1}{1+\mathrm{e}^{-x}}\] og squared error som tabsfunktion

\[E = \frac{1}{2} \sum_{m=1}^{M} \left (t^{(m)}-o^{(m)} \right)^2\]

Endeligt vælger vi alle startvægtene til at være \(0.5\), så \[ r_0=0.5 \textrm{ (bias)},\qquad r_1=0.5,\qquad r_2=0.5 \]

\[ v_0=0.5 \textrm{ (bias)}, \qquad v_1=0.5\]

\[ w_0=0.5 \textrm{ (bias)}, \qquad w_1=0.5 \]

Opdateringsregler

Fra noten om simple neurale netværk har vi opdateringsreglerne, som vi nu skal til at anvende på det konkrete træningsdatasæt.

Først udregnes feedforward-udtrykkene: \[ \begin{aligned} y^{(m)} &= \sigma (r_0 + r_1 \cdot x_1^{(m)} + r_2 \cdot x_2^{(m)} + \cdots + r_n \cdot x_n^{(m)}) \\ z^{(m)} &= \sigma (v_0 + v_1 \cdot y^{(m)}) \\ o^{(m)} &= \sigma(w_0 + w_1 \cdot z^{(m)}) \end{aligned} \] Herefter beregnes:

\[ \begin{aligned} \delta_w^{(m)} &= (t^{(m)}-o^{(m)} ) \cdot o^{(m)} \cdot (1-o^{(m)}) \\ \delta_v^{(m)} &= \delta_w^{(m)}\cdot w_1 \cdot z^{(m)} \cdot (1-z^{(m)}) \\ \delta_r^{(m)} &= \delta_v^{(m)} \cdot v_1 \cdot y^{(m)} \cdot (1-y^{(m)}) \end{aligned} \] Vægtene kan nu opdateres:

\(w\)-vægtene: \[ \begin{aligned} w_0^{\textrm{ny}} & \leftarrow w_0 + \eta \cdot \sum_{m=1}^{M} \delta_w^{(m)} \cdot 1\\ w_1^{\textrm{ny}} & \leftarrow w_1 + \eta \cdot \sum_{m=1}^{M} \delta_w^{(m)} \cdot z^{(m)}\\ \end{aligned} \]

\(v\)-vægtene: \[ \begin{aligned} v_0^{\textrm{ny}} & \leftarrow v_0 + \eta \cdot \sum_{m=1}^{M} \delta_v^{(m)}\cdot 1\\ v_1^{\textrm{ny}} & \leftarrow v_1 + \eta \cdot \sum_{m=1}^{M} \delta_v^{(m)}\cdot y^{(m)}\\ \end{aligned} \]

\(r\)-vægtene: \[ \begin{aligned} r_0^{\textrm{ny}} & \leftarrow r_0 + \eta \cdot \sum_{m=1}^M \delta_r^{(m)} \cdot 1 \\ r_1^{\textrm{ny}} & \leftarrow r_1 + \eta \cdot \sum_{m=1}^M \delta_r^{(m)} \cdot x_1^{(m)} \\ & \ \ \vdots & \\ r_n^{\textrm{ny}} & \leftarrow r_n + \eta \cdot \sum_{m=1}^M \delta_r^{(m)} \cdot x_n^{(m)} \end{aligned} \]

Beregninger

NoteOpgave 1: Feedforward fra \(x\) til \(y\) lag
  • Udregn \[r_0 + r_1 \cdot x_1^{(m)} + r_2 \cdot x_2^{(m)}\] for hver af de 3 træningseksempler.

  • Udregn \[y^{(m)}=\sigma(r_0 +r_1 \cdot x_1^{(m)} + r_2 \cdot x_2^{(m)})\] for hver af de 3 træningseksempler.

NoteOpgave 2: Feedforward fra \(y\) til \(z\) lag
  • Udregn på tilsvarende vis \(z^{(m)}\) for hver af de 3 træningseksempler.
NoteOpgave 3: Feedforward fra \(z\) til \(o\) lag
  • Udregn på tilsvarende vis \(o^{(m)}\) for hver af de 3 træningseksempler.
NoteOpgave 4: Opdatering af \(w\)-vægtene
  • Udregn \[\delta_w^{(m)} = (t^{(m)}-o^{(m)}) \cdot o^{(m)} \cdot (1-o^{(m)})\] for hver af de 3 træningseksempler.

  • Udregn \[\sum_{m=1}^{3} \delta_w^{(m)}\]

  • Opdatér \(w_0\)-vægten \[w_0^{ny} \leftarrow w_0 + \eta \cdot \sum_{m=1}^{3} \delta_w^{(m)}\]

  • Udregn \[\sum_{m=1}^{3} \delta_w^{(m)} \cdot z^{(m)}\]

  • Opdatér \(w_1\)-vægten \[w_1^{ny} \leftarrow w_1 + \eta \cdot \sum_{m=1}^3 \delta_w^{(m)} \cdot z^{(m)}\]

NoteOpgave 5: Opdatering af \(v\)-vægtene
  • Lav tilsvarende udregninger og opdatering af \(v\)-vægtene.
NoteOpgave 6: Opdatering af \(r\)-vægtene
  • Lav tilsvarende udregninger og opdatering af \(r\)-vægtene.

Et større datasæt

Det giver naturligvis ikke så meget mening med så lille et datasæt, og da slet ikke med blot én opdatering af vægtene. Lad os derfor se på et større datasæt, hvor vi laver mange iterationer med opdateringer, så vi kan se, om det neurale netværk reelt kan noget.

Lad os se, om vi kan få et neuralt netværk til at "opdage" følgende sammenhæng ud fra en lidt større mængde træningsdata.

Hvis \(4 < x_1 + x_2 < 7\) er targetværdien er \(1\), ellers er targetværdien \(0\). Det stemmer med det meget lille datasæt, vi indtil nu har anvendt.

I denne Excel-fil er der 200 linjer med træningsdata, som vi vil bruge til at træne et neutralt netværk med 2 skjulte lag. Men vi vil helt sikkert ikke selv lave opdateringerne af vægtene manuelt. I stedet vil vi bruge denne app.

NoteOpgave 7: Træn netværket
  • Indlæs træningsdata fra Excelfilen.
  • Vælg "t" som target-variabel og "x1" og "x2" som feature-variable.
  • Vælg 2 lag med hver 1 neuron.
  • Sæt startvægtene til 0,1.
  • Sæt learning rate til 0,01.
  • Vælg sigmoid og squared error.
  • Træn nætværket med 5000 iterationer.
  • Notér værdien af tabsfunktionen.

Hvis du har lavet forløbet Skibidi toilet om vurdering af værdien af tabsfunktionen er for stor, kan du lave opgave 8. Ellers fortsæt med opgave 9.

NoteOpgave 8: Vurder på værdien af tabsfunktionen
  • Undersøg i datasættet i Excelfilen, hvor mange af datapunkterne, der har \(t=1\).
  • Brug metoden fra det nævnte forløb til at vurdere, om den fundne værdi af tabsfunktionen måske er for stor, eller om den godt kunne være passende lille.
NoteOpgave 9: Forbedringer af netværksstrukturen
  • Øg antal neuroner i hvert lag til 3.
  • Fjern værdien for startvægte, derved bliver vægtene sat tilfældigt og dermed forskelligt. Med flere neuroner i samme lag, fungerer det meget ringe med samme værdi på alle vægtene.
  • Ændr antal iterationer til 10000.
  • Træn netværket.
  • Gentag træningen flere gange, hvilket giver lidt forskellige resultater på grund af de tilfældige startvægte. Notér hver gang værdien af tabsfunktionen. Er værdien af tabsfunktionen blevet mindre, end den du fandt i opgave 7?
  • Overvej, hvorfor grafen ikke ser "pæn" ud.
NoteOpgave 10: Yderligere forbedringer
  • Ændr antal iterationer til 100000.
  • Ændr learning-rate til 0,001.
  • Træn netværket (det tager noget længere tid)
  • Prøv eventuelt med endnu flere iterationer, hvis du har tålmodighed til det.
  • Hvorfor ser grafen "pænere" ud end i opgave 9?
  • Sammenlign værdien af tabsfunktionen med dem, du fandt i opgave 9.

Delvis facitliste

Facitliste.