stub Hva er Gradient Descent? - Unite.AI
Kontakt med oss

AI 101

Hva er Gradient Descent?

mm
oppdatert on

Hva er en gradientnedstigning?

Hvis du har lest om hvordan nevrale nettverk trenes, har du nesten helt sikkert kommet over begrepet "gradient descent" før. Gradient nedstigning er den primære metoden for å optimalisere ytelsen til et nevralt nettverk, og redusere nettverkets tap/feilrate. Gradientnedstigning kan imidlertid være litt vanskelig å forstå for de som er nye innen maskinlæring, og denne artikkelen vil forsøke å gi deg en anstendig intuisjon for hvordan gradientnedstigning fungerer.

Gradientnedstigning er en optimaliseringsalgoritme. Den brukes til å forbedre ytelsen til et nevralt nettverk ved å gjøre justeringer av parametrene til nettverket slik at forskjellen mellom nettverkets spådommer og de faktiske/forventede verdiene til nettverket (referert til som tap) er så liten som mulig. Gradientnedstigning tar de innledende verdiene til parameterne og bruker operasjoner basert på kalkulus for å justere verdiene deres mot verdiene som vil gjøre nettverket så nøyaktig som det kan bli. Du trenger ikke å kunne mye kalkulus for å forstå hvordan gradientnedstigning fungerer, men du trenger å ha forståelse for gradienter.

Hva er gradienter?

Anta at det er en graf som representerer mengden feil et nevralt nettverk gjør. Bunnen av grafen representerer punktene med lavest feil, mens toppen av grafen er der feilen er høyest. Vi ønsker å bevege oss fra toppen av grafen og ned til bunnen. En gradient er bare en måte å kvantifisere forholdet mellom feil og vektene til det nevrale nettverket. Forholdet mellom disse to tingene kan tegnes som en helning, med feil vekt som gir flere feil. Brattheten til skråningen/gradienten representerer hvor raskt modellen lærer.

En brattere skråning betyr at det gjøres store feilreduksjoner og at modellen lærer raskt, mens hvis skråningen er null, er modellen på et platå og lærer ikke. Vi kan bevege oss nedover skråningen mot mindre feil ved å beregne en gradient, en bevegelsesretning (endring i parametrene til nettverket) for vår modell.

La oss endre metaforen litt og forestille oss en serie med åser og daler. Vi ønsker å komme til bunnen av bakken og finne den delen av dalen som representerer det laveste tapet. Når vi starter på toppen av bakken kan vi ta store steg ned bakken og være trygge på at vi er på vei mot det laveste punktet i dalen.

Men når vi kommer nærmere det laveste punktet i dalen, må trinnene våre bli mindre, ellers kan vi overskride det sanne laveste punktet. På samme måte er det mulig at når du justerer vekten til nettverket, kan justeringene faktisk ta det lenger bort fra punktet med lavest tap, og derfor må justeringene bli mindre over tid. I sammenheng med å gå ned en bakke mot et punkt med laveste tap, er gradienten en vektor/instruksjoner som beskriver veien vi bør ta og hvor store skrittene våre skal være.

Nå vet vi at gradienter er instruksjoner som forteller oss hvilken retning vi skal bevege oss i (hvilke koeffisienter som skal oppdateres) og hvor store trinnene vi bør ta er (hvor mye koeffisientene skal oppdateres), vi kan utforske hvordan gradienten beregnes.

Beregning av gradienter og gradientnedstigning

Gradientnedstigning starter på et sted med høyt tap og tar ved flere iterasjoner skritt i retning av lavest tap, med sikte på å finne den optimale vektkonfigurasjonen. Foto: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)

For å utføre gradientnedstigning må gradientene først beregnes. I rekkefølge for å beregne gradienten, må vi kjenne tap/kostnadsfunksjonen. Vi bruker kostnadsfunksjonen for å bestemme den deriverte. I kalkulus refererer den deriverte bare til helningen til en funksjon ved et gitt punkt, så vi beregner i utgangspunktet bare helningen til bakken basert på tapsfunksjonen. Vi bestemmer tapet ved å kjøre koeffisientene gjennom tapsfunksjonen. Hvis vi representerer tapsfunksjonen 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)

Vi regner så ut den deriverte, eller bestemmer helningen. Å få den deriverte av tapet vil fortelle oss hvilken retning som er opp eller ned skråningen, ved å gi oss det passende tegnet å justere koeffisientene våre etter. Vi vil representere den riktige retningen som "delta".

delta = derivert_funksjon(tap)

Vi har nå bestemt hvilken retning som er nedover mot punktet med lavest tap. Dette betyr at vi kan oppdatere koeffisientene i nevrale nettverksparametere og forhåpentligvis redusere tapet. Vi oppdaterer koeffisientene basert på de forrige koeffisientene minus den passende verdiendringen som bestemt av retningen (delta) og et argument som kontrollerer størrelsen på endringen (størrelsen på trinnet vårt). Argumentet som styrer størrelsen på oppdateringen kalles "læringsfrekvens” og vi vil representere det som “alfa”.

koeffisient = koeffisient – ​​(alfa * delta)

Vi gjentar bare denne prosessen til nettverket har konvergert rundt punktet med laveste tap, som skal være nær null.

Det er veldig viktig å velge riktig verdi for læringsraten (alfa). Den valgte læringsraten må verken 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 vil vi overskride det sanne punktet med laveste tap og havne på den andre siden. Poenget med minste tap er lite, og hvis endringshastigheten vår er for stor, kan feilen ende opp med å øke igjen. Hvis trinnstørrelsene er for store, vil nettverkets ytelse fortsette å sprette rundt punktet med lavest tap, og overskride det på den ene siden og deretter på den andre. Hvis dette skjer, vil nettverket aldri konvergere til den sanne optimale vektkonfigurasjonen.

Derimot, hvis læringsraten er for liten, kan nettverket potensielt ta ekstraordinært lang tid å konvergere til de optimale vektene.

Typer Gradient Nedstigning

Nå som vi forstår hvordan gradientnedstigning fungerer generelt, la oss ta en titt på noen av de forskjellige typer gradientnedstigning.

Batch Gradient Descent: Denne formen for gradientnedstigning går gjennom alle treningsprøvene før koeffisientene oppdateres. Denne typen gradientnedstigning er sannsynligvis den mest beregningsmessig effektive formen for gradientnedstigning, siden vektene bare oppdateres når hele batchen er behandlet, noe som betyr at det er færre oppdateringer totalt. Men hvis datasettet inneholder et stort antall treningseksempler, kan batchgradientnedstigning gjøre at treningen tar lang tid.

Stokastisk gradientnedstigning: I Stokastisk gradientnedstigning behandles bare et enkelt treningseksempel for hver iterasjon av gradientnedstigning og parameteroppdatering. Dette skjer for hvert treningseksempel. Fordi bare ett treningseksempel behandles før parametrene oppdateres, har det en tendens til å konvergere raskere enn Batch Gradient Descent, ettersom oppdateringer gjøres raskere. Men fordi prosessen må utføres på hvert element i treningssettet, kan det ta ganske lang tid å fullføre hvis datasettet er stort, og derfor kan du bruke en av de andre gradientnedstigningstypene hvis det foretrekkes.

Mini-Batch Gradient Descent: Mini-Batch Gradient Descent fungerer ved å dele opp hele treningsdatasettet i underseksjoner. Den lager mindre minibatcher som kjøres gjennom nettverket, og når minibatchen er brukt til å beregne feilen oppdateres koeffisientene. Mini-batch Gradient Descent treffer en mellomting mellom Stokastisk Gradient Descent og Batch Gradient Descent. Modellen oppdateres hyppigere enn i tilfellet med Batch Gradient Descent, noe som betyr en litt raskere og mer robust konvergens på modellens optimale parametere. Den er også mer beregningseffektiv enn Stokastisk Gradient Descent

Blogger og programmerer med spesialiteter innen Maskinlæring og Dyp læring emner. Daniel håper å hjelpe andre å bruke kraften til AI til sosialt gode.