Grunnleggende AI
Hva er Gradient Descent?
Hva er en Gradient Descent?
Hvis du har lest om hvordan neurale nettverk er trenet, har du nesten sikkert kommet over begrepet “gradient descent” før. Gradient descent er den primære metoden for å optimalisere en neural nettverks ytelse, ved å redusere nettverkets tap/feilrate. Imidlertid kan gradient descent være litt vanskelig å forstå for de som er nye i maskinlæring, og denne artikkelen vil forsøke å gi deg en god forståelse av hvordan gradient descent fungerer.
Gradient descent er en optimeringsalgoritme. Den brukes til å forbedre ytelsen til et neural nettverk ved å gjøre justeringer av nettverkets parametre slik at forskjellen mellom nettverkets prediksjoner og de faktiske/forventede verdiene av nettverket (kalt tap) er så liten som mulig. Gradient descent tar de initielle verdiene av parameterne og bruker operasjoner basert på kalkulus til å justere deres verdier mot de verdier som vil gjøre nettverket så nøyaktig som mulig. Du trenger ikke å vite mye om kalkulus for å forstå hvordan gradient descent fungerer, men du må ha en forståelse av grader.
Hva er Grader?
Anta at det finnes en graf som representerer mengden feil et neural nettverk gjør. Bunnen av grafen representerer punktene med lavest feil, mens toppen av grafen er der feilen er høyest. Vi ønsker å flytte oss fra toppen av grafen ned til bunnen. En grad er bare en måte å kvantifisere forholdet mellom feil og vekter i det neurale nettverket. Forholdet mellom disse to ting kan grafisk fremstilles som en helning, med feil vekter som produserer mer feil. Helningens/gradens bråthehet representerer hvor raskt modellen lærer.
En bråtere helning betyr store reduksjoner i feil blir gjort og modellen lærer raskt, mens hvis helningen er null, er modellen på en platå og lærer ikke. Vi kan flytte nedover helningen mot mindre feil ved å beregne en grad, en retning for bevegelse (endring i nettverkets parametre) for vår modell.
La oss skifte metaforen litt og forestille oss en rekke åser og daler. Vi ønsker å komme til bunnen av åsen og finne delen av dalen som representerer lavest tap. Når vi starter på toppen av åsen, kan vi ta store skritt nedover åsen og være trygge på at vi er på vei mot lavest punkt i dalen.
Imidlertid, når vi kommer nærmere lavest punkt i dalen, må våre skritt bli mindre, ellers kan vi overskride det faktiske lavest punktet. Liksom når vi justerer vekter i nettverket, kan justeringene faktisk ta det lengre bort fra punktet med lavest tap, og derfor må justeringene bli mindre over tid. I sammenheng med å gå nedover en ås mot et punkt med lavest tap, er graden en vektor/instruksjoner som detaljerer veien vi skal gå og hvor store skritt vi skal ta.
Nå vi vet at grader er instruksjoner som forteller oss hvilken retning å gå i (hvilke koeffisienter som skal oppdateres) og hvor store skritt vi skal ta (hvor mye koeffisientene skal oppdateres), kan vi utforske hvordan graden beregnes.
Beregning av Grader og Gradient Descent

Gradient descent starter på et sted med høyt tap og gjennom flere iterasjoner, tar skritt i retning av lavest tap, med mål om å finne den optimale vekt-konfigurasjonen. Foto: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)
For å utføre gradient descent, må graderne først beregnes. For å beregne graden, må vi kjenne til tap/funksjonen. Vi vil bruke kostnadsfunksjonen til å bestemme derivaten. I kalkulus refererer derivaten bare til helningen av en funksjon på et gitt punkt, så vi beregner i praksis bare helningen av åsen basert på tap-funksjonen. Vi bestemmer tapet ved å kjøre koeffisientene gjennom tap-funksjonen. Hvis vi representerer tap-funksjonen som “f”, kan vi si at ligningen for å beregne tapet er som følger (vi kjører bare koeffisientene gjennom vår valgte kostnadsfunksjon):
Tap = f(koeffisient)
Så beregner vi derivaten, eller bestemmer helningen. Å få derivaten av tapet, forteller oss hvilken retning som er opp eller ned helningen, ved å gi oss det riktige tegnet for å justere koeffisientene våre. Vi vil representere den riktige retningen som “delta”.
delta = derivative_function(tap)
Vi har nå bestemt hvilken retning som er nedover helningen mot punktet med lavest tap. Dette betyr at vi kan oppdatere koeffisientene i nettverkets parametre og håpe å redusere tapet. Vi vil oppdatere koeffisientene basert på de forrige koeffisientene minus den riktige endringen i verdi, bestemt av retningen (delta) og et argument som kontrollerer størrelsen på endringen (størrelsen på vårt skritt). Argumentet som kontrollerer størrelsen på oppdateringen, kalles “læringsraten” og vi vil representere det som “alpha”.
koeffisient = koeffisient – (alpha * delta)
Så gjentar vi bare denne prosessen til nettverket har konvergert rundt punktet med lavest tap, som bør være nær null.
Det er veldig viktig å velge riktig verdi for læringsraten (alpha). Den valgte læringsraten må ikke være for liten eller for stor. Husk at når vi nærmer oss punktet med lavest tap, må skrittene våre bli mindre, ellers kan vi overskride det faktiske lavest punktet og havne på den andre siden. Punktet med minst tap er lite og hvis vår endringsrate er for stor, kan feilen ende opp med å øke igjen. Hvis skrittstørrelsen er for stor, vil nettverkets ytelse fortsette å bevege seg rundt punktet med lavest tap, overskride det på den ene siden og så på den andre. Hvis dette skjer, vil nettverket aldri konvergere mot den optimale vekt-konfigurasjonen.
I motsetning til dette, hvis læringsraten er for liten, kan nettverket potensielt ta en usedvanlig lang tid å konvergere mot de optimale vektene.
Typer av Gradient Descent
Nå at vi forstår hvordan gradient descent fungerer generelt, la oss se på noen av de ulike typene av gradient descent.
Batch Gradient Descent: Denne formen for gradient descent kjører gjennom alle trenings-eksemplene før den oppdaterer koeffisientene. Denne typen gradient descent er sannsynligvis den mest komputasjonelt effektive formen for gradient descent, da vektene bare oppdateres én gang hele batchen er prosessert, noe som betyr færre oppdateringer totalt. Imidlertid, hvis datasettet inneholder et stort antall trenings-eksempler, kan batch gradient descent gjøre trening tidskrevende.
Stochastic Gradient Descent: I Stochastic Gradient Descent behandles bare ett trenings-eksempel for hver iterasjon av gradient descent og parameter-oppdatering. Dette skjer for hvert trenings-eksempel. Fordi bare ett trenings-eksempel behandles før parameterne oppdateres, tenderer det å konvergere raskere enn Batch Gradient Descent, da oppdateringer gjøres tidligere. Imidlertid, fordi prosessen må utføres på hvert element i treningssettet, kan det ta ganske lang tid å fullføre hvis datasettet er stort, og derfor foretrekkes en av de andre typene gradient descent.
Mini-Batch Gradient Descent: Mini-Batch Gradient Descent opererer ved å dele hele trenings-datasettet opp i underseksjoner. Den lager mindre mini-batch som kjøres gjennom nettverket, og når mini-batchen er brukt til å beregne feilen, oppdateres koeffisientene. Mini-Batch Gradient Descent finner en midtvei mellom Stochastic Gradient Descent og Batch Gradient Descent. Modellen oppdateres oftere enn i tilfelle med Batch Gradient Descent, noe som betyr en litt raskere og mer robust konvergens mot modellens optimale parametre. Det er også mer komputasjonelt effektivt enn Stochastic Gradient Descent












