Razvrstitev rokopisnih risb. Poročilo v Yandex

Pred nekaj meseci so naši kolegi iz Googla porabili na Kaggle tekmovanje za ustvarjanje klasifikatorja za slike, pridobljene v senzacionalnem igra "Hitro, nariši!" Ekipa, ki je vključevala razvijalca Yandexa Romana Vlasova, je na tekmovanju zasedla četrto mesto. Na januarskem treningu strojnega učenja je Roman delil ideje svoje ekipe, končno implementacijo klasifikatorja in zanimive prakse svojih nasprotnikov.


- Pozdravljeni vsi skupaj! Moje ime je Roma Vlasov, danes vam bom povedal o Quick, Draw! Doodle Recognition Challenge.

Razvrstitev rokopisnih risb. Poročilo v Yandex

V naši ekipi je bilo pet ljudi. Pridružil sem se tik pred rokom za združitev. Imeli smo smolo, malo smo bili zamajani, vendar smo bili zamajani z denarne pozicije, oni pa z zlate pozicije. In zasedli smo častno četrto mesto.

(Med tekmovanjem so se ekipe opazovale v oceni, ki se je oblikovala na podlagi prikazanih rezultatov na enem delu predlaganega niza podatkov. Končna ocena pa se je oblikovala na drugem delu niza podatkov. To se naredi tako da udeleženci tekmovanja ne prilagajajo svojih algoritmov določenim podatkom, zato se v finalu pri preklopu med ocenami položaji nekoliko zamajejo (iz angleščine shake up - mešati): na drugih podatkih se lahko izkaže rezultat biti drugačen. Romanova ekipa je bila najprej med prvimi tremi. V tem primeru je prva trojica denarna, denarna bonitetna cona, saj so le prva tri mesta prejela denarno nagrado. Po pretresu je ekipa že na četrtem mestu. Na enak način je druga ekipa izgubila zmago, zlato mesto. - ur.)

Razvrstitev rokopisnih risb. Poročilo v Yandex

Konkurenca je bila pomembna tudi v tem, da je Evgenij Babahnin prejel velemojstra, Ivan Sosin je dobil mojstra, Roman Solovjev je ostal velemojster, Alex Parinov je prejel mojstra, jaz sem postal strokovnjak in zdaj sem že mojster.

Razvrstitev rokopisnih risb. Poročilo v Yandex

Kaj je to Quick, Draw? To je Googlova storitev. Google je imel cilj popularizirati AI in s to storitvijo je želel pokazati, kako delujejo nevronske mreže. Greš tja, klikneš Narišimo in pojavi se nova stran, kjer ti rečejo: nariši cik-cak, za to imaš 20 sekund. Poskušaš narisati cik-cak v 20 sekundah, kot na primer tukaj. Če ti uspe, mreža reče, da gre za cikcak in greš naprej. Takih slik je samo šest.

Če Googlovo omrežje ni prepoznalo, kaj ste narisali, je bila naloga postavljena s križcem. Kasneje vam bom povedal, kaj bo v prihodnosti pomenilo, ali omrežje prepozna risbo ali ne.

Ta storitev je zbrala precej veliko število uporabnikov in vse slike, ki so jih uporabniki narisali, so bile zabeležene.

Razvrstitev rokopisnih risb. Poročilo v Yandex

Uspelo nam je zbrati skoraj 50 milijonov slik. Iz tega sta se oblikovala vlak in datum testiranja za naše tekmovanje. Mimogrede, količina podatkov v testu in število razredov sta označena s krepkim tiskom z razlogom. O njih vam bom povedal malo kasneje.

Format podatkov je bil naslednji. To niso samo RGB slike, ampak, grobo rečeno, dnevnik vsega, kar je uporabnik naredil. Beseda je naš cilj, koda države je avtor doodla, časovni žig je čas. Prepoznana oznaka samo prikazuje, ali je omrežje prepoznalo sliko iz Googla ali ne. In sama risba je zaporedje, približek krivulje, ki jo uporabnik nariše s točkami. In časi. To je čas od začetka risanja slike.

Razvrstitev rokopisnih risb. Poročilo v Yandex

Podatki so bili predstavljeni v dveh oblikah. To je prvi format, drugi pa je poenostavljen. Od tam so izrezali čase in ta niz točk približali z manjšim nizom točk. Za to so uporabili Douglas-Peckerjev algoritem. Imate velik niz točk, ki preprosto približajo ravno črto, toda dejansko lahko to črto približate samo z dvema točkama. To je ideja algoritma.

Podatki so bili razdeljeni na naslednji način. Vse je enotno, vendar je nekaj odstopanj. Ko smo rešili problem, ga nismo pogledali. Glavna stvar je, da ni bilo razredov, ki jih je res malo, ni nam bilo treba delati uteženih vzorčevalnikov in predvzorčenja podatkov.

Razvrstitev rokopisnih risb. Poročilo v Yandex

Kako so izgledale slike? To je razred "letalo" in primeri iz njega s prepoznanimi in neprepoznanimi oznakami. Njihovo razmerje je bilo nekje 1 proti 9. Kot vidite, so podatki precej šumni. Predvidevam, da je letalo. Če pogledate, da ni prepoznan, je v večini primerov samo hrup. Nekdo je celo poskušal napisati "letalo", vendar očitno v francoščini.

Večina udeležencev je preprosto vzela mreže, narisala podatke iz tega zaporedja črt kot RGB slike in jih vrgla v omrežje. Risal sem približno na enak način: vzel sem paleto barv, prvo črto narisal z eno barvo, ki je bila na začetku te palete, zadnjo črto z drugo, ki je bila na koncu palete in med njima S to paleto sem povsod interpoliral. Mimogrede, to je dalo boljši rezultat, kot če bi risali kot na prvem diapozitivu - samo v črni barvi.

Drugi člani ekipe, kot je Ivan Sosin, so poskusili nekoliko drugačne pristope k risanju. Z enim kanalom je preprosto narisal sivo sliko, z drugim kanalom je narisal vsako potezo z gradientom od začetka do konca, od 32 do 255, s tretjim kanalom pa je narisal gradient čez vse poteze od 32 do 255.

Še ena zanimivost je, da je Alex Parinov naložil informacije v omrežje s kodo države.

Razvrstitev rokopisnih risb. Poročilo v Yandex

Merilo, uporabljeno v tekmovanju, je povprečna povprečna natančnost. Kaj je bistvo te metrike za konkurenco? Podate lahko tri napovedi in če v teh treh ni nobene pravilne napovedi, potem dobite 0. Če je pravilna, se upošteva njen vrstni red. In ciljni rezultat se bo štel kot 1, deljeno z vrstnim redom vaše napovedi. Na primer, naredili ste tri napovednike in pravilen je prvi, nato delite 1 z 1 in dobite 1. Če je napovednik pravilen in je njegov vrstni red 2, potem delite 1 z 2, dobite 0,5. No itd.

Razvrstitev rokopisnih risb. Poročilo v Yandex

S predobdelavo podatkov - kako risati slike in tako naprej - smo se malo odločili. Kakšne arhitekture smo uporabili? Poskušali smo uporabiti debele arhitekture, kot so PNASNet, SENet, in takšne, že klasične arhitekture, kot je SE-Res-NeXt, vse pogosteje vstopajo v nove tekme. Obstajala sta tudi ResNet in DenseNet.

Razvrstitev rokopisnih risb. Poročilo v Yandex

Razvrstitev rokopisnih risb. Poročilo v Yandex

Razvrstitev rokopisnih risb. Poročilo v Yandex

Kako smo to učili? Vsi modeli, ki smo jih vzeli, so bili predhodno usposobljeni na imagenetu. Čeprav je podatkov veliko, 50 milijonov slik, pa vseeno, če vzamete omrežje, ki je bilo predhodno naučeno na imagenetu, je pokazalo boljše rezultate, kot če bi ga preprosto usposobili iz nič.

Katere tehnike poučevanja smo uporabili? To je Cosing Annealing with Warm Restarts, o katerem bom govoril malo kasneje. To je tehnika, ki jo uporabljam na skoraj vseh svojih nedavnih tekmovanjih in z njimi se izkaže, da precej dobro treniram mreže, da dosežem dober minimum.

Razvrstitev rokopisnih risb. Poročilo v Yandex

Naprej zmanjšajte stopnjo učenja na planoti. Začnete trenirati mrežo, nastavite določeno stopnjo učenja, nadaljujete z učenjem in vaša izguba postopoma konvergira k določeni vrednosti. To preverite, na primer, za deset epoh se izguba ni nič spremenila. Zmanjšate stopnjo učenja za določeno vrednost in nadaljujete z učenjem. Spet malo pade, konvergira na nekem minimumu in spet znižate stopnjo učenja in tako naprej, dokler vaše omrežje končno ne konvergira.

Naslednja je zanimiva tehnika: ne zmanjšajte stopnje učenja, povečajte velikost serije. Obstaja članek z istim imenom. Ko usposabljate omrežje, vam ni treba zmanjšati stopnje učenja, lahko preprosto povečate velikost serije.

Mimogrede, to tehniko je uporabil Alex Parinov. Začel je s serijo, ki je bila enaka 408, in ko je njegova mreža dosegla določen plato, je preprosto podvojil velikost serije itd.

Pravzaprav se ne spomnim, kakšno vrednost je dosegla njegova velikost serije, zanimivo pa je, da so bile ekipe na Kagglu, ki so uporabljale isto tehniko, njihova velikost serije je bila približno 10000 XNUMX. Mimogrede, sodobni okviri za globoko učenje, kot je npr. PyTorch vam na primer omogoča, da to storite zelo enostavno. Ustvarite svoj paket in ga pošljete v omrežje ne takšnega, kot je, v celoti, ampak ga razdelite na dele, tako da se prilega vaši grafični kartici, izračunate gradiente in ko izračunate gradient za celoten paket, posodobite uteži.

Mimogrede, velike serije so bile še vedno vključene v to tekmovanje, ker so bili podatki precej hrupni, velika velikost serije pa vam je pomagala natančneje približati gradient.

Uporabljalo se je tudi psevdooznačevanje, ki ga je večinoma uporabljal Roman Soloviev. Približno polovico podatkov iz testa je vzorčil v serijah in na takšnih serijah usposobil mrežo.

Velikost slik je bila pomembna, a dejstvo je, da imaš veliko podatkov, da moraš dolgo trenirati, in če je tvoja slika precej velika, potem boš treniral zelo dolgo. Toda to ni veliko prispevalo k kakovosti vašega končnega klasifikatorja, zato je bilo vredno uporabiti nekakšen kompromis. Poskušali smo samo slike, ki niso bile zelo velike.

Kako se je vsega naučil? Najprej so bile posnete majhne slike, na njih je bilo predvajanih več epoh, kar je vzelo precej časa. Nato so bile podane velike slike, omrežje je bilo usposobljeno, nato še več, še več, da ga ne bi trenirali iz nič in ne bi izgubili veliko časa.

O optimizatorjih. Uporabili smo SGD in Adama. Na ta način je bilo mogoče dobiti en sam model, ki je na javni lestvici dal hitrost 0,941-0,946, kar je precej dobro.

Če modele na nek način združiš, boš dobil nekje 0,951. Če uporabite še eno tehniko, boste na javni tabli dobili končno oceno 0,954, tako kot smo jo dobili mi. A več o tem kasneje. Nato vam bom povedal, kako smo sestavljali modele in kako nam je uspelo doseči tako končno hitrost.

Nato bi rad spregovoril o žarjenju Cosing s toplimi ponovnimi zagoni ali stohastičnem gradientnem spuščanju s toplimi ponovnimi zagoni. Grobo povedano, načeloma lahko uporabiš kateri koli optimizator, a bistvo je sledeče: če samo treniraš eno omrežje in postopoma konvergira na nek minimum, potem je vse v redu, dobil boš eno omrežje, dela določene napake, ampak ti lahko trenira malo drugače. Določili boste neko začetno stopnjo učenja in jo postopoma zniževali po tej formuli. Znižaš, pride tvoja mreža do nekega minimuma, potem shraniš uteži in spet nastaviš stopnjo učenja, ki je bila na začetku treninga, s tem greš nekje navzgor od tega minimuma in spet znižaš stopnjo učenja.

Tako lahko obiščete več minimumov hkrati, v katerih bo vaša izguba plus ali minus enaka. Toda dejstvo je, da bodo omrežja s temi utežmi dala različne napake na vašem datumu. Z njihovim povprečenjem boste dobili nekakšen približek, vaša hitrost pa bo večja.

Razvrstitev rokopisnih risb. Poročilo v Yandex

O tem, kako smo sestavili naše modele. Na začetku predstavitve sem rekel, naj bodi pozoren na količino podatkov v testu in na število ur. Če številu tarč v testnem nizu prišteješ 1 in deliš s številom razredov, dobiš številko 330 in to je pisalo na forumu - da so razredi v testu uravnoteženi. To bi lahko uporabili.

Na podlagi tega je Roman Solovjev prišel do metrike, poimenovali smo jo približni rezultat, ki je precej dobro korelirala z lestvico najboljših. Bistvo je: naredite napoved, vzamete enega najboljših svojih napovedovalcev in preštejete število predmetov za vsak razred. Nato od vsake vrednosti odštejte 1 in seštejte dobljene absolutne vrednosti.

Dobljene so naslednje vrednosti. To nam je pomagalo, da nismo ustvarili testne lestvice najboljših, ampak lokalno validirali in izbrali koeficiente za naše skupine.

Z ansamblom bi lahko dosegel takšno hitrost. Kaj bi še lahko naredil? Recimo, da ste uporabili informacijo, da so razredi v vašem testu uravnoteženi.

Uravnoteženje je bilo drugačno. Primer enega izmed njih — uravnoteženje med fanti, ki so zasedli prvo mesto.

Kaj smo storili? Naše uravnoteženje je bilo precej preprosto, predlagal ga je Evgeny Babakhnin. Napovedi smo najprej razvrstili po prvih 1 in med njimi izbrali kandidate - tako da število razredov ni preseglo 330. Toda za nekatere razrede imate na koncu manj kot 330 napovedovalcev. V redu, razvrstimo tudi po najboljših 2 in najboljših 3 , kandidate pa bomo tudi izbrali.

V čem se je naša bilanca razlikovala od bilance na prvem mestu? Uporabili so iterativni pristop, pri čemer so vzeli najbolj priljubljen razred in zmanjševali verjetnosti za ta razred za nekaj majhnega števila, dokler ta razred ni bil več najbolj priljubljen. Udeležili smo se naslednjega najbolj priljubljenega razreda. Tako so jih zniževali, dokler se število vseh razredov ni izenačilo.

Vsi so uporabili pristop plus ali minus ena za vlakovna omrežja, niso pa vsi uporabili uravnoteženja. Z uporabo uravnoteženja bi lahko šli v zlato, in če ste imeli srečo, potem v denar.

Kako vnaprej obdelati datum? Vsi so predhodno obdelali datum, plus ali minus, na enak način - izdelovanje ročno izdelanih elementov, poskušanje kodiranja časov z različnimi barvami črt itd. O tem je govoril Aleksej Nozdrin-Plotnitski, ki je zasedel 8. mesto.

Razvrstitev rokopisnih risb. Poročilo v Yandex

Naredil je drugače. Rekel je, da vse te vaše ročno izdelane funkcije ne delujejo, tega vam ni treba storiti, vaše omrežje bi se moralo vsega tega naučiti samo. In namesto tega je pripravil učne module, ki so vnaprej obdelali vaše podatke. Vanj je vrgel izvirne podatke brez predhodne obdelave - koordinate točk in čase.

Nato je vzel razliko na podlagi koordinat in izračunal povprečje na podlagi časov. In prišel je do precej dolge matrice. Večkrat je uporabil 1D konvolucijo, da je dobil matriko velikosti 64xn, kjer je n skupno število točk, 64 pa je narejeno zato, da se dobljena matrika vnese v plast katere koli konvolucijske mreže, ki sprejme število kanalov - 64. je dobil matriko 64xn, potem je bilo treba iz tega ustvariti tenzor neke velikosti, tako da je bilo število kanalov enako 64. Normaliziral je vse točke X, Y v območju od 0 do 32, da je ustvaril tenzor velikosti 32x32. Ne vem zakaj je hotel 32x32, tako se je pač zgodilo. In na to koordinato je postavil delček te matrike velikosti 64xn. Tako se je pravkar končalo s tenzorjem 32x32x64, ki bi ga lahko dali dlje v svojo konvolucijsko nevronsko mrežo. To je vse, kar sem hotel povedati.

Vir: www.habr.com

Dodaj komentar