Ga naar de hoofdinhoud
BVDNET
Arnhem · websites & automatiseringBVDNET
Kernconcepten

Gradient descent

Gradient descent is de methode waarmee de meeste AI-modellen leren: het past de instellingen van het model stap voor stap aan, steeds in de richting van minder fouten.

Ook bekend als: SGD, stochastic gradient descent, gradiëntdaling

Gradient descent is de methode waarmee de meeste AI-modellen leren. Het model doet een voorspelling, meet hoe ver die ernaast zit en past elke interne instelling een beetje aan in de richting waarin de fout kleiner wordt, keer op keer. Denk aan een heuvel afdalen in de mist, steeds met een stap waar het het steilst omlaag gaat. Het draait ook als een bedrijf een model fine-tunet op eigen voorbeelden.

Hoe werkt het?

Neem een model met één instelling en zet de fout uit tegen die instelling. De helling van de grafiek laat zien waar het omlaag gaat, dus je verschuift de instelling een klein stapje die kant op en kijkt opnieuw naar de helling. Het leerboek Deep Learning van Goodfellow, Bengio en Courville herleidt de techniek tot Cauchy in 1847. Een echt model heeft veel instellingen, gewichten genoemd. De gradiënt bevat één helling per gewicht en wijst omhoog, dus elke stap gaat de andere kant op: gewicht = gewicht - learning_rate * gradiënt. De learning rate bepaalt hoe groot de stap is.

De fout wordt gemeten met een loss function, en backpropagation berekent de gradiënt. Voor het netwerk dat cijfers herkent in de les van 3Blue1Brown is de gradiënt een lijst van 13.002 duwtjes, één per gewicht en bias. Voor Llama 3 405B van Meta heeft hij 405 miljard waarden, één per parameter (Llama 3-paper). De training begint met willekeurige gewichten en herhaalt de stap tot de loss niet meer daalt. De Machine Learning Crash Course van Google noemt dat convergentie.

Batch, stochastic of mini-batch?

De varianten verschillen in hoeveel voorbeelden elke stap bekijkt. Hoofdstuk 8 van hetzelfde leerboek noemt methoden die per stap de hele trainingsset gebruiken batch gradient descent, en methoden die één voorbeeld tegelijk gebruiken stochastic of online. Deep learning zit meestal daartussen, met een mini-batch van doorgaans 32 tot 256 voorbeelden (batch size), en dat heet tegenwoordig gewoon stochastic gradient descent (SGD). Volgens het boek draait bijna alle deep learning erop.

Andere optimalisatiealgoritmen veranderen de stap zelf. Momentum telt er een uitdovend gemiddelde van eerdere gradiënten bij op, wat helpt in een lang, smal dal waarin gewone gradient descent zigzagt. Adam (Kingma en Ba, 2014) geeft elk gewicht een eigen stapgrootte, op basis van lopende gemiddelden van zijn gradiënten en hun kwadraten. AdamW (Loshchilov en Hutter, 2017) verandert hoe Adam weight decay toepast, een techniek die de gewichten bij elke stap een beetje kleiner maakt. Meta trainde Llama 2 met AdamW (Touvron e.a., 2023).

Waar gaat het mis?

  • De learning rate zit ernaast. Is hij te groot, dan kan gradient descent de fout vergroten in plaats van verkleinen; is hij te klein, dan gaat de training langzamer en kan hij blijven steken bij een hoge fout (Deep Learning, hoofdstuk 11).
  • Het algoritme komt in een dal terecht dat niet het laagste is. Waar je uitkomt, hangt af van waar je begint, zoals 3Blue1Brown laat zien. Lineaire modellen hebben daar geen last van: hun loss-oppervlak is convex, één enkele kom, dus gradient descent vindt het laagste punt. Voor grote neurale netwerken schrijft het leerboek dat experts nu vermoeden dat de meeste lokale minima een lage loss hebben, zodat het weinig uitmaakt of je het allerlaagste punt vindt.
  • Het vertraagt op vlak terrein. In veel problemen met veel dimensies komen zadelpunten, waar het oppervlak in de ene richting omhoog en in de andere omlaag loopt, veel vaker voor dan lokale minima. Dauphin e.a. (2014) stellen dat de vlakten rond zadelpunten het grotere obstakel zijn, omdat ze het leren vertragen en op een minimum lijken.

Voorbeeld

De crash course van Google voorspelt de zuinigheid van een auto in miles per gallon uit het gewicht, met zeven auto's en de mean squared error als loss. Het model begint met gewicht en bias op 0, en de loss is dan 303,71. De hellingen zijn -119,7 voor het gewicht en -34,3 voor de bias. Met een learning rate van 0,01 wordt het gewicht 1,20 en de bias 0,34, en daalt de loss naar 170,84. Bij de zesde iteratie is hij 42,17. Deze lus levert dezelfde getallen op:

Python
1x = [3.5, 3.69, 3.44, 3.43, 4.34, 4.42, 2.37] # gewicht van de auto in 1.000 pond
2y = [18, 15, 18, 16, 15, 14, 24] # miles per gallon
3w, b, lr = 0.0, 0.0, 0.01 # modelgewicht, bias, learning rate
4for step in range(6):
5 errors = [(w * xi + b) - yi for xi, yi in zip(x, y)]
6 loss = sum(e * e for e in errors) / len(x) # mean squared error
7 grad_w = sum(2 * e * xi for e, xi in zip(errors, x)) / len(x)
8 grad_b = sum(2 * e for e in errors) / len(x)
9 print(step + 1, round(w, 2), round(b, 2), round(loss, 2))
10 w, b = w - lr * grad_w, b - lr * grad_b # de stap van gradient descent