Klasifikacija rukopisnih crteža. Prijavite u Yandex

Prije nekoliko mjeseci naši kolege iz Googlea potrošen na Kaggleu natjecanje za izradu klasifikatora za slike dobivene u senzacionalnom igra "Brzo, crtaj!" Tim, koji je uključivao Yandex programera Romana Vlasova, zauzeo je četvrto mjesto u natjecanju. Na treningu strojnog učenja u siječnju, Roman je podijelio ideje svog tima, konačnu implementaciju klasifikatora i zanimljive prakse svojih protivnika.


- Bok svima! Moje ime je Roma Vlasov, danas ću vam pričati o Quick, Draw! Izazov prepoznavanja crteža.

Klasifikacija rukopisnih crteža. Prijavite u Yandex

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

(Tijekom natjecanja timovi su se promatrali u ocjeni koja se formirala na temelju rezultata prikazanih na jednom dijelu predloženog seta podataka. Konačna ocjena se pak formirala na drugom dijelu seta podataka. To se radi tako da sudionici natjecanja ne prilagođavaju svoje algoritme određenim podacima.Stoga se u finalu, kada se mijenjaju ocjene, pozicije malo potresaju (od engleskog shake up - miješati): na drugim podacima rezultat može ispasti biti drugačiji. Romanov tim bio je prvi među prva tri. U ovom slučaju prva tri je novčana, monetarna zona rejtinga, jer su samo prva tri mjesta bila nagrađena novčanom nagradom. Nakon potresa tim je već bio u četvrto mjesto. Na isti je način drugi tim izgubio pobjedu, zlatnu poziciju. - ur.)

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Konkurencija je bila značajna i po tome što je Evgenij Babahnjin 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 rukopisnih crteža. Prijavite u Yandex

Što je ovo Quick, Draw? Ovo je Googleova usluga. Google je imao za cilj popularizirati AI te je ovom uslugom želio pokazati kako funkcioniraju neuronske mreže. Odete tamo, kliknete Let's draw, i pojavi se nova stranica gdje vam se kaže: nacrtajte cik-cak, imate 20 sekundi za to. Pokušavate nacrtati cik-cak za 20 sekundi, kao na primjer ovdje. Ako uspijete, mreža kaže da je to cik-cak i idete dalje. Postoji samo šest takvih slika.

Ako Googleova mreža nije uspjela prepoznati što ste nacrtali, na zadatak je stavljen križić. Kasnije ću vam reći što će u budućnosti značiti hoće li mreža prepoznati crtež ili ne.

Ovaj servis okupio je prilično velik broj korisnika, a sve slike koje su korisnici nacrtali bile su zabilježene.

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Uspjeli smo prikupiti gotovo 50 milijuna slika. Iz toga je formiran termin treninga i testiranja za naše natjecanje. Inače, količina podataka u testu i broj sati su s razlogom istaknuti masnim slovima. Pričat ću vam o njima malo kasnije.

Format podataka bio je sljedeći. Ovo nisu samo RGB slike, već, grubo rečeno, log svega što je korisnik radio. Riječ je naš cilj, kod zemlje je odakle je autor doodlea, vremenska oznaka je vrijeme. Oznaka prepoznavanja samo pokazuje je li mreža prepoznala sliku s Googlea ili ne. A sam crtež je niz, aproksimacija krivulje koju korisnik crta točkama. I vremena. Ovo je vrijeme od početka crtanja slike.

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Podaci su prikazani u dva formata. Ovo je prvi format, a drugi je pojednostavljen. Od tamo su izrezali vremena i aproksimirali ovaj skup točaka s manjim skupom točaka. Za ovo su koristili Douglas-Peckerov algoritam. Imate velik skup točaka koje jednostavno aproksimiraju ravnu crtu, ali zapravo ovu liniju možete aproksimirati sa samo dvije točke. Ovo je ideja algoritma.

Podaci su raspoređeni na sljedeći način. Sve je ujednačeno, ali ima nekih odstupanja. Kad smo riješili problem, nismo ga gledali. Glavna stvar je da nije bilo stvarno malo klasa, nismo morali raditi ponderirane uzorke i oversampling podataka.

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Kako su izgledale slike? Ovo je klasa "zrakoplov" i primjeri iz nje s prepoznatim i neprepoznatim oznakama. Njihov omjer bio je negdje oko 1 prema 9. Kao što vidite, podaci su prilično šumoviti. Pretpostavljam da je to avion. Ako pogledate da nije prepoznato, u većini slučajeva to je samo buka. Netko je čak pokušao napisati "zrakoplov", ali očito na francuskom.

Većina sudionika jednostavno je uzela rešetke, 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, povukao prvu liniju jednom bojom, koja je bila na početku ove palete, zadnju liniju drugom, koja je bila na kraju palete, a između njih Svugdje sam interpolirao pomoću ove palete. Usput, ovo je dalo bolji rezultat nego ako crtate kao na prvom slajdu - samo crno.

Ostali članovi tima, poput Ivana Sosina, okušali su se u malo drugačijim pristupima crtanju. Jednim kanalom jednostavno je iscrtao sivu sliku, drugim kanalom svaki potez je iscrtao s gradijentom od početka do kraja, od 32 do 255, a trećim kanalom je povukao gradijent preko svih poteza od 32 do 255.

Još jedna zanimljivost je da je Alex Parinov učitao podatke na mrežu koristeći kod države.

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Mjerni podatak korišten u natjecanju je srednja prosječna preciznost. Što je bit ove metrike za konkurenciju? Možete dati tri predviđanja, a ako u ta tri nema nijednog ispravnog predviđanja, tada dobivate 0. Ako postoji točno, tada se u obzir uzima njegov redoslijed. Ciljani rezultat računat će se kao 1 podijeljen redoslijedom vašeg predviđanja. Na primjer, napravili ste tri prediktora, a točan je prvi, zatim podijelite 1 s 1 i dobijete 1. Ako je prediktor točan i njegov redoslijed je 2, a zatim podijelite 1 s 2, dobit ćete 0,5. Pa itd.

Klasifikacija rukopisnih crteža. Prijavite u Yandex

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

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Kako smo ovo naučili? Svi modeli koje smo snimili bili su prethodno obučeni na imagenetu. Iako ima puno podataka, 50 milijuna slika, ali ipak, ako uzmete mrežu unaprijed obučenu na imagenet, ona je pokazala bolje rezultate nego da ste je jednostavno trenirali od nule.

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

Klasifikacija rukopisnih crteža. Prijavite u Yandex

Sljedeće smanji stopu učenja na visoravni. Počnete trenirati mrežu, postavite određenu stopu učenja, nastavite je podučavati i vaš gubitak postupno konvergira do određene vrijednosti. To provjerite, na primjer, za deset epoha gubitak se uopće nije promijenio. Smanjite svoju stopu učenja za neku vrijednost i nastavite učiti. Opet malo padne, konvergira na nekom minimumu, a vi opet smanjite stopu učenja, i tako dalje, sve dok vaša mreža konačno ne konvergira.

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

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

Zapravo, ne sjećam se koju vrijednost je dosegla njegova veličina serije, ali ono što je zanimljivo jest da su postojali timovi na Kaggleu koji su koristili istu tehniku, njihova veličina serije bila je oko 10000 XNUMX. Usput, moderni okviri za dubinsko učenje, kao npr. PyTorch vam, primjerice, to omogućuje vrlo jednostavno. Generirate svoju seriju i šaljete je na mrežu ne onakvu kakva jest, u cijelosti, nego je podijelite na dijelove tako da stane u vašu video karticu, izračunate gradijente i nakon što ste izračunali gradijent za cijelu seriju, ažurirajte utezi.

Usput, velike serije su i dalje bile uključene u ovo natjecanje, jer su podaci bili prilično bučni, a velika veličina serije pomogla vam je da točnije odredite gradijent.

Također se koristilo i pseudoetiketiranje, koje je najviše koristio Roman Solovjev. Uzorkovao je otprilike polovicu 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 vam je slika dosta velika, onda ćete trenirati jako dugo. Ali to nije puno dodalo kvaliteti vašeg konačnog klasifikatora, pa je vrijedilo upotrijebiti neku vrstu kompromisa. I isprobali smo samo slike koje nisu bile jako velike.

Kako se sve naučilo? Prvo su snimljene male slike, na njima je pokrenuto nekoliko epoha, što je oduzelo dosta vremena. Zatim su dane velike slike, mreža je trenirana, pa još više, još više, da se ne trenira ispočetka i da se ne gubi puno vremena.

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

Ako na neki način spojite modele, dobit ćete negdje oko 0,951. Ako koristite još jednu tehniku, dobit ćete konačnu ocjenu 0,954 na javnoj ploči, kao što smo i mi dobili. Ali o tome kasnije. Zatim ću vam reći kako smo sastavljali modele i kako smo uspjeli postići takvu konačnu brzinu.

Zatim bih želio govoriti o Cosing Annealing s toplim ponovnim pokretanjem ili stohastičkim gradijentnim spuštanjem s toplim ponovnim pokretanjem. Grubo govoreći, u principu možete koristiti bilo koji optimizator, ali poanta je sljedeća: ako samo trenirate jednu mrežu i postupno ona konvergira na neki minimum, onda je sve u redu, dobit ćete jednu mrežu, ona radi određene greške, ali vi može trenirati malo drugačije. Postavit ćete neku početnu stopu učenja i postupno je smanjivati ​​prema ovoj formuli. Spustite ga, mreža vam dođe na neki minimum, onda spremite težine, pa opet postavite rate učenja koji je bio na početku treninga, time idete negdje prema gore od ovog minimuma, i opet spuštate brzinu učenja.

Dakle, 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 pogreške na vašem datumu. Njihovim usrednjavanjem dobit ćete neku aproksimaciju, a vaša brzina će biti veća.

Klasifikacija rukopisnih crteža. Prijavite u Yandex

O tome kako smo sastavljali naše modele. Na početku izlaganja rekao sam da obratite pozornost na količinu podataka u testu i fond sati. Ako broju meta u testnom skupu dodate 1 i podijelite s brojem klasa, dobit ćete broj 330, a to je pisalo na forumu - da su klase u testu uravnotežene. Ovo bi se moglo iskoristiti.

Na temelju toga, Roman Soloviev je smislio metriku, nazvali smo je Proxy Score, koja je prilično dobro korelirala s ljestvicom najboljih. Poanta je: napravite predviđanje, uzmete prvi od svojih prediktora i prebrojite broj objekata za svaku klasu. Zatim od svake vrijednosti oduzmite 1 i zbrojite dobivene apsolutne vrijednosti.

Dobivene su sljedeće vrijednosti. To nam je pomoglo da ne stvorimo probnu ploču s rezultatima, već da lokalno potvrdimo i odaberemo koeficijente za naše skupine.

S ansamblom biste mogli postići takvu brzinu. Što sam drugo mogao? Pretpostavimo da ste koristili informaciju da su razredi u vašem testu uravnoteženi.

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

Što smo učinili? Naše balansiranje je bilo prilično jednostavno, predložio ga je Evgeny Babakhnin. Prvo smo razvrstali naša predviđanja prema prvom 1 i odabrali kandidate iz njih - tako da broj klasa nije premašio 330. Ali za neke klase završite s manje od 330 prediktora. U redu, sortirajmo i prema prva 2 i najbolja 3 , a izvršit ćemo i selekciju kandidata.

Po čemu se naše balansiranje razlikovalo od balansiranja na prvom mjestu? Koristili su iterativni pristup, uzimajući najpopularniju klasu i smanjujući vjerojatnosti za tu klasu za neki mali broj sve dok ta klasa više nije bila najpopularnija. Uzeli smo sljedeći najpopularniji razred. Tako su ih nastavili spuštati sve dok se broj svih klasa nije izjednačio.

Svi su koristili plus ili minus jedan pristup za treniranje mreža, 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 unaprijed obradili datum, plus ili minus, na isti način - izrađujući ručno izrađene značajke, pokušavajući kodirati vremena s različitim bojama poteza, itd. Alexey Nozdrin-Plotnitsky, koji je zauzeo 8. mjesto, govorio je o tome.

Klasifikacija rukopisnih crteža. Prijavite u Yandex

On je to učinio drugačije. Rekao je da sve ove vaše ručno izrađene značajke ne rade, ne morate to raditi, vaša bi mreža sve to trebala naučiti sama. Umjesto toga, osmislio je module za učenje koji su unaprijed obradili vaše podatke. U njih je ubacio izvorne podatke bez prethodne obrade - koordinate točaka i vremena.

Zatim je uzeo razliku na temelju koordinata i izračunao prosjek na temelju vremena. I došao je do prilično dugačke matrice. Primijenio je 1D konvoluciju na nju nekoliko puta kako bi dobio matricu veličine 64xn, gdje je n ukupan broj točaka, a 64 se pravi kako bi se rezultirajuća matrica unijela u sloj bilo koje konvolucijske mreže, koja prihvaća broj kanala - 64. dobio je matricu 64xn, a zatim je iz nje bilo potrebno stvoriti tenzor neke veličine tako da je broj kanala jednak 64. Normalizirao je sve točke X, Y u rasponu od 0 do 32 da bi stvorio tenzor veličine 32x32. Ne znam zašto je htio 32x32, jednostavno se tako dogodilo. I na ovu koordinatu postavio je fragment ove matrice veličine 64xn. Tako da je upravo završio s tenzorom 32x32x64 koji možete staviti dalje u svoju konvolucijsku neuronsku mrežu. To je sve što sam htio reći.

Izvor: www.habr.com

Dodajte komentar