AI 101
Hvad er Gradient Descent?

Hvad er Gradient Descent?
Hvis du har læst om, hvordan neurale netværk trænes, har du næsten sikkert stødt på begrebet “gradient descent” før. Gradient descent er den primære metode til at optimere et neuralt netværks præstation, reducere netværkets fejl/rate. however, gradient descent kan være lidt svær at forstå for dem, der er nye til maskinlæring, og denne artikel vil forsøge at give dig en ordentlig intuition for, hvordan gradient descent fungerer.
Gradient descent er en optimeringsalgoritme. Det bruges til at forbedre et neuralt netværks præstation ved at lave justeringer af netværkets parametre, så forskellen mellem netværkets forudsigelser og de faktiske/forventede værdier af netværket (kaldet fejlen) er så lille som muligt. Gradient descent tager de oprindelige værdier af parametrene og bruger operationer baseret på kalkulus til at justere deres værdier mod de værdier, der vil gøre netværket så præcist som muligt. Du behøver ikke at kende meget om kalkulus for at forstå, hvordan gradient descent fungerer, men du skal have en forståelse for gradienter.
Hvad er Gradienter?
Antag, at der er et graf, der repræsenterer det antal fejl, et neuralt netværk laver. Bundene af grafen repræsenterer punkterne med den laveste fejl, mens toppen af grafen er, hvor fejlen er højest. Vi vil flytte os fra toppen af grafen ned til bunden. En gradient er bare en måde at kvantificere forholdet mellem fejl og vægtene af det neurale netværk. Forholdet mellem disse to ting kan grafisk repræsenteres som en skråning, med forkerte vægte, der producerer mere fejl. Stejlheden af skråningen/gradienten repræsenterer, hvor hurtigt modellen lærer.
En stejlere skråning betyder, at store reduceringer i fejl foretages, og modellen lærer hurtigt, hvorimod hvis skråningen er nul, er modellen på en plateau og lærer ikke. Vi kan flytte ned ad skråningen mod mindre fejl ved at beregne en gradient, en retning for vores modells bevægelse (ændring i parametrene af netværket).
Lad os skifte metaforen lidt og forestille os en række bakker og dale. Vi vil nå bunden af bakken og finde den del af dalen, der repræsenterer den laveste fejl. Når vi starter øverst på bakken, kan vi tage store skridt ned ad bakken og være sikre på, at vi er på vej mod det laveste punkt i dalen.
Men når vi kommer tættere på det laveste punkt i dalen, skal vores skridt blive mindre, ellers kan vi overskyde det sande laveste punkt. Ligesom det er muligt, at når vi justerer vægtene af netværket, kan justeringerne faktisk tage det længere væk fra punktet med den laveste fejl, og derfor skal justeringerne blive mindre over tid. I sammenhængen med at gå ned ad en bakke mod et punkt med den laveste fejl er gradienten en vektor/instruktioner, der detaljerer den vej, vi skal tage, og hvor store vores skridt skal være.
Nu vi ved, at gradienter er instruktioner, der fortæller os, hvilken retning vi skal gå i (hvilke koefficienter skal opdateres) og hvor store vores skridt skal være (hvordan meget koefficienterne skal opdateres), kan vi udforske, hvordan gradienten beregnes.
Beregning af Gradienter & Gradient Descent

Gradient descent starter på et sted med høj fejl og ved at gå gennem multiple iterationer, tager skridt i retningen af den laveste fejl, med målet at finde den optimale vægtkonfiguration. Foto: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)
For at udføre gradient descent, skal gradienterne først beregnes. For at beregne gradienten, har vi brug for at kende fejl/funktionsfunktionen. Vi vil bruge kostfunktionen til at bestemme afledningen. I kalkulus refererer afledningen bare til skråningen af en funktion i et givet punkt, så vi beregner grundlæggende bare skråningen af bakken baseret på fejlfunktionen. Vi bestemmer fejlen ved at køre koefficienterne gennem fejlfunktionen. Hvis vi repræsenterer fejlfunktionen som “f”, kan vi sige, at ligningen for at beregne fejlen er følgende (vi kører bare koefficienterne gennem vores valgte kostfunktion):
Fejl = f(koefficient)
Derefter beregner vi afledningen eller bestemmer skråningen. At få afledningen af fejlen vil fortælle os, hvilken retning der er op eller ned ad skråningen, ved at give os det passende tegn til at justere vores koefficienter med. Vi vil repræsentere den passende retning som “delta”.
delta = afledningsfunktion(fejl)
Vi har nu bestemt, hvilken retning der er ned ad skråningen mod punktet med den laveste fejl. Dette betyder, at vi kan opdatere koefficienterne i netværkets parametre og håbe at reducere fejlen. Vi vil opdatere koefficienterne baseret på de tidligere koefficienter minus den passende ændring i værdi, som bestemmes af retningen (delta) og et argument, der kontrollerer størrelsen af ændringen (størrelsen af vores skridt). Argumentet, der kontrollerer størrelsen af opdateringen, kaldes “læringshastigheden” og vi vil repræsentere det som “alpha”.
koefficient = koefficient – (alpha * delta)
Derefter gentager vi bare processen, indtil netværket er konvergeret omkring punktet med den laveste fejl, som burde være nær nul.
Det er meget vigtigt at vælge den rigtige værdi for læringshastigheden (alpha). Den valgte læringshastighed skal hverken være for lille eller for stor. Husk, at når vi nærmer os punktet med den laveste fejl, skal vores skridt blive mindre, ellers kan vi overskyde det sande punkt med den laveste fejl og ender med at være på den anden side. Punktet med den laveste fejl er lille, og hvis vores ændringshastighed er for stor, kan fejlen ende med at øge igen. Hvis skridtstørrelserne er for store, vil netværkets præstation fortsætte med at hoppe rundt om punktet med den laveste fejl, overskydende det på den ene side og derefter den anden. Hvis dette sker, vil netværket aldrig konvergere om den optimale vægtkonfiguration.
Til gengæld, hvis læringshastigheden er for lille, kan netværket potentielt tage en ekstraordinær lang tid at konvergere om de optimale vægte.
Typer af Gradient Descent
Nu, da vi forstår, hvordan gradient descent fungerer generelt, lad os kaste et blik på nogle af de forskellige typer af gradient descent.
Batch Gradient Descent: Denne form for gradient descent kører gennem alle træningsprøverne, før koefficienterne opdateres. Denne type gradient descent er sandsynligvis den mest beregningsmæssigt effektive form for gradient descent, da vægtene kun opdateres én gang, efter hele batchen er blevet behandlet, hvilket betyder, at der er færre opdateringer i alt. however, hvis datasset indeholder et stort antal træningsprøver, kan batch gradient descent gøre træningen langsom.
Stochastic Gradient Descent: I Stochastic Gradient Descent behandles kun en enkelt træningsprøve for hver iteration af gradient descent og parameteropdatering. Dette sker for hver træningsprøve. Fordi kun en enkelt træningsprøve behandles, før parametrene opdateres, tenderer det til at konvergere hurtigere end Batch Gradient Descent, da opdateringerne sker tidligere. however, da processen skal udføres på hver enkelt prøve i træningssettet, kan det tage meget lang tid at fuldføre, hvis datasset er stort, og derfor kan brugen af en af de andre gradient descent-typer være foretrukket.
Mini-Batch Gradient Descent: Mini-Batch Gradient Descent fungerer ved at opdele hele træningsdatasettet i underafsnit. Det opretter små mini-batches, der køres gennem netværket, og når mini-batchen er blevet brugt til at beregne fejlen, opdateres koefficienterne. Mini-Batch Gradient Descent finder en middelvej mellem Stochastic Gradient Descent og Batch Gradient Descent. Modellen opdateres hyppigere end i tilfældet med Batch Gradient Descent, hvilket betyder en lidt hurtigere og mere robust konvergens omkring modellens optimale parametre. Det er også mere beregningsmæssigt effektivt end Stochastic Gradient Descent










