Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Muutama kuukausi sitten kollegamme Googlesta käytetty on Kaggle kilpailu luoda luokittelu kuvia saatu sensaatiomainen peli "Luonnos!" Joukkue, johon kuului Yandex-kehittäjä Roman Vlasov, sijoittui kilpailussa neljänneksi. Tammikuun koneoppimiskoulutuksessa Roman kertoi tiiminsä ideoista, luokittelijan lopullisesta toteutuksesta ja vastustajiensa mielenkiintoisista käytännöistä.


- Hei kaikki! Nimeni on Roma Vlasov, tänään kerron sinulle Quick, Drawista! Doodle Recognition Challenge.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Joukkueessamme oli viisi henkilöä. Liityin juuri ennen yhdistämisen määräaikaa. Meillä oli epäonnea, meitä ravisteltiin hieman, mutta meitä ravistettiin raha-asennosta, ja he ravistettiin kulta-asemasta. Ja saimme kunniallisen neljännen sijan.

(Kilpailun aikana joukkueet tarkkailivat itseään luokituksessa, joka muodostettiin ehdotetun aineiston yhdessä osassa näkyvien tulosten perusteella. Lopullinen arvosana puolestaan ​​muodostui aineiston toisesta osasta. Tämä tehdään niin että kilpailun osallistujat eivät sovita algoritmejaan tiettyihin tietoihin. Siksi finaalissa arvosanoja vaihdellessa paikat tärisevät hieman (englanniksi shake up - to mix): muilla tiedoilla tulos voi osoittautua olla erilainen. Romanin joukkue oli ykkönen kolmen parhaan joukossa. Tässä tapauksessa kärkikolmikkoon on raha, rahaluokitusalue, koska vain kolme ensimmäistä paikkaa palkittiin rahapalkinnolla. Räjähdyksen jälkeen joukkue oli jo neljäs sija. Samalla tavalla toinen joukkue menetti voiton, kultapaikan. - Toim.)

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Kilpailu oli merkittävä myös siinä, että Jevgeni Babakhnin sai suurmestarin, Ivan Sosin sai mestarin, Roman Soloviev pysyi suurmestarina, Aleksi Parinov sai mestarin, minusta tuli asiantuntija ja nyt olen jo mestari.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Mikä tämä Quick, Draw on? Tämä on Googlen palvelu. Googlen tavoitteena oli tehdä tekoälyn suosituksi ja halusi tällä palvelulla näyttää kuinka hermoverkot toimivat. Menet sinne, napsautat Piirrä, ja uusi sivu ponnahtaa esiin, jossa sinulle sanotaan: piirrä siksak, sinulla on 20 sekuntia aikaa tehdä tämä. Yrität piirtää siksakin 20 sekunnissa, kuten esimerkiksi tässä. Jos onnistut, verkko sanoo, että se on siksak ja jatkat eteenpäin. Tällaisia ​​kuvia on vain kuusi.

Jos Googlen verkko ei tunnistanut piirtämääsi, tehtävään laitettiin rasti. Kerron myöhemmin, mitä se tarkoittaa tulevaisuudessa, tunnistaako verkko piirustuksen vai ei.

Tämä palvelu keräsi melkoisen määrän käyttäjiä ja kaikki käyttäjien piirtämät kuvat kirjattiin lokiin.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Onnistuimme keräämään lähes 50 miljoonaa kuvaa. Tästä muodostui kilpailumme juna- ja testipäivämäärä. Muuten, testin datamäärä ja luokkien lukumäärä on korostettu lihavoidulla syystä. Kerron niistä hieman myöhemmin.

Tietojen muoto oli seuraava. Nämä eivät ole vain RGB-kuvia, vaan karkeasti sanottuna lokia kaikesta, mitä käyttäjä teki. Word on kohteemme, maakoodi on doodlen tekijän kotipaikka, aikaleima on aika. Tunnistettu tarra osoittaa vain, tunnistiko verkko Googlen kuvan vai ei. Ja itse piirustus on sekvenssi, likiarvo käyrästä, jonka käyttäjä piirtää pisteillä. Ja ajoitukset. Tämä on aika kuvan piirtämisen alusta.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Tiedot esitettiin kahdessa muodossa. Tämä on ensimmäinen muoto, ja toinen on yksinkertaistettu. He leikkasivat ajoitukset sieltä ja likimääräisivät tämän pistejoukon pienemmällä pistejoukolla. Tätä varten he käyttivät Douglas-Pecker-algoritmi. Sinulla on suuri joukko pisteitä, jotka yksinkertaisesti approksimoivat suoraa, mutta itse asiassa voit arvioida tämän suoran vain kahdella pisteellä. Tämä on algoritmin idea.

Tiedot jaettiin seuraavasti. Kaikki on yhtenäistä, mutta on joitain poikkeamia. Kun ratkaisimme ongelman, emme katsoneet sitä. Pääasia, ettei luokkia ollut todella vähän, ei tarvinnut tehdä painotettuja näytteistoja ja datan ylinäytteenottoa.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Miltä kuvat näyttivät? Tämä on "lentokone"-luokka ja esimerkkejä siitä tunnisteilla ja tunnistamattomilla. Niiden suhde oli jossain 1:9. Kuten näet, data on melko meluisaa. Luulisin sen olevan lentokone. Jos katsot tunnistamatonta, useimmissa tapauksissa se on vain melua. Joku jopa yritti kirjoittaa sanan "lentokone", mutta ilmeisesti ranskaksi.

Useimmat osallistujat yksinkertaisesti ottivat ruudukoita, piirsivät dataa tästä viivasarjasta RGB-kuvina ja heittivät ne verkkoon. Piirsin suunnilleen samalla tavalla: otin väripaletin, piirsin ensimmäisen rivin yhdellä värillä, joka oli tämän paletin alussa, viimeisen rivin toisella, joka oli paletin lopussa ja niiden väliin Interpoloin kaikkialla käyttämällä tätä palettia. Muuten, tämä antoi paremman tuloksen kuin jos piirrät kuten aivan ensimmäisellä dialla - vain mustalla.

Muut tiimin jäsenet, kuten Ivan Sosin, kokeilivat hieman erilaisia ​​lähestymistapoja piirtämiseen. Yhdellä kanavalla hän piirsi yksinkertaisesti harmaan kuvan, toisella kanavalla hän piirsi jokaisen vedon gradientilla alusta loppuun, 32:sta 255:een, ja kolmannella kanavalla hän piirsi gradientin kaikkiin vedoihin 32:sta 255:een.

Toinen mielenkiintoinen asia on, että Alex Parinov latasi tietoa verkkoon maakoodin avulla.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Kilpailussa käytetty mittari on Mean Average Precision. Mikä on tämän mittarin ydin kilpailulle? Voit antaa kolme predikiä, ja jos näissä kolmessa ei ole oikeaa predikiä, saat 0. Jos on oikea, niin sen järjestys otetaan huomioon. Ja tavoitetulos lasketaan luvulla 1 jaettuna ennustuksesi järjestyksessä. Esimerkiksi teit kolme ennustajaa, joista oikea on ensimmäinen, jaat sitten 1:llä 1 ja saat 1. Jos ennustaja on oikea ja sen järjestys on 2, jaa 1 kahdella, saat 2. No jne.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Tietojen esikäsittelyllä - kuinka piirtää kuvia ja niin edelleen - olemme päättäneet vähän. Mitä arkkitehtuuria käytimme? Yritimme käyttää paksuja arkkitehtuureja, kuten PNASNet, SENet, ja sellaisia ​​jo klassisia arkkitehtuureja, kuten SE-Res-NeXt, ne tulevat yhä enemmän uusiin kilpailuihin. Mukana oli myös ResNet ja DenseNet.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Miten opetimme tämän? Kaikki ottamamme mallit olivat esikoulutettuja imagenetissä. Vaikka dataa on paljon, 50 miljoonaa kuvaa, mutta silti, jos otat verkon, joka on esikoulutettu imagenetissä, se osoitti parempia tuloksia kuin jos opetti sen yksinkertaisesti tyhjästä.

Mitä opetustekniikoita käytimme? Tämä on Cosing Annealing with Warm Restarts, josta puhun hieman myöhemmin. Tämä on tekniikka, jota käytän lähes kaikissa viimeaikaisissa kilpailuissani, ja niillä se harjoittelee ruudukkoa melko hyvin, saavuttaen hyvän minimin.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Seuraavaksi vähennä oppimisnopeutta tasangolla. Aloitat verkoston harjoittamisen, asetat tietyn oppimisnopeuden, jatkat sen opettamista, ja menetys vähitellen lähentyy tiettyyn arvoon. Tarkistat tämän esimerkiksi kymmenen aikakauden ajan menetys ei ole muuttunut ollenkaan. Vähennät oppimisnopeuttasi jollain arvolla ja jatkat oppimista. Se laskee jälleen hieman, konvergoi johonkin minimiin ja lasket taas oppimisnopeutta ja niin edelleen, kunnes verkkosi lopulta konvergoi.

Seuraava on mielenkiintoinen tekniikka: Älä heikennä oppimisnopeutta, vaan lisää eräkokoa. On artikkeli, jolla on sama nimi. Kun koulutat verkkoa, sinun ei tarvitse vähentää oppimisnopeutta, voit yksinkertaisesti kasvattaa eräkokoa.

Tätä tekniikkaa muuten käytti Alex Parinov. Hän aloitti erällä, joka oli 408, ja kun hänen verkkonsa saavutti tasangon, hän yksinkertaisesti tuplasi erän koon jne.

Itse asiassa en muista minkä arvon hänen eräkokonsa saavutti, mutta mielenkiintoista on, että Kagglessa oli tiimejä, jotka käyttivät samaa tekniikkaa, joiden eräkoko oli noin 10000 XNUMX. Muuten, nykyaikaiset puitteet syväoppimiseen, kuten esim. Esimerkiksi PyTorchin avulla voit tehdä tämän erittäin helposti. Luot erän ja lähetät sen verkkoon ei sellaisenaan, kokonaisuudessaan, vaan jaat sen osiin niin, että se mahtuu näytönohjainkorttiisi, laske gradientit ja kun olet laskenut gradientin koko erälle, päivitä painot.

Muuten, suuret eräkoot olivat edelleen mukana tässä kilpailussa, koska data oli melko meluisaa ja suuri eräkoko auttoi sinua arvioimaan gradientin tarkemmin.

Myös pseudomerkintää käytettiin, enimmäkseen Roman Soloviev. Hän otti noin puolet testin tiedoista erissä ja koulutti ruudukon tällaisissa erissä.

Kuvien koolla oli väliä, mutta tosiasia on, että sinulla on paljon dataa, sinun täytyy harjoitella pitkään, ja jos kuvakoko on melko suuri, harjoittelet erittäin pitkään. Mutta tämä ei juurikaan lisännyt lopullisen luokittelijasi laatua, joten kannatti käyttää jonkinlaista kompromissia. Ja kokeilimme vain kuvia, jotka eivät olleet kovin suuria.

Miten se kaikki opittiin? Ensin otettiin pienikokoisia kuvia, joissa ajettiin useita aikakausia, mikä vei melko paljon aikaa. Sitten annettiin suurikokoisia kuvia, verkostoa koulutettiin, sitten vielä enemmän, vielä enemmän, jotta sitä ei koulutettaisi tyhjästä eikä tuhlata paljon aikaa.

Tietoja optimoijista. Käytimme SGD:tä ja Adamia. Tällä tavalla oli mahdollista saada yksi malli, joka antoi julkisella pistetaulukolla nopeuden 0,941-0,946, mikä on melko hyvä.

Jos mallit yhdistetään jollain tavalla, saat arvon 0,951. Jos käytät vielä yhtä tekniikkaa, saat julkisella taululla lopullisen pistemäärän 0,954, aivan kuten saimme. Mutta siitä lisää myöhemmin. Seuraavaksi kerron kuinka mallit kokosimme ja kuinka onnistuimme saavuttamaan tällaisen loppunopeuden.

Seuraavaksi haluaisin puhua Cosing Hehkutuksesta lämpimillä uudelleenkäynnistyksillä tai Stochastic Gradient Descent with Warm Restarts. Karkeasti sanottuna periaatteessa voit käyttää mitä tahansa optimoijaa, mutta pointti on tämä: jos vain koulutat yhtä verkkoa ja vähitellen se konvergoi johonkin minimiin, niin kaikki on kunnossa, saat yhden verkon, se tekee tiettyjä virheitä, mutta voi harjoitella sitä hieman eri tavalla. Asetat alkuopetusnopeuden ja alennat sitä vähitellen tämän kaavan mukaisesti. Alennat sitä, verkkosi tulee johonkin minimiin, sitten tallennat painot ja asetat jälleen oppimisnopeuden, joka oli harjoituksen alussa, jolloin nouset jonnekin ylöspäin tästä minimistä ja lasket taas oppimisnopeuttasi.

Siten voit käydä useissa minimissä kerralla, joissa tappiosi on plus tai miinus sama. Mutta tosiasia on, että verkot, joilla on nämä painot, antavat erilaisia ​​​​virheitä päivämäärälläsi. Laskemalla niiden keskiarvon saat jonkinlaisen likiarvon ja nopeudesi on suurempi.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Tietoja siitä, kuinka kokosimme mallimme. Esityksen alussa sanoin, että kiinnitä huomiota kokeen datamäärään ja luokkien määrään. Jos lisäät 1 testisarjan tavoitteiden määrään ja jaat luokkien lukumäärällä, saat luvun 330, ja tämä kirjoitettiin foorumille - että testin luokat ovat tasapainossa. Tätä voisi käyttää.

Tämän perusteella Roman Soloviev keksi mittarin, kutsuimme sitä Proxy Score -pisteeksi, joka korreloi melko hyvin tulostaulukon kanssa. Asia on: teet ennusteen, otat ennusteistasi top 1 ja lasket kunkin luokan objektien lukumäärän. Seuraavaksi vähennä kustakin arvosta 330 ja laske yhteen saadut absoluuttiset arvot.

Seuraavat arvot saatiin. Tämä auttoi meitä luomaan mittaavaa tulostaulukkoa, vaan vahvistamaan paikallisesti ja valitsemaan kertoimet yhtyeillemme.

Kokonaisuudella saisi sellaisen nopeuden. Mitä muuta voisin tehdä? Oletetaan, että käytit tietoa, että testisi luokat ovat tasapainossa.

Tasapainotus oli erilainen. Esimerkki yhdestä niistä - tasapainotus ykkössijan ottaneilta kavereilta.

Mitä teimme? Tasapainotteemme oli melko yksinkertainen, Jevgeni Babakhnin ehdotti. Lajittelimme ennusteemme ensin parhaan 1 mukaan ja valitsimme ehdokkaat heistä - niin, että luokkien lukumäärä ei ylittänyt 330. Mutta joillain luokilla ennustajia on vähemmän kuin 330. Okei, lajitellaan myös 2 parhaan ja 3 parhaan mukaan , ja valitsemme myös ehdokkaat.

Miten tasapainotuksemme erosi ykköspaikan tasapainotuksesta? He käyttivät iteratiivista lähestymistapaa, ottivat suosituimman luokan ja pienensivät sen luokan todennäköisyyksiä pienellä määrällä, kunnes luokka ei enää ollut suosituin. Otimme seuraavaksi suosituimman luokan. Joten he jatkoivat niiden alentamista, kunnes kaikkien luokkien lukumäärä tuli yhtä suuri.

Kaikki käyttivät plus tai miinus yksi lähestymistapa junaverkkoihin, mutta kaikki eivät käyttäneet tasapainottamista. Tasapainotuksen avulla voit mennä kultaan, ja jos oli onnekas, niin rahaksi.

Kuinka esikäsitellä päivämäärä? Kaikki esikäsittelivät päivämäärän, plus tai miinus, samalla tavalla - tekemällä käsintehtyjä ominaisuuksia, yrittämällä koodata ajoituksia eri viivan väreillä jne. Aleksei Nozdrin-Plotnitsky, joka sijoittui 8. sijalle, puhui tästä.

Käsinkirjoitettujen piirustusten luokittelu. Raportoi Yandexissä

Hän teki sen toisin. Hän sanoi, että kaikki nämä käsintehty ominaisuudet eivät toimi, sinun ei tarvitse tehdä sitä, verkkosi pitäisi oppia tämä kaikki itse. Sen sijaan hän kehitti oppimismoduuleja, jotka esikäsittelivät tietosi. Hän heitti niihin alkuperäiset tiedot ilman esikäsittelyä - pistekoordinaatit ja ajoitukset.

Sitten hän otti eron koordinaattien perusteella ja laski kaiken keskiarvon ajoitusten perusteella. Ja hän keksi melko pitkän matriisin. Hän sovelsi siihen 1D-konvoluutiota useita kertoja saadakseen matriisin, jonka koko on 64xn, jossa n on pisteiden kokonaismäärä ja 64 on tehty syöttämään tuloksena oleva matriisi minkä tahansa konvoluutioverkon kerrokseen, joka hyväksyy kanavien lukumäärän. - 64. hän sai 64xn matriisin, sitten tästä piti luoda jonkin kokoinen tensori, jotta kanavien lukumäärä olisi 64. Hän normalisoi kaikki pisteet X, Y alueella 0-32 luodakseen tensori koko 32x32. En tiedä miksi hän halusi 32x32, se vain tapahtui niin. Ja tähän koordinaattiin hän asetti fragmentin tästä matriisista, jonka koko oli 64xn. Joten se vain päätyi 32x32x64-tensoriin, jonka voit laittaa syvemmälle konvoluutiohermoverkkoosi. Siinä kaikki, mitä halusin sanoa.

Lähde: will.com

Lisää kommentti