Vad är Dropout? Minska överanpassning i dina neurala nätverk

Sist uppdaterad den 17 december 2019

När du tränar neurala nätverk är ditt mål att producera en modell som presterar riktigt bra.

Detta är helt logiskt, eftersom det inte finns någon mening med att använda en modell som inte presterar.

Det finns dock en relativt snäv balans som du måste upprätthålla när du försöker hitta en perfekt välfungerande modell.

Det är balansen mellan underanpassning och överanpassning.

För att undvika underanpassning (att ha sämre prediktiva prestanda än möjligt) kan du fortsätta träna, tills du upplever det andra problemet – överanpassning, a.k.a. att vara för känslig för dina träningsdata. Båda dessa faktorer försvårar modellens prestanda.

I vissa fall är det område inom vilket din modell varken är underanpassad eller överanpassad mycket litet. Lyckligtvis kan det utökas genom att tillämpa en så kallad regularizer – en teknik som reglerar hur din modell beter sig under träningen, för att fördröja överanpassning under en viss tid.

Dropout är en sådan regleringsteknik. I det här blogginlägget täcker vi den, genom att ta en titt på ett par saker. För det första dyker vi ner i skillnaden mellan underfitting och overfitting mer i detalj, så att vi får en djupare förståelse för de två. För det andra introducerar vi Dropout baserat på akademiska arbeten och berättar hur det fungerar. För det tredje tar vi en titt på om den verkligen fungerar, genom att beskriva de olika experiment som gjorts med denna teknik. Slutligen kommer vi att jämföra traditionell Dropout med Gaussian Dropout – och hur det förändrar träningen av din modell.

Är du redo? Då kör vi! 😎

Hur bra presterar din modell? Underfitting och overfitting

Låt oss först ta en titt på vad underfitting och overfitting är.

När du startar träningsprocessen initialiseras vikterna för dina neuroner sannolikt slumpmässigt eller med någon annan initialiseringsstrategi. Detta innebär att felprocenten, eller förlustvärdet, kommer att vara mycket hög under de första epokerna. Ta en titt på det här diagrammet, där förlusten minskar mycket snabbt under de första epokerna:

När både träningsförlusten och valideringen minskar sägs modellen vara underanpassad: den kan fortfarande tränas för att göra bättre förutsägelser, dvs. för att öka sin förutsägelseförmåga.

Den åtgärd som ska vidtas är då att fortsätta träna.

Detta kan dock inte fortsätta för evigt. För att optimera en modell måste man generera valideringsprediktioner med dina valideringsdata, vilket resulterar i förlustvärden och gradienter för optimering, som sedan utförs. Tyvärr innebär detta att en del av datans ideosynkrasier läcker in i modellvikterna. Det vill säga, eftersom data är ett urval snarare än en fullständig population är de alltid något annorlunda än den fullständiga population som de representerar. När du optimerar modellen i hundratals epoker med dessa data får du alltid en förskjutning i förhållande till denna sanna population.

Om du skulle fortsätta träna skulle din modell anpassa sig mer och mer till dessa ideosynkrasier, vilket gör att den blir mindre lämplig för data som den aldrig har sett förut – dvs. andra prov från populationen. Modellen sägs då vara överanpassad: den är för väl anpassad till tränings- och valideringsdata.

Vi stannar upp en stund! 👩💻

Bloggar på MachineCurve lär ut maskininlärning för utvecklare. Anmäl dig till MachineCurves kostnadsfria uppdatering om maskininlärning idag! Du kommer att lära dig nya saker och bättre förstå begrepp som du redan känner till.
Vi skickar e-post minst varje fredag. Välkommen!

Genom att registrera dig samtycker du till att all information du får kan omfatta tjänster och specialerbjudanden via e-post.

Overfitting kan upptäckas på diagram som det ovan genom att inspektera valideringsförlusten: när den stiger igen, medan träningsförlusten förblir konstant eller minskar, vet du att din modell är överanpassad. Som du kan se har det ELU-drivna nätverket i diagrammet ovan börjat överanpassa väldigt lite.

Både underanpassning och överanpassning ska undvikas, eftersom din modell kommer att prestera sämre än vad den skulle kunna prestera teoretiskt. Lyckligtvis kan vissa tekniker – så kallade regulatorer – användas för att minska effekterna av överanpassning. Dropout är en av dem – och vi kommer att behandla den i den här bloggen. Låt oss börja med att analysera vad Dropout är, vad den gör och hur den fungerar.

Vad är Dropout och hur fungerar den?

I sin artikel ”Dropout: A Simple Way to Prevent Neural Networks from Overfitting” beskriver Srivastava et al. (2014) Dropout-tekniken, som är en stokastisk regleringsteknik och bör minska överanpassning genom att (teoretiskt sett) kombinera många olika neurala nätverksarkitekturer.

Med Dropout släpper träningsprocessen i princip ut neuroner i ett neuralt nätverk. De tas tillfälligt bort från nätverket, vilket kan visualiseras på följande sätt:

Bemärk att kopplingarna eller synapserna också tas bort, och att det därför inte längre flödar några data genom dessa neuroner.

…men bara mycket kortvarigt! Denna process upprepas varje epok (eller till och med varje minibatch! – Srivastava et al. 2014) och därför sker provtagning av uttunnade nätverk mycket ofta. Detta bör leda till betydligt lägre generaliseringsfelprocent (dvs. överanpassning), eftersom ”närvaron av neuroner görs opålitlig” (Srivastava et al., 2014).

Detta borttagande av neuroner och synapser under träningen utförs slumpmässigt, med en parameter \(p\) som är avstämningsbar (eller, med tanke på empiriska tester, bäst inställd på 0,5 för dolda lager och nära 1,0 för ingångslagret). Detta innebär i praktiken att, enligt författarna, det ”tunna” nätverket tas ut från den globala arkitekturen och används för träningen.

Vid testtillfället ”är det inte genomförbart att uttryckligen beräkna medelvärdet av förutsägelserna från exponentiellt många tunna modeller” (Srivastava et al., 2014). Det är sant: det skulle bli en beräkningsmässig börda när hundratusentals epoker/minibatcher måste medelvärdesberäknas, särskilt när nätverken blir riktigt stora.

Turligtvis finns det en lösning – som är enkel, men ger samma resultat. Genom att använda ett neuralt nätverk, där viktutgångarna skalas ner enligt den \(p\) med vilken en enhet behölls under träningen. Detta innebär att det förväntade utfallet vid träningstillfället är detsamma som det sanna utfallet vid testtillfället, vilket löser beräkningsproblemet och gör Dropout användbart i praktiken.

Bernoulli-variabler

Låt oss nu ta en titt på hur Dropout fungerar matematiskt. Oroa dig inte, vi begraver dig inte med matte, utan försöker istället ta en mycket intuitiv synvinkel.

Väldigt förenklat är detta hur en neuron tar emot sin inmatning: t.ex. tre uppströmsneuroner i ett tätskikt med tre neuroner skickar sina utdata till nästa skikt, där det tas emot som inmatning. Observera att vi för enkelhetens skull utelämnar biasvärdena här.

Normal neuron (antas vara utan bias)

Det är mycket enkelt att gå härifrån till en Dropout-neuron, som ser ut på följande sätt:

Dropout-neuron (antas vara utan bias)

Matematiskt sett handlar det om så kallade Bernoulli- slumpmässiga variabler:

I sannolikhetsteori och statistik är Bernoulli-fördelningen, uppkallad efter den schweiziske matematikern Jacob Bernoulli, den diskreta sannolikhetsfördelningen för en slumpvariabel som antar värdet 1 med sannolikhet \(p\).

Wikipedia om Bernoulli-fördelningen

För att skapa Dropout kopplade Srivastava et al. (2014) Bernoulli-variabler till nätverkets neuroner (genom att multiplicera dem med neurala utgångar), ”var och en med sannolikheten \(p\) att vara 1″. Värdet \(p\) väljs här av maskininlärningsingenjören, vanligtvis baserat på någon valideringsuppsättning, eller naivt satt till 0,5.

Missa aldrig nya artiklar om maskininlärning ✅

Bloggar på MachineCurve lär ut maskininlärning för utvecklare. Anmäl dig till MachineCurves kostnadsfria uppdatering om maskininlärning idag! Du kommer att lära dig nya saker och bättre förstå begrepp som du redan känner till.
Vi skickar e-post minst varje fredag. Välkommen!

Genom att registrera dig samtycker du till att all information du får kan omfatta tjänster och specialerbjudanden via e-post.

Inuti nätverket avgör Bernoulli-variabeln och dess värde 1 eller 0 om en neuron ”tappas bort” under denna epok eller minibatch feedforward operation. Detta leder i praktiken till det ”tunna nätverk” som Srivastava et al. (2014) talar om.

Varför kan Dropout minska överanpassning?

Du kanske nu undrar: varför minskar Bernoulli-variabler som är kopplade till vanliga neurala nätverk, vilket gör nätverket tunnare, överanpassning?

För att få svar på denna fråga måste vi ta en titt på hur neurala nätverk tränas.

I vanliga fall används backpropagation och gradient descent eller en liknande optimerare för detta ändamål. Givet ett förlustvärde beräknas så kallade ”gradienter” som optimeraren sedan bearbetar till nätverkets vikter. Genom att använda dessa gradienter (med avseende på felvärdet) för att ändra vikterna presterar nätverket sannolikt något bättre under nästa iteration av träningsprocessen.

Beräkningen av gradienten görs med avseende på felet, men också med avseende på vad alla andra enheter gör (Srivastava et al., 2014). Detta innebär att vissa neuroner, genom förändringar i sina vikter, kan rätta till andra neuroners misstag. Dessa, menar Srivastava et al. (2014), leder till komplexa samanpassningar som kanske inte generaliseras till osynliga data, vilket resulterar i överanpassning.

Dropout förhindrar alltså dessa samanpassningar genom att – som vi skrev tidigare – göra närvaron av andra dolda otillförlitlig. Neuronerna kan helt enkelt inte förlita sig på att andra enheter korrigerar deras misstag, vilket minskar antalet samanpassningar som inte generaliseras till osynliga data, och därmed förmodligen också minskar överanpassning.

Träning av neurala nät med Dropout

Träning av neurala nät till vilka Dropout har bifogats är i stort sett likvärdigt med träning av neurala nät utan Dropout. Stokastisk gradient descent eller liknande optimerare kan användas. Den enda skillnaden, som rapporteras av Srivastava et al. (2014), finns när man använder en minibatch-metod: i stället för per epok samplas gallrade nätverk per minibatch.

Det går dessutom att använda metoder som förbättrar klassisk SGD – som momentum – och de visar liknande förbättringar som med vanliga neurala nätverk (Srivastava et al, 2014).

Vad författarna också fann vara användbart under träningen är att tillämpa max-normreglering, vilket innebär att man begränsar normen för den inkommande vikten till att begränsas av ett visst maximalt värde \(c\). Detta värde måste fastställas av ingenjören i förväg och bestämmas med hjälp av en valideringsuppsättning (Srivastava et al, 2014).

Kombination av Dropout med max-normreglering förbättrar prestandan jämfört med att enbart använda Dropout, men författarna rapporterade ännu bättre resultat när Dropout och max-normreglering kombineras med två andra saker:

  • Stora, avtagande inlärningshastigheter.
  • Hög momentum.

Enligt Srivastava et al. (2014) kan detta möjligen motiveras av följande argument:

  1. Constraining weight vectors gör det möjligt att använda stora inlärningshastigheter utan att vikterna exploderar.
  2. Dropout-brus plus stora inlärningshastigheter hjälper sedan optimerare ”att utforska olika regioner av viktrummet som annars skulle ha varit svåra att nå”.
  3. Avtrappning av inlärningshastigheten bromsar sedan upp hoppigheten i utforskningsprocessen, som så småningom ”sätter sig i ett minimum”.
  4. Hög momentum gör det möjligt för nätverket att övervinna lokala minima, vilket ökar sannolikheten för att det globala minimumet hittas.

Fungerar dropout faktiskt? Experimentella resultat

Med alla förbättringar inom maskininlärning är det trevligt med en teoretisk förbättring – men det är också viktigt att testa om det verkligen fungerar. Srivastava et al. (2014) utförde flera tester för att ta reda på om Dropout fungerar. För det första använde de olika standarddataset (t.ex. MNIST-dataset) för att testa om Dropout förbättrar modellens prestanda över ett brett spektrum av klassificeringsproblem.

För det andra kontrollerade de hur den presterade med en mängd andra regulatorer (vilket gav insikten att max-norm-regularisering tillsammans med Dropout fungerar bäst – men låt oss ta en titt på dessa resultat mer i detalj senare), och för det tredje undersökte Srivastava et al. (2014) vilka dropout-nivåer (dvs, vilken parameter \(p\)) fungerar bäst och hur datastorlek påverkar Dropout-prestanda. Låt oss ta en titt!

Prover från MNIST-dataset

Dropout vs no dropout on standard datasets

Författarna testade Dropout vs No Dropout på dessa standarddataset (Srivastava et al, 2014):

  • The MNIST dataset, som innehåller tusentals handskrivna siffror;
  • The TIMIT speech benchmark dataset för ren taligenkänning.
  • The CIFAR-10 och CIFAR-100 dataset, som innehåller små naturliga bilder i 10 och 100 klasser.
  • The Street View House Numbers (SVHN) dataset, med bilder av husnummer som samlats in från Google Street View.
  • The ImageNet dataset, som innehåller många naturliga bilder.
  • The Reuters RCV1 newswire articles dataset. Detta är ett textdataset snarare än ett bilddataset.
Prover från CIFAR10-dataset

För alla dataset förbättrade Dropout modellens generaliseringskraft. På MNIST kunde drastiskt olika testfel rapporteras, med betydande förbättringar för alla de olika arkitekturer som testades.

Gå med hundratals andra inlärare! 😎

Bloggar på MachineCurve lär ut Machine Learning for Developers. Anmäl dig till MachineCurves kostnadsfria uppdatering om maskininlärning idag! Du kommer att lära dig nya saker och bättre förstå begrepp som du redan känner till.
Vi skickar e-post minst varje fredag. Välkommen!

Genom att registrera dig samtycker du till att all information du får kan omfatta tjänster och specialerbjudanden via e-post.

Dropout presterar också bättre än vanliga neurala nätverk på ConvNets som tränats på CIFAR-100, CIFAR-100 och ImageNet-dataseten.

För SVHN-dataseten kan en annan intressant observation rapporteras: när Dropout appliceras på det konvolutionella lagret ökar också prestanda. Enligt författarna är detta intressant eftersom dessa lager tidigare antogs inte vara känsliga för överanpassning eftersom de inte har så många parametrar (Srivastava et al., 2014). Det hävdas att om man lägger till Dropout till Conv-lagren får man brusande indata till de täta lagren som följer efter dem, vilket förhindrar dem ytterligare från överanpassning.

Sluttligen fungerar Dropout på TIMIT tal benchmark-datasetterna och Reuters RCV1-datasetterna, men här var förbättringen mycket mindre jämfört med vision- och taldatasetterna.

Dropout vs no dropout with other regularizers

När författarna nu visste att Dropout skalar väl över en mängd olika maskininlärningsproblem undersökte de det ytterligare: hur presterar det i förhållande till andra regularizers?

Flera regulariseringsmetoder testades för att förhindra överanpassning:

  • L2 viktförfall;
  • Lasso;
  • KL sparsity;
  • Max-normreglering.

Srivastava et al. (2014) fann att Dropout, när det kombineras med max-normreglering, ger ännu lägre generaliseringsfel. Faktum är att det gav det lägsta felet som rapporterades, följt – på visst avstånd – av Dropout + L2-regularisering och slutligen de andra.

Därmed kan det vid tillämpning av Dropout också vara en bra idé att utföra max-norm-regularisering samtidigt.

När fungerar Dropout bäst? Om Dropout rate och Dataset size

En annan fråga som de försökte besvara: påverkar dropout rate (dvs. parametern \(p\)) och/eller datasetstorlek prestandan hos Dropout och de neurala nätverken som den är kopplad till?

Frågan måste besvaras med ja.

Vilket är det bästa värdet för \(p\)?

För det första, parametern \(p\). Vid det här laget kan vi erinra oss att den är inställbar och faktiskt måste ställas in i förväg av maskininlärningsingenjören. Det faktum att den är inställbar leder till samma fel som varför fasta inlärningshastigheter inte är en bra idé: man vet helt enkelt inte vilken \(p\) som passar data bäst.

Författarna hävdar därför att valet av ett värde för \(p\) måste göras genom några inledande tester med en valideringsuppsättning.

Det gjorde de också – för att se om intressanta mönster kunde hittas.

Och de hittade ett sådant mönster: över flera scenarier tycks ett värde på \(p \ ca 0,5\) för de dolda lagren resultera i den bästa prestandan när man tillämpar Dropout (Srivastava et al, 2014). Detta gäller för alla lager utom ingångslagret, där \(p\) måste vara \(\(\approx 1.0\). Det sistnämnda är förmodligen fallet eftersom inmatningslagret tar inmatningsdata och det är svårt att hitta mönster när data släpps slumpmässigt.

Hur presterar Dropout med avseende på datasetets storlek?

Enligt författarna gör en ”bra regularizer det möjligt att få ett bra generaliseringsfel från modeller med ett stort antal parametrar som tränats på små datamängder”. Det vill säga, den presterar riktigt bra på data som den inte har sett förut – även när den tränas med små data.

För att ta reda på om Dropout regulariserar bra över olika datasetstorlekar utförde Srivastava et al. (2014) tester med olika storlekar på MNIST-dataset. Storlekarna var följande: ”100, 500, 1K, 5K, 10K och 50K som valdes slumpmässigt från MNIST-träningsuppsättningen” (Srivastava et al., 2014).

Vi hjälper dig med maskininlärning! 🧠

Bloggar på MachineCurve lär ut maskininlärning för utvecklare. Anmäl dig till MachineCurves kostnadsfria uppdatering om maskininlärning idag! Du kommer att lära dig nya saker och bättre förstå begrepp som du redan känner till.
Vi skickar e-post minst varje fredag. Välkommen!

Genom att registrera dig samtycker du till att all information du får kan omfatta tjänster och specialerbjudanden via e-post.

Författarna fann att det finns en avvägning mellan när Dropout är nödvändigt och när det inte längre är användbart. För det första, för att täcka fallet där datasetet är extremt litet: inte ens Dropout förbättrar prestandan i det fallet, helt enkelt för att datasetets storlek är för liten. Samma sak gäller för dataset som är tillräckligt stora: Dropout förbättrar då inte längre modellen, utan modellens prestanda blir snarare sämre.

Det finns alltså en ”sweet spot”, när Dropout är nödvändigt och när det är smart att inte använda det (eller att öka datasetstorleken). Enligt Srivastava et al. (2014) finns det ingen heuristik för att bestämma denna storlek, utan den måste bestämmas med en valideringsuppsättning.

Gaussian Dropout: Gaussiska istället för Bernoulli-variabler

Vi erinrar oss från ovan att Dropout fungerar med Bernoulli-variabler som tar 1 med sannolikhet \(p\) och 0 med resten, vilket är \(1 – p\).

Den här idén kan generaliseras till att multiplicera aktiveringarna med slumpmässiga variabler från andra fördelningar (Srivastava et al., 2014). I sitt arbete fann Srivastava et al. att den gaussiska fördelningen och därmed gaussiska variabler fungerar lika bra – och kanske till och med bättre.

Användning av gaussiska variabler kan göras på ett liknande sätt: gallring av nätverken vid träningstillfället och användning av viktade aktiveringar vid test- och produktionstillfället (som med vanlig Dropout). Författarna väljer dock att använda Gaussian Dropout på ett annat sätt – dvs. multiplicerande. Istället för gallring och viktning viktas Gaussian Dropout vid utbildningstillfället, när aktiverade värden som inte faller bort multipliceras med \(1/p\) i stället för \(1\) (med vanlig Bernoulli Dropout). De ändras inte vid testtillfället. Detta motsvarar det tidigare scenariot.

Gaussian Dropout måste konfigureras med en viss \(\sigma\), som i Srivastava et al.’s experiment sattes till \(\sqrt{(1-p)/p}\), där \(p\) är konfigurationen av Bernoullivarianten (dvs, i naiva fall \(p \approx 0.5\) för dolda lager och \(\approx 1.0\) för inmatningslagret).

Sammanfattning

I det här blogginlägget tittade vi på överanpassning – och hur man undviker det, med Dropout. Genom att titta på vad det är, hur det fungerar och att det fungerar, fann vi att det är en intressant teknik för tillämpning i dina deep learning-modeller.

Jag hoppas att du har lärt dig något idag – något användbart för dina ML-modeller 😀 Om du har gjort det, eller när du har frågor, tveka inte att lämna en kommentar nedan ⬇! När det är möjligt kommer jag att svara på dina frågor 😊

Tack för att du läste MachineCurve idag och glad ingenjörskonst! 😎

Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I., & Salakhutdinov, R. (2014, June 15). Dropout: A Simple Way to Prevent Neural Networks from Overfitting. Hämtad från http://jmlr.org/papers/v15/srivastava14a.html

Wikipedia. (2003, 20 mars). Bernoulli-fördelning. Hämtad från https://en.wikipedia.org/wiki/Bernoulli_distribution

💡 Bemästra ditt ML – kolla in de här inläggen också:

Lämna ett svar

Din e-postadress kommer inte publiceras.