Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

'n Paar maande gelede het ons kollegas van Google bestee op Kaggle 'n kompetisie om 'n klassifiseerder te skep vir beelde wat in die sensasionele verkry is die spel "Vinnige trekking!" Die span, wat die Yandex-ontwikkelaar Roman Vlasov ingesluit het, het die vierde plek in die kompetisie behaal. By die Januarie-masjienleeropleiding het Roman sy span se idees, die finale implementering van die klassifiseerder en interessante praktyke van sy teenstanders gedeel.


- Hi almal! My naam is Roma Vlasov, vandag sal ek jou vertel van Quick, Draw! Doodle Recognition Challenge.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Daar was vyf mense in ons span. Ek het net voor die samesmeltingsperdatum aangesluit. Ons was ongelukkig, ons was 'n bietjie geskud, maar ons is uit die geldposisie geskud, en hulle is uit die goudposisie geskud. En ons het 'n eervolle vierde plek behaal.

(Gedurende die kompetisie het die spanne hulself waargeneem in 'n gradering, wat gevorm is op grond van die resultate wat op een deel van die voorgestelde datastel gewys word. Die finale gradering is op sy beurt op 'n ander deel van die datastel gevorm. Dit word so gedoen dat die kompetisiedeelnemers nie hul algoritmes by spesifieke data aanpas nie.Daarom, in die eindronde, wanneer daar tussen graderings gewissel word, skud die posisies 'n bietjie op (van die Engelse shake up - om te meng): op ander data kan die uitslag uitdraai om anders te wees.Roman se span was eerste in die top drie. In hierdie geval is die topdrie geld, monetêre graderingsone, aangesien slegs die eerste drie plekke met 'n kontantprys bekroon is. Na die opskudding was die span reeds in vierde plek. Op dieselfde manier het die ander span die oorwinning verloor, die goue posisie. - Red.)

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Die kompetisie was ook betekenisvol deurdat Evgeniy Babakhnin 'n grootmeester ontvang het, Ivan Sosin 'n meester ontvang het, Roman Soloviev 'n grootmeester gebly het, Alex Parinov 'n meester ontvang het, ek 'n kenner geword het, en nou is ek reeds 'n meester.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Wat is hierdie Quick, Draw? Dit is 'n diens van Google. Google het die doel gehad om KI te populariseer en wou met hierdie diens wys hoe neurale netwerke werk. Jy gaan daarheen, klik Kom ons teken, en 'n nuwe bladsy verskyn waar jy gesê word: teken 'n sigsag, jy het 20 sekondes om dit te doen. Jy probeer 'n sigsag in 20 sekondes teken, soos byvoorbeeld hier. As jy daarin slaag, sê die netwerk dit is 'n sigsag en jy beweeg aan. Daar is net ses sulke prente.

As Google se netwerk nie kon herken wat jy geteken het nie, is 'n kruisie op die taak geplaas. Later sal ek jou vertel wat dit in die toekoms gaan beteken of 'n tekening deur die netwerk herken word of nie.

Hierdie diens het 'n redelike groot aantal gebruikers versamel, en al die prente wat gebruikers geteken het, is aangeteken.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Ons het daarin geslaag om byna 50 miljoen beelde te versamel. Hieruit is die trein- en toetsdatum vir ons kompetisie gevorm. Terloops, die hoeveelheid data in die toets en die aantal klasse word om 'n rede in vetdruk uitgelig. Ek sal jou 'n bietjie later van hulle vertel.

Die dataformaat was soos volg. Dit is nie net RGB-beelde nie, maar, rofweg gesproke, 'n logboek van alles wat die gebruiker gedoen het. Woord is ons teiken, landkode is waar die skrywer van die krabbel vandaan kom, tydstempel is tyd. Die herkende etiket wys net of die netwerk die prent van Google herken het of nie. En die tekening self is 'n volgorde, 'n benadering van 'n kromme wat die gebruiker met punte teken. En tydsberekeninge. Dit is die tyd vanaf die begin van die teken van die prentjie.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Data is in twee formate aangebied. Dit is die eerste formaat, en die tweede is vereenvoudig. Hulle het die tydsberekeninge daarvandaan uitgeknip en hierdie stel punte benader met 'n kleiner stel punte. Hiervoor het hulle gebruik Douglas-Pecker-algoritme. Jy het 'n groot stel punte wat bloot 'n reguit lyn benader, maar in werklikheid kan jy hierdie lyn met net twee punte benader. Dit is die idee van die algoritme.

Die data is soos volg versprei. Alles is eenvormig, maar daar is 'n paar uitskieters. Toe ons die probleem opgelos het, het ons nie daarna gekyk nie. Die belangrikste ding is dat daar geen klasse was wat regtig min was nie, ons hoef nie geweegde monsternemers en data-oorsteekproefneming te doen nie.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Hoe het die prente gelyk? Dit is die "vliegtuig"-klas en voorbeelde daaruit met die etikette wat herken en nie herken word nie. Hulle verhouding was iewers rondom 1 tot 9. Soos jy kan sien, is die data nogal raserig. Ek sou raai dit is 'n vliegtuig. As jy kyk na nie herken nie, is dit in die meeste gevalle net geraas. Iemand het selfs probeer om "vliegtuig" te skryf, maar blykbaar in Frans.

Die meeste deelnemers het eenvoudig roosters geneem, data uit hierdie reeks lyne as RGB-prente geteken en dit in die netwerk gegooi. Ek het op ongeveer dieselfde manier geteken: ek het 'n palet kleure geneem, die eerste lyn getrek met een kleur, wat aan die begin van hierdie palet was, die laaste lyn met 'n ander, wat aan die einde van die palet was, en tussen hulle Ek het oral geïnterpoleer deur hierdie palet te gebruik. Terloops, dit het 'n beter resultaat gegee as wanneer jy soos op die heel eerste skyfie teken - net in swart.

Ander spanlede, soos Ivan Sosin, het effens ander benaderings tot teken probeer. Met een kanaal het hy bloot 'n grys prentjie geteken, met 'n ander kanaal het hy elke slag geteken met 'n gradiënt van begin tot einde, van 32 tot 255, en met die derde kanaal het hy 'n gradiënt oor alle beroertes van 32 tot 255 geteken.

Nog 'n interessante ding is dat Alex Parinov inligting na die netwerk opgelaai het met behulp van landkode.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Die maatstaf wat in die kompetisie gebruik word, is gemiddelde gemiddelde presisie. Wat is die kern van hierdie maatstaf vir mededinging? Jy kan drie voorspellings gee, en as daar geen korrekte voorspelling in hierdie drie is nie, dan kry jy 0. As daar 'n korrekte een is, word die volgorde daarvan in ag geneem. En die teikenresultaat sal getel word as 1 gedeel deur die volgorde van jou voorspelling. Byvoorbeeld, jy het drie voorspellers gemaak, en die korrekte een is die eerste een, dan deel jy 1 deur 1 en kry 1. As die voorspeller korrek is en sy volgorde is 2, deel dan 1 deur 2, jy kry 0,5. Wel, ens.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Met datavoorverwerking - hoe om prente te teken en so meer - het ons 'n bietjie besluit. Watter argitekture het ons gebruik? Ons het probeer om vet argitekture soos PNASNet, SENet, en sulke reeds klassieke argitekture soos SE-Res-NeXt te gebruik, hulle skryf toenemend nuwe kompetisies in. Daar was ook ResNet en DenseNet.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Hoe het ons dit geleer? Al die modelle wat ons geneem het, is vooraf op imagenet opgelei. Alhoewel daar baie data is, 50 miljoen beelde, maar tog, as jy 'n netwerk neem wat vooraf op imagenet opgelei is, het dit beter resultate getoon as as jy dit bloot van nuuts af opgelei het.

Watter onderrigtegnieke het ons gebruik? Dit is Cosing Annealing with Warm Restarts, waaroor ek 'n bietjie later sal praat. Dit is 'n tegniek wat ek in byna al my onlangse kompetisies gebruik, en daarmee blyk dit om die roosters redelik goed te oefen, om 'n goeie minimum te bereik.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Volgende Verminder leertempo op plato. Jy begin die netwerk oplei, stel 'n sekere leertempo vas, gaan voort om dit te onderrig, en jou verlies konvergeer geleidelik na 'n sekere waarde. Jy kontroleer dit, byvoorbeeld, vir tien tydperke het die verlies glad nie verander nie. Jy verminder jou leertempo met 'n mate van waarde en gaan voort met leer. Dit daal weer 'n bietjie, konvergeer op 'n minimum, en jy verlaag weer die leertempo, ensovoorts, totdat jou netwerk uiteindelik konvergeer.

Volgende is 'n interessante tegniek: Moenie die leertempo verval nie, verhoog die bondelgrootte. Daar is 'n artikel met dieselfde naam. Wanneer jy 'n netwerk oplei, hoef jy nie die leertempo te verminder nie, jy kan eenvoudig die bondelgrootte vergroot.

Hierdie tegniek, terloops, is deur Alex Parinov gebruik. Hy het begin met 'n bondel gelykstaande aan 408, en toe sy netwerk 'n plato bereik het, het hy eenvoudig die bondelgrootte verdubbel, ens.

Om die waarheid te sê, ek onthou nie watter waarde sy bondelgrootte bereik het nie, maar wat interessant is, is dat daar spanne op Kaggle was wat dieselfde tegniek gebruik het, hul bondelgrootte was omtrent 10000 XNUMX. Terloops, moderne raamwerke vir diep leer, soos bv. PyTorch, byvoorbeeld, laat jou toe om dit baie maklik te doen. Jy genereer jou bondel en dien dit nie in sy geheel aan die netwerk in soos dit is nie, maar verdeel dit in stukke sodat dit in jou videokaart pas, bereken die gradiënte, en nadat jy die gradiënt vir die hele bondel bereken het, werk op die gewigte.

Terloops, groot bondelgroottes is steeds by hierdie kompetisie ingesluit, want die data was nogal raserig, en 'n groot bondelgrootte het jou gehelp om die gradiënt meer akkuraat te benader.

Pseudo-etikettering is ook gebruik, meestal deur Roman Soloviev. Hy het ongeveer die helfte van die data van die toets in groepe gemonster en die rooster op sulke groepe opgelei.

Die grootte van die prente het saak gemaak, maar die feit is dat jy baie data het, jy moet lank oefen, en as jou prentgrootte redelik groot is, sal jy vir 'n baie lang tyd oefen. Maar dit het nie veel bygedra tot die kwaliteit van jou finale klassifiseerder nie, so dit was die moeite werd om 'n soort afruil te gebruik. En ons het net prente probeer wat nie baie groot in grootte was nie.

Hoe is dit alles geleer? Eers is klein-grootte foto's geneem, verskeie tydperke is daarop uitgevoer, dit het nogal baie tyd in beslag geneem. Dan is groot prente gegee, die netwerk is opgelei, dan nog meer, selfs meer, om dit nie van nuuts af op te lei en nie baie tyd te mors nie.

Oor optimaliseerders. Ons het SGD en Adam gebruik. Op hierdie manier was dit moontlik om 'n enkele model te kry, wat 'n spoed van 0,941-0,946 op die publieke ranglys gegee het, wat redelik goed is.

As jy die modelle op een of ander manier saamstel, sal jy iewers rondom 0,951 kry. As jy nog een tegniek gebruik, sal jy 'n finale telling van 0,954 op die publieke bord kry, net soos ons gekry het. Maar later meer daaroor. Volgende sal ek jou vertel hoe ons die modelle saamgestel het, en hoe ons dit reggekry het om so 'n finale spoed te bereik.

Volgende wil ek praat oor Cosing uitgloeiing met warm herbegins of Stogastiese gradiënt afkoms met warm herbegin. In beginsel kan jy rofweg enige optimiseerder gebruik, maar die punt is dit: as jy net een netwerk oplei en dit geleidelik tot 'n minimum konvergeer, dan is alles in orde, jy sal een netwerk kry, dit maak sekere foute, maar jy kan dit 'n bietjie anders oplei. Jy sal 'n mate van aanvanklike leertempo stel en dit geleidelik verlaag volgens hierdie formule. Jy verlaag dit, jou netwerk kom tot 'n minimum, dan spaar jy die gewigte, en stel weer die leertempo wat aan die begin van opleiding was, en gaan daardeur iewers opwaarts vanaf hierdie minimum, en verlaag weer jou leertempo.

U kan dus verskeie minimums gelyktydig besoek, waarin u verlies, plus of minus, dieselfde sal wees. Maar die feit is dat netwerke met hierdie gewigte verskillende foute op jou datum sal gee. Deur hulle te gemiddelde, sal jy 'n soort benadering kry, en jou spoed sal hoër wees.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Oor hoe ons ons modelle saamgestel het. Aan die begin van die aanbieding het ek gesê om aandag te gee aan die hoeveelheid data in die toets en die aantal klasse. As jy 1 by die aantal teikens in die toetsstel voeg en deur die aantal klasse deel, sal jy die getal 330 kry, en dit is op die forum geskryf - dat die klasse in die toets gebalanseerd is. Dit kan gebruik word.

Op grond hiervan het Roman Soloviev met 'n maatstaf vorendag gekom, ons het dit Proxy Score genoem, wat redelik goed met die puntelys ooreenstem. Die punt is: jy doen 'n voorspelling, neem die top 1 van jou voorspellers en tel die aantal voorwerpe vir elke klas. Trek dan 330 van elke waarde af en tel die resulterende absolute waardes by.

Die volgende waardes is verkry. Dit het ons gehelp om nie 'n ondersoekende ranglys te skep nie, maar om plaaslik te valideer en koëffisiënte vir ons ensembles te kies.

Met 'n ensemble kon jy so 'n spoed kry. Wat anders kon ek doen? Gestel jy het die inligting gebruik dat die klasse in jou toets gebalanseerd is.

Die balansering was anders. 'n Voorbeeld van een van hulle — balansering van die ouens wat die eerste plek behaal het.

Wat het ons gedoen? Ons balansering was redelik eenvoudig, is voorgestel deur Evgeny Babakhnin. Ons het eers ons voorspellings volgens top 1 gesorteer en kandidate daaruit gekies – sodat die aantal klasse nie 330 oorskry het nie. Maar vir sommige klasse eindig jy met minder as 330 voorspellers. Goed, kom ons sorteer ook volgens top 2 en die top 3 , en ons sal ook kandidate kies.

Hoe het ons balansering verskil van die balansering van die eerste plek? Hulle het 'n iteratiewe benadering gebruik, deur die gewildste klas te neem en die waarskynlikhede vir daardie klas met 'n klein getal te verminder totdat daardie klas nie meer die gewildste was nie. Ons het die volgende gewildste klas geneem. Hulle het dus aangehou om hulle te verlaag totdat die getal van alle klasse gelyk geword het.

Almal het plus of minus een benadering gebruik om netwerke op te lei, maar nie almal het balansering gebruik nie. Deur balansering te gebruik, kon jy in goud ingaan, en as jy gelukkig was, dan in geld.

Hoe om 'n datum vooraf te verwerk? Almal het die datum, plus of minus, op dieselfde manier vooraf verwerk - handgemaakte kenmerke gemaak, tydsberekeninge met verskillende slagkleure probeer enkodeer, ens. Alexey Nozdrin-Plotnitsky, wat die 8ste plek behaal het, het hieroor gepraat.

Klassifikasie van handgeskrewe tekeninge. Verslag in Yandex

Hy het dit anders gedoen. Hy het gesê dat al hierdie handgemaakte kenmerke van jou nie werk nie, jy hoef dit nie te doen nie, jou netwerk moet dit alles op sy eie leer. En in plaas daarvan het hy met leermodules vorendag gekom wat jou data vooraf verwerk het. Hy het die oorspronklike data in hulle gegooi sonder om vooraf te verwerk – puntkoördinate en tydsberekeninge.

Toe het hy die verskil geneem op grond van die koördinate, en dit alles gemiddeld gebaseer op die tydsberekeninge. En hy het met 'n taamlik lang matriks vorendag gekom. Hy het verskeie kere 1D konvolusie daarop toegepas om 'n matriks van grootte 64xn te verkry, waar n die totale aantal punte is, en 64 gemaak word om die resulterende matriks na die laag van enige konvolusienetwerk te voer, wat die aantal kanale aanvaar - 64. hy het 'n 64xn-matriks verkry, dan was dit nodig om 'n tensor van 'n mate van grootte te skep sodat die aantal kanale gelyk is aan 64. Hy het alle punte X, Y in die reeks van 0 tot 32 genormaliseer om 'n tensor van grootte 32x32. Ek weet nie hoekom hy 32x32 wou hê nie, dit het net so gebeur. En by hierdie koördinaat het hy 'n fragment van hierdie matriks van grootte 64xn geplaas. Dit het dus net geëindig met 'n 32x32x64 tensor wat jy verder in jou konvolusionele neurale netwerk kon plaas. Dis al wat ek wou sê.

Bron: will.com

Voeg 'n opmerking