Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

We zagen dat het perceptron-model (en bijgevolg ook het logistische regressiemodel) fundamentele problemen heeft om niet-lineair scheidbare problemen op te lossen. Een specifieke remedie is om meerdere perceptrons samen te voegen. Dit brengt ons bij neurale netwerken. In het geval van zogenaamde multi layer perceptrons worden inputs aan meerdere perceptrons gekoppeld en worden ook één of meerdere lagen van perceptrons voorzien tussen in- en outputs: zogenaamde hidden layers.

Source
Source
<Figure size 1600x1000 with 1 Axes>

Forward pass

Iedere input wordt volgens de aanwezige connecties (architectuur) voorwaarts gepropageerd door het netwerk richting de output (van links naar rechts in bovenstaande illustratie).

In bovenstaande illustratie gaat dit als volgt:

z1,i=w1,1+w2,1xi,2+w3,1xi,3z2,i=w1,2+w2,2xi,2+w3,2xi,3zi=w1+w2ϕ(z1,i)+w3ϕ(z2,i)yi^=ϕ(zi)\begin{align} z_{1,i} &= w_{1,1} + w_{2,1}x_{i,2} + w_{3,1}x_{i,3} \cr z_{2,i} &= w_{1,2} + w_{2,2}x_{i,2} + w_{3,2}x_{i,3} \cr z_i &= w_1 + w_2\phi(z_{1,i}) + w_3\phi(z_{2,i}) \cr \hat{y_i} &= \phi(z_i) \end{align}

Backward pass

Stap 1

Eens de forward pass is uitgevoerd, kunnen we de predictiefout aan de hand van de gekozen loss functie uitdrukken. Voor deze uiteenzetting kiezen we voor de squared error LSE=12(y−y^)2\mathcal{L}_{SE} = \frac{1}{2}(y-\hat{y})^2. Merk op dat:

  • we het subscript ii achterwege laten

  • we geen sum of squared errors gebruiken (zoals eerder bij het lineaire regressiemodel) omdat het hier maar over één input gaat.

  • we de term 12\frac{1}{2} toevoegen omdat we hiermee de exponent wegwerken bij het berekenen van de gradiënt.

We werken ook met de veronderstelling van een logistische activatiefunctie.

We willen opnieuw via gradient descent, stap voor stap de gewichten updaten aan de hand van de partiële afgeleiden (gradiënt) van de loss functie. De individuele partiële afgeleiden geven ons telkens de richting aan waarin we een bepaald gewicht (of parameter) moeten verschuiven om de grootste daling in de loss te bekomen - rekening houdend met een bepaalde stapgrootte (learning rate) en bij het constant houden van alle andere gewichten (of parameters).

Het berekenen van de gradiënt gebeurt, gezien de (variabele) netwerkstructuur, op een speciale manier waarbij er sequentieel gewerkt wordt, beginnend bij de output en eindigend bij de input (van rechts naar links in bovenstaande illustratie). Deze beweging wordt de backward pass genoemd.

Doordat de output van het netwerk tot stand komt op basis van een reeks geneste functies, speelt de kettingregel hierin een centrale rol.

Stap 2

Nadat we in de eerste stap de loss bepaald hebben, beginnen we rechts, bij de eerste gewichten die we tegenkomen vóór de output: w1{w_1}, w2{w_2} en w3{w_3} in bovenstaande illustratie.

Als we de SESE loss in termen van die gewichten uitdrukken krijgen we:

LSE=12(y−y^)2=12(y−ϕ(z))2=12(y−ϕ(w1+w2ϕ(z1)+w3ϕ(z2)))2\begin{align} \mathcal{L}_{SE} &= \frac{1}{2}(y - \hat{y})^2 \cr &= \frac{1}{2}(y - \phi(z))^2 \cr &= \frac{1}{2}(y - \phi(w_1 + w_2\phi(z_1) + w_3\phi(z_2)))^2 \cr \end{align}

We kunnen dit zien als vier geneste functies:

LSE=f(g(ϕ(h(w))))\mathcal{L}_{SE} = f(g(\phi(h(\pmb{w}))))

met (in de veronderstelling van een logistische activatiefunctie)

f=12g(ϕ(h(w)))2g=y−ϕ(h(w))ϕ=11+e−h(w)h=w1+w2ϕ(z1)+w3ϕ(z2)\begin{align} f &= \frac{1}{2}g(\phi(h(\pmb{w})))^2 \cr g &= y - \phi(h(\pmb{w})) \cr \phi &= \frac{1}{1 + e^{-h(\pmb{w})}} \cr h &= w_1 + w_2\phi(z_1) + w_3\phi(z_2) \end{align}

Voor de partiële afgeleide van de loss functie met betrekking tot het bias gewicht w1w_1 krijgen we via de kettingregel:

∂LSE∂w1=∂∂w1f(g(ϕ(h(w1))))=∂LSE∂f∂g∂ϕ∂ϕ∂h∂h∂w1\frac{\partial \mathcal{L}_{SE}}{\partial w_1} = \frac{\partial}{\partial w_1}f(g(\phi(h(w_1)))) = \frac{\partial \mathcal{L}_{SE}}{\partial f}\frac{\partial g}{\partial \phi}\frac{\partial \phi}{\partial h}\frac{\partial h}{\partial w_1}

waarbij

∂LSE∂f=122(y−y^)=(y−y^)∂g∂ϕ=−1∂ϕ∂h=ϕ(z)(1−ϕ(z))∂h∂w1=1\begin{align} \frac{\partial \mathcal{L}_{SE}}{\partial f} &= \frac{1}{2}2(y - \hat{y}) = (y - \hat{y}) \cr \frac{\partial g}{\partial \phi} &= -1 \cr \frac{\partial \phi}{\partial h} &= \phi(z)(1 - \phi(z))\cr \frac{\partial h}{\partial w_1} &= 1 \end{align}

We krijgen dus:

∂LSE∂w1=(y−y^)(−1)ϕ(z)(1−ϕ(z))\frac{\partial \mathcal{L}_{SE}}{\partial w_1} = (y - \hat{y})(-1)\phi(z)(1 - \phi(z))

Voor de partiële afgeleide van de loss functie met betrekking tot gewicht w2w_2 zit het enige verschil in de laatste term van de ketting:

∂h∂w2=ϕ(z1)∂LSE∂w2=(y−y^)(−1)ϕ(z)(1−ϕ(z))ϕ(z1)\begin{align} \frac{\partial h}{\partial w_2} &= \phi(z_1) \cr \frac{\partial \mathcal{L}_{SE}}{\partial w_2} &= (y - \hat{y})(-1)\phi(z)(1 - \phi(z))\phi(z_1) \end{align}

Hiermee kunnen we exact zoals voorheen een update berekenen binnen een gradient descent iteratie:

wk+1=wk−λ∇L(wk)\pmb{w}^{k+1} = \pmb{w}^k - \lambda \nabla \mathcal{L}(\pmb{w}^k)

Stap 3

Als we nu naar de gewichten op het voorgaande niveau gaan kijken, kunnen we de ketting van partiële afgeleiden simpelweg verlengen. Laten we kijken naar gewicht w2,1w_{2,1} dat verbonden is met input x2x_2 en het eerste hidden neuron.

We moeten de loss nu uitdrukken als een functie van w2,1w_{2,1}:

LSE=12(y−y^)2=12(y−ϕ(z))2=12(y−ϕ(w1+w2ϕ(z1)+w3ϕ(z2)))2=12(y−ϕ(w1+w2ϕ(w1,1+w2,1x2+w3,1x3)+w3ϕ(z2)))2\begin{align} \mathcal{L}_{SE} &= \frac{1}{2}(y - \hat{y})^2 \cr &= \frac{1}{2}(y - \phi(z))^2 \cr &= \frac{1}{2}(y - \phi(w_1 + w_2\phi(z_1) + w_3\phi(z_2)))^2 \cr &= \frac{1}{2}(y - \phi(w_1 + w_2\phi(w_{1,1} + w_{2,1}x_2 + w_{3,1}x_3) + w_3\phi(z_2)))^2 \end{align}

We hebben nu zes geneste functies:

LSE=f(g(ϕ(h(ϕ(h1(w))))))\mathcal{L}_{SE} = f(g(\phi(h(\phi(h_1(\pmb{w}))))))

met

f=12g(ϕ(h(w)))2g=y−ϕ(h(w))ϕ=11+e−h(w)h=w1+w2ϕ(z1)+w3ϕ(z2)ϕ1=11+e−h1(w)h1=w1,1+w2,1x2+w3,1x3\begin{align} f &= \frac{1}{2}g(\phi(h(\pmb{w})))^2 \cr g &= y - \phi(h(\pmb{w})) \cr \phi &= \frac{1}{1 + e^{-h(\pmb{w})}} \cr h &= w_1 + w_2\phi(z_1) + w_3\phi(z_2) \cr \phi_1 &= \frac{1}{1 + e^{-h_1(\pmb{w})}} \cr h_1 &= w_{1,1} + w_{2,1}x_2 + w_{3,1}x_3 \end{align}

De ketting wordt:

∂LSE∂w2,1=∂LSE∂f∂g∂ϕ∂ϕ∂h∂h∂ϕ1∂ϕ1∂h1∂h1∂w2,1\frac{\partial \mathcal{L}_{SE}}{\partial w_{2,1}} = \frac{\partial \mathcal{L}_{SE}}{\partial f}\frac{\partial g}{\partial \phi}\frac{\partial \phi}{\partial h}\frac{\partial h}{\partial \phi_1}\frac{\partial \phi_1}{\partial h_1}\frac{\partial h_1}{\partial w_{2,1}}

waarbij ϕ1=ϕ(z1)\phi_1 = \phi(z_1) de activatie van het eerste hidden neuron is.

De eerste drie termen kennen we al uit Stap 2 🎉:

∂LSE∂f=(y−y^)∂g∂ϕ=−1∂ϕ∂h=ϕ(z)(1−ϕ(z))\begin{align} \frac{\partial \mathcal{L}_{SE}}{\partial f} &= (y - \hat{y}) \cr \frac{\partial g}{\partial \phi} &= -1 \cr \frac{\partial \phi}{\partial h} &= \phi(z)(1 - \phi(z)) \end{align}

De nieuwe termen zijn:

∂h∂ϕ1=w2∂ϕ1∂h1=ϕ(z1)(1−ϕ(z1))∂h1∂w2,1=x2\begin{align} \frac{\partial h}{\partial \phi_1} &= w_2 \cr \frac{\partial \phi_1}{\partial h_1} &= \phi(z_1)(1 - \phi(z_1)) \cr \frac{\partial h_1}{\partial w_{2,1}} &= x_2 \end{align}

Dit geeft ons:

∂LSE∂w2,1(1)=(y−y^)(−1)ϕ(z)(1−ϕ(z))⋅w2⋅ϕ(z1)(1−ϕ(z1))⋅x2\frac{\partial \mathcal{L}_{SE}}{\partial w^{(1)}_{2,1}} = (y - \hat{y})(-1)\phi(z)(1 - \phi(z)) \cdot w_2 \cdot \phi(z_1)(1 - \phi(z_1)) \cdot x_2

Op analoge wijze kunnen we de partiële afgeleiden voor alle andere gewichten in de inputlaag berekenen. Voor bijvoorbeeld w3,2w_{3,2} (verbonden met input x3x_3 en het tweede hidden neuron) krijgen we:

∂LSE∂w3,2=(y−y^)(−1)ϕ(z)(1−ϕ(z))⋅w3⋅ϕ(z2)(1−ϕ(z2))⋅x3\frac{\partial \mathcal{L}_{SE}}{\partial w_{3,2}} = (y - \hat{y})(-1)\phi(z)(1 - \phi(z)) \cdot w_3 \cdot \phi(z_2)(1 - \phi(z_2)) \cdot x_3

Algemeen principe

De gradiënt van de loss wordt achterwaarts berekend door de loss steeds dieper uit te schrijven in termen van de bewuste gewichten. Deze terugwaartse beweging is de kern van het back propagation algoritme. Het algoritme is heel efficiënt doordat de bouwstenen van de partiële afgeleiden hergebruikt kunnen worden bij veel verschillende gewichten. Eens de gradiënt berekend is, kunnen we precies zoals voorheen gradient descent toepassen op de volledige set van gewichten (of varianten zoals stochastic gradient descent):

wk+1=wk−λ∇L(wk)\pmb{w}^{k+1} = \pmb{w}^k - \lambda \nabla \mathcal{L}(\pmb{w}^k)

Merk op dat bovenstaande uiteenzetting specifiek geldt voor de geïllustreerde architectuur met logistische activatie en LSE\mathcal{L}_{SE}. Het algoritme kan echter in principe omgaan met een arbitraire architectuur en afleidbare activatiefuncties. Zo zal bij diepere netwerken (meer hidden layers) ook de somregel zijn intrede doen wanneer er vanaf een bepaald gewicht meerdere paden richting de output lopen.

Source
<Figure size 1000x700 with 1 Axes>

Een mogelijk probleem bij back propagation in diepe netwerken is dat bij het terug propageren van de loss, partiële afgeleiden steeds kleiner worden. Daardoor leren vroegere lagen trager dan latere lagen, wat tot leerproblemen leidt. Dit is het zogenaamde vanishing gradients probleem. Er bestaan verschillende strategieën om dit tegen te gaan, zoals de keuze voor ReLU als activatiefunctie en adaptieve learning rates (zie bijvoorbeeld het Adam optimalisatiealgoritme).