Werken met neurale netwerken: checklist voor foutopsporing

Werken met neurale netwerken: checklist voor foutopsporing

De code van machine learning-softwareproducten is vaak complex en behoorlijk verwarrend. Het detecteren en elimineren van bugs daarin is een taak die veel middelen vergt. Zelfs de eenvoudigste feedforward neurale netwerken vereisen een serieuze benadering van netwerkarchitectuur, initialisatie van gewichten en netwerkoptimalisatie. Een kleine fout kan tot vervelende problemen leiden.

Dit artikel gaat over een algoritme voor het debuggen van uw neurale netwerken.

Skillbox beveelt aan: Praktische cursus Python-ontwikkelaar vanaf nul.

Herinnering: voor alle lezers van "Habr" - een korting van 10 roebel bij inschrijving voor een Skillbox-cursus met behulp van de promotiecode "Habr".

Het algoritme bestaat uit vijf fasen:

  • gemakkelijke start;
  • bevestiging van verliezen;
  • het controleren van tussenresultaten en verbanden;
  • parameterdiagnostiek;
  • controle over het werk.

Als iets u interessanter lijkt dan de rest, kunt u onmiddellijk naar deze secties gaan.

Gemakkelijk begin

Een neuraal netwerk met een complexe architectuur, regularisatie en een leersnelheidplanner is moeilijker te debuggen dan een normaal netwerk. We zijn hier een beetje lastig, omdat het punt zelf indirect verband houdt met foutopsporing, maar dit is nog steeds een belangrijke aanbeveling.

Een eenvoudig begin is het maken van een vereenvoudigd model en het trainen ervan op één set (punt) gegevens.

Eerst maken we een vereenvoudigd model

Om snel aan de slag te gaan, creëren we een klein netwerk met één verborgen laag en controleren we of alles correct werkt. Vervolgens maken we het model geleidelijk ingewikkelder, controleren we elk nieuw aspect van de structuur (extra laag, parameter, enz.) en gaan we verder.

We trainen het model op een enkele set (punt) gegevens

Als snelle controle van uw project kunt u een of twee datapunten gebruiken voor training om te bevestigen of het systeem correct werkt. Het neurale netwerk moet 100% nauwkeurigheid vertonen bij training en testen. Als dit niet het geval is, is het model te klein of heeft u al een bug.

Zelfs als alles goed gaat, bereid je het model voor op een of meer tijdperken voordat je verder gaat.

Beoordeling van verliezen

Schadeschatting is de belangrijkste manier om de prestaties van het model te verfijnen. U moet ervoor zorgen dat het verlies passend is voor het probleem en dat de verliesfuncties op de juiste schaal worden beoordeeld. Als u meer dan één verliestype gebruikt, zorg er dan voor dat ze allemaal in dezelfde volgorde staan ​​en correct zijn geschaald.

Het is belangrijk om alert te zijn op initiële verliezen. Controleer hoe dicht het werkelijke resultaat bij het verwachte resultaat ligt als het model met een willekeurige gok is begonnen. IN Het werk van Andrey Karpathy suggereert het volgende:: “Zorg ervoor dat je het verwachte resultaat krijgt als je met een klein aantal parameters begint. Het is beter om het gegevensverlies onmiddellijk te controleren (met de mate van regularisatie op nul). Voor CIFAR-10 met een Softmax-classificator verwachten we bijvoorbeeld dat het aanvankelijke verlies 2.302 is, omdat de verwachte diffuse waarschijnlijkheid 0,1 is voor elke klasse (aangezien er 10 klassen zijn) en het Softmax-verlies de negatieve logwaarschijnlijkheid van de juiste klasse is. als − ln (0.1) = 2.302.”

Voor het binaire voorbeeld wordt eenvoudigweg voor elk van de klassen een soortgelijke berekening gemaakt. Hier zijn bijvoorbeeld de gegevens: 20% 0-en en 80% 1-en. Het verwachte initiële verlies zal oplopen tot –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Als het resultaat groter is dan 1, kan dit erop duiden dat de gewichten van het neurale netwerk niet goed in evenwicht zijn of dat de gegevens niet zijn genormaliseerd.

Het controleren van tussenresultaten en verbanden

Om een ​​neuraal netwerk te debuggen, is het noodzakelijk om de dynamiek van processen binnen het netwerk te begrijpen en de rol van individuele tussenlagen wanneer deze met elkaar verbonden zijn. Dit zijn de veelvoorkomende fouten die u kunt tegenkomen:

  • onjuiste uitdrukkingen voor geleidelijke updates;
  • gewichtsupdates worden niet toegepast;
  • exploderende gradiënten.

Als de gradiëntwaarden nul zijn, betekent dit dat de leersnelheid in de optimizer te laag is, of dat u een onjuiste uitdrukking tegenkomt voor het bijwerken van de gradiënt.

Bovendien is het noodzakelijk om de waarden van de activeringsfuncties, gewichten en updates van elk van de lagen te controleren. Bijvoorbeeld de omvang van parameterupdates (gewichten en biases) moet 1-e3 zijn.

Er is een fenomeen genaamd “Dying ReLU” of "verdwijnend gradiëntprobleem", wanneer ReLU-neuronen nul zullen uitvoeren nadat ze een grote negatieve bias-waarde voor hun gewichten hebben geleerd. Deze neuronen worden op geen enkel punt in de gegevens opnieuw afgevuurd.

U kunt gradiëntcontrole gebruiken om deze fouten te identificeren door de gradiënt te benaderen met behulp van een numerieke benadering. Als het dicht bij de berekende gradiënten ligt, is backpropagation correct geïmplementeerd. Bekijk deze geweldige bronnen van CS231 om een ​​verloopcontrole te maken hier и hierZowel als les Andrew Nga over dit onderwerp.

Faizan-sjeik geeft drie hoofdmethoden aan voor het visualiseren van een neuraal netwerk:

  • Voorbereidingen zijn eenvoudige methoden die ons de algemene structuur van het getrainde model laten zien. Deze omvatten de uitvoer van vormen of filters van de individuele lagen van het neurale netwerk en de parameters binnen elke laag.
  • Activering gebaseerd. Daarin ontcijferen we de activeringen van individuele neuronen of groepen neuronen om hun functies te begrijpen.
  • Gebaseerd op gradiënten. Deze methoden hebben de neiging om gradiënten te manipuleren die worden gevormd door de voorwaartse en achterwaartse passages van modeltraining (inclusief saliency-kaarten en klassenactiveringskaarten).

Er zijn verschillende handige hulpmiddelen om de activeringen en verbindingen van individuele lagen te visualiseren, b.v. ConX и Tensorbord.

Werken met neurale netwerken: checklist voor foutopsporing

Parameterdiagnostiek

Neurale netwerken hebben veel parameters die met elkaar interacteren, wat de optimalisatie bemoeilijkt. Eigenlijk is dit gedeelte het onderwerp van actief onderzoek door specialisten, dus de onderstaande suggesties mogen alleen worden beschouwd als advies, als uitgangspunten waarop kan worden voortgebouwd.

Pakketgrootte (batchgrootte) - Als u wilt dat de batchgrootte groot genoeg is om nauwkeurige schattingen van de foutgradiënt te krijgen, maar klein genoeg voor een stochastische gradiëntdaling (SGD) om uw netwerk te regulariseren. Kleine batchgroottes zullen leiden tot snelle convergentie als gevolg van ruis tijdens het trainingsproces en vervolgens tot optimalisatieproblemen. Dit wordt gedetailleerder beschreven hier.

Leersnelheid - een te laag niveau zal leiden tot langzame convergentie of het risico dat men blijft steken in lokale minima. Tegelijkertijd zal een hoog leerpercentage optimalisatiedivergentie veroorzaken, omdat u het risico loopt door het diepe maar smalle deel van de verliesfunctie te springen. Probeer snelheidsplanning te gebruiken om deze te verminderen tijdens het trainen van het neurale netwerk. Up-to-date met CS231n Er is een groot gedeelte gewijd aan dit probleem.

Verloop knippen  — het trimmen van parametergradiënten tijdens backpropagation op de maximale waarde of marginale norm. Handig voor het oplossen van eventuele exploderende gradiënten die u in punt drie kunt tegenkomen.

Batch-normalisatie - gebruikt om de invoergegevens van elke laag te normaliseren, waardoor we het probleem van interne covariate verschuiving kunnen oplossen. Als u Dropout en Batch Norma samen gebruikt, bekijk dit artikel.

Stochastische gradiëntdaling (SGD) – er zijn verschillende varianten van SGD die gebruik maken van momentum, adaptieve leersnelheden en de Nesterov-methode. Geen van hen heeft echter een duidelijk voordeel in termen van zowel leerefficiëntie als generalisatie (details hier).

Regularisatie - is cruciaal voor het bouwen van een generaliseerbaar model, omdat het een boete toevoegt voor modelcomplexiteit of extreme parameterwaarden. Dit is een manier om de modelvariantie te verkleinen zonder de bias ervan aanzienlijk te vergroten. Meer gedetailleerde informatie - hier.

Om alles zelf te evalueren, moet u de regularisatie uitschakelen en zelf de gegevensverliesgradiënt controleren.

Afhaken is een andere methode om uw netwerk te stroomlijnen om congestie te voorkomen. Tijdens de training wordt uitval alleen uitgevoerd door de activiteit van het neuron met een bepaalde waarschijnlijkheid p (hyperparameter) te behouden of in het tegenovergestelde geval op nul te zetten. Als gevolg hiervan moet het netwerk voor elke trainingsbatch een andere subset van parameters gebruiken, waardoor veranderingen in bepaalde parameters die dominant worden, worden verminderd.

Belangrijk: Als u zowel dropout als batchnormalisatie gebruikt, wees dan voorzichtig met de volgorde van deze bewerkingen of gebruik ze zelfs samen. Dit alles wordt nog actief besproken en aangevuld. Hier zijn twee belangrijke discussies over dit onderwerp op Stackoverflow и ArXiv.

Werkcontrole

Het gaat over het documenteren van workflows en experimenten. Als u niets documenteert, vergeet u bijvoorbeeld welk leertempo of welke klassengewichten er worden gebruikt. Dankzij de bediening kun je eerdere experimenten eenvoudig bekijken en reproduceren. Hierdoor kunt u het aantal dubbele experimenten verminderen.

Handmatig documenteren kan echter een moeilijke taak worden als er sprake is van een grote hoeveelheid werk. Dit is waar tools zoals Comet.ml van pas komen om u te helpen bij het automatisch loggen van datasets, codewijzigingen, experimentele geschiedenis en productiemodellen, inclusief belangrijke informatie over uw model (hyperparameters, modelprestatiestatistieken en omgevingsinformatie).

Een neuraal netwerk kan erg gevoelig zijn voor kleine veranderingen, en dit zal leiden tot een daling van de modelprestaties. Het bijhouden en documenteren van uw werk is de eerste stap die u kunt zetten om uw omgeving en modellering te standaardiseren.

Werken met neurale netwerken: checklist voor foutopsporing

Ik hoop dat dit bericht een startpunt voor je kan zijn om te beginnen met het debuggen van je neurale netwerk.

Skillbox beveelt aan:

Bron: www.habr.com

Voeg een reactie