stub Hvad er Gradient Descent? - Unite.AI
Følg os

AI 101

Hvad er Gradient Descent?

mm
Opdateret on

Hvad er en gradientnedstigning?

Hvis du har læst om, hvordan neurale netværk trænes, har du næsten helt sikkert stødt på udtrykket "gradient descent" før. Gradient nedstigning er den primære metode til at optimere et neuralt netværks ydeevne, hvilket reducerer netværkets tab/fejlrate. Gradient descent kan dog være lidt svært at forstå for dem, der er nye til maskinlæring, og denne artikel vil bestræbe sig på at give dig en anstændig intuition for, hvordan gradient descent fungerer.

Gradient descent er en optimeringsalgoritme. Det bruges til at forbedre ydeevnen af ​​et neuralt netværk ved at foretage justeringer af netværkets parametre, således at forskellen mellem netværkets forudsigelser og de faktiske/forventede værdier af netværket (benævnt tabet) er så lille som muligt. Gradient descent tager de indledende værdier af parametrene og bruger operationer baseret på kalkulation til at justere deres værdier mod de værdier, der vil gøre netværket så nøjagtigt, som det kan være. Du behøver ikke at kunne en masse calculus for at forstå, hvordan gradientnedstigning fungerer, men du skal have en forståelse af gradienter.

Hvad er gradienter?

Antag, at der er en graf, der repræsenterer mængden af ​​fejl et neuralt netværk laver. Bunden af ​​grafen repræsenterer punkterne med laveste fejl, mens toppen af ​​grafen er der, hvor fejlen er højest. Vi ønsker at bevæge os fra toppen af ​​grafen ned til bunden. En gradient er blot en måde at kvantificere forholdet mellem fejl og vægten af ​​det neurale netværk. Forholdet mellem disse to ting kan tegnes som en hældning, med forkerte vægte, der giver flere fejl. Skråningens/gradientens stejlhed repræsenterer, hvor hurtigt modellen lærer.

En stejlere hældning betyder, at der foretages store reduktioner i fejl, og at modellen lærer hurtigt, mens hvis hældningen er nul, er modellen på et plateau og lærer ikke. Vi kan bevæge os ned ad skråningen mod mindre fejl ved at beregne en gradient, en bevægelsesretning (ændring i netværkets parametre) for vores model.

Lad os ændre metaforen lidt og forestille os en række bakker og dale. Vi ønsker at komme til bunden af ​​bakken og finde den del af dalen, der repræsenterer det laveste tab. Når vi starter på toppen af ​​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, bliver vores skridt nødt til at blive mindre, ellers kan vi overskride det sande laveste punkt. På samme måde er det muligt, at når du justerer netværkets vægte, kan justeringerne faktisk tage det længere væk fra punktet med det laveste tab, og derfor skal justeringerne blive mindre over tid. I sammenhæng med at gå ned ad en bakke mod et punkt med det laveste tab, er gradienten en vektor/instruktioner, der beskriver den vej, vi skal tage, og hvor store vores skridt skal være.

Nu ved vi, at gradienter er instruktioner, der fortæller os, hvilken retning vi skal bevæge os i (hvilke koefficienter skal opdateres) og hvor store skridt vi skal tage er (hvor meget koefficienterne skal opdateres), vi kan undersøge, hvordan gradienten beregnes.

Beregning af gradienter og gradientnedstigning

Gradientnedstigning starter på et sted med stort tab og tager gennem flere iterationer skridt i retning af det laveste tab, med det formål 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 gradientnedstigning skal gradienterne først beregnes. I rækkefølge at beregne gradienten, skal vi kende tab/omkostningsfunktionen. Vi bruger omkostningsfunktionen til at bestemme den afledte. I calculus refererer den afledede kun til hældningen af ​​en funktion på et givet punkt, så vi beregner i bund og grund kun hældningen af ​​bakken baseret på tabsfunktionen. Vi bestemmer tabet ved at køre koefficienterne gennem tabsfunktionen. Hvis vi repræsenterer tabsfunktionen som "f", så kan vi konstatere, at ligningen for at beregne tabet er som følger (vi kører bare koefficienterne gennem vores valgte omkostningsfunktion):

Tab = f(koefficient)

Vi beregner derefter den afledede, eller bestemmer hældningen. At få den afledte af tabet vil fortælle os, hvilken retning der er op eller ned af skråningen, ved at give os det passende tegn at justere vores koefficienter efter. Vi repræsenterer den passende retning som "delta".

delta = afledt_funktion(tab)

Vi har nu bestemt, hvilken retning der er ned ad bakke mod punktet med det laveste tab. Det betyder, at vi kan opdatere koefficienterne i de neurale netværksparametre og forhåbentlig reducere tabet. Vi opdaterer koefficienterne baseret på de foregående koefficienter minus den passende ændring i værdi som bestemt af retningen (delta) og et argument, der styrer størrelsen af ​​ændringen (størrelsen af ​​vores trin). Argumentet, der styrer størrelsen af ​​opdateringen, kaldes "indlæringshastighed” og vi repræsenterer det som “alfa”.

koefficient = koefficient – ​​(alfa * delta)

Vi gentager så bare denne proces, indtil netværket har konvergeret omkring punktet med det laveste tab, som burde være tæt på nul.

Det er meget vigtigt at vælge den rigtige værdi for indlæringshastigheden (alfa). Den valgte indlæringsrate må hverken være for lille eller for stor. Husk, at når vi nærmer os det laveste tab, skal vores skridt blive mindre, ellers vil vi overskride det sande punkt med det laveste tab og ende på den anden side. Pointen med det mindste tab er lille, og hvis vores forandringshastighed er for stor, kan fejlen ende med at stige igen. Hvis trinstørrelserne er for store, vil netværkets ydeevne fortsætte med at hoppe omkring punktet med det laveste tab og overskride det på den ene side og derefter den anden. Hvis dette sker, vil netværket aldrig konvergere til den sande optimale vægtkonfiguration.

I modsætning hertil, hvis indlæringshastigheden er for lille, kan netværket potentielt tage ekstraordinært lang tid at konvergere til de optimale vægte.

Typer af gradientnedstigning

Nu hvor vi forstår, hvordan gradientnedstigning fungerer generelt, lad os tage et kig på nogle af de forskellige typer af gradientnedstigning.

Batch Gradient Descent: Denne form for gradient descent løber gennem alle træningsprøverne, før koefficienterne opdateres. Denne type gradientnedstigning er sandsynligvis den mest beregningsmæssigt effektive form for gradientnedstigning, da vægtene først opdateres, når hele batchen er blevet behandlet, hvilket betyder, at der er færre opdateringer i alt. Men hvis datasættet indeholder et stort antal træningseksempler, kan batchgradientnedstigning få træningen til at tage lang tid.

Stokastisk gradientnedstigning: I Stokastisk gradientnedstigning behandles kun et enkelt træningseksempel for hver iteration af gradientnedstigning og parameteropdatering. Dette sker for hvert træningseksempel. Fordi kun ét træningseksempel behandles, før parametrene opdateres, har det en tendens til at konvergere hurtigere end Batch Gradient Descent, da opdateringer foretages hurtigere. Men fordi processen skal udføres på hvert element i træningssættet, kan det tage temmelig lang tid at gennemføre, hvis datasættet er stort, og så brug af en af ​​de andre gradient-nedstigningstyper, hvis det foretrækkes.

Mini-Batch Gradient Descent: Mini-Batch Gradient Descent fungerer ved at opdele hele træningsdatasættet i underafsnit. Det skaber mindre mini-batches, der køres gennem netværket, og når mini-batchen er brugt til at beregne fejlen, opdateres koefficienterne. Mini-batch Gradient Descent rammer en mellemting mellem Stokastisk 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 på modellens optimale parametre. Det er også mere beregningsmæssigt effektivt end Stokastisk Gradient Descent

Blogger og programmør med speciale i Maskinelæring , Deep Learning emner. Daniel håber at kunne hjælpe andre med at bruge AI's kraft til socialt gode.