stub Vad är Gradient Descent? - Unite.AI
Anslut dig till vårt nätverk!

AI 101

Vad är Gradient Descent?

mm
Uppdaterad on

Vad är en Gradient Descent?

Om du har läst om hur neurala nätverk tränas, har du nästan säkert stött på termen "gradient descent" tidigare. Övertoning är den primära metoden för att optimera ett neuralt nätverks prestanda, vilket minskar nätverkets förlust-/felfrekvens. Gradientnedstigning kan dock vara lite svårt att förstå för dem som är nybörjare inom maskininlärning, och den här artikeln kommer att försöka ge dig en anständig intuition för hur gradientnedstigning fungerar.

Gradient descent är en optimeringsalgoritm. Det används för att förbättra prestandan hos ett neuralt nätverk 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 (kallad 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 det kan bli. Du behöver inte kunna mycket kalkyl för att förstå hur gradientnedstigning fungerar, men du behöver ha en förståelse för gradienter.

Vad är gradienter?

Antag att det finns en graf som representerar mängden fel ett neuralt nätverk gör. Den nedre delen av grafen representerar punkterna med lägsta fel medan toppen av grafen är där felet är högst. Vi vill flytta från toppen av grafen ner till botten. En gradient är bara ett sätt att kvantifiera förhållandet mellan fel och vikten av det neurala nätverket. Förhållandet mellan dessa två saker kan ritas som en lutning, med felaktiga vikter som ger fler fel. Lutningens/gradientens branthet representerar hur snabbt modellen lär sig.

En brantare lutning innebär att stora minskningar av fel görs och att modellen lär sig snabbt, medan om lutningen är noll befinner sig modellen på en platå och lär sig inte. Vi kan röra oss nedför sluttningen mot mindre fel genom att beräkna en gradient, en rörelseriktning (ändring i nätverkets parametrar) för vår modell.

Låt oss ändra metaforen lite och föreställa oss en serie kullar och dalar. Vi vill komma till botten av backen och hitta den del av dalen som representerar den lägsta förlusten. När vi börjar på toppen av backen kan vi ta stora steg nerför backen 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 du justerar nätverkets vikter 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 med tiden. I samband med att gå ner för en kulle mot en punkt med lägsta förlust, är gradienten en vektor/instruktioner som beskriver vägen vi bör ta och hur stora våra steg ska vara.

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

Beräknar gradienter och gradientnedstigning

Gradientnedstigning börjar på en plats med hög förlust och tar genom flera iterationer 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 lutningssänkning måste lutningarna först beräknas. I ordning för att beräkna gradienten, måste vi känna till förlust/kostnadsfunktionen. Vi använder kostnadsfunktionen för att bestämma derivatan. I kalkyl hänvisar derivatan bara till lutningen av 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", så kan vi konstatera att ekvationen för att beräkna förlusten är som följer (vi kör bara koefficienterna genom vår valda kostnadsfunktion):

Förlust = f(koefficient)

Vi beräknar sedan 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 sluttningen, genom att ge oss rätt tecken att justera våra koefficienter efter. Vi kommer att representera lämplig riktning som "delta".

delta = derivata_funktion(förlust)

Vi har nu bestämt vilken riktning som är nedförsbacke mot punkten med lägsta förlust. Detta innebär att vi kan uppdatera koefficienterna i parametrarna för det neurala nätverket och förhoppningsvis minska förlusten. Vi uppdaterar koefficienterna baserat på de tidigare koefficienterna minus den lämpliga värdeförändringen som bestäms av riktningen (delta) och ett argument som styr storleken på förändringen (storleken på vårt steg). Argumentet som styr storleken på uppdateringen kallas "inlärningshastighet” och vi kommer att representera det som ”alfa”.

koefficient = koefficient – ​​(alfa * delta)

Vi upprepar sedan bara denna process tills nätverket har konvergerat runt punkten för 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 (alfa). Den valda inlärningshastigheten får 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 kommer vi att överskrida den sanna punkten med lägsta förlust och hamna på andra sidan. Punkten med minsta förlust är liten och om vår förändringstakt är för stor kan felet i slutändan öka igen. Om stegstorlekarna är för stora kommer nätverkets prestanda att fortsätta att studsa runt punkten med lägsta förlust, överskrider den på ena sidan och sedan den andra. Om detta händer kommer nätverket aldrig att konvergera till den verkliga optimala viktkonfigurationen.

Däremot, om inlärningshastigheten är för liten, kan nätverket potentiellt ta utomordentligt lång tid att konvergera till de optimala vikterna.

Typer Av Gradient Nedstigning

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

Batch Gradient Descent: Denna form av gradient descent går igenom alla träningsprover innan koefficienterna uppdateras. Denna typ av gradientnedstigning är sannolikt den mest beräkningseffektiva formen av gradientnedstigning, eftersom vikterna bara uppdateras när 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 satsgradientnedstigning göra att träningen tar lång tid.

Stokastisk Gradient Descent: I Stokastisk Gradient Descent bearbetas endast ett enda träningsexempel för varje iteration av gradientnedstigning och parameteruppdatering. Detta sker för varje träningsexempel. Eftersom endast ett träningsexempel 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 objekt i träningsuppsättningen, kan det ta ganska lång tid att slutföra om datauppsättningen är stor, och därför kan man använda någon av de andra gradientnedstigningstyperna om så önskas.

Mini-Batch Gradient Descent: Mini-Batch Gradient Descent fungerar genom att dela upp hela träningsdatauppsättningen i undersektioner. Det skapar mindre mini-batcher 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 mellanting 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 på modellens optimala parametrar. Det är också mer beräkningseffektivt än Stokastisk Gradient Descent

Bloggare och programmerare med specialiteter inom Maskininlärning och Deep Learning ämnen. Daniel hoppas kunna hjälpa andra att använda kraften i AI för socialt bästa.