Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Prije nekoliko mjeseci naše kolege iz Google-a potrošeno na Kaggleu konkurs za kreiranje klasifikatora za slike dobijene u senzacionalnom igra "Brzo, crtaj!" Tim, koji je uključivao Yandex programera Romana Vlasova, zauzeo je četvrto mesto na takmičenju. Na januarskom treningu mašinskog učenja, Roman je podijelio ideje svog tima, konačnu implementaciju klasifikatora i zanimljive prakse svojih protivnika.


- Zdravo svima! Moje ime je Roma Vlasov, danas ću vam pričati o Quick, Draw! Doodle Recognition Challenge.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

U našem timu je bilo pet ljudi. Pridružio sam se neposredno prije roka za spajanje. Mi nismo imali sreće, bili smo malo uzdrmani, ali mi smo uzdrmani sa pozicije novca, a oni su uzdrmani sa pozicije zlata. I zauzeli smo počasno četvrto mjesto.

(Tokom takmičenja timovi su se posmatrali u rejtingu, koji je formiran na osnovu rezultata prikazanih na jednom dijelu predloženog skupa podataka. Konačna ocjena je, pak, formirana na drugom dijelu skupa podataka. To se radi tako da da učesnici takmičenja ne prilagođavaju svoje algoritme određenim podacima.Stoga u finalu, pri prelasku između rejtinga, pozicije se malo potresu (od engleskog shake up - miješati): na drugim podacima može ispasti rezultat da bude drugačiji. Romanov tim je bio prvi u prva tri. U ovom slučaju prva tri je novac, zona monetarnog rejtinga, pošto su samo prva tri mjesta nagrađena novčanom nagradom. Nakon pretresa ekipa je već bila u četvrto mjesto. Na isti način, drugi tim je izgubio pobjedu, zlatnu poziciju. - Ed.)

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Konkurencija je bila značajna i po tome što je Evgenij Babahnin dobio velemajstora, Ivan Sosin je dobio majstora, Roman Solovjev je ostao velemajstor, Aleks Parinov je dobio majstora, ja sam postao stručnjak, a sada sam već majstor.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Šta je ovo Quick, Draw? Ovo je Google usluga. Google je imao za cilj popularizaciju AI i ovom uslugom je želio pokazati kako funkcioniraju neuronske mreže. Odete tamo, kliknete Hajde da nacrtamo i iskoči nova stranica na kojoj vam se kaže: nacrtajte cik-cak, imate 20 sekundi da to uradite. Pokušavate da nacrtate cik-cak za 20 sekundi, kao ovde, na primer. Ako uspijete, mreža kaže da je to cik-cak i idete dalje. Postoji samo šest takvih slika.

Ako Google-ova mreža nije prepoznala šta ste nacrtali, na zadatku se stavlja križić. Kasnije ću vam reći šta će značiti u budućnosti da li će crtež biti prepoznat na mreži ili ne.

Ovaj servis je okupio prilično veliki broj korisnika, a sve slike koje su korisnici nacrtali su evidentirane.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Uspeli smo da prikupimo skoro 50 miliona slika. Iz toga je formiran termin za voz i test za naše takmičenje. Inače, količina podataka u testu i broj časova su s razlogom označeni podebljanim slovima. Reći ću vam o njima malo kasnije.

Format podataka je bio sljedeći. Ovo nisu samo RGB slike, već, grubo rečeno, dnevnik svega što je korisnik uradio. Riječ je naša meta, kod države je odakle je autor doodlea, vremenska oznaka je vrijeme. Prepoznata oznaka samo pokazuje da li je mreža prepoznala sliku sa Google-a ili ne. A sam crtež je niz, aproksimacija krive koju korisnik crta tačkama. I tajming. Ovo je vrijeme od početka crtanja slike.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Podaci su predstavljeni u dva formata. Ovo je prvi format, a drugi je pojednostavljen. Odatle su izrezali tajminge i aproksimirali ovaj skup tačaka manjim skupom tačaka. Za ovo su koristili Douglas-Pecker algoritam. Imate veliki skup tačaka koje jednostavno aproksimiraju pravu liniju, ali u stvari ovu liniju možete aproksimirati sa samo dvije tačke. Ovo je ideja algoritma.

Podaci su raspoređeni na sljedeći način. Sve je ujednačeno, ali ima nekih odstupanja. Kada smo riješili problem, nismo ga pogledali. Glavna stvar je da nije bilo klasa koje je bilo zaista malo, nismo morali da radimo ponderisane uzorke i oversampling podataka.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Kako su slike izgledale? Ovo je klasa "avion" i primjeri iz nje sa oznakama prepoznati i neprepoznati. Njihov odnos je bio negde oko 1 prema 9. Kao što vidite, podaci su prilično bučni. Pretpostavljam da je avion. Ako pogledate nepriznato, u većini slučajeva to je samo buka. Neko je čak pokušao da napiše "avion", ali očigledno na francuskom.

Većina učesnika je jednostavno uzela mreže, izvukla podatke iz ovog niza linija kao RGB slike i bacila ih u mrežu. Crtao sam otprilike na isti način: uzeo sam paletu boja, nacrtao prvu liniju jednom bojom, koja je bila na početku ove palete, posljednju liniju drugom, koja je bila na kraju palete, i između njih Interpolirao sam svuda koristeći ovu paletu. Inače, ovo je dalo bolji rezultat nego da crtate kao na prvom slajdu - samo crnom bojom.

Ostali članovi tima, poput Ivana Šošina, pokušali su malo drugačije pristupe crtanju. Jednim kanalom je jednostavno nacrtao sivu sliku, drugim kanalom je crtao svaki potez sa gradijentom od početka do kraja, od 32 do 255, a trećim kanalom je crtao gradijent preko svih poteza od 32 do 255.

Još jedna zanimljiva stvar je da je Alex Parinov uploadovao informacije na mrežu koristeći countrycode.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Mera koja se koristi u takmičenju je srednja prosečna preciznost. Koja je suština ove metrike za konkurenciju? Možete dati tri predviđanja, a ako nema ispravnog predviđanja u ova tri, onda dobijate 0. Ako postoji tačna, onda se uzima u obzir njegov redoslijed. I ciljni rezultat će se računati kao 1 podijeljen s redoslijedom vašeg predviđanja. Na primjer, napravili ste tri prediktora, a pravi je prvi, zatim podijelite 1 sa 1 i dobijete 1. Ako je prediktor tačan i njegov redoslijed je 2, onda podijelite 1 sa 2, dobit ćete 0,5. pa itd.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Sa predobradom podataka - kako crtati slike i tako dalje - malo smo odlučili. Koje smo arhitekture koristili? Pokušali smo koristiti masne arhitekture kao što su PNASNet, SENet i takve već klasične arhitekture kao što je SE-Res-NeXt, one sve više ulaze u nova takmičenja. Postojali su i ResNet i DenseNet.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Kako smo ovo učili? Svi modeli koje smo uzeli prethodno su obučeni na imagenet-u. Iako ima puno podataka, 50 miliona slika, ali ipak, ako uzmete mrežu prethodno obučenu na imagenet-u, pokazala je bolje rezultate nego da ste je jednostavno obučili od nule.

Koje smo nastavne tehnike koristili? Ovo je Cosing Annealing with Warm Restarts, o čemu ću govoriti malo kasnije. Ovo je tehnika koju koristim na skoro svim svojim nedavnim takmičenjima, a s njima se ispostavilo da prilično dobro treniram rešetke, da postignem dobar minimum.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

Sljedeće Smanjite stopu učenja na Plateau. Počinjete trenirati mrežu, postavljate određenu brzinu učenja, nastavljate da je podučavate, a vaš gubitak se postepeno približava određenoj vrijednosti. Ovo provjerite, na primjer, za deset epoha gubitak se uopće nije promijenio. Smanjujete stopu učenja za neku vrijednost i nastavljate učiti. Opet malo pada, konvergira na nekom minimumu, a vi opet snižavate stopu učenja, i tako dalje, dok se vaša mreža konačno ne konvergira.

Sljedeća je zanimljiva tehnika: ne smanjite brzinu učenja, povećajte veličinu serije. Postoji članak sa istim nazivom. Kada trenirate mrežu, ne morate smanjiti stopu učenja, možete jednostavno povećati veličinu serije.

Ovu tehniku ​​je, inače, koristio Alex Parinov. Počeo je sa serijom jednakim 408, a kada je njegova mreža dostigla neki plato, jednostavno je udvostručio veličinu serije, itd.

Zapravo, ne sjećam se koju je vrijednost dostizala njegova batch veličina, ali ono što je zanimljivo je da su postojali timovi na Kaggleu koji su koristili istu tehniku, njihova veličina serije je bila oko 10000 XNUMX. Inače, moderni okviri za duboko učenje, kao npr. PyTorch vam, na primjer, omogućava da to učinite vrlo lako. Vi generišete svoju grupu i šaljete je mreži ne onakav kakav jeste, u celosti, već ga delite na delove tako da stane u vašu video karticu, izračunavate gradijente i nakon što izračunate gradijent za celu seriju, ažurirajte utezi.

Inače, velike serije su i dalje bile uključene u ovo takmičenje, jer su podaci bili prilično bučni, a velika veličina serije pomogla vam je da preciznije aproksimirate gradijent.

Korišćeno je i pseudo-etiketiranje, koje je uglavnom koristio Roman Solovjev. On je uzorkovao oko polovine podataka iz testa u serijama i trenirao mrežu na takvim serijama.

Veličina slika je bila bitna, ali činjenica je da imate puno podataka, morate dugo trenirati, a ako je vaša slika prilično velika, onda ćete trenirati jako dugo. Ali to nije mnogo doprinijelo kvaliteti vašeg konačnog klasifikatora, pa je vrijedilo koristiti neku vrstu kompromisa. Probali smo samo slike koje nisu bile velike.

Kako se sve to naučilo? Prvo su snimljene male slike, na njima je vođeno nekoliko epoha, to je oduzimalo dosta vremena. Zatim su date velike slike, mreža je obučena, pa još više, još više, da se ne trenira od nule i ne gubi puno vremena.

O optimizatorima. Koristili smo SGD i Adama. Na ovaj način je bilo moguće dobiti jedan model, koji je dao brzinu od 0,941-0,946 na javnoj tabli, što je prilično dobro.

Ako na neki način ansamblirate modele, dobit ćete negdje oko 0,951. Ako koristite još jednu tehniku, dobit ćete konačan rezultat od 0,954 na javnoj tabli, baš kao što smo i mi dobili. Ali više o tome kasnije. U nastavku ću vam reći kako smo sastavljali modele i kako smo uspjeli postići tako konačnu brzinu.

Sljedeće bih želio govoriti o Cosing žarenju s toplim ponovnim pokretanjem ili Stohastičkom gradijentnom spuštanju s toplim ponovnim pokretanjem. Grubo govoreći, u principu, možete koristiti bilo koji optimizator, ali poenta je sljedeća: ako samo trenirate jednu mrežu i ona postepeno konvergira na neki minimum, onda je sve u redu, dobit ćete jednu mrežu, pravi određene greške, ali vi može to trenirati malo drugačije. Postavićete neku početnu stopu učenja i postepeno je snižavati prema ovoj formuli. Snizite ga, vaša mreža dođe do nekog minimuma, zatim spremate pondere, i ponovo postavljate brzinu učenja koja je bila na početku treninga i tako ide negdje naviše od ovog minimuma i opet snižavate stopu učenja.

Tako možete posjetiti nekoliko minimuma odjednom, u kojima će vaš gubitak biti, plus ili minus, isti. Ali činjenica je da će mreže s ovim težinama dati različite greške na vašem datumu. Njihovim usrednjavanjem dobit ćete neku vrstu aproksimacije, a vaša brzina će biti veća.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

O tome kako smo sastavljali naše modele. Na početku prezentacije rekao sam da obratite pažnju na količinu podataka u testu i broj časova. Ako broju meta u testnom skupu dodate 1 i podijelite sa brojem klasa, dobićete broj 330, a to je napisano na forumu - da su klase na testu izbalansirane. Ovo bi se moglo iskoristiti.

Na osnovu toga, Roman Solovjev je smislio metriku, nazvali smo je Proxy Score, koja je prilično dobro korelirala sa ljestvicom. Poenta je: uradite predviđanje, uzmete prvi od vaših prediktora i prebrojite broj objekata za svaku klasu. Zatim oduzmite 1 od svake vrijednosti i zbrojite rezultirajuće apsolutne vrijednosti.

Dobijene su sledeće vrednosti. To nam je pomoglo da ne napravimo listu lidera za ispitivanje, već da lokalno validiramo i odaberemo koeficijente za naše ansamble.

Sa ansamblom možete postići takvu brzinu. Šta sam drugo mogao učiniti? Pretpostavimo da ste koristili informaciju da su klase u vašem testu uravnotežene.

Balansiranje je bilo drugačije. Primjer jednog od njih — balansiranje od momaka koji su zauzeli prvo mjesto.

sta smo uradili? Naše balansiranje je bilo prilično jednostavno, predložio ga je Evgenij Babaknjin. Prvo smo sortirali naša predviđanja po prvih 1 i od njih odabrali kandidate - tako da broj razreda ne prelazi 330. Ali za neke razrede na kraju dobijete manje od 330 prediktora. U redu, hajde da sortiramo i po prva 2 i prva 3 , a izvršićemo i selekciju kandidata.

Po čemu se naš balans razlikovao od balansa prvog mjesta? Koristili su iterativni pristup, uzimajući najpopularniju klasu i smanjivali vjerovatnoće za tu klasu za neki mali broj sve dok ta klasa više nije bila najpopularnija. Pohađali smo sljedeći najpopularniji čas. Tako su ih nastavili snižavati sve dok se broj svih klasa nije izjednačio.

Svi su koristili plus ili minus jedan pristup mrežama vlakova, ali nisu svi koristili balansiranje. Koristeći balansiranje, mogli ste ući u zlato, a ako ste imali sreće, onda u novac.

Kako unaprijed obraditi datum? Svi su unapred obrađivali datum, plus ili minus, na isti način - praveći ručno izrađene karakteristike, pokušavajući da kodiraju vremenske okvire različitim bojama poteza, itd. O tome je govorio Aleksej Nozdrin-Plotnicki, koji je zauzeo 8. mesto.

Klasifikacija rukom pisanih crteža. Prijavi u Yandexu

On je to uradio drugačije. Rekao je da sve ove tvoje ručno izrađene karakteristike ne funkcionišu, ne moraš to da radiš, tvoja mreža bi sve ovo trebala naučiti sama. I umjesto toga, osmislio je module za učenje koji su unaprijed procesuirali vaše podatke. U njih je ubacio originalne podatke bez prethodne obrade - koordinate tačaka i tajminge.

Zatim je uzeo razliku na osnovu koordinata, i sve usrednio na osnovu vremena. I smislio je prilično dugu matricu. Na nju je primijenio 1D konvoluciju nekoliko puta kako bi dobio matricu veličine 64xn, gdje je n ukupan broj tačaka, a 64 je napravljeno da bi rezultirajuću matricu nahranio sloju bilo koje konvolucijske mreže, koja prihvata broj kanala - 64. dobio je 64xn matricu, a zatim je iz ovoga bilo potrebno kreirati tenzor neke veličine tako da je broj kanala jednak 64. Normalizirao je sve tačke X, Y u rasponu od 0 do 32 kako bi stvorio tenzor veličine 32x32. Ne znam zašto je htio 32x32, jednostavno se tako dogodilo. I na ovu koordinatu je postavio fragment ove matrice veličine 64xn. Tako je upravo završio sa tenzorom 32x32x64 koji možete staviti dalje u svoju konvolucionu neuronsku mrežu. To je sve što sam htio reći.

izvor: www.habr.com

Dodajte komentar