Grundlæggende AI

Hvad er Gradient Descent?

mm
Føj Unite.AI til dine foretrukne kilder på Google

Hvad er en 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 en neural networks præstation, ved at reducere netværkets fejl/rate. Gradient descent kan dog være lidt svær at forstå for dem, der er nye i maskinlæring, og denne artikel vil forsøge at give dig en ordentlig intuition for, hvordan gradient descent fungerer.

Gradient descent er en optimeringsalgoritme. Den bruges til at forbedre en neural networks 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 vide 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 diagram, der repræsenterer mængden af fejl, et neural netværk laver. Bunden af diagrammet repræsenterer punkterne med den laveste fejl, mens toppen af diagrammet er, hvor fejlen er højest. Vi vil gerne flytte os fra toppen af diagrammet ned til bunden. En gradient er blot 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. Skråningens stejlhed repræsenterer, hvor hurtigt modellen lærer.

En stejlere skråning betyder, at der sker store reduceringer i fejl, og modellen lærer hurtigt, hvorimod hvis skråningen er nul, er modellen på en plateau og lærer ikke. Vi kan flytte os ned ad skråningen mod mindre fejl ved at beregne en gradient, en retning for modellens bevægelse (ændring i netværkets parametre).

Lad os skifte metaforen lidt og forestille os en række bakker og dale. Vi vil gerne nå bunden af bakken og finde det punkt i 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 og ender på den anden side. Ligesom det er muligt, at når vi justerer vægtene af netværket, kan justeringerne faktisk føre 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 gradienen en vektor/instruktioner, der detaljerer den vej, vi skal gå, 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, der skal opdateres) og hvor store vores skridt skal være (hvor meget koefficienterne skal opdateres), kan vi udforske, hvordan gradienen beregnes.

Beregning af Gradienter & Gradient Descent

Gradient descent starter på et sted med høj fejl og flytter sig gennem multiple iterationer, tager skridt i retning af den laveste fejl, med målet at finde den optimale vægtkonfiguration. Billede: Роман Сузи 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 gradienen, har vi brug for at kende fejl/funktionen. Vi vil bruge fejl/funktionen til at bestemme afledningen. I kalkulus refererer afledningen blot til skråningen af en funktion på et given punkt, så vi beregner grundlæggende skråningen af bakken baseret på fejl/funktionen. Vi bestemmer fejlen ved at køre koefficienterne gennem fejl/funktionen. Hvis vi repræsenterer fejl/funktionen som “f”, kan vi sige, at ligningen for at beregne fejlen er følgende (vi kører blot koefficienterne gennem vores valgte fejl/funktion):

Fejl = f(koefficient)

Vi beregner herefter 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 = aflednings_funktion(fejl)

Vi har nu bestemt, hvilken retning der er ned ad bakken 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 forrige 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)

Vi gentager herefter denne proces, indtil netværket har konvergeret omkring punktet med den laveste fejl, som burde være nær nul.

Det er meget vigtigt at vælge den rette værdi for læringshastigheden (alpha). Den valgte læringshastighed må ikke 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 ende 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, overskyde det på den ene side og så på 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, hvor 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øver, 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 at hele batchen er blevet behandlet, hvilket betyder, at der er færre opdateringer i alt. Men hvis datasættet 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, konvergerer den generelt hurtigere end Batch Gradient Descent, da opdateringerne sker tidligere. Men da processen skal udføres på hver enkelt prøve i træningssættet, kan det tage lang tid at fuldføre, hvis datasættet er stort, og derfor kan brugen af en af de andre typer gradient descent være at foretrække.

Mini-Batch Gradient Descent: Mini-Batch Gradient Descent fungerer ved at splitte det hele træningssæt op i undersektioner. Den opretter mindre 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 midtergrund mellem Stochastic Gradient Descent og Batch Gradient Descent. Modellen opdateres mere hyppigt end i tilfældet med Batch Gradient Descent, hvilket betyder en lidt hurtigere og mere robust konvergens om modellens optimale parametre. Det er også mere beregningsmæssigt effektivt end Stochastic Gradient Descent

Blogger og programmør med specialer i Machine Learning og Deep Learning emner. Daniel håber at hjælpe andre med at bruge AI's kraft til sociale formål.