Hoofdstuk 1
Het ontwerp
Voor we ook maar één gewicht trainen, moeten we drie keuzes maken: hoe geven we de getallen aan het netwerk, wat moet eruit komen, en hoe ziet het netwerk eruit? Die keuzes bepalen alles wat erna komt.
De volledige waarheid past op één tabel
We willen twee getallen optellen, allebei uit de verzameling {0, 1, 2, 3, 4}. De som ligt dan altijd tussen 0 en 8. Omdat elk getal maar 5 waarden kan aannemen, zijn er precies 5 × 5 = 25 mogelijke sommen. Hier zijn ze allemaal:
| + | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | 0 | 1 | 2 | 3 | 4 |
| 1 | 1 | 2 | 3 | 4 | 5 |
| 2 | 2 | 3 | 4 | 5 | 6 |
| 3 | 3 | 4 | 5 | 6 | 7 |
| 4 | 4 | 5 | 6 | 7 | 8 |
Omdat er maar 25 gevallen zijn, kunnen we het netwerk gewoon álle 25 laten zien tijdens het trainen. Het hoeft dus niet te “gokken” over gevallen die het nooit zag — het mag de hele tabel leren reproduceren. Dat maakt het een heldere oefening: lukt het, dan zit het netwerk altijd juist.
Hoe geef je een getal aan een netwerk?
Een netwerk eet getallen. Je zou dus gewoon de waarde “3” kunnen binnengeven. Maar dan suggereer je dat 4 “twee keer zo veel” is als 2, en dat 3 “tussen” 2 en 4 ligt — een ordening die het netwerk misschien op het verkeerde been zet. Voor een klein, vast lijstje categorieën gebruiken we daarom een nettere voorstelling: one-hot codering.
One-hot betekent: maak een rijtje van vijf vakjes (één per mogelijke waarde 0–4) en zet een 1 in het vakje dat erbij hoort, de rest blijft 0.
| getal | positie 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 | 0 |
| 2 | 0 | 0 | 1 | 0 | 0 |
| 3 | 0 | 0 | 0 | 1 | 0 |
| 4 | 0 | 0 | 0 | 0 | 1 |
We hebben twee getallen, dus plakken we hun twee one-hot rijtjes achter elkaar: vijf vakjes voor a, dan vijf voor b. Samen: 10 invoergetallen. Bijvoorbeeld “3 + 1” wordt:
invoer = [0, 0, 0, 1, 0, 0, 1, 0, 0, 0] ← 10 getallen
Klein maar belangrijk gevolg: omdat in elke helft precies één vakje een 1 is en de rest 0, “kiest” de invoer eigenlijk gewoon één kolom uit de gewichten per getal. In hoofdstuk 2 zie je dat dat het rekenwerk mooi vereenvoudigt.
Een keuze uit negen mogelijkheden
De som is een getal van 0 tot 8 — dat zijn 9 mogelijke antwoorden. In plaats van het netwerk één getal te laten “raden”, laten we het voor elk van die 9 mogelijkheden een score geven. Daarna zetten we die 9 scores om in 9 kansen die samen 1 zijn (met softmax, hoofdstuk 2), en kiezen we de hoogste.
Uitvoer-positie 0 staat dus voor “de som is 0”, positie 1 voor “de som is 1”, enzovoort tot positie 8. De gewenste uitvoer voor een voorbeeld is opnieuw one-hot: een 1 op de positie van de juiste som.
Deze manier — kiezen uit een vast aantal hokjes — heet classificatie. Ze is prettig om te tonen: het netwerk geeft niet alleen een antwoord, maar ook hoe zeker het is, en je ziet de twijfel tussen de mogelijkheden.
De vorm: 10 → 16 → 9
Nu we weten wat erin en eruit gaat, ligt de vorm van het netwerk grotendeels vast. We zetten er één verborgen laag tussen, waar het netwerk zijn eigen “optel-logica” mag vormen.
Wat doet elke laag?
De invoerlaag (10) is gewoon de gecodeerde getallen; daar gebeurt geen rekenwerk.
De verborgen laag (16, ReLU) is waar het echte werk zit. Elk van die 16 neuronen kijkt naar de hele invoer en vormt zijn eigen patroon — bijvoorbeeld iets als “a is groot én b is klein”. De ReLU-activatie (negatief wordt 0, zie De basis) zorgt voor de nodige “bocht”. Het getal 16 is een comfortabele keuze: ruim genoeg voor deze taak. Voor zo’n klein probleem zou minder ook werken; meer schaadt niet maar is onnodig.
De uitvoerlaag (9, softmax) neemt de 16 verborgen waarden en maakt er 9 scores van, die softmax omzet in 9 kansen. De hoogste kans is het antwoord.
In hoofdstuk 2 zetten we hier de wiskunde onder: hoe een getal door dit netwerk stroomt, hoe we meten hoe fout het zat, en hoe het zichzelf bijstuurt.