AI-basisprincipes
Wat is Gradient Descent?
Wat is een Gradient Descent?
Als je hebt gelezen over hoe neurale netwerken getraind worden, heb je waarschijnlijk het begrip “gradient descent” tegenkommen. Gradient descent is de primaire methode voor het optimaliseren van de prestaties van een neuronaal netwerk, door de verlies-/foutenratio van het netwerk te verlagen. Echter, gradient descent kan een beetje moeilijk te begrijpen zijn voor mensen die nieuw zijn in machine learning, en dit artikel zal proberen om je een fatsoenlijk inzicht te geven in hoe gradient descent werkt.
Gradient descent is een optimalisatiealgoritme. Het wordt gebruikt om de prestaties van een neuronaal netwerk te verbeteren door aanpassingen te maken in de parameters van het netwerk, zodat het verschil tussen de voorspellingen van het netwerk en de werkelijke/verwachte waarden van het netwerk (de verlies-/foutenratio) zo klein mogelijk is. Gradient descent neemt de initiële waarden van de parameters en gebruikt operaties gebaseerd op calculus om hun waarden aan te passen naar de waarden die het netwerk zo nauwkeurig mogelijk maken. Je hoeft geen veel calculus te kennen om te begrijpen hoe gradient descent werkt, maar je moet wel een begrip hebben van gradients.
Wat zijn Gradients?
Stel dat er een grafiek is die de hoeveelheid fouten van een neuronaal netwerk weergeeft. De onderkant van de grafiek vertegenwoordigt de punten met de laagste fout, terwijl de bovenkant van de grafiek de punten met de hoogste fout vertegenwoordigt. We willen van de bovenkant van de grafiek naar de onderkant gaan. Een gradient is gewoon een manier om de relatie tussen fout en de gewichten van het neuronaal netwerk te kwantificeren. De relatie tussen deze twee dingen kan worden weergegeven als een helling, met onjuiste gewichten die meer fouten produceren. De steilheid van de helling/gradient vertegenwoordigt hoe snel het model leert.
Een steile helling betekent dat grote verminderingen in fout optreden en het model leert snel, terwijl een helling van nul betekent dat het model op een plateau zit en niet leert. We kunnen naar beneden gaan op de helling naar minder fout door een gradient te berekenen, een richting van beweging (verandering in de parameters van het netwerk) voor ons model.
Laten we de metafoor een beetje veranderen en ons een reeks heuvels en valleien voorstellen. We willen naar de onderkant van de heuvel en het deel van de vallei vinden dat de laagste verlies vertegenwoordigt. Wanneer we bovenaan de heuvel beginnen, kunnen we grote stappen naar beneden nemen en er zeker van zijn dat we naar het laagste punt in de vallei gaan.
Echter, als we dichter bij het laagste punt in de vallei komen, moeten onze stappen kleiner worden, anders kunnen we het werkelijke laagste punt voorbijlopen. Vergelijkbaar hiermee is het mogelijk dat, wanneer we de gewichten van het netwerk aanpassen, de aanpassingen het netwerk verder weg van het punt van laagste verlies kunnen brengen, en daarom moeten de aanpassingen kleiner worden over tijd. In de context van het afdalen van een heuvel naar een punt van laagste verlies, is de gradient een vector/instructies die de richting aangeven die we moeten volgen en hoe groot onze stappen moeten zijn.
Nu we weten dat gradients instructies zijn die ons vertellen in welke richting we moeten gaan (welke coëfficiënten moeten worden bijgewerkt) en hoe groot onze stappen moeten zijn (hoeveel de coëfficiënten moeten worden bijgewerkt), kunnen we onderzoeken hoe de gradient wordt berekend.
Het berekenen van Gradients en Gradient Descent

Gradient descent begint bij een punt van hoge verlies en door meerdere iteraties, stappen te nemen in de richting van laagste verlies, met als doel het optimale gewichtconfiguratie te vinden. Foto: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)
Om gradient descent uit te voeren, moeten de gradients eerst worden berekend. Om de gradient te berekenen, moeten we de verlies-/kostenfunctie kennen. We zullen de kostenfunctie gebruiken om de afgeleide te bepalen. In calculus verwijst de afgeleide naar de helling van een functie op een bepaald punt, dus we berekenen eigenlijk de helling van de heuvel op basis van de verliesfunctie. We bepalen de verlies door de coëfficiënten door de verliesfunctie te halen. Als we de verliesfunctie “f” noemen, kunnen we de vergelijking voor het berekenen van de verlies als volgt schrijven (we halen de coëfficiënten door onze gekozen kostenfunctie):
Verlies = f(coëfficiënt)
We berekenen vervolgens de afgeleide, of bepalen de helling. Het verkrijgen van de afgeleide van de verlies zal ons vertellen in welke richting we moeten gaan, door ons de juiste teken te geven om onze coëfficiënten bij te werken. We zullen de juiste richting “delta” noemen.
delta = afgeleide_functie(verlies)
We hebben nu bepaald in welke richting we moeten gaan om het punt van laagste verlies te bereiken. Dit betekent dat we de coëfficiënten in de parameters van het netwerk kunnen bijwerken en hopelijk de verlies verlagen. We zullen de coëfficiënten bijwerken op basis van de vorige coëfficiënten minus de juiste verandering in waarde, zoals bepaald door de richting (delta) en een argument dat de grootte van de verandering controleert (de grootte van onze stap). Het argument dat de grootte van de update controleert, wordt de “leer tempo” genoemd en we zullen het “alfa” noemen.
coëfficiënt = coëfficiënt – (alfa * delta)
We herhalen dit proces totdat het netwerk is geconvergeerd rond het punt van laagste verlies, dat dicht bij nul moet liggen.
Het is heel belangrijk om de juiste waarde voor het leer tempo (alfa) te kiezen. De gekozen leer tempo moet niet te klein of te groot zijn. Denk eraan dat, als we dichter bij het punt van laagste verlies komen, onze stappen kleiner moeten worden, anders kunnen we het werkelijke punt van laagste verlies voorbijlopen en eindigen op de andere kant. Het punt van laagste verlies is klein en als onze veranderingssnelheid te groot is, kan de fout weer toenemen. Als de stapgroottes te groot zijn, zal de prestatie van het netwerk blijven schommelen rond het punt van laagste verlies, het overschrijden aan de ene kant en dan aan de andere kant. Als dit gebeurt, zal het netwerk nooit convergeren naar de werkelijke optimale gewichtconfiguratie.
In tegenstelling tot, als het leer tempo te klein is, kan het netwerk potentieel een buitengewoon lange tijd nodig hebben om te convergeren naar de optimale gewichten.
Soorten Gradient Descent
Nu we begrijpen hoe gradient descent in het algemeen werkt, laten we eens kijken naar enkele van de verschillende soorten gradient descent.
Batch Gradient Descent: Deze vorm van gradient descent verwerkt alle trainingsvoorbeelden voordat de coëfficiënten worden bijgewerkt. Deze vorm van gradient descent is waarschijnlijk de meest computationeel efficiënte vorm van gradient descent, omdat de gewichten alleen worden bijgewerkt als de hele batch is verwerkt, wat betekent dat er minder updates zijn in totaal. Echter, als de dataset een groot aantal trainingsvoorbeelden bevat, kan batch gradient descent de training lang maken.
Stochastic Gradient Descent: In Stochastic Gradient Descent wordt slechts één trainingsvoorbeeld verwerkt voor elke iteratie van gradient descent en parameter bijwerken. Dit gebeurt voor elk trainingsvoorbeeld. Omdat slechts één trainingsvoorbeeld wordt verwerkt voordat de parameters worden bijgewerkt, convergeert het sneller dan Batch Gradient Descent, omdat updates eerder worden gemaakt. Echter, omdat het proces moet worden uitgevoerd op elk item in de trainingsset, kan het een lange tijd duren om te voltooien als de dataset groot is, en dus kan het gebruik van een van de andere soorten gradient descent de voorkeur hebben.
Mini-Batch Gradient Descent: Mini-Batch Gradient Descent werkt door de hele trainingsdataset op te splitsen in subsections. Het maakt kleinere mini-batches die door het netwerk worden verwerkt, en wanneer de mini-batch is gebruikt om de fout te berekenen, worden de coëfficiënten bijgewerkt. Mini-Batch Gradient Descent vindt een middenweg tussen Stochastic Gradient Descent en Batch Gradient Descent. Het model wordt vaker bijgewerkt dan in het geval van Batch Gradient Descent, wat betekent een iets snellere en robuustere convergentie naar de optimale parameters van het model. Het is ook computationeel efficiënter dan Stochastic Gradient Descent












