Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Prieš kelis mėnesius mūsų kolegos iš Google išleista apie Kaggle konkursą sukurti vaizdų, gautų sensacingų, klasifikatorių žaidimą "Greitai, pieškite!" Komanda, kurioje buvo „Yandex“ kūrėjas Romanas Vlasovas, konkurse užėmė ketvirtą vietą. Sausio mėnesio mašininio mokymosi mokymuose Romanas dalijosi savo komandos idėjomis, galutiniu klasifikatoriaus įgyvendinimu ir įdomia oponentų praktika.


- Sveiki visi! Mano vardas Roma Vlasov, šiandien aš jums papasakosiu apie Quick, Draw! „Doodle“ atpažinimo iššūkis.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Mūsų komandoje buvo penki žmonės. Prisijungiau prieš pat sujungimo terminą. Mums nepasisekė, mus šiek tiek papurtė, bet mus iš pinigų pozicijos, o jie – iš aukso. Ir užėmėme garbingą ketvirtą vietą.

(Varžybų metu komandos stebėjo save reitinge, kuris buvo sudarytas pagal rezultatus, parodytus vienoje siūlomo duomenų rinkinio dalyje. Galutinis įvertinimas, savo ruožtu, buvo suformuotas kitoje duomenų rinkinio dalyje. Tai daroma taip kad varžybų dalyviai savo algoritmų nederina prie konkrečių duomenų.Todėl finale, keičiant reitingus, pozicijos šiek tiek sujuda (iš angl. shake up - maišyti): ant kitų duomenų rezultatas gali pasirodyti skirtis.Romano komanda buvo pirma trejetuke.Šiuo atveju trejetukas yra pinigų,piniginio reitingo zona,nes tik pirmos trys vietos buvo apdovanotos piniginiu prizu.Po sukrėtimo komanda jau buvo ketvirta vieta. Lygiai taip pat kita komanda prarado pergalę, aukso poziciją. – Red.)

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Konkursas buvo reikšmingas ir tuo, kad Jevgenijus Babachninas gavo didmeistrią, Ivanas Sosinas – meistrą, Romanas Solovjovas liko didmeistriu, Aleksas Parinovas – meistru, aš tapau ekspertu, o dabar jau esu meistras.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Kas tai yra „Quick, Draw“? Tai „Google“ paslauga. „Google“ siekė populiarinti AI ir su šia paslauga norėjo parodyti, kaip veikia neuroniniai tinklai. Einate ten, spustelėkite Pieškime ir pasirodys naujas puslapis, kuriame jums sakoma: nupieškite zigzagą, tam turite 20 sekundžių. Jūs bandote nupiešti zigzagą per 20 sekundžių, kaip, pavyzdžiui, čia. Jei pavyksta, tinklas sako, kad tai zigzagas, ir tu eini toliau. Yra tik šešios tokios nuotraukos.

Jei „Google“ tinklas neatpažino to, ką nupiešėte, užduotis buvo uždėta kryžiuku. Vėliau papasakosiu, ką tai reikš ateityje, ar tinklas atpažins piešinį, ar ne.

Ši paslauga surinko gana daug vartotojų, o visos vartotojų nupieštos nuotraukos buvo registruojamos.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Mums pavyko surinkti beveik 50 milijonų vaizdų. Iš to buvo sudaryta mūsų varžybų traukinio ir bandymo data. Beje, duomenų kiekis teste ir klasių skaičius ne veltui paryškintas pusjuodžiu šriftu. Apie juos papasakosiu šiek tiek vėliau.

Duomenų formatas buvo toks. Tai ne tik RGB vaizdai, bet, grubiai tariant, visų naudotojo veiksmų žurnalas. „Word“ yra mūsų tikslas, šalies kodas yra tai, iš kur kilęs papuošto logotipo autorius, laiko žyma yra laikas. Atpažinta etiketė tik parodo, ar tinklas atpažino vaizdą iš „Google“, ar ne. O pats piešinys yra seka, apytikslis kreivės, kurią vartotojas nubrėžia taškais. Ir laikai. Tai laikas nuo piešimo pradžios.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Duomenys buvo pateikti dviem formatais. Tai pirmasis formatas, o antrasis yra supaprastintas. Iš ten jie iškirto laiką ir apytiksliai įvertino šį taškų rinkinį mažesniu taškų rinkiniu. Tam jie naudojo Douglas-Pecker algoritmas. Turite didelį taškų rinkinį, kuris tiesiog apytiksliai apytiksliai atitinka tiesią liniją, tačiau iš tikrųjų šią liniją galite apytiksliai įvertinti tik dviem taškais. Tai yra algoritmo idėja.

Duomenys buvo paskirstyti taip. Viskas vienoda, bet yra ir nuokrypių. Kai išsprendėme problemą, į ją nežiūrėjome. Svarbiausia, kad nebuvo klasių, kurių būtų tikrai mažai, nereikėjo daryti svertinių mėginių ėmimo ir duomenų perteklinės atrankos.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Kaip atrodė nuotraukos? Tai yra „lėktuvo“ klasė ir jos pavyzdžiai su atpažintais ir neatpažintais etiketėmis. Jų santykis buvo kažkur nuo 1 iki 9. Kaip matote, duomenys gana triukšmingi. Spėčiau, kad tai lėktuvas. Jei žiūrite į neatpažintą, daugeliu atvejų tai yra tik triukšmas. Kažkas net bandė parašyti „lėktuvas“, bet, matyt, prancūziškai.

Dauguma dalyvių tiesiog paėmė tinklelius, iš šios eilučių sekos nubrėžė duomenis kaip RGB paveikslėlius ir įmetė juos į tinklą. Piešiau maždaug taip pat: paėmiau spalvų paletę, nubrėžiau pirmą eilutę su viena spalva, kuri buvo šios paletės pradžioje, paskutinę eilutę su kita, kuri buvo paletės gale ir tarp jų Visur interpoliavau naudodamas šią paletę. Beje, tai davė geresnį rezultatą nei piešiant kaip pačioje pirmoje skaidrėje – tik juodai.

Kiti komandos nariai, pavyzdžiui, Ivanas Sosinas, bandė šiek tiek kitokius piešimo būdus. Vienu kanalu jis tiesiog nupiešė pilką paveikslėlį, kitu kanalu nubrėžė kiekvieną potėpį su gradientu nuo pradžios iki pabaigos, nuo 32 iki 255, o trečiuoju kanalu nubrėžė gradientą per visus brūkšnius nuo 32 iki 255.

Kitas įdomus dalykas yra tai, kad Aleksas Parinovas įkėlė informaciją į tinklą naudodamas šalies kodą.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Varžybose naudojama metrika yra vidutinis vidutinis tikslumas. Kokia yra šios konkurencijos metrikos esmė? Galite pateikti tris predikus, o jei šiuose trijuose nėra teisingo prediko, tada gausite 0. Jei yra teisingas, tada atsižvelgiama į jo eilę. Tikslinis rezultatas bus skaičiuojamas kaip 1, padalytas iš jūsų prognozės eilės. Pavyzdžiui, sudarėte tris prognozes, o teisingas yra pirmasis, tada padalinate 1 iš 1 ir gaunate 1. Jei prognozė teisinga ir jo tvarka yra 2, tada padalinkite 1 iš 2 ir gausite 0,5. Na ir t.t.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Su išankstiniu duomenų apdorojimu – kaip piešti paveikslėlius ir pan. – nusprendėme šiek tiek. Kokias architektūras naudojome? Bandėme naudoti tokias storas architektūras kaip PNASNet, SENet ir tokias jau klasikines architektūras kaip SE-Res-NeXt, jos vis dažniau patenka į naujus konkursus. Taip pat buvo ResNet ir DenseNet.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Kaip mes to išmokėme? Visi modeliai, kuriuos pasirinkome, buvo iš anksto apmokyti „imagenet“. Nors duomenų yra daug, 50 milijonų vaizdų, bet vis tiek, jei paimtumėte tinklą, iš anksto apmokytą „imagenet“, jis rodė geresnius rezultatus, nei tiesiog apmokius jį nuo nulio.

Kokius mokymo metodus taikėme? Tai Cosing atkaitinimas su šiltais paleidimais, apie kurį pakalbėsiu šiek tiek vėliau. Tai technika, kurią naudoju beveik visose pastarojo meto varžybose ir su jomis pasirodo, kad tinklelius treniruoju visai neblogai, pasiekiu gerą minimumą.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Kitas Sumažinkite mokymosi lygį plynaukštėje. Pradedate treniruoti tinklą, nustatote tam tikrą mokymosi tempą, toliau mokote, o jūsų praradimas palaipsniui artėja prie tam tikros vertės. Jūs tai patikrinate, pavyzdžiui, dešimties epochų nuostoliai visiškai nepasikeitė. Jūs sumažinate savo mokymosi greitį tam tikra verte ir tęsite mokymąsi. Jis vėl šiek tiek nukrenta, susilieja iki tam tikro minimumo, o jūs vėl sumažinate mokymosi greitį ir taip toliau, kol jūsų tinklas galiausiai susilieja.

Kitas yra įdomus metodas: nesumažinkite mokymosi greičio, padidinkite partijos dydį. Yra straipsnis tokiu pat pavadinimu. Kai mokote tinklą, jums nereikia mažinti mokymosi greičio, galite tiesiog padidinti partijos dydį.

Šią techniką, beje, naudojo Aleksas Parinovas. Jis pradėjo nuo partijos, lygios 408, o kai jo tinklas pasiekė tam tikrą plokščiakalnį, jis tiesiog padvigubino partijos dydį ir pan.

Tiesą sakant, nepamenu, kokią vertę pasiekė jo partijos dydis, bet įdomu tai, kad Kaggle buvo komandos, kurios naudojo tą pačią techniką, jų partijos dydis buvo apie 10000 XNUMX. Beje, šiuolaikinės giluminio mokymosi sistemos, pvz. Pavyzdžiui, „PyTorch“ leidžia tai padaryti labai lengvai. Jūs sugeneruojate savo paketą ir pateikiate tinklui ne tokį, koks jis yra, visą, o padalinate į dalis, kad tilptų į vaizdo plokštę, apskaičiuojate gradientus ir, apskaičiavę gradientą visai partijai, atnaujinate svoriai.

Beje, dideli partijų dydžiai vis dar buvo įtraukti į šį konkursą, nes duomenys buvo gana triukšmingi, o didelis partijos dydis padėjo tiksliau nustatyti gradientą.

Taip pat buvo naudojamas pseudoženklinimas, kurį dažniausiai naudojo Romanas Solovjovas. Jis partijomis atrinko maždaug pusę bandymo duomenų ir parengė tokių partijų tinklelį.

Paveikslėlių dydis buvo svarbus, bet faktas yra tas, kad turite daug duomenų, reikia ilgai treniruotis, o jei jūsų nuotraukos dydis yra gana didelis, tada treniruositės labai ilgai. Tačiau tai nelabai padidino jūsų galutinio klasifikatoriaus kokybę, todėl buvo verta pasinaudoti tam tikru kompromisu. Ir mes bandėme tik nuotraukas, kurios nebuvo labai didelės.

Kaip visa tai buvo išmokta? Pirmiausia buvo darytos mažo dydžio nuotraukos, jas perbėgo kelios epochos, tai užėmė gana daug laiko. Tada buvo pateikiamos didelės nuotraukos, tinklas buvo apmokytas, tada dar daugiau, dar daugiau, kad nebūtų apmokytas nuo nulio ir nesugaištų daug laiko.

Apie optimizatorius. Naudojome SGD ir Adamą. Tokiu būdu buvo galima gauti vieną modelį, kuris viešoje lyderių lentelėje davė 0,941-0,946 greitį, o tai yra gana gerai.

Jei modelius kaip nors komplektuosite, gausite kažkur 0,951. Jei naudosite dar vieną techniką, galutinis rezultatas bus 0,954 viešoje lentoje, kaip ir mes. Bet apie tai vėliau. Toliau papasakosiu, kaip surinkome modelius ir kaip pavyko pasiekti tokį galutinį greitį.

Toliau norėčiau pakalbėti apie Cosing atkaitinimą šiltu paleidimu arba Stochastic Gradient Descent with Warm Restarts. Grubiai tariant, iš principo galite naudoti bet kurį optimizatorių, bet esmė tokia: jei tik apmokysite vieną tinklą ir palaipsniui jis susijungs iki kažkokio minimumo, tada viskas gerai, gausite vieną tinklą, jis daro tam tikras klaidas, bet jūs gali treniruoti šiek tiek kitaip. Jūs nustatysite tam tikrą pradinį mokymosi greitį ir palaipsniui jį sumažinsite pagal šią formulę. Jūs jį sumažinate, jūsų tinklas pasiekia tam tikrą minimumą, tada išsaugote svorius ir vėl nustatote mokymosi greitį, kuris buvo treniruotės pradžioje, taip kažkur pakylant nuo šio minimumo ir vėl sumažinant mokymosi greitį.

Taigi vienu metu galite aplankyti kelis minimumus, kuriuose jūsų nuostoliai plius ar minus bus vienodi. Tačiau faktas yra tas, kad tinklai su šiais svoriais jūsų datą pateiks skirtingas klaidas. Juos suvidurkindami gausite kažkokį aproksimaciją, o jūsų greitis bus didesnis.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Apie tai, kaip surinkome savo modelius. Pristatymo pradžioje sakiau atkreipti dėmesį į testo duomenų kiekį ir klasių skaičių. Jei prie testo rinkinio taikinių skaičiaus pridėsite 1 ir padalinsite iš klasių skaičiaus, gausite skaičių 330, ir forume buvo parašyta – kad teste klasės subalansuotos. Tai galėtų būti panaudota.

Remdamasis tuo, Romanas Solovjovas sugalvojo metriką, pavadinome ją Proxy Score, kuri gana gerai koreliavo su pirmaujančiųjų sąrašu. Esmė tokia: jūs nuspėjate, paimate 1 didžiausią prognozių skaičių ir suskaičiuojate kiekvienos klasės objektų skaičių. Tada iš kiekvienos vertės atimkite 330 ir sudėkite gautas absoliučias reikšmes.

Buvo gautos šios vertės. Tai padėjo mums ne sukurti pirmaujančiųjų lentelę, o patvirtinti lokaliai ir parinkti koeficientus mūsų ansambliams.

Su ansambliu galima pasiekti tokį greitį. Ką dar galėčiau padaryti? Tarkime, kad naudojote informaciją, kad jūsų testo klasės yra subalansuotos.

Balansas buvo kitoks. Vieno iš jų pavyzdys — balansuojant iš pirmąją vietą užėmusių vaikinų.

Ką mes padarėme? Mūsų balansavimas buvo gana paprastas, tai pasiūlė Jevgenijus Babakhninas. Pirmiausia surūšiavome savo prognozes pagal 1 geriausius ir iš jų atrinkome kandidatus, kad klasių skaičius neviršytų 330. Tačiau kai kuriose klasėse prognozuojančiųjų skaičius yra mažesnis nei 330. Gerai, rūšiuokime ir pagal 2 geriausius ir 3 geriausius , taip pat atrinksime kandidatus.

Kuo mūsų balansavimas skyrėsi nuo pirmosios vietos balansavimo? Jie naudojo kartotinį metodą, pasirinkdami populiariausią klasę ir sumažindami tos klasės tikimybę nedideliu skaičiumi, kol ta klasė nebebuvo pati populiariausia. Mes užėmėme kitą populiariausią klasę. Taigi jie toliau jas mažino, kol visų klasių skaičius tapo vienodas.

Visi naudojo plius minus vieną metodą traukinių tinklams, bet ne visi naudojo balansavimą. Naudodami balansavimą galite eiti į auksą, o jei pasisekė, tada į pinigus.

Kaip iš anksto apdoroti pasimatymą? Visi iš anksto apdorojo datą, pliusą ar minusą, vienodai – gamino rankų darbo bruožus, bandė užkoduoti laiką skirtingomis potėpių spalvomis ir pan. Apie tai kalbėjo Aleksejus Nozdrinas-Plotnickis, užėmęs 8 vietą.

Ranka rašytų brėžinių klasifikacija. Pranešti „Yandex“.

Jis tai padarė kitaip. Jis pasakė, kad visos šios jūsų rankų darbo funkcijos neveikia, jums to nereikia daryti, jūsų tinklas turėtų visa tai išmokti pats. Vietoj to jis sugalvojo mokymosi modulius, kurie iš anksto apdorojo jūsų duomenis. Jis į juos įmetė pirminius duomenis be išankstinio apdorojimo – taškų koordinates ir laiko.

Tada jis paėmė skirtumą pagal koordinates ir viską apskaičiavo pagal laiką. Ir jis sugalvojo gana ilgą matricą. Jis kelis kartus pritaikė 1D konvoliuciją, kad gautų 64xn dydžio matricą, kur n yra bendras taškų skaičius, o 64 yra sudaryta, kad gautą matricą paduotų į bet kurio konvoliucinio tinklo sluoksnį, kuris priima kanalų skaičių. - 64. jis gavo 64xn matricą, tada iš jos reikėjo sukurti tam tikro dydžio tenzorių, kad kanalų skaičius būtų lygus 64. Jis normalizavo visus taškus X, Y intervale nuo 0 iki 32, kad sukurtų a. 32x32 dydžio tenzorius. Nežinau, kodėl jis norėjo 32x32, tiesiog taip atsitiko. Ir prie šios koordinatės jis padėjo šios 64xn dydžio matricos fragmentą. Taigi tai tiesiog baigėsi 32 x 32 x 64 tenzoriumi, kurį galėjote įdėti toliau į savo konvoliucinį neuronų tinklą. Tai viskas, ką norėjau pasakyti.

Šaltinis: www.habr.com

Добавить комментарий