AI 101

Vad Àr Gradient Descent?

mm

Vad är en Gradient Descent?

Om du har läst om hur neuronnät tränas har du nästan säkert stött på termen “gradient descent” tidigare. Gradient descent är den primära metoden för att optimera en neuronnäts prestanda, minska nätverkets förlust/felhastighet. Gradient descent kan dock vara svår att förstå för dem som är nya inom maskinlärning, och den här artikeln kommer att försöka ge dig en bra 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 nätverkets parametrar så att skillnaden mellan nätverkets förutsägelser och de faktiska/förväntade värdena för nätverket (som kallas förlust) är så liten som möjligt. Gradient descent tar de initiala 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 grader.

Vad är Grader?

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 grad ä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/gradens branthet representerar hur snabbt modellen lär sig.

En brant lutning innebär stora minskningar av fel och modellen lär sig snabbt, medan en lutning på noll innebär att modellen är på en platå och inte lär sig. Vi kan flytta ner för lutningen mot mindre fel genom att beräkna en grad, en riktning för rörelse (ändring i nätverksparametrarna) 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. På samma sätt är det möjligt att när vi justerar vikterna i nätverket, justeringarna kan faktiskt ta det längre bort från punkten med lägsta förlust, och därför måste justeringarna bli mindre över tiden. I sammanhanget att gå ner för en kulle mot en punkt med lägsta förlust är graden en vektor/instruktioner som detaljerar den väg vi ska ta och hur stora våra steg ska vara.

Nu vet vi att grader är instruktioner som berättar för oss vilken riktning vi ska flytta i (vilka koefficienter som ska uppdateras) och hur stora stegen vi ska ta (hur mycket koefficienterna ska uppdateras), så kan vi undersöka hur graden beräknas.

Beräkning av Grader och Gradient Descent

Gradient descent börjar på en plats med hög förlust och genom flera iterationer tar steg i riktningen 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 graderna först beräknas. För att beräkna graden behöver vi veta förlust/funktionsvärdet. Vi kommer att använda kostnadsfunktionen för att bestämma derivatan. I kalkyl hänvisar derivatan till funktionens lutning 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 ange 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 berätta för oss vilken riktning som är upp eller ner för lutningen, genom att ge oss det lämpliga tecknet för att justera våra koefficienter. Vi kommer att representera den lämpliga riktningen som “delta”.

delta = derivat_funktion(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 neuronnätets parametrar och förhoppningsvis 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 värdet för inlärningshastigheten måste varken vara för litet eller för stort. 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 punkten med lägsta förlust och hamna på andra sidan. Punkten med minsta förlust är liten och om vå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, överskrida 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 igenom alla träningsprover innan den uppdaterar koefficienterna. Denna typ av gradient descent är sannolikt 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 datasetet innehåller ett stort antal träningsexempel, kan batch gradient descent göra att träningsprocessen tar lång tid.

Stokastisk Gradient Descent: I stokastisk gradient descent bearbetas endast ett enda träningsexempel för varje iteration av gradient descent och parameteruppdatering. Detta sker för varje träningsexempel. Eftersom endast ett träningsexempel bearbetas innan parametrarna uppdateras, tenderar den att konvergera snabbare än batch gradient descent, eftersom uppdateringar görs tidigare. Men eftersom processen måste utföras på varje objekt i träningsmängden, kan det ta ganska lång tid att slutföra om datasetet är stort, och därför kan användning av en av de andra typerna av gradient descent föredras.

Mini-Batch Gradient Descent: Mini-batch gradient descent fungerar genom att dela upp hela träningsdatasetet i undersektioner. Den skapar mindre mini-batchar som bearbetas 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 stokastisk gradient descent och batch gradient descent. Modellen uppdateras oftare än i fallet med batch gradient descent, vilket innebär en något snabbare och mer robust konvergens mot modellens optimala parametrar. Det är också mer beräkningsmässigt effektivt än stokastisk 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.