Arbeta med neurala nätverk: checklista för felsökning

Arbeta med neurala nätverk: checklista för felsökning

Koden för programvaruprodukter för maskininlärning är ofta komplex och ganska förvirrande. Att upptäcka och eliminera buggar i den är en resurskrävande uppgift. Även den enklaste framkopplade neurala nätverk kräver ett seriöst förhållningssätt till nätverksarkitektur, initiering av vikter och nätverksoptimering. Ett litet misstag kan leda till obehagliga problem.

Den här artikeln handlar om en algoritm för att felsöka dina neurala nätverk.

Skillbox rekommenderar: Praktisk kurs Python-utvecklare från grunden.

Påminnelse: för alla läsare av "Habr" - en rabatt på 10 000 rubel när du anmäler dig till någon Skillbox-kurs med hjälp av "Habr"-kampanjkoden.

Algoritmen består av fem steg:

  • enkel start;
  • bekräftelse av förluster;
  • kontroll av mellanresultat och anslutningar;
  • parameterdiagnostik;
  • kontroll av arbetet.

Om något verkar mer intressant för dig än resten, kan du direkt hoppa till dessa avsnitt.

Enkel start

Ett neuralt nätverk med en komplex arkitektur, regularisering och en inlärningshastighetsschemaläggare är svårare att felsöka än ett vanligt. Vi är lite knepiga här, eftersom själva punkten är indirekt relaterad till felsökning, men detta är fortfarande en viktig rekommendation.

En enkel början är att skapa en förenklad modell och träna den på en uppsättning (punkt) data.

Först skapar vi en förenklad modell

För att snabbt komma igång skapar vi ett litet nätverk med ett enda dolt lager och kontrollerar att allt fungerar korrekt. Sedan komplicerar vi gradvis modellen, kontrollerar varje ny aspekt av dess struktur (ytterligare lager, parameter, etc.) och går vidare.

Vi tränar modellen på en enda uppsättning (punkt) data

Som en snabb förnuftskontroll för ditt projekt kan du använda en eller två datapunkter för träning för att bekräfta om systemet fungerar korrekt. Det neurala nätverket måste visa 100 % noggrannhet i träning och testning. Om så inte är fallet är antingen modellen för liten eller så har du redan en bugg.

Även om allt är bra, förbered modellen för en eller flera epoker innan du går vidare.

Förlustbedömning

Förlustuppskattning är det huvudsakliga sättet att förfina modellens prestanda. Du måste se till att förlusten är lämplig för problemet och att förlustfunktionerna är klassade på rätt skala. Om du använder mer än en förlusttyp, se till att alla är av samma ordning och skalade korrekt.

Det är viktigt att vara uppmärksam på initiala förluster. Kontrollera hur nära det faktiska resultatet är det förväntade resultatet om modellen började med en slumpmässig gissning. I Andrey Karpathys arbete föreslår följande:: “Se till att du får det resultat du förväntar dig när du börjar med ett litet antal parametrar. Det är bättre att omedelbart kontrollera dataförlusten (med graden av regularisering inställd på noll). Till exempel, för CIFAR-10 med en Softmax-klassificerare, förväntar vi oss att den initiala förlusten är 2.302 eftersom den förväntade diffusa sannolikheten är 0,1 för varje klass (eftersom det finns 10 klasser) och Softmax-förlusten är den negativa logsannolikheten för rätt klass som − ln (0.1) = 2.302."

För det binära exemplet görs en liknande beräkning helt enkelt för var och en av klasserna. Här är till exempel data: 20 % 0:or och 80 % 1:or. Den förväntade initiala förlusten kommer att vara upp till –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Om resultatet är större än 1 kan det tyda på att vikten av det neurala nätverket inte är korrekt balanserad eller att data inte är normaliserade.

Kontrollera mellanresultat och anslutningar

För att felsöka ett neuralt nätverk är det nödvändigt att förstå dynamiken i processer inom nätverket och rollen av enskilda mellanliggande lager när de är anslutna. Här är de vanligaste felen du kan stöta på:

  • felaktiga uttryck för graderingsuppdateringar;
  • viktuppdateringar tillämpas inte;
  • exploderande gradienter.

Om gradientvärdena är noll betyder det att inlärningshastigheten i optimeraren är för långsam, eller att du stöter på ett felaktigt uttryck för uppdatering av gradienten.

Dessutom är det nödvändigt att övervaka värdena för aktiveringsfunktionerna, vikter och uppdateringar av vart och ett av lagren. Till exempel storleken på parameteruppdateringar (vikter och fördomar) ska vara 1-e3.

Det finns ett fenomen som kallas "Dying ReLU" eller "problem med försvinnande gradient", när ReLU-neuroner kommer att mata ut noll efter att ha lärt sig ett stort negativt biasvärde för sina vikter. Dessa neuroner avfyras aldrig igen vid någon punkt i data.

Du kan använda gradientkontroll för att identifiera dessa fel genom att approximera gradienten med ett numeriskt tillvägagångssätt. Om det är nära de beräknade gradienterna, implementerades backpropagation korrekt. För att skapa en gradientkontroll, kolla in dessa fantastiska resurser från CS231 här и härSåväl som lektion Andrew Nga om detta ämne.

Faizan Sheikh indikerar tre huvudmetoder för att visualisera ett neuralt nätverk:

  • Preliminärer är enkla metoder som visar oss den utbildade modellens allmänna struktur. Dessa inkluderar utdata från former eller filter för de individuella lagren i det neurala nätverket och parametrarna inom varje lager.
  • Aktiveringsbaserad. I dem dechiffrerar vi aktiveringarna av enskilda neuroner eller grupper av neuroner för att förstå deras funktioner.
  • Baserat på gradienter. Dessa metoder tenderar att manipulera gradienter som bildas från framåt- och bakåtpass av modellträning (inklusive framträdande kartor och klassaktiveringskartor).

Det finns flera användbara verktyg för att visualisera aktiveringarna och kopplingarna av enskilda lager, t.ex. ConX и Spännbräda.

Arbeta med neurala nätverk: checklista för felsökning

Parameterdiagnostik

Neurala nätverk har många parametrar som interagerar med varandra, vilket komplicerar optimering. Egentligen är det här avsnittet föremål för aktiv forskning av specialister, så förslagen nedan bör endast betraktas som råd, utgångspunkter att bygga från.

Paketstorlek (batchstorlek) - Om du vill att batchstorleken ska vara tillräckligt stor för att få exakta felgradientuppskattningar, men tillräckligt liten för att stokastisk gradientdescent (SGD) ska kunna reglera ditt nätverk. Små batchstorlekar kommer att leda till snabb konvergens på grund av buller under träningsprocessen och ytterligare optimeringssvårigheter. Detta beskrivs mer i detalj här.

Inlärningshastighet - för lågt leder till långsam konvergens eller risk att fastna i lokala minima. Samtidigt kommer en hög inlärningshastighet att orsaka optimeringsdivergens eftersom du riskerar att hoppa igenom den djupa men smala delen av förlustfunktionen. Försök att använda hastighetsschemaläggning för att minska den medan du tränar det neurala nätverket. Uppdaterad med CS231n det finns ett stort avsnitt tillägnat detta problem.

Gradientklippning  — Trimning av parametergradienter under backpropagation vid maximalt värde eller marginalnorm. Användbar för att felsöka eventuella exploderande gradienter du kan stöta på i punkt tre.

Batchnormalisering - används för att normalisera indata för varje lager, vilket gör att vi kan lösa problemet med internt kovariatskifte. Om du använder Dropout och Batch Norma tillsammans, kolla in den här artikeln.

Stokastisk gradientnedstigning (SGD) — Det finns flera varianter av SGD som använder momentum, adaptiva inlärningshastigheter och Nesterov-metoden. Ingen av dem har dock en klar fördel när det gäller både inlärningseffektivitet och generalisering (detaljer här).

Regularisering - är avgörande för att bygga en generaliserbar modell, eftersom den lägger till en straffavgift för modellens komplexitet eller extrema parametervärden. Detta är ett sätt att minska modellvariansen utan att avsevärt öka dess bias. Mer detaljerad information - här.

För att utvärdera allt själv måste du inaktivera regularisering och själv kontrollera dataförlustgradienten.

Hoppa av är en annan metod för att effektivisera ditt nätverk för att förhindra överbelastning. Under träning utförs avhopp endast genom att upprätthålla neurons aktivitet med en viss sannolikhet p (hyperparameter) eller ställa in den på noll i motsatt fall. Som ett resultat måste nätverket använda en annan delmängd av parametrar för varje träningsbatch, vilket minskar förändringar i vissa parametrar som blir dominerande.

Viktigt: Om du använder både bortfall och batchnormalisering, var försiktig med ordningen på dessa operationer eller till och med att använda dem tillsammans. Allt detta diskuteras och kompletteras fortfarande aktivt. Här är två viktiga diskussioner om detta ämne på Stackoverflow и ArXiv.

Arbetskontroll

Det handlar om att dokumentera arbetsflöden och experiment. Om du inte dokumenterar något kan du glömma till exempel vilken inlärningstakt eller klassvikter som används. Tack vare kontroll kan du enkelt se och återskapa tidigare experiment. Detta gör att du kan minska antalet dubbletter av experiment.

Manuell dokumentation kan dock bli en svår uppgift vid en stor arbetsvolym. Det är här verktyg som Comet.ml kommer in för att hjälpa dig att automatiskt logga datamängder, kodändringar, experimenthistorik och produktionsmodeller, inklusive nyckelinformation om din modell (hyperparametrar, modellprestandamått och miljöinformation).

Ett neuralt nätverk kan vara mycket känsligt för små förändringar, och detta kommer att leda till att modellens prestanda minskar. Att spåra och dokumentera ditt arbete är det första steget du kan ta för att standardisera din miljö och din modellering.

Arbeta med neurala nätverk: checklista för felsökning

Jag hoppas att det här inlägget kan vara en startpunkt för dig att börja felsöka ditt neurala nätverk.

Skillbox rekommenderar:

Källa: will.com

Lägg en kommentar