Classificatie van handgeschreven tekeningen. Verslag in Yandex

Een paar maanden geleden hebben onze collega's van Google uitgevoerd op Kaggle een wedstrijd om een ​​classificatie te creëren voor beelden verkregen in het sensationele het spel "Snel, tekenen!" Het team, waartoe ook Yandex-ontwikkelaar Roman Vlasov behoorde, behaalde de vierde plaats in de competitie. Tijdens de machine learning-training van januari deelde Roman de ideeën van zijn team, de uiteindelijke implementatie van de classifier en interessante praktijken van zijn tegenstanders.


- Dag Allemaal! Mijn naam is Roma Vlasov, vandaag zal ik je vertellen over Quick, Draw! Doodleherkenningsuitdaging.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Ons team bestond uit vijf mensen. Ik ben vlak voor de fusiedeadline lid geworden. We hadden pech, we waren een beetje geschokt, maar we waren geschokt door de geldpositie, en zij werden geschud door de goudpositie. En we behaalden een eervolle vierde plaats.

(Tijdens de competitie observeerden de teams zichzelf in een beoordeling, die werd gevormd op basis van de resultaten die op een deel van de voorgestelde dataset werden getoond. De uiteindelijke beoordeling werd op zijn beurt gevormd op een ander deel van de dataset. Dit wordt zo gedaan dat de deelnemers aan de competitie hun algoritmen niet aanpassen aan specifieke gegevens. Daarom schudden de posities in de finale, bij het schakelen tussen beoordelingen, een beetje (van het Engelse shake up - to mix): op andere gegevens kan het resultaat blijken om anders te zijn. Het team van Roman stond op de eerste plaats in de top drie. In dit geval is de top drie geld, monetaire beoordelingszone, aangezien alleen de eerste drie plaatsen een geldprijs kregen. Na de opschudding was het team al in vierde plaats. Op dezelfde manier verloor het andere team de overwinning, de gouden positie. - Vert.)

Classificatie van handgeschreven tekeningen. Verslag in Yandex

De concurrentie was ook belangrijk omdat Evgeniy Babakhnin een grootmeester ontving, Ivan Sosin een meester ontving, Roman Soloviev een grootmeester bleef, Alex Parinov een meester ontving, ik een expert werd en nu ben ik al een meester.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Wat is dit Snel, Tekenen? Dit is een dienst van Google. Google had als doel AI te populariseren en wilde met deze dienst laten zien hoe neurale netwerken werken. Je gaat daarheen, klikt op Laten we tekenen, en er verschijnt een nieuwe pagina waarop je wordt verteld: teken een zigzag, je hebt 20 seconden om dit te doen. Je probeert in 20 seconden een zigzag te tekenen, zoals hier bijvoorbeeld. Als het je lukt, zegt het netwerk dat het een zigzag is en ga je verder. Er zijn slechts zes van dergelijke afbeeldingen.

Als het netwerk van Google niet herkende wat je tekende, werd er een kruisje bij de taak geplaatst. Later zal ik je vertellen wat het in de toekomst zal betekenen of een tekening door het netwerk wordt herkend of niet.

Deze dienst verzamelde een vrij groot aantal gebruikers en alle afbeeldingen die gebruikers tekenden, werden geregistreerd.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

We zijn erin geslaagd bijna 50 miljoen afbeeldingen te verzamelen. Hieruit werden de trein- en testdatum voor onze competitie gevormd. Overigens zijn de hoeveelheid gegevens in de test en het aantal klassen niet voor niets vetgedrukt. Ik zal je er later over vertellen.

Het gegevensformaat was als volgt. Dit zijn niet alleen RGB-afbeeldingen, maar grofweg een logboek van alles wat de gebruiker heeft gedaan. Woord is ons doel, de landcode is waar de auteur van de doodle vandaan komt, de tijdstempel is de tijd. Het herkende label laat alleen zien of het netwerk de afbeelding van Google heeft herkend of niet. En de tekening zelf is een reeks, een benadering van een curve die de gebruiker met punten tekent. En tijdstippen. Dit is de tijd vanaf het begin van het tekenen van de afbeelding.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Gegevens werden in twee formaten gepresenteerd. Dit is het eerste formaat en het tweede is vereenvoudigd. Ze hebben de timing daar vandaan gehaald en deze reeks punten benaderd met een kleinere reeks punten. Hiervoor gebruikten ze Douglas-Pecker-algoritme. Je hebt een groot aantal punten die eenvoudigweg een rechte lijn benaderen, maar in feite kun je deze lijn met slechts twee punten benaderen. Dit is het idee van het algoritme.

De gegevens waren als volgt verdeeld. Alles is uniform, maar er zijn enkele uitschieters. Toen we het probleem oplosten, hebben we er niet naar gekeken. Het belangrijkste is dat er geen echt kleine klassen waren, we hoefden geen gewogen samplers en data-oversampling uit te voeren.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Hoe zagen de foto's eruit? Dit is de klasse “vliegtuig” en voorbeelden daarvan met de labels herkend en niet herkend. Hun verhouding lag ergens rond de 1 op 9. Zoals u kunt zien, zijn de gegevens behoorlijk luidruchtig. Ik vermoed dat het een vliegtuig is. Als je het niet herkent, is het in de meeste gevallen alleen maar ruis. Iemand probeerde zelfs ‘vliegtuig’ te schrijven, maar blijkbaar in het Frans.

De meeste deelnemers namen eenvoudigweg rasters, tekenden gegevens uit deze reeks lijnen als RGB-afbeeldingen en gooiden deze in het netwerk. Ik tekende ongeveer op dezelfde manier: ik nam een ​​kleurenpalet, tekende de eerste lijn met de ene kleur, die aan het begin van dit palet stond, de laatste lijn met een andere, die aan het einde van het palet zat, en daartussen Ik heb overal geïnterpoleerd met dit palet. Dit gaf overigens een beter resultaat dan wanneer je tekent zoals op de allereerste dia - alleen in het zwart.

Andere teamleden, zoals Ivan Sosin, probeerden iets andere benaderingen van tekenen. Bij het ene kanaal tekende hij eenvoudigweg een grijs plaatje, bij een ander kanaal tekende hij elke streek met een verloop van begin tot eind, van 32 naar 255, en bij het derde kanaal tekende hij een verloop over alle penseelstreken van 32 naar 255.

Een ander interessant ding is dat Alex Parinov informatie naar het netwerk heeft geüpload met behulp van de landcode.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

De maatstaf die in de competitie wordt gebruikt, is de gemiddelde gemiddelde precisie. Wat is de essentie van deze maatstaf voor concurrentie? Je kunt drie voorspellingen geven, en als er geen correcte voorspelling in deze drie zit, dan krijg je 0. Als er wel een correcte is, wordt er rekening gehouden met de volgorde ervan. En het doelresultaat wordt als 1 geteld, gedeeld door de volgorde van uw voorspelling. Je hebt bijvoorbeeld drie voorspellers gemaakt, en de juiste is de eerste, dan deel je 1 door 1 en krijg je 1. Als de voorspeller correct is en de volgorde ervan is 2, en dan 1 door 2 deelt, krijg je 0,5. Nou, enz.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Met de voorverwerking van gegevens - hoe u afbeeldingen tekent enzovoort - hebben we een beetje besloten. Welke architecturen hebben we gebruikt? We hebben geprobeerd dikke architecturen te gebruiken zoals PNASNet, SENet en al klassieke architecturen als SE-Res-NeXt, ze doen steeds vaker mee aan nieuwe competities. Er waren ook ResNet en DenseNet.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Hoe hebben we dit geleerd? Alle modellen die we hebben genomen, zijn vooraf getraind op Imagenet. Hoewel er veel gegevens zijn, 50 miljoen afbeeldingen, maar toch, als je een netwerk neemt dat vooraf is getraind op Imagenet, laat het betere resultaten zien dan wanneer je het simpelweg helemaal opnieuw hebt getraind.

Welke lestechnieken hebben we gebruikt? Dit is Cosing Annealing met warme herstarts, waar ik het later over zal hebben. Dit is een techniek die ik in bijna al mijn recente wedstrijden gebruik, en daarmee blijkt de grids behoorlijk goed te trainen, om een ​​goed minimum te bereiken.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Volgende Verlaag het leerpercentage op plateau. Je begint het netwerk te trainen, stelt een bepaald leertempo in, blijft het lesgeven en je verlies convergeert geleidelijk naar een bepaalde waarde. Je controleert dit bijvoorbeeld voor tien tijdperken is het verlies helemaal niet veranderd. Je verlaagt je leertempo met enige waarde en gaat door met leren. Het daalt weer een beetje, convergeert op een bepaald minimum, en je verlaagt opnieuw de leersnelheid, enzovoort, totdat je netwerk uiteindelijk convergeert.

Het volgende is een interessante techniek: verlaag de leersnelheid niet, maar vergroot de batchgrootte. Er is een artikel met dezelfde naam. Wanneer u een netwerk traint, hoeft u de leersnelheid niet te verlagen; u kunt eenvoudigweg de batchgrootte vergroten.

Deze techniek werd trouwens gebruikt door Alex Parinov. Hij begon met een batch gelijk aan 408, en toen zijn netwerk een bepaald plateau bereikte, verdubbelde hij eenvoudigweg de batchgrootte, enz.

Sterker nog, ik weet niet meer welke waarde zijn batchgrootte bereikte, maar wat interessant is, is dat er teams op Kaggle waren die dezelfde techniek gebruikten, hun batchgrootte was ongeveer 10000. Trouwens, moderne raamwerken voor deep learning, zoals Met PyTorch kunt u dit bijvoorbeeld heel eenvoudig doen. U genereert uw batch en verzendt deze naar het netwerk, niet zoals deze in zijn geheel is, maar verdeelt deze in stukjes zodat deze in uw videokaart past, berekent de gradiënten en nadat u de gradiënt voor de hele batch hebt berekend, werkt u bij de gewichten.

Trouwens, grote batchgroottes deden nog steeds mee aan deze wedstrijd, omdat de gegevens behoorlijk luidruchtig waren en een grote batchgrootte je hielp de gradiënt nauwkeuriger te benaderen.

Er werd ook gebruik gemaakt van pseudo-labeling, vooral gebruikt door Roman Solovjev. Hij bemonsterde ongeveer de helft van de gegevens uit de test in batches en trainde het raster op dergelijke batches.

De grootte van de foto's was van belang, maar feit is dat je veel gegevens hebt, dat je lang moet trainen, en als je fotoformaat behoorlijk groot is, dan zul je heel lang trainen. Maar dit voegde niet veel toe aan de kwaliteit van je uiteindelijke classificatie, dus het was de moeite waard om een ​​soort afweging te maken. En we hebben alleen afbeeldingen geprobeerd die niet erg groot waren.

Hoe is het allemaal geleerd? Eerst werden er foto's op klein formaat gemaakt, er werden verschillende tijdperken op gedraaid, dit kostte behoorlijk wat tijd. Vervolgens werden er grote foto's gemaakt, werd het netwerk getraind, en nog meer, nog meer, om het niet helemaal opnieuw te trainen en niet veel tijd te verspillen.

Over optimalisaties. We gebruikten SGD en Adam. Op deze manier was het mogelijk om één enkel model te krijgen, dat een snelheid van 0,941-0,946 op het publieke scorebord opleverde, wat best goed is.

Als je de modellen op de een of andere manier samenvoegt, kom je ergens rond de 0,951 uit. Als je nog een techniek gebruikt, krijg je een eindscore van 0,954 op het openbare bord, net als wij. Maar daarover later meer. Vervolgens vertel ik je hoe we de modellen in elkaar hebben gezet, en hoe we zo’n eindsnelheid hebben weten te bereiken.

Vervolgens wil ik het hebben over Cosing Annealing met warme herstarts of stochastische gradiëntdaling met warme herstarts. Grofweg kun je in principe elke optimalisatie gebruiken, maar het punt is dit: als je maar één netwerk traint en het geleidelijk convergeert naar een bepaald minimum, dan is alles in orde, je krijgt één netwerk, het maakt bepaalde fouten, maar jij kan het een beetje anders trainen. U stelt een initiële leersnelheid in en verlaagt deze geleidelijk volgens deze formule. Je verlaagt het, je netwerk bereikt een bepaald minimum, dan bewaar je de gewichten en stel je opnieuw de leersnelheid in die aan het begin van de training was, waardoor je ergens boven dit minimum uitgaat, en opnieuw je leersnelheid verlaagt.

U kunt dus meerdere minima tegelijk bezoeken, waarbij uw verlies, plus of min, hetzelfde zal zijn. Maar feit is dat netwerken met deze gewichten verschillende fouten op je date zullen geven. Door ze te middelen, krijg je een soort benadering en zal je snelheid hoger zijn.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Over hoe we onze modellen assembleerden. Aan het begin van de presentatie zei ik dat ik moest letten op de hoeveelheid gegevens in de toets en het aantal lessen. Als je 1 optelt bij het aantal doelen in de testset en deelt door het aantal klassen, krijg je het getal 330, en dit stond op het forum geschreven - dat de klassen in de test in evenwicht zijn. Dit zou gebruikt kunnen worden.

Op basis hiervan bedacht Roman Solovjev een maatstaf, we noemden deze Proxy Score, die redelijk goed correleerde met het klassement. Het punt is: je doet een voorspelling, neemt de top 1 van je voorspellers en telt het aantal objecten voor elke klasse. Trek vervolgens 330 af van elke waarde en tel de resulterende absolute waarden bij elkaar op.

De volgende waarden werden verkregen. Dit heeft ons geholpen om geen indringend klassement te creëren, maar om lokaal te valideren en coëfficiënten voor onze ensembles te selecteren.

Met een ensemble kun je zo'n snelheid halen. Wat zou ik nog meer kunnen doen? Stel dat je de informatie hebt gebruikt dat de klassen in je toets in evenwicht zijn.

De balans was anders. Een voorbeeld van één ervan - balancerend op de jongens die de eerste plaats behaalden.

Wat hebben we gedaan? Ons evenwicht was vrij eenvoudig, zo werd voorgesteld door Evgeny Babakhnin. We hebben onze voorspellingen eerst gesorteerd op top 1 en daaruit kandidaten geselecteerd - zodat het aantal klassen niet groter was dan 330. Maar voor sommige klassen kom je uit op minder dan 330 voorspellers. Oké, laten we ook sorteren op top 2 en de top 3 , en we zullen ook kandidaten selecteren.

Hoe verschilde onze balancering van de balancering van de eerste plaats? Ze gebruikten een iteratieve aanpak, waarbij ze de meest populaire klasse namen en de kansen voor die klasse met een klein aantal verlaagden totdat die klasse niet langer de meest populaire was. We namen de volgende meest populaire les. Dus bleven ze ze verlagen totdat het aantal van alle klassen gelijk werd.

Iedereen gebruikte plus of min één benadering voor treinnetwerken, maar niet iedereen gebruikte balancering. Door gebruik te maken van balanceren, zou je in goud kunnen stappen, en als je geluk had, in geld.

Hoe een datum voorbewerken? Iedereen verwerkte de datum, plus of min, op dezelfde manier voor: maakte handgemaakte functies, probeerde de timing te coderen met verschillende lijnkleuren, enz. Alexey Nozdrin-Plotnitsky, die de 8e plaats behaalde, sprak hierover.

Classificatie van handgeschreven tekeningen. Verslag in Yandex

Hij deed het anders. Hij zei dat al deze handgemaakte functies van jou niet werken, dat hoef je niet te doen, je netwerk zou dit allemaal zelf moeten leren. En in plaats daarvan bedacht hij leermodules die je data voorbewerkten. Hij gooide de originele gegevens erin zonder voorbewerking: puntcoördinaten en timings.

Vervolgens nam hij het verschil op basis van de coördinaten en berekende het gemiddelde op basis van de tijdstippen. En hij kwam met een vrij lange matrix. Hij paste er verschillende keren 1D-convolutie op toe om een ​​matrix met de grootte 64xn te verkrijgen, waarbij n het totale aantal punten is, en 64 wordt gemaakt om de resulterende matrix te voeden met de laag van elk convolutioneel netwerk, dat het aantal kanalen accepteert. - 64. hij verkreeg een 64xn-matrix, waarna het nodig was om een ​​tensor van een bepaalde grootte te creëren, zodat het aantal kanalen gelijk was aan 64. Hij normaliseerde alle punten X, Y in het bereik van 0 tot 32 om een tensor van maat 32x32. Ik weet niet waarom hij 32x32 wilde, het gebeurde gewoon zo. En op deze coördinaat plaatste hij een fragment van deze matrix met de grootte 64xn. Het eindigde dus met een tensor van 32x32x64 die je verder in je convolutionele neurale netwerk kon plaatsen. Dat is alles wat ik wilde zeggen.

Bron: www.habr.com

Voeg een reactie