Backpropagation geeft ons gradiënten - maar gradiënten waarvan? Voordat backprop kan starten, hebben we één enkel getal nodig dat vastlegt hoe fout het model zit. Dat getal komt van een verliesfunctie. Zodra we gradiënten hebben, bepaalt een optimalisator hoe de gewichten worden bijgewerkt. Samen vormen ze de leerlus.
Een verliesfunctie (ook wel kostenfunctie genoemd) neemt de voorspelling van het model en het juiste antwoord, en geeft een getal terug dat de "fout" meet. Het doel van het trainen is om dit getal te minimaliseren.
Zie het als een golfscore - lager is beter. Een verlies van 0 betekent een perfecte voorspelling.
Bij het voorspellen van continue waarden (huizenprijzen, temperatuur) gebruiken we Mean Squared Error (MSE):
MSE = (1/n) × Σ(voorspeld - werkelijk)²
Kwadrateren doet twee dingen: het maakt alle fouten positief, en het bestraft grote fouten onevenredig zwaar. Een huisprijs die €100.000 afwijkt heeft een kwadratische fout die 100× erger is dan een afwijking van €10.000.
MSE dateert uit 1795, toen Carl Friedrich Gauss het bedacht - meer dan twee eeuwen vóór neurale netwerken. Hij gebruikte het om de baan van de asteroïde Ceres te berekenen.
Bij het voorspellen van categorieën (spam of niet, kat vs. hond) gebruiken we cross-entropy-verlies. Het meet hoe ver de voorspelde kansen van het model afstaan van de werkelijke labels.
Als het juiste antwoord "kat" is en het model zegt 99% kat, dan is het verlies minuscuul. Als het 10% kat zegt, is het verlies enorm. Cross-entropy heeft een nuttige eigenschap: het wordt oneindig ontevreden wanneer het model vol vertrouwen fout zit, wat een sterke gradiënt creëert om de fout te corrigeren.
Binaire cross-entropy is voor tweeklassenprobleem. Categorische cross-entropy behandelt meerdere klassen door kansdistributies te vergelijken.
Waarom is MSE een slechte keuze voor classificatietaken?
Sign in to join the discussion
Met een gedefinieerde verliesfunctie kunnen we het verlieslandschap visualiseren - een oppervlak waar elk punt een set gewichten vertegenwoordigt en de hoogte het verlies is. Trainen betekent het diepste dal vinden.
Gradiëntafdaling is het algoritme dat ons daar brengt:
De grootte van elke stap wordt bepaald door de leersnelheid - misschien wel de belangrijkste hyperparameter in deep learning.
Stel je voor dat je in dichte mist een berg afdaalt en alleen de helling direct onder je voeten kunt voelen. Je stapt bergafwaarts, maar je kunt het hele landschap niet zien. Hoe zou je in een klein kuiltje terecht kunnen komen dat niet het diepste dal is? Dit is het lokaal-minimumprobleem.
Berekent de gradiënt op basis van de volledige dataset vóór elke update. Nauwkeurig maar pijnlijk langzaam voor grote datasets - stel je voor dat je elk boek in een bibliotheek opnieuw moet lezen voordat je één spelfout mag corrigeren.
Werkt gewichten bij na elk afzonderlijk voorbeeld. Snel maar lawaaierig - het pad zigzagt wild. Het lawaai kan juist helpen om aan lokale minima te ontsnappen, wat een verrassend voordeel is.
De praktische gulden middenweg. Berekent gradiënten op een kleine batch (doorgaans 32–512 voorbeelden). Brengt snelheid en stabiliteit in balans, en is wat vrijwel alle moderne training gebruikt.
Gewone SGD heeft beperkingen. Onderzoekers hebben slimmere optimalisatoren ontwikkeld die zich aanpassen terwijl ze werken.
Net als een zware bal die bergafwaarts rolt, bouwt momentum snelheid op in consistente richtingen en dempt oscillaties. Als de gradiënt steeds dezelfde kant op wijst, versnelt momentum. Als de richting steeds verandert, vlakt momentum het af.
Past de leersnelheid per parameter aan. Vaak bijgewerkte gewichten krijgen kleinere stappen; zelden bijgewerkte gewichten krijgen grotere stappen. Uitstekend voor schaarse data (zoals tekst), maar de leersnelheid kan na verloop van tijd krimpen tot nul.
Combineert momentum en per-parameter adaptieve snelheden. Het houdt lopende gemiddelden bij van zowel de gradiënt (eerste moment) als de gekwadrateerde gradiënt (tweede moment). Adam is de standaardkeuze voor de meeste beoefenaars vandaag.
Welk voordeel heeft Adam ten opzichte van gewone SGD?
In plaats van de leersnelheid vast te zetten, wordt bij moderne training vaak een schema gehanteerd:
De intuïtie: neem grote stappen in het begin om breed te verkennen, en daarna kleine stappen om fijn af te stellen.
Soms exploderen gradiënten (zoals we zagen in de les over backpropagation). Gradiënt-clipping beperkt de grootte van de gradiënt vóór de updatestap. Als de gradiënt een drempelwaarde overschrijdt, wordt deze proportioneel verkleind. Dit is standaardpraktijk bij het trainen van RNN's en Transformers.
Wat voorkomt gradiënt-clipping?
Het artikel over de Adam-optimalisator (Kingma & Ba, 2014) heeft meer dan 150.000 citaties, waardoor het een van de meest geciteerde artikelen in de gehele informatica is.
Als je een model traint en het verlies stopt met dalen na een paar epochs, wat zou je dan als eerste onderzoeken - de leersnelheid, de verliesfunctie of de data? Waarom?