33. Stokastisk gradientnedstigning, AKA "hitta brantaste stigen ner till dalen"
Stokastisk gradientnedstigning – eller stochastic gradient descent – är en metod för att optimera förlustfunktionen (eng. loss function) i ett neuralt nätverk under uppträning. Förlustfunktionen visar hur mycket modellens beräkningar skiljer sig från verklighetens, och vi vill hitta det globla minimumet i förlustfunktionen där modellens parametrar har som bäst värden. Två vanliga metoder för att ta fram själva förlustfunktionen är Mean Squared Error och Cross Entropy.
Med “gradient” avses att vi har att göra med två eller flera derivator av samma funktion [1], och om jag har förstått det hela rätt så blir det en derivata för varje parameter i modellen, vilket kan bli tiotusentals. Den slutliga gradienten blir i alla fall ett stort multidimensionellt vektorrum som svår att representera i bild. Ofta brukar man jämföra det med ett bergslandskap där det gäller att hitta den brantaste stigen ner till dalen där vi har vårt globala minimum. Jag tänker inte försöka ge mig på matematiken bakom detta, men principen är följande.
Gradientnedstigning börjar med att man antar ett godtyckligt värde för varje enskild parameter i förlustfunktionen samt en inlärningshastighet (eng. learning rate) . Därefter beräknar man tangenten på den punkt i förlustfunktionen som motsvarar det värdet. Sedan tar man ett steg vidare i motsatt riktning av tangenten. Storleken på det steget beror på inlärningshastigheten man har satt, men generellt är det större i början för att sedan bli mindre och mindre ju närmare vi kommer 0. Vi fortsätter att hoppa vidare från ett värde till ett annat (via inlärningshastigheten) tills vi hittat ett minumum.
Den här processen kan ta väldigt lång tid när man har att göra med stora mängder indata, och dessutom riskerar den att fastna i lokala minimama i tron om att den har hittat det globala mininumet. Det är därför vi vill göra gradientnedstigningen stokastisk, dvs. slumpmässig. Stokastisk gradientnedstigning innebär nämligen att vi slumpmässigt blandar om träningsexmplen så att gradienten ser lite olika ut under varje iteration. Och istället för att justera om vikterna mot varje instans i träningsdatat väljer vi ut en delmängd av datat (“mini-batches”), vilket snabbar på processen.