Klassificering af håndskrevne tegninger. Rapport i Yandex

For et par måneder siden, vores kollegaer fra Google afholdt på Kaggle en konkurrence om at skabe en klassificering af billeder opnået i den sensationelle spillet "Hurtig, tegn!" Holdet, som omfattede Yandex-udvikleren Roman Vlasov, tog fjerdepladsen i konkurrencen. Ved maskinlæringstræningen i januar delte Roman sit teams ideer, den endelige implementering af klassificeringsværktøjet og sine modstanderes interessante praksis.


- Hej alle! Mit navn er Roma Vlasov, i dag vil jeg fortælle dig om Quick, Draw! Doodle-genkendelsesudfordring.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Der var fem personer på vores hold. Jeg tiltrådte lige før fusionsfristen. Vi var uheldige, vi blev rystet lidt, men vi blev rystet fra pengepositionen, og de blev rystet fra guldpositionen. Og vi fik en hæderlig fjerdeplads.

(Under konkurrencen observerede holdene sig selv i en rating, som blev dannet ud fra resultaterne vist på en del af det foreslåede datasæt. Den endelige rating blev til gengæld dannet på en anden del af datasættet. Dette gøres således at konkurrencedeltagerne ikke tilpasser deres algoritmer til specifikke data Derfor ryster positionerne i finalerne, når der skiftes mellem ratings, lidt (fra engelsk shake up - to mix): på andre data kan resultatet vise sig. at være anderledes. Romans hold var først i top tre. I dette tilfælde er top tre penge, monetær vurderingszone, da kun de første tre pladser blev tildelt en pengepræmie. Efter omrystning var holdet allerede i fjerdepladsen. På samme måde tabte det andet hold sejren, guldpositionen. - Red.)

Klassificering af håndskrevne tegninger. Rapport i Yandex

Konkurrencen var også væsentlig, idet Evgeniy Babakhnin modtog en stormester, Ivan Sosin modtog en mester, Roman Soloviev forblev en stormester, Alex Parinov modtog en mester, jeg blev en ekspert, og nu er jeg allerede en mester.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Hvad er dette Quick, Draw? Dette er en tjeneste fra Google. Google havde som mål at popularisere kunstig intelligens og ville med denne tjeneste vise, hvordan neurale netværk fungerer. Du går dertil, klikker på Lad os tegne, og en ny side dukker op, hvor du får at vide: tegn en zigzag, du har 20 sekunder til at gøre dette. Du forsøger at tegne en zigzag på 20 sekunder, som her f.eks. Hvis det lykkes, siger netværket, at det er en zigzag, og du går videre. Der er kun seks sådanne billeder.

Hvis Googles netværk ikke kunne genkende det, du tegnede, blev der sat et kryds på opgaven. Senere vil jeg fortælle dig, hvad det vil betyde i fremtiden, om en tegning bliver genkendt af netværket eller ej.

Denne tjeneste samlede et ret stort antal brugere, og alle de billeder, som brugerne tegnede, blev logget.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Det lykkedes os at indsamle næsten 50 millioner billeder. Ud fra dette blev tog- og testdatoen for vores konkurrence dannet. I øvrigt er mængden af ​​data i testen og antallet af klasser fremhævet med fed af en grund. Jeg fortæller dig om dem lidt senere.

Dataformatet var som følger. Det er ikke kun RGB-billeder, men groft sagt en log over alt, hvad brugeren gjorde. Word er vores mål, landekode er, hvor forfatteren til doodlen kommer fra, tidsstempel er tid. Den genkendte etiket viser blot, om netværket genkendte billedet fra Google eller ej. Og selve tegningen er en sekvens, en tilnærmelse af en kurve, som brugeren tegner med punkter. Og tidspunkter. Dette er tidspunktet fra starten af ​​at tegne billedet.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Data blev præsenteret i to formater. Dette er det første format, og det andet er forenklet. De skar tiderne ud derfra og tilnærmede dette sæt punkter med et mindre sæt punkter. Til dette brugte de Douglas-Pecker algoritme. Du har et stort sæt punkter, der blot tilnærmer en lige linje, men faktisk kan du tilnærme denne linje med kun to punkter. Dette er ideen med algoritmen.

Dataene blev fordelt som følger. Alt er ensartet, men der er nogle afvigelser. Da vi løste problemet, så vi ikke på det. Det vigtigste er, at der ikke var nogen klasser, der var virkelig få, vi behøvede ikke at lave vægtede samplere og dataoversampling.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Hvordan så billederne ud? Dette er "flyvemaskine"-klassen og eksempler fra den med etiketterne genkendt og ikke-genkendt. Deres forhold var et sted omkring 1 til 9. Som du kan se, er dataene ret støjende. Jeg vil gætte på, at det er et fly. Hvis du ser på ikke genkendt, er det i de fleste tilfælde bare støj. Nogen prøvede endda at skrive "fly", men tilsyneladende på fransk.

De fleste deltagere tog ganske enkelt net, tegnede data fra denne sekvens af linjer som RGB-billeder og smed dem ind i netværket. Jeg tegnede på nogenlunde samme måde: Jeg tog en palet af farver, tegnede den første linje med en farve, som var i begyndelsen af ​​denne palet, den sidste linje med en anden, som var i slutningen af ​​paletten, og mellem dem Jeg interpolerede overalt ved hjælp af denne palette. Det gav i øvrigt et bedre resultat, end hvis man tegner som på den allerførste slide - bare i sort.

Andre teammedlemmer, såsom Ivan Sosin, prøvede lidt anderledes tilgange til tegning. Med en kanal tegnede han blot et gråt billede, med en anden kanal tegnede han hvert streg med en gradient fra begyndelse til slut, fra 32 til 255, og med den tredje kanal tegnede han en gradient over alle streger fra 32 til 255.

En anden interessant ting er, at Alex Parinov uploadede oplysninger til netværket ved hjælp af landekode.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Den metrik, der bruges i konkurrencen, er gennemsnitlig gennemsnitlig præcision. Hvad er essensen af ​​denne metrik for konkurrence? Du kan give tre forudsigelser, og hvis der ikke er et korrekt prædikat i disse tre, så får du 0. Hvis der er et rigtigt, så tages der hensyn til dens rækkefølge. Og målresultatet tælles som 1 divideret med rækkefølgen af ​​din forudsigelse. For eksempel lavede du tre prædiktorer, og den rigtige er den første, så dividerer du 1 med 1 og får 1. Hvis prædiktoren er korrekt og dens rækkefølge er 2, så divider du 1 med 2, får du 0,5. Nå, osv.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Med dataforbehandling - hvordan man tegner billeder og så videre - har vi bestemt os lidt. Hvilke arkitekturer brugte vi? Vi forsøgte at bruge fede arkitekturer som PNASNet, SENet og sådanne allerede klassiske arkitekturer som SE-Res-NeXt, de deltager i stigende grad i nye konkurrencer. Der var også ResNet og DenseNet.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Klassificering af håndskrevne tegninger. Rapport i Yandex

Klassificering af håndskrevne tegninger. Rapport i Yandex

Hvordan lærte vi dette? Alle de modeller, vi tog, var fortrænede på imagenet. Selvom der er en masse data, 50 millioner billeder, men alligevel, hvis du tager et netværk, der er fortrænet på imagenet, viste det bedre resultater, end hvis du blot trænede det fra bunden.

Hvilke undervisningsteknikker brugte vi? Dette er Cosing Annealing med varme genstarter, som jeg vil tale om lidt senere. Dette er en teknik, som jeg bruger i næsten alle mine seneste konkurrencer, og med dem viser det sig at træne ristene ret godt, for at opnå et godt minimum.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Næste Reducer læringshastigheden på Plateau. Du begynder at træne netværket, indstiller en bestemt indlæringshastighed, fortsætter med at undervise i det, og dit tab konvergerer gradvist til en vis værdi. Du tjekker dette, for eksempel for ti epoker har tabet ikke ændret sig overhovedet. Du reducerer din læringshastighed med en vis værdi og fortsætter med at lære. Det falder lidt igen, konvergerer på et minimum, og du sænker igen indlæringshastigheden, og så videre, indtil dit netværk endelig konvergerer.

Dernæst er en interessant teknik: Forøg ikke indlæringshastigheden, øg batchstørrelsen. Der er en artikel med samme navn. Når du træner et netværk, behøver du ikke at reducere indlæringshastigheden, du kan blot øge batchstørrelsen.

Denne teknik blev i øvrigt brugt af Alex Parinov. Han startede med en batch svarende til 408, og da hans netværk nåede et eller andet plateau, fordoblede han simpelthen batchstørrelsen osv.

Faktisk husker jeg ikke hvilken værdi hans batchstørrelse nåede, men det interessante er, at der var hold på Kaggle, der brugte samme teknik, deres batchstørrelse var omkring 10000. I øvrigt moderne rammer for deep learning, som f.eks. PyTorch, for eksempel, giver dig mulighed for at gøre dette meget nemt. Du genererer din batch og sender den til netværket ikke som den er i sin helhed, men deler den op i bidder, så den passer ind i dit videokort, udregner gradienterne, og efter du har beregnet gradienten for hele batchen, opdaterer du vægtene.

Forresten var store batchstørrelser stadig inkluderet i denne konkurrence, fordi dataene var ret støjende, og en stor batchstørrelse hjalp dig med at tilnærme gradienten mere præcist.

Pseudo-mærkning blev også brugt, mest brugt af Roman Soloviev. Han samplede omkring halvdelen af ​​dataene fra testen i batches og trænede nettet på sådanne batches.

Størrelsen på billederne betød, men faktum er, at du har mange data, du skal træne i lang tid, og hvis din billedstørrelse er ret stor, så træner du meget længe. Men dette tilføjede ikke meget til kvaliteten af ​​din endelige klassificering, så det var værd at bruge en form for afvejning. Og vi prøvede kun billeder, der ikke var særlig store i størrelsen.

Hvordan blev det hele lært? Først blev der taget små billeder, der blev kørt flere epoker på dem, dette tog ret meget tid. Så blev der givet billeder i stor størrelse, netværket blev trænet, så endnu mere, endnu mere, for ikke at træne det fra bunden og ikke spilde en masse tid.

Om optimering. Vi brugte SGD og Adam. På den måde var det muligt at få en enkelt model, som gav en hastighed på 0,941-0,946 på den offentlige rangliste, hvilket er ganske godt.

Hvis du sammensætter modellerne på en eller anden måde, vil du få et sted omkring 0,951. Hvis du bruger en teknik mere, får du en slutscore på 0,954 på den offentlige tavle, ligesom vi fik. Men mere om det senere. Dernæst vil jeg fortælle dig, hvordan vi samlede modellerne, og hvordan vi formåede at opnå en sådan endelig hastighed.

Dernæst vil jeg gerne tale om Cosing Annealing med varme genstarter eller Stokastisk gradientnedstigning med varme genstarter. Groft sagt kan du i princippet bruge en hvilken som helst optimizer, men pointen er denne: Hvis du bare træner et netværk og gradvist konvergerer til et minimum, så er alt i orden, du får ét netværk, det laver visse fejl, men du kan træne det lidt anderledes. Du vil indstille en indledende indlæringshastighed og gradvist sænke den i henhold til denne formel. Du sænker det, dit netværk kommer til et minimum, så sparer du vægtene og sætter igen den indlæringshastighed, der var i begyndelsen af ​​træningen, og går derved et sted opad fra dette minimum, og sænker igen din indlæringsrate.

Således kan du besøge flere minimumskrav på én gang, hvor dit tab vil være, plus eller minus, det samme. Men faktum er, at netværk med disse vægte vil give forskellige fejl på din date. Ved at tage et gennemsnit af dem, vil du få en form for tilnærmelse, og din hastighed vil være højere.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Om hvordan vi sammensatte vores modeller. I begyndelsen af ​​præsentationen sagde jeg at være opmærksom på mængden af ​​data i testen og antallet af klasser. Lægger man 1 til antallet af mål i testsættet og dividerer med antallet af klasser, får man tallet 330, og dette blev skrevet på forummet - at klasserne i testen er balancerede. Dette kunne bruges.

Baseret på dette kom Roman Soloviev med en metrik, vi kaldte den Proxy Score, som korrelerede ganske godt med leaderboardet. Pointen er: du laver en forudsigelse, tager top 1 af dine forudsigelser og tæller antallet af objekter for hver klasse. Træk derefter 330 fra hver værdi og læg de resulterende absolutte værdier sammen.

Følgende værdier blev opnået. Dette hjalp os med ikke at skabe en sonderende rangliste, men til at validere lokalt og vælge koefficienter for vores ensembler.

Med et ensemble kunne man få sådan en fart. Hvad kunne jeg ellers gøre? Antag, at du brugte informationen om, at klasserne i din test er afbalancerede.

Balancen var anderledes. Et eksempel på en af ​​dem — balancering fra de fyre, der tog førstepladsen.

Hvad gjorde vi? Vores balancering var ret enkel, blev det foreslået af Evgeny Babakhnin. Vi sorterede først vores forudsigelser efter top 1 og udvalgte kandidater fra dem - så antallet af klasser ikke oversteg 330. Men for nogle klasser ender man med færre end 330 forudsigere. Okay, lad os også sortere efter top 2 og top 3 , og vi vil også udvælge kandidater.

Hvordan adskilte vores balancering sig fra balanceringen fra det første sted? De brugte en iterativ tilgang, idet de tog den mest populære klasse og reducerede sandsynligheden for den klasse med et lille antal, indtil den klasse ikke længere var den mest populære. Vi tog den næstmest populære klasse. Så de fortsatte med at sænke dem, indtil antallet af alle klasser blev lige.

Alle brugte plus eller minus én tilgang til tognet, men ikke alle brugte balancering. Ved at bruge balancering kunne du gå ind i guld, og hvis du var heldig, så til penge.

Hvordan forbehandler man en dato? Alle forbehandlede datoen, plus eller minus, på samme måde - lavede håndlavede funktioner, forsøgte at indkode timings med forskellige stregfarver osv. Alexey Nozdrin-Plotnitsky, som tog 8. pladsen, talte om dette.

Klassificering af håndskrevne tegninger. Rapport i Yandex

Han gjorde det anderledes. Han sagde, at alle disse håndlavede funktioner hos dig ikke virker, det behøver du ikke gøre, dit netværk burde lære alt dette på egen hånd. Og i stedet kom han med læringsmoduler, der forbehandlede dine data. Han smed de originale data ind i dem uden forbehandling - punktkoordinater og timings.

Derefter tog han forskellen baseret på koordinaterne og tog gennemsnittet af det hele baseret på timingen. Og han kom med en ret lang matrix. Han anvendte 1D-foldning på det flere gange for at opnå en matrix med størrelse 64xn, hvor n er det samlede antal punkter, og 64 er lavet for at føre den resulterende matrix til laget af ethvert foldningsnetværk, som accepterer antallet af kanaler - 64. han opnåede en 64xn matrix, så var det nødvendigt at skabe en tensor af en eller anden størrelse, så antallet af kanaler var lig med 64. Han normaliserede alle punkter X, Y i området fra 0 til 32 for at skabe en tensor af størrelse 32x32. Jeg ved ikke, hvorfor han ville have 32x32, det skete bare sådan. Og ved denne koordinat placerede han et fragment af denne matrix af størrelse 64xn. Så det endte bare med en 32x32x64 tensor, som du kunne sætte længere ind i dit konvolutionelle neurale netværk. Det var alt, jeg ville sige.

Kilde: www.habr.com

Tilføj en kommentar