Van neuron tot taalmodel

Hoofdstuk 10

Remedies & demo

We weten nu hoe overfitting eruitziet: een netwerk dat zijn trainingsdata van buiten leert en daardoor faalt op nieuwe voorbeelden. Het goede nieuws is dat er een vaste gereedschapskist aan tegenmaatregelen bestaat. We lopen ze één voor één door — en daarna mag je met de twee belangrijkste — capaciteit en regularisatie — zelf spelen in een echte live demo.

10.1 — remedie 1

Vroeg stoppen

De validatiecurve uit het vorige hoofdstuk gaf het al weg: er is een moment waarop verder trainen je generalisatie júist schaadt. De eenvoudigste remedie is dan ook de meest logische — stop op dat moment.

Je houdt tijdens het trainen de validatiefout in de gaten, je onthoudt het netwerk met de láágste validatiefout, en je gebruikt dát netwerk — niet het netwerk na nog duizend extra epochs. Dit heet vroeg stoppen (early stopping). Het kost niets extra, je krijgt het er gratis bij tijdens het gewone trainen, en het werkt verrassend goed.

10.2 — remedie 2

Regularisatie: kleine gewichten afdwingen

Een tweede aanpak grijpt in op de gewichten zelf. Overfitting gaat vaak gepaard met grote gewichten: om door élk punt te kronkelen heeft een netwerk steile, extreme waarden nodig. Straf je grote gewichten af, dan duw je het netwerk naar een gladdere, eenvoudigere oplossing.

Je telt daarvoor een extra term bij de foutfunctie op:

Ltotaal = Ldata + (λ / 2) · Σ w²

De som loopt over alle gewichten van het netwerk; λ (lambda) bepaalt hoe zwaar de straf weegt. Bij elke stap worden de gewichten daardoor een beetje naar nul getrokken — vandaar de bijnaam weight decay. Te weinig λ en het netwerk overfit nog steeds; te veel λ en het wordt zó glad dat het underfit. Er zit een zoete plek tussen, en in de demo hieronder kun je er zelf naar zoeken.

10.3 — remedie 3

Dropout

Dropout pakt het van een heel andere kant aan: bij elke trainingsstap schakel je willekeurig een deel van de neuronen tijdelijk uit. Het netwerk kan dus nooit op één enkel neuron rekenen en wordt gedwongen om robuuste, gespreide voorstellingen te leren.

invoer verborgen laag uitvoer
Bij elke trainingsstap valt een willekeurig deel van de neuronen weg. De volgende stap is het weer een ander deel.

Je traint zo telkens een iets ander, kleiner netwerk, en het geheel gedraagt zich als een gemiddelde van vele netwerken — wat overfitting flink tempert. Bij het uiteindelijke voorspellen zet je alle neuronen weer aan.

10.4 — remedie 4

Meer data en augmentatie

De betrouwbaarste remedie is meteen de meest voor de hand liggende: meer data. Hoe meer voorbeelden, hoe minder ruimte het netwerk heeft om toevallige ruis uit het hoofd te leren — het echte patroon wint dan vanzelf.

Kun je niet aan meer échte data, dan helpt data-augmentatie: je maakt goedkoop nieuwe voorbeelden door bestaande licht te wijzigen. Een foto spiegelen, een stukje bijsnijden, verschuiven, of er wat ruis op zetten. Voor het netwerk zijn het nieuwe voorbeelden, terwijl het label hetzelfde blijft — een hond blijft een hond, ook gespiegeld.

10.5 — remedie 5

Een eenvoudiger model

Ten slotte kun je rechtstreeks aan de capaciteit draaien. Een netwerk met te veel neuronen voor de hoeveelheid data zal overfitten; een kleiner netwerk heeft simpelweg de ruimte niet om de ruis te volgen. De juiste maat vind je door te experimenteren — en met een aparte validatieset zie je meteen of je goed zit.

Geen van deze remedies is een toverstaf, en in de praktijk combineer je ze: een passend model, wat regularisatie, vroeg stoppen, en zoveel goede data als je kunt vinden.

10.6 — zelf doen

Live demo: zie overfitting gebeuren

Tijd om het zelf te voelen. Hieronder leert een echt netwerkje — één invoer, één verborgen laag, één uitvoer — een vloeiende kromme door een wolk ruizige punten. De gevulde oranje stippen zijn de trainingsdata; de open groene cirkels zijn validatiedata waar het netwerk niet op traint. Onderaan lopen de twee foutcurves mee. Dit netje gebruikt trouwens tanh als activatie in plaats van ReLU: voor het leren van een gladde kromme werkt een gladde functie net wat beter.

Overfitting-speeltuin

Een regressienetje (1 → verborgen laag → 1) dat een kromme door ruizige data leert.

Epoch0
Trainingsfout–
Validatiefout–
gevulde stippen = training · open cirkels = validatie · oranje lijn = wat het netwerk leert · stippellijn = ware patroon
— trainingsfout  — validatiefout · de verticale stippellijn markeert de laagste validatiefout (het beste model)

8
6000
0

Probeer dit: zet de capaciteit hoog en laat lang trainen. De oranje trainingscurve blijft dalen, maar de groene validatiecurve buigt weer omhoog — precies de U uit het vorige hoofdstuk. Verlaag dan de capaciteit, of draai de L2-regularisatie omhoog, en kijk hoe de validatiefout weer zakt. Zet de capaciteit juist heel laag (1 of 2 neuronen) en je ziet underfitting: de lijn is te stijf en beide fouten blijven hoog.

10.7 — tot slot

De cirkel rond

En daarmee is de cirkel rond. We begonnen bij één neuron en een handvol gewichten, bouwden een netwerk dat leert optellen, breidden het uit naar vier bewerkingen, en zagen stap voor stap hoe het leert via gradient descent. In deze twee hoofdstukken draaide alles om de vraag die het hele verhaal bij elkaar houdt: leert een netwerk het échte patroon, of leert het zijn huiswerk uit het hoofd?

Generaliseren is geen detail of een afwerking achteraf — het is waar machine learning ten diepste om draait. Een model is pas waardevol als het iets zinnigs doet met data die het nooit eerder zag.

Nog één verfijning wacht: mini-batches, de manier waarop grote netwerken in de praktijk echt getraind worden. En daarna maken we in Deel II de grote sprong — van deze doorzichtige speelgoednetwerkjes naar een echt taalmodel van 494 miljoen parameters, dat we bestand voor bestand openmaken.