Connect with us

Vad Àr Gradient Descent?

AI 101

Vad Àr Gradient Descent?

mm

Vad är Gradient Descent?

Om du har läst om hur neuronnät tränas, har du nästan säkert stött på begreppet “gradient descent” tidigare. Gradient descent är den primära metoden för att optimera en neuronnets prestanda, minska nätverkets förlust/felhastighet. Men gradient descent kan vara lite svårt att förstå för dem som är nya inom maskinlärning, och den här artikeln ska ge dig en anständig intuition för hur gradient descent fungerar.

Gradient descent är ett optimeringsalgoritm. Det används för att förbättra prestandan hos ett neuronnät genom att göra justeringar av parametrarna i nätverket så att skillnaden mellan nätverkets förutsägelser och de faktiska/förväntade värdena för nätverket (som kallas för förlusten) är så liten som möjligt. Gradient descent tar de ursprungliga värdena för parametrarna och använder operationer baserade på kalkyl för att justera deras värden mot de värden som kommer att göra nätverket så exakt som möjligt. Du behöver inte veta mycket om kalkyl för att förstå hur gradient descent fungerar, men du behöver ha en förståelse för gradienter.

Vad är Gradient?

Anta att det finns ett diagram som representerar mängden fel som ett neuronnät gör. Botten av diagrammet representerar punkterna med lägsta fel medan toppen av diagrammet är där felet är som störst. Vi vill flytta från toppen av diagrammet ner till botten. En gradient är bara ett sätt att kvantifiera relationen mellan fel och vikterna i neuronnätet. Relationen mellan dessa två saker kan grafiskt representeras som en lutning, med felaktiga vikter som producerar mer fel. Lutningens branthet representerar hur snabbt modellen lär sig.

En brant lutning innebär stora minskningar av felet och modellen lär sig snabbt, medan om lutningen är noll så är modellen på en platå och lär sig inte. Vi kan flytta ner för lutningen mot mindre fel genom att beräkna en gradient, en riktning för rörelse (ändring i parametrarna i nätverket) för vår modell.

Låt oss skifta metaforen lite och föreställa oss en serie kullar och dalar. Vi vill komma till botten av kullen och hitta den delen av dalen som representerar den lägsta förlusten. När vi börjar på toppen av kullen kan vi ta stora steg ner för kullen och vara säkra på att vi är på väg mot den lägsta punkten i dalen.

Men när vi kommer närmare den lägsta punkten i dalen måste våra steg bli mindre, annars kan vi överskrida den verkliga lägsta punkten och hamna på andra sidan. Likaså är det möjligt att när vi justerar vikterna i nätverket, kan justeringarna faktiskt ta det längre bort från punkten med lägsta förlust, och därför måste justeringarna bli mindre över tid. I sammanhanget att nedstiga en kulle mot en punkt med lägsta förlust, är gradienten en vektor/instruktioner som detaljerar den väg vi ska ta och hur stora steg vi ska ta.

Nu när vi vet att gradienter är instruktioner som talar om för oss vilken riktning vi ska flytta i (vilka koefficienter som ska uppdateras) och hur stora steg vi ska ta (hur mycket koefficienterna ska uppdateras), kan vi undersöka hur gradienten beräknas.

Beräkning av Gradient & Gradient Descent

Gradient descent börjar på en plats med hög förlust och genom flera iterationer, tar steg i riktning mot lägsta förlust, i syfte att hitta den optimala viktkonfigurationen. Foto: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)

För att utföra gradient descent, måste gradienterna först beräknas. För att beräkna gradienten, behöver vi veta förlust/funktionen. Vi kommer att använda kostnadsfunktionen för att bestämma derivatan. I kalkyl hänvisar derivatan bara till lutningen på en funktion vid en given punkt, så vi beräknar i princip bara lutningen på kullen baserat på förlustfunktionen. Vi bestämmer förlusten genom att köra koefficienterna genom förlustfunktionen. Om vi representerar förlustfunktionen som “f”, kan vi säga att ekvationen för att beräkna förlusten är följande (vi kör bara koefficienterna genom vår valda kostnadsfunktion):

Förlust = f(koefficient)

Sedan beräknar vi derivatan, eller bestämmer lutningen. Att få derivatan av förlusten kommer att tala om för oss vilken riktning som är upp eller ner för lutningen, genom att ge oss rätt tecken för att justera våra koefficienter. Vi kommer att representera riktningen som “delta”.

delta = derivative_function(förlust)

Vi har nu bestämt vilken riktning som är nedåt mot punkten med lägsta förlust. Detta innebär att vi kan uppdatera koefficienterna i neuronnetsparametrarna och hoppas minska förlusten. Vi kommer att uppdatera koefficienterna baserat på de tidigare koefficienterna minus den lämpliga ändringen i värde som bestäms av riktningen (delta) och ett argument som kontrollerar ändringens storlek (storleken på vårt steg). Argumentet som kontrollerar uppdateringens storlek kallas “inlärningshastighet” och vi kommer att representera det som “alpha”.

koefficient = koefficient – (alpha * delta)

Sedan upprepar vi bara processen tills nätverket har konvergerat runt punkten med lägsta förlust, som bör vara nära noll.

Det är mycket viktigt att välja rätt värde för inlärningshastigheten (alpha). Det valda lärandetemperaturen måste varken vara för liten eller för stor. Kom ihåg att när vi närmar oss punkten med lägsta förlust, måste våra steg bli mindre, annars kan vi överskrida den verkliga lägsta punkten och hamna på andra sidan. Punkten med minsta förlust är liten och om vår förändringshastighet är för stor, kan felet faktiskt öka igen. Om stegstorlekarna är för stora, kommer nätverkets prestanda att fortsätta studsande runt punkten med lägsta förlust, överskridande den på ena sidan och sedan den andra. Om detta händer, kommer nätverket aldrig att konvergera till den optimala viktkonfigurationen.

I kontrast, om inlärningshastigheten är för liten, kan nätverket potentiellt ta en ovanligt lång tid att konvergera till de optimala vikterna.

Typer av Gradient Descent

Nu när vi förstår hur gradient descent fungerar i allmänhet, låt oss ta en titt på några av de olika typerna av gradient descent.

Batch Gradient Descent: Denna form av gradient descent kör genom alla träningsprover innan koefficienterna uppdateras. Denna typ av gradient descent är troligen den mest beräkningsmässigt effektiva formen av gradient descent, eftersom vikterna bara uppdateras en gång hela batchen har bearbetats, vilket innebär att det finns färre uppdateringar totalt. Men om datamängden innehåller ett stort antal träningsexempel, kan batch gradient descent göra att träningen tar lång tid.

Stochastic Gradient Descent: I Stochastic Gradient Descent bearbetas endast ett enda träningsprov för varje iteration av gradient descent och parameteruppdatering. Detta sker för varje träningsprov. Eftersom endast ett träningsprov bearbetas innan parametrarna uppdateras, tenderar det att konvergera snabbare än Batch Gradient Descent, eftersom uppdateringar görs tidigare. Men eftersom processen måste utföras på varje artikel i träningsuppsättningen, kan det ta ganska lång tid att slutföra om datamängden är stor, och användning av en av de andra gradient descent-typerna föredras.

Mini-Batch Gradient Descent: Mini-Batch Gradient Descent fungerar genom att dela upp hela träningsdatamängden i underavsnitt. Det skapar mindre mini-batchar som körs genom nätverket, och när mini-batchen har använts för att beräkna felet, uppdateras koefficienterna. Mini-Batch Gradient Descent slår en medelväg mellan Stochastic Gradient Descent och Batch Gradient Descent. Modellen uppdateras oftare än i fallet med Batch Gradient Descent, vilket innebär en snabbare och mer robust konvergens mot modellens optimala parametrar. Det är också mer beräkningsmässigt effektivt än Stochastic Gradient Descent

Blogger och programmerare med specialomrÄden inom Machine Learning och Deep Learning Àmnen. Daniel hoppas pÄ att hjÀlpa andra att anvÀnda kraften frÄn AI för socialt vÀl.