Arbejde med neurale netværk: tjekliste til fejlretning

Arbejde med neurale netværk: tjekliste til fejlretning

Koden for maskinlæringssoftwareprodukter er ofte kompleks og ret forvirrende. Opdagelse og eliminering af fejl i det er en ressourcekrævende opgave. Selv den simpleste feedforward neurale netværk kræver en seriøs tilgang til netværksarkitektur, initialisering af vægte og netværksoptimering. En lille fejl kan føre til ubehagelige problemer.

Denne artikel handler om en algoritme til fejlretning af dine neurale netværk.

Skillbox anbefaler: Praktisk kursus Python udvikler fra bunden.

Påmindelse: for alle læsere af "Habr" - en rabat på 10 rubler ved tilmelding til ethvert Skillbox-kursus ved hjælp af "Habr"-kampagnekoden.

Algoritmen består af fem trin:

  • let start;
  • bekræftelse af tab;
  • kontrol af mellemresultater og forbindelser;
  • parameter diagnostik;
  • kontrol med arbejdet.

Hvis noget virker mere interessant for dig end resten, kan du straks springe til disse afsnit.

Nem start

Et neuralt netværk med en kompleks arkitektur, regularisering og en læringshastighedsplanlægger er sværere at fejlfinde end et almindeligt. Vi er lidt tricky her, da selve punktet er indirekte relateret til debugging, men dette er stadig en vigtig anbefaling.

En simpel start er at skabe en forenklet model og træne den på ét sæt (punkt) data.

Først laver vi en forenklet model

For at komme hurtigt i gang opretter vi et lille netværk med et enkelt skjult lag og tjekker, at alt fungerer korrekt. Derefter komplicerer vi gradvist modellen, kontrollerer hvert nyt aspekt af dens struktur (yderligere lag, parameter osv.), Og går videre.

Vi træner modellen på et enkelt sæt (punkt) data

Som en hurtig fornuftskontrol for dit projekt kan du bruge et eller to træningsdatapunkter til at bekræfte, om systemet fungerer korrekt. Det neurale netværk skal vise 100% nøjagtighed i træning og test. Hvis dette ikke er tilfældet, så er modellen enten for lille, eller også har du allerede en fejl.

Selvom alt er godt, skal du forberede modellen til en eller flere epoker, før du går videre.

Tabsvurdering

Tabsestimering er den vigtigste måde at forfine modellens ydeevne på. Du skal sikre dig, at tabet passer til problemet, og at tabsfunktionerne er vurderet på den korrekte skala. Hvis du bruger mere end én tabstype, skal du sørge for, at de alle er af samme rækkefølge og skaleret korrekt.

Det er vigtigt at være opmærksom på indledende tab. Tjek, hvor tæt det faktiske resultat er på det forventede resultat, hvis modellen startede med et tilfældigt gæt. I Andrey Karpathys arbejde foreslår følgende:: “Sørg for at få det resultat, du forventer, når du starter med et lille antal parametre. Det er bedre straks at kontrollere datatabet (med graden af ​​regularisering sat til nul). For eksempel, for CIFAR-10 med en Softmax-klassifikator, forventer vi, at det indledende tab er 2.302, fordi den forventede diffuse sandsynlighed er 0,1 for hver klasse (da der er 10 klasser), og Softmax-tabet er den negative log-sandsynlighed for den korrekte klasse som − ln (0.1) = 2.302."

For det binære eksempel laves der ganske enkelt en lignende beregning for hver af klasserne. Her er for eksempel dataene: 20% 0'er og 80% 1'er. Det forventede indledende tab vil være op til –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Hvis resultatet er større end 1, kan det indikere, at vægten af ​​det neurale netværk ikke er korrekt afbalanceret, eller at dataene ikke er normaliserede.

Kontrol af mellemresultater og forbindelser

For at debugge et neuralt netværk er det nødvendigt at forstå dynamikken i processer i netværket og rollen af ​​individuelle mellemlag, når de er forbundet. Her er de almindelige fejl, du kan støde på:

  • forkerte udtryk for gradueringsopdateringer;
  • vægtopdateringer anvendes ikke;
  • eksploderende gradienter.

Hvis gradientværdierne er nul, betyder det, at indlæringshastigheden i optimizeren er for langsom, eller at du støder på et forkert udtryk for opdatering af gradienten.

Derudover er det nødvendigt at overvåge værdierne af aktiveringsfunktionerne, vægte og opdateringer af hvert af lagene. For eksempel størrelsen af ​​parameteropdateringer (vægte og skævheder) skal være 1-e3.

Der er et fænomen kaldet "Dying ReLU" eller "forsvindende gradientproblem", når ReLU-neuroner udsender nul efter at have lært en stor negativ biasværdi for dens vægte. Disse neuroner bliver aldrig affyret igen på noget tidspunkt i dataene.

Du kan bruge gradientkontrol til at identificere disse fejl ved at tilnærme gradienten ved hjælp af en numerisk tilgang. Hvis det er tæt på de beregnede gradienter, så blev backpropagation implementeret korrekt. For at oprette et gradienttjek, tjek disse fantastiske ressourcer fra CS231 her и herSamt lektie Andrew Nga om dette emne.

Faizan Sheikh angiver tre hovedmetoder til at visualisere et neuralt netværk:

  • Indledende er enkle metoder, der viser os den overordnede struktur af den trænede model. Disse omfatter output af former eller filtre af de individuelle lag i det neurale netværk og parametrene inden for hvert lag.
  • Aktiveringsbaseret. I dem dechifrerer vi aktiveringerne af individuelle neuroner eller grupper af neuroner for at forstå deres funktioner.
  • Baseret på gradienter. Disse metoder er tilbøjelige til at manipulere gradienter, der dannes ud fra de fremadgående og bagudrettede gennemløb af modeltræning (inklusive saliency-kort og klasseaktiveringskort).

Der er flere nyttige værktøjer til at visualisere aktiveringer og forbindelser af individuelle lag, f.eks. ConX и Tensorboard.

Arbejde med neurale netværk: tjekliste til fejlretning

Parameter diagnostik

Neurale netværk har en masse parametre, der interagerer med hinanden, hvilket komplicerer optimering. Faktisk er denne sektion genstand for aktiv forskning af specialister, så forslagene nedenfor bør kun betragtes som råd, udgangspunkter at bygge ud fra.

Pakke størrelse (batchstørrelse) - Hvis du ønsker, at batchstørrelsen skal være stor nok til at få nøjagtige fejlgradientestimater, men lille nok til at stokastisk gradientnedstigning (SGD) kan regulere dit netværk. Små batchstørrelser vil føre til hurtig konvergens på grund af støj under træningsprocessen og efterfølgende til optimeringsvanskeligheder. Dette er beskrevet mere detaljeret her.

Indlæringshastighed - for lav vil føre til langsom konvergens eller risiko for at sidde fast i lokale minima. Samtidig vil en høj indlæringsrate forårsage optimeringsdivergens, fordi du risikerer at springe gennem den dybe, men smalle del af tabsfunktionen. Prøv at bruge hastighedsplanlægning for at reducere den, mens du træner det neurale netværk. Opdateret med CS231n der er en stor sektion dedikeret til dette problem.

Gradient klipning  — trimning af parametergradienter under tilbageudbredelse ved maksimumværdien eller marginalnormen. Nyttigt til fejlfinding af eksploderende gradienter, du kan støde på i punkt tre.

Batch normalisering - bruges til at normalisere inputdataene for hvert lag, hvilket giver os mulighed for at løse problemet med internt kovariatskift. Hvis du bruger Dropout og Batch Norma sammen, tjek denne artikel.

Stokastisk gradientnedstigning (SGD) — der er flere varianter af SGD, der bruger momentum, adaptive læringshastigheder og Nesterov-metoden. Men ingen af ​​dem har en klar fordel med hensyn til både læringseffektivitet og generalisering (detaljer her).

Regulering - er afgørende for at bygge en generaliserbar model, da den tilføjer en straf for modelkompleksitet eller ekstreme parameterværdier. Dette er en måde at reducere modelvariansen på uden at øge dens bias markant. Mere detaljerede oplysninger - her.

For at evaluere alt selv, skal du deaktivere regularisering og selv kontrollere datatabsgradienten.

Dropper ud er en anden metode til at strømline dit netværk for at forhindre overbelastning. Under træning udføres frafald kun ved at opretholde neurons aktivitet med en vis sandsynlighed p (hyperparameter) eller sætte den til nul i det modsatte tilfælde. Som følge heraf skal netværket bruge et andet undersæt af parametre for hver træningsbatch, hvilket reducerer ændringer i visse parametre, der bliver dominerende.

Vigtigt: Hvis du bruger både frafald og batchnormalisering, skal du være forsigtig med rækkefølgen af ​​disse operationer eller endda bruge dem sammen. Alt dette bliver stadig aktivt diskuteret og suppleret. Her er to vigtige diskussioner om dette emne på Stackoverflow и arXiv.

Arbejdskontrol

Det handler om at dokumentere arbejdsgange og eksperimenter. Hvis du ikke dokumenterer noget, glemmer du måske f.eks. hvilken indlæringsrate eller klassevægte, der bruges. Takket være kontrol kan du nemt se og gengive tidligere eksperimenter. Dette giver dig mulighed for at reducere antallet af duplikerede eksperimenter.

Manuel dokumentation kan dog blive en vanskelig opgave i tilfælde af en stor mængde arbejde. Det er her værktøjer som Comet.ml kommer ind for at hjælpe dig med automatisk at logge datasæt, kodeændringer, eksperimentel historie og produktionsmodeller, herunder nøgleoplysninger om din model (hyperparametre, modelpræstationsmålinger og miljøoplysninger).

Et neuralt netværk kan være meget følsomt over for små ændringer, og det vil føre til et fald i modellens ydeevne. Sporing og dokumentering af dit arbejde er det første skridt, du kan tage for at standardisere dit miljø og din modellering.

Arbejde med neurale netværk: tjekliste til fejlretning

Jeg håber, at dette indlæg kan være et udgangspunkt for dig til at begynde at fejlfinde dit neurale netværk.

Skillbox anbefaler:

Kilde: www.habr.com

Tilføj en kommentar