Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

In pear moannen lyn, ús kollega's fan Google bestege op Kaggle in kompetysje foar it meitsjen fan in klassifikaasje foar bylden krigen yn de sensasjonele it spultsje "Fluch, tekenje!" It team, wêrby't Yandex-ûntwikkelder Roman Vlasov omfette, naam it fjirde plak yn 'e kompetysje. By de training foar masine-learen fan jannewaris dielde Roman de ideeën fan syn team, de definitive ymplemintaasje fan 'e klassifikaasje en ynteressante praktiken fan syn tsjinstanners.


- Hoi allegearre! Myn namme is Roma Vlasov, hjoed sil ik jo fertelle oer Quick, Draw! Doodle Recognition Challenge.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Der sieten fiif minsken yn ús team. Ik die mei krekt foar de fúzjedeadline. Wy wiene pech, wy waarden skodde in bytsje, mar wy waarden skodde út it jild posysje, en se waarden skodde út 'e gouden posysje. En we pakten in earfol fjirde plak.

(Tydens de kompetysje observearren de teams harsels yn in wurdearring, dy't waard foarme op basis fan de resultaten werjûn op ien diel fan 'e foarstelde dataset. De definitive wurdearring is op syn beurt foarme op in oar diel fan' e dataset. Dit wurdt dien sa dat de kompetysje dielnimmers harren algoritmen net oanpasse oan spesifike gegevens.Dêrom skodzje yn de finale, by it wikseljen tusken wurdearrings, de posysjes in bytsje op (fan it Ingelsk shake up - to mix): op oare gegevens kin it resultaat útdraaie oars te wêzen. Roman syn ploech wie earste yn de top trije. Yn dit gefal, de top trije is jild, monetêre rating sône, sûnt allinnich de earste trije plakken waarden takend in jildpriis. Nei de shake-up, it team wie al yn fjirde plak. Op deselde wize ferlear it oare team de oerwinning, de gouden posysje. - Red.)

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

De konkurrinsje wie ek wichtich yn dat Evgeniy Babakhnin krige in grutmaster, Ivan Sosin krige in master, Roman Soloviev bleau in grutmaster, Alex Parinov krige in master, ik waard in ekspert, en no bin ik al in master.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Wat is dit Quick, Draw? Dit is in tsjinst fan Google. Google hie it doel om AI te popularisearjen en woe mei dizze tsjinst sjen litte hoe't neurale netwurken wurkje. Jo geane dêrhinne, klikje op Lit ús tekenje, en in nije side ferskynt wêr't jo ferteld wurde: tekenje in sigzag, jo hawwe 20 sekonden om dit te dwaan. Jo besykje in zigzag yn 20 sekonden te tekenjen, lykas hjir bygelyks. As jo ​​slagje, seit it netwurk dat it in zigzag is en jo geane troch. Der binne mar seis sokke plaatsjes.

As it netwurk fan Google net erkende wat jo tekene, waard in krús op 'e taak pleatst. Letter sil ik jo fertelle wat it yn 'e takomst betsjutte sil oft in tekening troch it netwurk erkend wurdt of net.

Dizze tsjinst sammele in frij grut oantal brûkers, en alle foto's dy't brûkers tekene waarden oanmeld.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

It is ús slagge om hast 50 miljoen ôfbyldings te sammeljen. Dêrút waarden de trein- en testdatum foar ús kompetysje foarme. Trouwens, de hoemannichte gegevens yn 'e test en it oantal klassen binne foar in reden fet markearre. Ik sil dy efkes letter oer harren fertelle.

It gegevensformaat wie as folget. Dit binne net allinich RGB-ôfbyldings, mar, rûchwei sprutsen, in logboek fan alles wat de brûker die. Wurd is ús doel, lânkoade is wêr't de skriuwer fan 'e doodle komt, tiidstempel is tiid. It erkende label lit gewoan sjen oft it netwurk de ôfbylding fan Google herkende of net. En de tekening sels is in sekwinsje, in oanwizing fan in kromme dy't de brûker tekenet mei punten. En timings. Dit is de tiid fan it begjin fan it tekenjen fan de foto.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Gegevens waarden presintearre yn twa formaten. Dit is it earste formaat, en it twadde is ferienfâldige. Se snijden dêr de timings út en benadere dizze set punten mei in lytsere set punten. Dêrfoar brûkten se Douglas-Pecker algoritme. Jo hawwe in grutte set punten dy't gewoanlik in rjochte line benaderje, mar yn feite kinne jo dizze line benaderje mei mar twa punten. Dit is it idee fan it algoritme.

De gegevens waarden ferdield as folget. Alles is unifoarm, mar der binne wat útfallers. Doe't wy it probleem oplosten, seagen wy it net. It wichtichste is dat d'r gjin klassen wiene dy't echt in pear wiene, wy hoegden net te dwaan gewichtige samplers en gegevensoversampling.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Hoe seagen de foto's der út? Dit is de klasse "fleantúch" en foarbylden dêrfan mei de labels erkend en net erkend. Harren ferhâlding wie earne om 1 oan 9. Sa't jo sjen kinne, de gegevens is frij luidruchtig. Ik soe riede dat it in fleantúch is. As jo ​​sjogge nei net erkend, yn de measte gefallen is it gewoan lûd. Immen besocht sels "fleantúch" te skriuwen, mar blykber yn it Frânsk.

De measte dielnimmers namen gewoan rasters, tekene gegevens út dizze rige linen as RGB-ôfbyldings, en smieten se yn it netwurk. Ik tekene sawat deselde manier: ik naam in palet fan kleuren, tekene de earste line mei ien kleur, dy't oan it begjin fan dit palet wie, de lêste line mei in oare, dy't oan 'e ein fan it palet wie, en tusken har Ik ynterpolearre oeral mei dit palet. Trouwens, dit joech in better resultaat dan as jo tekenje as op 'e earste dia - gewoan yn swart.

Oare teamleden, lykas Ivan Sosin, besochten wat ferskillende oanpak foar tekenjen. Mei it iene kanaal tekene er gewoan in griis byld, mei in oar kanaal tekene er elke streek mei in helling fan begjin oant ein, fan 32 oant 255, en mei it tredde kanaal tekene er in helling oer alle streken fan 32 oant 255.

In oar nijsgjirrich ding is dat Alex Parinov ynformaasje uploade nei it netwurk mei lânkoade.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

De metrik dy't brûkt wurdt yn 'e konkurrinsje is Mean Average Precision. Wat is de essinsje fan dizze metrik foar konkurrinsje? Jo kinne trije predics jaan, en as der gjin juste predic yn dizze trije is, dan krije jo 0. As der in juste is, dan wurdt de folchoarder derfan rekkene. En it doelresultaat sil wurde teld as 1 dield troch de folchoarder fan jo foarsizzing. Jo hawwe bygelyks trije foarsizzers makke, en de juste is de earste, dan diele jo 1 troch 1 en krije 1. As de foarsizzer goed is en syn folchoarder is 2, diel dan 1 troch 2, jo krije 0,5. No, ensfh.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Mei gegevensfoarferwurking - hoe't jo foto's tekenje en sa fierder - hawwe wy in bytsje besletten. Hokker arsjitektuer hawwe wy brûkt? Wy besochten fet arsjitektueren te brûken lykas PNASNet, SENet, en sokke al klassike arsjitektueren as SE-Res-NeXt, se dogge hieltyd mear nije kompetysjes yn. D'r wiene ek ResNet en DenseNet.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Hoe hawwe wy dit leard? Alle modellen dy't wy namen waarden foartraind op imagenet. Hoewol't der in protte gegevens, 50 miljoen ôfbyldings, mar dochs, as jo nimme in netwurk pre-trained op imagenet, toande it bettere resultaten dan as jo gewoan trained it fanôf it begjin.

Hokker leartechniken hawwe wy brûkt? Dit is Cosing Annealing mei Warm Restarts, dêr't ik in bytsje letter oer sil prate. Dit is in technyk dy't ik yn hast al myn resinte kompetysjes brûke, en mei har docht bliken dat de rasters frij goed trainje, om in goed minimum te berikken.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Folgjende Ferminderje Learning Rate op Plateau. Jo begjinne it netwurk te trenen, in bepaalde learsnelheid ynstelle, trochgean mei it learen, en jo ferlies konvergeet stadichoan nei in bepaalde wearde. Jo kontrolearje dit, bygelyks, foar tsien tiidrekken is it ferlies hielendal net feroare. Jo ferminderje jo learrate mei wat wearde en trochgean mei learen. It sakket wer in bytsje, konvergeart op in bepaald minimum, en jo ferleegje de learsnelheid opnij, ensfh., oant jo netwurk úteinlik konvergeart.

Folgjende is in nijsgjirrige technyk: ferfal it leartempo net, ferheegje de batchgrutte. Der is in artikel mei deselde namme. As jo ​​in netwurk traine, hoege jo it leartempo net te ferminderjen, jo kinne de batchgrutte gewoan ferheegje.

Dizze technyk, trouwens, waard brûkt troch Alex Parinov. Hy begon mei in batch lyk oan 408, en doe't syn netwurk wat plato berikte, ferdûbele hy gewoan de batchgrutte, ensfh.

Yn feite, ik wit net ûnthâlde hokker wearde syn batch grutte berikte, mar wat is nijsgjirrich is dat der wiene teams op Kaggle dy't brûkten deselde technyk, harren batch grutte wie oer 10000 XNUMX. Troch de wei, moderne kaders foar djip learen, lykas PyTorch, bygelyks, kinne jo dit dwaan hiel maklik. Jo generearje jo batch en stjoere it oan it netwurk net sa't it is, yn syn gehiel, mar ferdiele it yn brokken sadat it past yn jo fideokaart, berekkenje de gradiënten, en nei't jo de gradient foar de heule batch berekkene hawwe, update de gewichten.

Trouwens, grutte batchgrutte waarden noch opnommen yn dizze kompetysje, om't de gegevens frijwat lawaaierich wiene, en in grutte batchgrutte holp jo de gradient krekter te benaderjen.

Pseudo-labeling waard ek brûkt, meast brûkt troch Roman Soloviev. Hy samplede sawat de helte fan de gegevens fan 'e test yn batches, en trainde it raster op sokke batches.

De grutte fan 'e foto's wie wichtich, mar it feit is dat jo in protte gegevens hawwe, jo moatte in lange tiid traine, en as jo ôfbyldingsgrutte frij grut is, dan sille jo in heule tiid traine. Mar dit foege net folle ta oan de kwaliteit fan jo lêste klassifikaasje, dus it wie de muoite wurdich om in soarte fan ôfwikseling te brûken. En wy besochten allinich foto's dy't net heul grut wiene.

Hoe waard it allegear leard? Earst waarden lytse foto's makke, dêr waarden ferskate epoken op rûn, dit naam nochal in soad tiid yn beslach. Dêrnei waarden grutte foto's jûn, it netwurk waard traind, dan noch mear, noch mear, om it net fanôf it begjin te trenen en net in protte tiid te fergrieme.

Oer optimizers. Wy brûkten SGD en Adam. Op dizze manier wie it mooglik om in inkeld model te krijen, dat in snelheid fan 0,941-0,946 joech op it iepenbiere Leaderboard, wat frij goed is.

As jo ​​de modellen op ien of oare manier ensemble, sille jo earne om 0,951 komme. As jo ​​noch ien technyk brûke, krije jo in einskoare fan 0,954 op it iepenbiere boerd, krekt lykas wy krigen. Mar dêroer letter mear. Folgjende sil ik jo fertelle hoe't wy de modellen gearstald hawwe, en hoe't wy sa'n definitive snelheid koenen berikke.

Folgjende wol ik graach prate oer Cosing Annealing mei waarme opstarten of Stochastic Gradient Descent mei waarme opstarten. Rûchwei, yn prinsipe kinne jo elke optimizer brûke, mar it punt is dit: as jo gewoan ien netwurk trainje en stadichoan nei in minimum konvergeart, dan is alles goed, jo krije ien netwurk, it makket bepaalde flaters, mar jo kin it in bytsje oars traine. Jo sille wat inisjele learsnelheid ynstelle, en it stadichoan ferleegje neffens dizze formule. Jo ferleegje it, jo netwurk komt ta wat minimum, dan bewarje jo de gewichten, en set wer de learsnelheid yn dy't oan it begjin fan 'e training wie, en gean dêrmei earne omheech fan dit minimum, en ferleegje jo learrate wer.

Sa kinne jo ferskate minimumen tagelyk besykje, wêryn jo ferlies, plus of min, itselde sil wêze. Mar it feit is dat netwurken mei dizze gewichten sille jaan ferskillende flaters op jo datum. Troch se te gemiddelden, sille jo in soarte fan approximaasje krije, en jo snelheid sil heger wêze.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Oer hoe't wy ús modellen gearstald hawwe. Oan it begjin fan 'e presintaasje sei ik omtinken te jaan oan it bedrach fan gegevens yn' e test en it oantal klassen. As jo ​​1 tafoegje oan it oantal doelen yn 'e testset en diele troch it oantal klassen, krije jo it nûmer 330, en dit waard skreaun op it foarum - dat de klassen yn' e test lykwichtich binne. Dit koe brûkt wurde.

Op grûn dêrfan kaam Roman Soloviev mei in metryske, wy neamden it Proxy Score, dy't frij goed korrelearre mei it Leaderboard. It punt is: jo dogge in foarsizzing, nim de top 1 fan jo foarsizzers en tel it oantal objekten foar elke klasse. Folgje dan 330 fan elke wearde ôf en tel de resultearjende absolute wearden op.

De folgjende wearden waarden krigen. Dit holp ús net om in probearjende leaderboard te meitsjen, mar om lokaal te falidearjen en koeffizienten te selektearjen foar ús ensembles.

Mei in ensemble koene jo sa'n snelheid krije. Wat koe ik oars dwaan? Stel dat jo de ynformaasje hawwe brûkt dat de klassen yn jo test lykwichtich binne.

It lykwicht wie oars. In foarbyld fan ien fan harren - ôfwaging fan de jonges dy't naam it earste plak.

Wat hawwe wy dien? Us ôfwaging wie frij simpel, it waard suggerearre troch Evgeny Babakhnin. Wy sorteare ús foarsizzings earst op top 1 en selekteare kandidaten dêrút - sadat it oantal klassen net mear wie dan 330. Mar foar guon klassen komme jo op minder as 330 foarsizzers. Okay, litte wy ek sortearje op top 2 en de top 3 , en wy sille ek selektearje kandidaten.

Hoe wie ús balâns ferskille fan it lykwicht fan it earste plak? Se brûkten in iterative oanpak, namen de populêrste klasse en ferminderen de kânsen foar dy klasse mei wat lyts oantal oant dy klasse net mear de populêrste wie. Wy namen de folgjende meast populêre klasse. Sa bleaunen se har ferleegje oant it oantal fan alle klassen gelyk waard.

Elkenien brûkte plus of min ien oanpak foar treinnetwurken, mar net elkenien brûkte balâns. Mei help fan balâns, kinne jo gean yn goud, en as jo wiene gelok, dan yn jild.

Hoe kinne jo in datum foarferwurkje? Elkenien foarbewurke de datum, plus of minus, op deselde manier - it meitsjen fan hânmakke funksjes, besykje timings te kodearjen mei ferskate strokekleuren, ensfh. Alexey Nozdrin-Plotnitsky, dy't it 8ste plak naam, spruts oer dit.

Klassifikaasje fan hânskreaune tekeningen. Rapportearje yn Yandex

Hy die it oars. Hy sei dat al dizze mei de hân makke funksjes fan jo net wurkje, jo hoege dat net te dwaan, jo netwurk moat dit alles op himsels leare. En ynstee kaam hy mei learmodules dy't jo gegevens foarbewurke. Hy smiet de orizjinele gegevens yn har sûnder foarferwurking - puntkoordinaten en timings.

Doe naam hy it ferskil basearre op 'e koördinaten, en gemiddelde it allegear basearre op' e timings. En hy kaam mei in frij lange matrix. Hy hat ferskate kearen 1D-konvolúsje tapast om in matrix fan grutte 64xn te krijen, wêrby't n it totale oantal punten is, en 64 wurdt makke om de resultearjende matrix te fieden oan 'e laach fan elk konvolúsjoneel netwurk, dat it oantal kanalen akseptearret. - 64. hy krige in 64xn matrix, dan wie it nedich om in tensor fan wat grutte te meitsjen sadat it oantal kanalen gelyk wie oan 64. Hy normalisearre alle punten X, Y yn it berik fan 0 oant 32 om in te meitsjen tensor fan grutte 32x32. Ik wit net wêrom hy 32x32 woe, it barde gewoan sa. En op dizze koördinaat pleatste hy in fragmint fan dizze matrix fan grutte 64xn. Dat it einige gewoan mei in 32x32x64 tensor dy't jo fierder koenen pleatse yn jo konvolúsjonele neurale netwurk. Dat woe ik net sizze.

Boarne: www.habr.com

Add a comment