ICT Horse Logo

iCt Horse

connecting the dots

Email: info@icthorse.nl

Telefoon: +31610323432

KvK: 96787112 | BTW: NL002996606B14

Module 3 van 8

Neural Networks

Van één neuron naar een netwerk — hoe meerdere lagen samen problemen oplossen die een enkel neuron niet kan.

1. Waarom één neuron niet genoeg is

In Module 1 ontdekten we dat een perceptron XOR niet kan leren. Dat komt omdat één neuron slechts een rechte lijn kan trekken door de data. XOR vereist een gebogen grens.

De oplossing: stapel meerdere neuronen op in lagen. Elk neuron in de eerste laag leert een eigen rechte lijn. De volgende laag combineert die lijnen tot complexere vormen. Hoe meer lagen, hoe ingewikkelder de patronen die het netwerk kan herkennen.

Analogie: Denk aan een fabriek. De eerste werknemers (laag 1) doen simpele taken: schroeven sorteren op grootte, platen buigen. De volgende afdeling (laag 2) combineert die halffabricaten tot onderdelen. De eindafdeling (laag 3) assembleert alles tot een compleet product. Geen enkele werknemer begrijpt het eindproduct, maar samen maken ze iets complex.

2. De architectuur van een neural network

Een neural network bestaat uit drie soorten lagen:

Laag Wat doet het? Voorbeeld
Input layer Ontvangt de ruwe data 2 neuronen voor x1 en x2
Hidden layer(s) Verwerkt en transformeert — hier zit de "intelligentie" 4 neuronen die features ontdekken
Output layer Geeft het antwoord 1 neuron voor ja/nee classificatie

Elke verbinding tussen twee neuronen heeft een gewicht. Elk neuron heeft een bias. In een netwerk met 2 inputs, 4 hidden neuronen en 1 output zijn er al 2×4 + 4×1 = 12 gewichten en 4 + 1 = 5 biases. Bij GPT-4 zijn dat er honderden miljarden.

Feedforward: van input naar output

Data stroomt altijd in één richting: van links naar rechts. Elk neuron:

  1. Ontvangt outputs van de vorige laag
  2. Vermenigvuldigt ze met zijn gewichten
  3. Telt de bias op
  4. Past de activatiefunctie toe
  5. Stuurt het resultaat naar de volgende laag
Waarom "hidden"? We zien de input (data) en de output (voorspelling), maar de tussenliggende neuronen zijn voor ons onzichtbaar. We weten niet precies wat ze leren — vandaar "hidden". Dit is ook de reden dat AI soms een "black box" wordt genoemd.

3. XOR oplossen met een hidden layer

Laten we stap voor stap bekijken hoe twee hidden neuronen samen XOR oplossen:

Hidden neuron h1: leert OR (x1 OF x2)
Hidden neuron h2: leert NAND (NIET beide)

Output neuron: combineert h1 AND h2

XOR = OR EN NAND
x1x2 h1 (OR)h2 (NAND) Output (AND)= XOR
00 01 00
01 11 11
10 11 11
11 10 00
Analogie: XOR is als de vraag: "Heeft precies één persoon zijn hand opgestoken?" Dat kun je niet met één blik zien. Maar als je twee helpers hebt — één die checkt "heeft iemand zijn hand op?" en een ander die checkt "hebben ze NIET allebei hun hand op?" — dan hoef je alleen te kijken of beide helpers ja zeggen.

4. Backpropagation: het netwerk trainen

In Module 2 leerden we gradient descent voor één neuron. Bij een netwerk met meerdere lagen moeten we de fout terugpropageren — van de output terug naar elke laag.

Het algoritme in 4 stappen:

  1. Forward pass — stuur de input door het netwerk en bereken de output
  2. Bereken de loss — vergelijk output met het verwachte antwoord
  3. Backward pass — bereken de gradient van elk gewicht via de chain rule
  4. Update — pas alle gewichten aan met gradient descent

De chain rule visueel

Stel je een ketting voor van bewerkingen: input → hidden → output → loss. De chain rule zegt: de invloed van een gewicht op de loss is het product van alle tussenstappen.

∂Loss/∂whidden = ∂Loss/∂output × ∂output/∂hidden × ∂hidden/∂whidden
Analogie: Stel je voor: je chef is ontevreden over het eindproduct (loss). Hij vraagt aan de assemblage-afdeling (output layer): "Wat ging er mis?" Die wijst naar de onderdelen-afdeling (hidden layer): "Dit onderdeel klopte niet." Die wijst op zijn beurt naar de schroevensorteerder (input weights): "Ik kreeg de verkeerde schroeven." Zo wordt de fout stap voor stap terug getraceerd naar de bron — en elke afdeling past zich aan.
Vanishing gradient probleem: Bij heel diepe netwerken (veel lagen) kan de gradient steeds kleiner worden naarmate hij verder terugpropageert. De eerste lagen leren dan bijna niets. Oplossingen: ReLU (i.p.v. sigmoid), skip connections (ResNet), en batch normalization.

5. Activatiefuncties: waarom niet-lineair?

Zonder activatiefunctie is een neural network — hoe diep ook — wiskundig equivalent aan een enkel lineair neuron. De activatiefunctie voegt de niet-lineariteit toe die het netwerk krachtig maakt.

Functie Formule Gebruikt voor Nadeel
Sigmoid 1/(1+e-x) Output layer (kans 0-1) Vanishing gradient
Tanh (ex-e-x)/(ex+e-x) Hidden layers (range -1 tot 1) Vanishing gradient
ReLU max(0, x) Hidden layers (standaard keuze) "Dying ReLU" bij negatieve inputs
Softmax exi / ∑exj Output: meerdere klassen
De standaard in 2024-2026: Gebruik ReLU (of varianten zoals GELU, SiLU) in hidden layers. Gebruik sigmoid als je output een kans is (ja/nee), en softmax als je meerdere klassen hebt (kat/hond/vogel).

6. Python code: een neural network from scratch

Een compleet 2-laags netwerk dat XOR leert — zonder libraries, alleen wiskunde:

import random
import math

# --- Activatiefuncties ---
def sigmoid(x):
    return 1 / (1 + math.exp(-max(-500, min(500, x))))

def sigmoid_deriv(output):
    return output * (1 - output)   # afgeleide t.o.v. output

# --- Netwerk: 2 inputs → 2 hidden → 1 output ---
# Gewichten willekeurig initialiseren
wh = [[random.uniform(-1,1) for _ in range(2)] for _ in range(2)]  # 2x2
bh = [random.uniform(-1,1) for _ in range(2)]                  # 2 biases
wo = [random.uniform(-1,1) for _ in range(2)]                  # 2→1
bo = random.uniform(-1,1)                                     # 1 bias

# XOR training data
data = [([0,0], 0), ([0,1], 1), ([1,0], 1), ([1,1], 0)]
lr = 2.0

for epoch in range(10000):
    total_loss = 0
    for inputs, target in data:
        # --- Forward pass ---
        hidden = []
        for j in range(2):
            s = sum(inputs[i] * wh[j][i] for i in range(2)) + bh[j]
            hidden.append(sigmoid(s))

        out_sum = sum(hidden[j] * wo[j] for j in range(2)) + bo
        output = sigmoid(out_sum)

        # --- Loss ---
        loss = (target - output) ** 2
        total_loss += loss

        # --- Backward pass ---
        # Output layer gradients
        d_output = (output - target) * sigmoid_deriv(output)

        for j in range(2):
            wo[j] -= lr * d_output * hidden[j]
        bo -= lr * d_output

        # Hidden layer gradients
        for j in range(2):
            d_hidden = d_output * wo[j] * sigmoid_deriv(hidden[j])
            for i in range(2):
                wh[j][i] -= lr * d_hidden * inputs[i]
            bh[j] -= lr * d_hidden

    if epoch % 1000 == 0:
        print(f"Epoch {epoch:5d} | Loss: {total_loss:.6f}")

# --- Test ---
print("\nResultaten:")
for inputs, target in data:
    hidden = [sigmoid(sum(inputs[i]*wh[j][i] for i in range(2))+bh[j]) for j in range(2)]
    output = sigmoid(sum(hidden[j]*wo[j] for j in range(2))+bo)
    print(f"  {inputs} → {output:.4f}  (verwacht {target})")

Interactieve demo 1: Neural network traint XOR

Bekijk live hoe een netwerk met 2 hidden neuronen XOR leert. De dikte van elke verbinding toont het gewicht. De kleur van elk neuron toont de activatie. Rechts zie je de decision boundary ontstaan.

2.0
Epoch
0
Loss
[0,0]
[0,1]
[1,0]
[1,1]

Interactieve demo 2: Teken & herken

Teken een patroon in het 5×5 grid. Het netwerk (25 inputs → 10 hidden → 3 outputs) leert drie patronen herkennen. Train het eerst en teken dan!

Klik vakjes om te tekenen

Voorspelling:

Train het netwerk eerst!

Training patronen:

Klik "Train netwerk" om te beginnen...

7. Van speelgoed naar echte AI

Onze demo's gebruiken netwerken met 2-25 neuronen. Echte AI-systemen zijn onvoorstelbaar groter:

Model Parameters Lagen Training
Onze XOR demo ~17 2 milliseconden
MNIST classifier ~100.000 3-5 minuten
GPT-2 (2019) 1,5 miljard 48 weken (8 GPU's)
GPT-4 (2023) ~1.800 miljard* 120+* maanden (25.000 GPU's)*
Claude (2024-2026) niet gepubliceerd

* Geschatte waarden — OpenAI publiceert geen exacte architectuurdetails.

Maar het principe is identiek: lagen van neuronen, gewichten, biases, activatiefuncties, en backpropagation. Het verschil zit in de schaal en in slimme architectuurkeuzes — zoals Transformers, die we in Module 6 behandelen.

Samenvatting

← Module 2: Gradient Descent Module 4: Training in de praktijk →

Een gratis cursus van iCt Horse — Connecting the dots