Van neuron tot taalmodel

Hoofdstuk 9

Generaliseren

Tot nu toe betekende “100% juist” dat het netwerk alle voorbeelden kende die het zélf had gezien. Maar dat is uit het hoofd leren, geen begrijpen. De kern van machine learning zit ergens anders: werkt het netwerk ook op voorbeelden die het nooit eerder zag? Dit hoofdstuk gaat over dat verschil — en over wat er misgaat als je het uit het oog verliest.

9.1 — het echte doel

Onthouden is niet hetzelfde als leren

Onze Optelnet en RekenNet trainden op álle mogelijke combinaties. Toen ze foutloos werden, hadden ze in zekere zin gewoon een tabel uit het hoofd geleerd — precies de eerlijke kanttekening uit de vorige hoofdstukken. Voor een rekenoefening met 25 of 95 sommen kan dat nog, maar het is niet wat we eigenlijk willen.

Wat we willen is generalisatie: een netwerk dat het onderliggende patroon vat en het toepast op nieuwe gevallen. Een kindje dat optellen leert, kent niet alle sommen uit het hoofd — het snapt de regel en kan daardoor ook 7 + 6 als het die nooit eerder zag. Dát is het doel. En om te meten of een netwerk dat kan, mag je het niet beoordelen op de voorbeelden waarop het oefende.

9.2 — data opsplitsen

Train, validatie en test

De oplossing is even eenvoudig als streng: je houdt bewust een deel van je data achter. Je splitst in drie stukken, elk met een eigen taak.

Training ~70% Validatie ~15% Test ~15% alle beschikbare data

De rolverdeling, met een vergelijking die blijft hangen:

  • Trainingsset — hierop past het netwerk zijn gewichten aan. Dit zijn de oefeningen.
  • Validatieset — hier traint het netwerk niét op; je gebruikt ze tijdens het werk om te zien hoe goed het generaliseert, en om keuzes te maken (hoeveel neuronen, wanneer stoppen). Dit is het proefexamen.
  • Testset — die raak je pas één keer aan, helemaal op het einde, voor een eerlijk eindcijfer. Dit is het echte examen — en je oefent er niet op, anders is het cijfer niets waard.

De gouden regel: laat keuzes nooit leunen op de testset. Zodra je je netwerk bijstuurt op basis van de test, is ze besmet en geeft ze een te rooskleurig beeld. Vandaar de tussenliggende validatieset.

9.3 — twee manieren om de mist in te gaan

Underfitting en overfitting

Met een aparte validatieset in de hand worden twee tegengestelde problemen zichtbaar. Stel je een wolk meetpunten voor waar een vloeiend patroon in zit, met wat ruis erop:

Underfitting

te simpel

Goede fit

net goed

Overfitting

te complex

Underfitting (links) is een model dat te simpel is, of te kort getraind. Het vat het patroon niet eens en zit er overal naast — zowel op de trainingsdata als op nieuwe data. De rechte lijn kan de bocht gewoon niet maken.

Overfitting (rechts) is het omgekeerde: een model dat zó flexibel is dat het door élk punt kronkelt, inclusief de toevallige ruis. Op de trainingsdata lijkt dat schitterend — bijna geen fout — maar het heeft de ruis van buiten geleerd in plaats van het patroon. Op nieuwe data, die net iets anders ligt, slaat het de bal mis.

De goede fit (midden) volgt het patroon zonder elke rimpel mee te nemen. Dat is waar je naartoe wilt — en de validatieset is je instrument om het te vinden.

9.4 — de verraderlijke curve

Waarom langer trainen niet altijd beter is

Volg tijdens het trainen niet alleen de trainingsfout, maar ook de validatiefout. Dan zie je iets typisch gebeuren. De trainingsfout blijft maar dalen — het netwerk wordt almaar beter in het nabootsen van wat het zag. De validatiefout daalt eerst mee, maar buigt op een gegeven moment weer omhoog.

fout training (epochs) → beste model — hier stoppen
trainingsfout validatiefout

Dat omhoog buigen is overfitting in actie: vanaf dat punt verbetert het netwerk alleen nog op de trainingsdata en wordt het slechter op alles daarbuiten. Het gat tussen de twee curves heet de generalisatiekloof. Het laagste punt van de validatiecurve is je doelwit — dáár generaliseert het netwerk het best. In het volgende hoofdstuk gebruiken we precies dit inzicht om overfitting te bestrijden.

9.5 — de twee soorten fout

Bias en variantie

Onder underfitting en overfitting ligt een klassiek begrippenpaar. Bias is fout door een te star model: het maakt aannames die te simpel zijn en zit er systematisch naast (de rechte lijn). Variantie is fout door een te gevoelig model: het reageert zo sterk op de exacte trainingspunten dat het bij andere data heel anders zou liggen (de kronkel).

Veel bias hoort bij underfitting, veel variantie bij overfitting. De kunst — en eigenlijk de hele rest van dit verhaal — is die twee in evenwicht brengen: complex genoeg om het patroon te vatten, eenvoudig genoeg om niet de ruis te volgen.

9.6 — de juiste maat

Capaciteit

De capaciteit van een netwerk — ruwweg het aantal neuronen en lagen — bepaalt hoe complex de functies zijn die het kan vormen. Meer capaciteit is niet zomaar beter: het laat het netwerk ingewikkeldere patronen leren, maar geeft het ook meer ruimte om te overfitten. De juiste capaciteit hangt af van twee dingen: hoe complex het probleem is, en hoeveel data je hebt. Veel data verdraagt veel capaciteit; weinig data niet.

Daarmee hebben we het probleem scherp: hoe vind je de goede maat, en hoe houd je overfitting in toom? Dat is het onderwerp van het volgende hoofdstuk — met een live demo waarin je het allemaal zelf ziet gebeuren.