Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Paar kuud tagasi meie kolleegid Google'ist kulutatud Kaggle võistlusel sensatsiooniliselt saadud piltide klassifikaatori loomiseks mäng "Kiire joonistus!" Meeskond, kuhu kuulus Yandexi arendaja Roman Vlasov, saavutas võistlusel neljanda koha. Jaanuari masinõppe koolitusel jagas Roman oma meeskonna ideid, klassifikaatori lõplikku rakendamist ja vastaste huvitavaid praktikaid.


- Tere kõigile! Minu nimi on Roma Vlasov, täna räägin teile Quick, Draw'st! Doodle'i äratundmise väljakutse.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Meie meeskonnas oli viis inimest. Liitusin vahetult enne ühendamise tähtaega. Meil ei vedanud, meid raputati veidi, aga meid raputas rahapositsioonilt, nemad aga kullapositsioonilt. Ja saime auväärse neljanda koha.

(Võistluse käigus jälgisid võistkonnad end reitingus, mis moodustati pakutud andmekogumi ühel osal näidatud tulemuste põhjal. Lõplik hinnang omakorda moodustati andmestiku teises osas. Seda tehakse nii et võistlusel osalejad ei kohanda oma algoritme konkreetsetele andmetele Seetõttu finaalis reitingute vahel vahetades positsioonid veidi loksuvad (inglise keelest shake up - to mix): muudel andmetel võib tulemus selguda erineda. Romani võistkond oli esikolmikus esimene. Antud juhul on esikolmik raha, rahalise reitingu tsoon, kuna rahalise auhinna said ainult kolm esimest kohta. Pärast raputamist oli meeskond juba neljas koht. Samamoodi kaotas teine ​​meeskond võidu, kulla positsiooni. - Toim.)

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Võistlus oli märkimisväärne ka selle poolest, et Jevgeni Babahnin sai suurmeistri, Ivan Sosin sai meistri, Roman Solovjov jäi suurmeistriks, Aleks Parinov sai meistriks, minust sai ekspert ja nüüd olen juba meister.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Mis see Quick, Draw on? See on Google'i teenus. Google'i eesmärk oli AI populariseerimine ja selle teenusega sooviti näidata, kuidas närvivõrgud töötavad. Lähete sinna, klõpsake nuppu Joonistame ja avaneb uus leht, kus teile öeldakse: tõmmake siksak, teil on selleks aega 20 sekundit. Proovite joonistada 20 sekundiga siksaki, nagu näiteks siin. Kui see õnnestub, ütleb võrk, et see on siksak ja liigud edasi. Selliseid pilte on ainult kuus.

Kui Google'i võrk ei tuvastanud teie joonistust, märgiti ülesandele rist. Hiljem räägin teile, mida see tulevikus tähendab, kas võrk tunneb joonise ära või mitte.

See teenus kogus üsna palju kasutajaid ja kõik kasutajate tehtud pildid logiti sisse.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Meil õnnestus koguda ligi 50 miljonit pilti. Sellest kujunes välja meie võistluse rongi- ja katsekuupäev. Muide, testi andmemaht ja klasside arv on põhjusega paksus kirjas esile tõstetud. Ma räägin teile neist veidi hiljem.

Andmete vorming oli järgmine. Need ei ole lihtsalt RGB-pildid, vaid jämedalt öeldes logi kõigest, mida kasutaja tegi. Word on meie sihtmärk, riigikood on koht, kust pärit vigurlogo autor on, ajatempel on aeg. Tunnustatud silt näitab lihtsalt, kas võrk tundis Google'i pildi ära või mitte. Ja joonis ise on jada, ligikaudne kõver, mille kasutaja joonistab punktidega. Ja ajastused. See on aeg pildi joonistamise algusest.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Andmed esitati kahes vormingus. See on esimene vorming ja teine ​​on lihtsustatud. Nad lõikasid sealt välja ajastused ja lähendasid selle punktide komplekti väiksema punktide komplektiga. Selleks nad kasutasid Douglas-Peckeri algoritm. Teil on suur hulk punkte, mis lihtsalt ligikaudsed sirgjoonele, kuid tegelikult saate seda joont ligikaudselt hinnata vaid kahe punktiga. See on algoritmi idee.

Andmed jaotati järgmiselt. Kõik on ühtlane, kuid on ka kõrvalekaldeid. Kui probleemi lahendasime, ei vaadanud me seda. Peaasi, et ei olnud klasse, mida oleks tõesti vähe, me ei pidanud tegema kaalutud diskreereid ja andmeüleproovimist.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Kuidas pildid välja nägid? See on klass "lennuk" ja selle näited, mille märgistused on äratuntud ja tuvastamata. Nende suhe oli kuskil 1:9. Nagu näha, on andmed üsna lärmakad. Ma arvan, et see on lennuk. Kui vaadata äratundmatut, siis enamasti on see lihtsalt müra. Keegi üritas isegi kirjutada "lennuk", kuid ilmselt prantsuse keeles.

Enamik osalejaid võtsid lihtsalt ruudud, tõmbasid sellest joonte jadast andmed RGB-piltidena ja viskasid need võrku. Joonistasin umbes samamoodi: võtsin värvipaleti, tõmbasin ühe värviga esimese rea, mis oli selle paleti alguses, viimase rea teisega, mis oli paleti lõpus ja nende vahele Interpoleerisin seda paletti kasutades kõikjal. Muide, see andis parema tulemuse, kui joonistada nii nagu esimesel slaidil – lihtsalt mustas.

Teised meeskonnaliikmed, näiteks Ivan Sosin, proovisid joonistamisel veidi teistsuguseid lähenemisi. Ühe kanaliga joonistas ta lihtsalt halli pildi, teise kanaliga joonistas ta iga joone gradiendiga algusest lõpuni, 32-st 255-ni ja kolmanda kanaliga joonistas ta gradiendi kõikidele joontele vahemikus 32 kuni 255.

Huvitav on ka see, et Alex Parinov laadis teabe võrku riigikoodi abil.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Võistlusel kasutatav mõõdik on Mean Average Precision. Mis on selle mõõdiku olemus konkurentsi jaoks? Võite anda kolm predikti ja kui nendes kolmes pole õiget predici, saate 0. Kui on õige, siis võetakse arvesse selle järjekorda. Ja sihttulemus loetakse 1-ga jagatuna teie ennustuse järjekorras. Näiteks tegite kolm ennustajat ja õige on esimene, siis jagate 1 1-ga ja saate 1. Kui ennustaja on õige ja selle järjekord on 2, jagage 1 2-ga, saate 0,5. No jne.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Andmete eeltöötlusega – kuidas pilte joonistada ja nii edasi – oleme veidi otsustanud. Milliseid arhitektuure me kasutasime? Üritasime kasutada rasvaarhitektuure nagu PNASNet, SENet ja selliseid juba klassikalisi arhitektuure nagu SE-Res-NeXt, need sisenevad üha enam uutele võistlustele. Seal olid ka ResNet ja DenseNet.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Kuidas me seda õpetasime? Kõik mudelid, mille me võtsime, olid eelkoolitatud imagenetis. Kuigi andmeid on palju, 50 miljonit pilti, kuid siiski, kui võtta ette imagenetis eelkoolitatud võrk, näitas see paremaid tulemusi kui lihtsalt nullist välja õpetades.

Milliseid õpetamistehnikaid kasutasime? See on Cosing Annealing with Warm Restarts, millest räägin veidi hiljem. See on võte, mida kasutan peaaegu kõigil oma viimastel võistlustel ja nendega saab päris hästi ruudustikku treenima, hea miinimumi saavutama.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Järgmine, vähendage Platoo õppimismäära. Alustate võrgustiku treenimist, määrate teatud õppimiskiiruse, jätkate selle õpetamist ja teie kaotus läheneb järk-järgult teatud väärtusele. Kontrollige seda näiteks kümne epohhi jooksul pole kaotus üldse muutunud. Vähendate oma õppimiskiirust mõne väärtuse võrra ja jätkate õppimist. See langeb jälle veidi, läheneb mingile miinimumile ja alandate jälle õppimiskiirust ja nii edasi, kuni teie võrk lõpuks läheneb.

Järgmine on huvitav tehnika: ärge vähendage õppimiskiirust, vaid suurendage partii suurust. Sama nimega artikkel on olemas. Võrgu treenimisel ei pea te õppimiskiirust vähendama, saate lihtsalt partii suurust suurendada.

Seda tehnikat, muide, kasutas Alex Parinov. Ta alustas partiiga, mis võrdub 408-ga, ja kui tema võrk jõudis mõnele platoole, siis ta lihtsalt kahekordistas partii suuruse jne.

Tegelikult ma ei mäleta, mis väärtuse tema partii suurus saavutas, kuid huvitav on see, et Kaggle'is oli meeskondi, kes kasutasid sama tehnikat, nende partii suurus oli umbes 10000 XNUMX. Muide, kaasaegsed süvaõppe raamistikud, nagu nt. Näiteks PyTorch võimaldab seda väga lihtsalt teha. Loote oma partii ja esitate selle võrku mitte sellisel kujul, nagu see on tervikuna, vaid jagate selle tükkideks, nii et see mahub teie videokaardile, arvutate gradiendid ja kui olete kogu partii gradiendi arvutanud, värskendate kaalud.

Muide, sellel võistlusel olid endiselt suured partii suurused, kuna andmed olid üsna mürarikkad ja suur partii suurus aitas teil gradienti täpsemalt hinnata.

Kasutati ka pseudomärgistust, enamasti kasutas seda Roman Solovjov. Ta valis umbes pooled testi andmetest partiidena ja koolitas selliste partiide võrgustikku.

Piltide suurus mängis rolli, aga fakt on see, et sul on palju andmeid, pead kaua treenima ja kui pildi suurus on päris suur, siis treenid väga kaua. Kuid see ei andnud teie lõpliku klassifikaatori kvaliteedile palju juurde, seega tasus kasutada mingit kompromissi. Ja proovisime ainult pilte, mis ei olnud väga suured.

Kuidas seda kõike õpiti? Kõigepealt tehti väikeses mõõdus pilte, jooksis mitu epohhi läbi, see võttis päris palju aega. Siis anti suures mahus pilte, koolitati võrgustikku, siis veel rohkem, veel rohkem, et mitte nullist treenida ja mitte palju aega raisata.

Optimeerijate kohta. Kasutasime SGD-d ja Adamit. Nii oli võimalik saada üksik mudel, mis andis avalikul edetabelis kiiruseks 0,941-0,946, mis on päris hea.

Kui modellid kuidagi komplekteerida, siis saad kuskil 0,951. Kui kasutate veel ühte tehnikat, saate avalikul tablool lõpptulemuseks 0,954, nagu meiegi. Aga sellest pikemalt hiljem. Järgmisena räägin teile, kuidas me mudeleid kokku panime ja kuidas meil õnnestus selline lõppkiirus saavutada.

Järgmisena tahaksin rääkida Cosing Annealingist sooja taaskäivitusega või Stochastic Gradient Descent with Warm Restarts. Laias laastus võib põhimõtteliselt kasutada mis tahes optimeerijat, kuid mõte on järgmine: kui treenite lihtsalt ühte võrku ja see läheneb järk-järgult miinimumini, siis on kõik korras, saate ühe võrgu, see teeb teatud vigu, kuid saab seda veidi teisiti treenida. Määrate algse õppimiskiiruse ja alandate seda selle valemi järgi järk-järgult. Alandate seda, teie võrk jõuab miinimumini, siis salvestate raskused ja määrate uuesti õppimise kiiruse, mis oli treeningu alguses, liikudes seeläbi sellest miinimumist kuhugi ülespoole ja alandades taas oma õppimiskiirust.

Seega saate korraga külastada mitut miinimumi, milles teie kaotus on pluss-miinus sama. Kuid tõsiasi on see, et nende kaaludega võrgud annavad teie kuupäeval erinevaid vigu. Nende keskmistamisega saate mingisuguse ligikaudse hinnangu ja teie kiirus on suurem.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Sellest, kuidas me oma mudeleid kokku panime. Ettekande alguses ütlesin, et pöörake tähelepanu testi andmemahule ja klasside arvule. Kui liita testikomplektis olevate sihtmärkide arvule 1 ja jagada klasside arvuga, saad numbriks 330 ja nii oligi foorumis kirjas - et testis on klassid tasakaalus. Seda võiks kasutada.

Selle põhjal mõtles Roman Soloviev välja mõõdiku, nimetasime selle Proxy Score'iks, mis korreleerus edetabeliga üsna hästi. Asi on selles, et teete ennustuse, võtate oma ennustajatest 1 parima ja loendate iga klassi objektide arvu. Seejärel lahutage igast väärtusest 330 ja liidage saadud absoluutväärtused.

Saadi järgmised väärtused. See aitas meil mitte luua sondeerivat edetabelit, vaid valideerida kohapeal ja valida oma ansamblitele koefitsiendid.

Ansambliga saaks sellise kiiruse. Mida ma veel saaksin teha? Oletame, et kasutasite teavet, et teie testi klassid on tasakaalus.

Tasakaalustamine oli erinev. Näide ühest neist — balansseerides esikoha saanud kuttidest.

Mida me tegime? Meie tasakaalustamine oli üsna lihtne, seda soovitas Jevgeni Babahnin. Esmalt sorteerisime oma ennustused parima 1 järgi ja valisime nende hulgast välja kandidaadid – nii et klasside arv ei ületaks 330. Kuid mõne klassi puhul jääb ennustajaid alla 330. Olgu, sorteerime ka 2 parima ja 3 parima järgi , ja valime ka kandidaate.

Mille poolest erines meie tasakaal esikoha tasakaalust? Nad kasutasid iteratiivset lähenemist, võttes kõige populaarsema klassi ja vähendades selle klassi tõenäosust mõne väikese arvu võrra, kuni see klass ei olnud enam kõige populaarsem. Võtsime järgmise populaarseima klassi. Nii jätkasid nad nende langetamist, kuni kõigi klasside arv muutus võrdseks.

Kõik kasutasid rongivõrkude jaoks pluss-miinus ühte lähenemisviisi, kuid mitte kõik ei kasutanud tasakaalustamist. Tasakaalustamist kasutades sai minna kullasse ja hea õnne korral rahasse.

Kuidas kuupäeva eeltöödelda? Kõik eeltöötlesid kuupäeva, pluss või miinus, ühtemoodi - tehes käsitsi valmistatud funktsioone, püüdes kodeerida ajastusi erinevate tõmbevärvidega jne. Just sellest rääkis Aleksei Nozdrin-Plotnitski, kes saavutas 8. koha.

Käsitsi kirjutatud jooniste klassifikatsioon. Teatage Yandexis

Ta tegi seda teisiti. Ta ütles, et kõik need teie käsitsi valmistatud funktsioonid ei tööta, te ei pea seda tegema, teie võrk peaks seda kõike ise õppima. Ja selle asemel mõtles ta välja õppemoodulid, mis teie andmeid eeltöötlesid. Ta viskas neisse ilma eeltöötluseta algandmed – punktide koordinaadid ja ajastused.

Seejärel võttis ta koordinaatide põhjal erinevuse ja arvutas selle ajastuse põhjal keskmise. Ja ta mõtles välja üsna pika maatriksi. Ta rakendas sellele mitu korda 1D-konvolutsiooni, et saada maatriks suurusega 64xn, kus n on punktide koguarv ja 64 tehakse selleks, et edastada saadud maatriks mis tahes konvolutsioonivõrgu kihti, mis aktsepteerib kanalite arvu. - 64. ta sai 64xn maatriksi, siis sellest oli vaja luua mingi suurusega tensor, et kanalite arv oleks võrdne 64-ga. Ta normaliseeris kõik punktid X, Y vahemikus 0 kuni 32, et luua a tensor suurusega 32x32. Ma ei tea, miks ta tahtis 32x32, see lihtsalt juhtus nii. Ja sellele koordinaadile paigutas ta selle maatriksi fragmendi suurusega 64xn. Nii et see lihtsalt lõppes 32x32x64 tensoriga, mille saate oma konvolutsiooninärvivõrku veelgi lisada. See on kõik, mida ma öelda tahtsin.

Allikas: www.habr.com

Lisa kommentaar