Klasifikácia ručne písaných kresieb. Správa v Yandex

Pred pár mesiacmi naši kolegovia z Google držané na Kaggle súťaž o vytvorenie klasifikátora pre obrázky získané v senzačný hru "Rýchlo, kresliť!" Tím, v ktorom bol vývojár Yandex Roman Vlasov, obsadil v súťaži štvrté miesto. Na januárovom školení strojového učenia sa Roman podelil o nápady svojho tímu, konečnú implementáciu klasifikátora a zaujímavé postupy svojich súperov.


- Ahojte všetci! Volám sa Roma Vlasov, dnes vám poviem o Quick, Draw! Výzva na rozpoznanie doodle.

Klasifikácia ručne písaných kresieb. Správa v Yandex

V našom tíme bolo päť ľudí. Pripojil som sa tesne pred termínom zlúčenia. Mali sme smolu, boli sme trochu otrasení, ale boli sme otrasení z pozície peňazí a oni zo zlatej pozície. A obsadili sme čestné štvrté miesto.

(Počas súťaže tímy sledovali sami seba v hodnotení, ktoré bolo vytvorené na základe výsledkov zobrazených na jednej časti navrhovaného súboru údajov. Výsledné hodnotenie sa zase vytvorilo na inej časti súboru údajov. že účastníci súťaže neprispôsobujú svoje algoritmy konkrétnym údajom. Preto sa vo finále pri prepínaní medzi hodnoteniami pozície trochu zatrasú (z anglického shake up - zmiešať): na iných údajoch môže výsledok dopadnúť byť iný. Romanov tím bol prvý v prvej trojke. V tomto prípade sú prvé tri peňažné, peňažné pásmo hodnotenia, keďže len prvé tri miesta boli ocenené peňažnou odmenou. Po pretrepaní bol tím už v štvrté miesto. Rovnakým spôsobom druhý tím prišiel o víťazstvo, zlatú pozíciu. - Red.)

Klasifikácia ručne písaných kresieb. Správa v Yandex

Súťaž bola významná aj tým, že veľmajstra dostal Jevgenij Babachnin, majstra Ivan Sosin, veľmajstrom zostal Roman Soloviev, majstra Alex Parinov, ja som sa stal odborníkom a teraz som už majstrom.

Klasifikácia ručne písaných kresieb. Správa v Yandex

Čo je to Quick, Draw? Toto je služba od spoločnosti Google. Google mal za cieľ popularizovať AI a pomocou tejto služby chcel ukázať, ako fungujú neurónové siete. Idete tam, kliknete na Poďme kresliť a objaví sa nová stránka, kde vám povieme: nakreslite cikcak, máte na to 20 sekúnd. Snažíte sa nakresliť cikcak za 20 sekúnd, ako napríklad tu. Ak uspejete, sieť povie, že je to cikcak a ide sa ďalej. Takýchto obrázkov je len šesť.

Ak sieť Google nerozpoznala, čo ste nakreslili, na úlohu sa umiestnil krížik. Neskôr vám poviem, čo to bude v budúcnosti znamenať, či sieť rozpozná kresbu alebo nie.

Táto služba zhromaždila pomerne veľký počet používateľov a všetky obrázky, ktoré používatelia nakreslili, boli zaznamenané.

Klasifikácia ručne písaných kresieb. Správa v Yandex

Podarilo sa nám nazbierať takmer 50 miliónov obrázkov. Z toho sa vytvoril vlakový a testovací termín našej súťaže. Mimochodom, množstvo údajov v teste a počet tried sú z nejakého dôvodu zvýraznené tučným písmom. Poviem vám o nich trochu neskôr.

Formát údajov bol nasledujúci. Nie sú to len obrázky RGB, ale zhruba povedané, denník všetkého, čo používateľ urobil. Slovo je náš cieľ, kód krajiny je miesto, odkiaľ pochádza autor sviatočného loga, časová pečiatka je čas. Rozpoznaný štítok iba ukazuje, či sieť rozpoznala obrázok od Googlu alebo nie. A samotná kresba je postupnosť, aproximácia krivky, ktorú používateľ kreslí bodmi. A načasovanie. Toto je čas od začiatku kreslenia obrázka.

Klasifikácia ručne písaných kresieb. Správa v Yandex

Údaje boli prezentované v dvoch formátoch. Toto je prvý formát a druhý je zjednodušený. Odtiaľ vystrihli časovanie a aproximovali túto množinu bodov menšou množinou bodov. Na to použili Douglas-Peckerov algoritmus. Máte veľkú množinu bodov, ktoré jednoducho aproximujú priamku, ale v skutočnosti môžete túto čiaru aproximovať iba dvoma bodmi. Toto je myšlienka algoritmu.

Údaje boli distribuované nasledovne. Všetko je jednotné, no nájdu sa aj odľahlé miesta. Keď sme problém vyriešili, nepozreli sme sa naň. Hlavná vec je, že neexistovali žiadne triedy, ktorých by bolo naozaj málo, nemuseli sme robiť vážené vzorkovače a prevzorkovanie údajov.

Klasifikácia ručne písaných kresieb. Správa v Yandex

Ako vyzerali obrázky? Toto je trieda „lietadlo“ a príklady z nej s označeniami rozpoznané a nerozpoznané. Ich pomer bol niekde okolo 1 ku 9. Ako vidíte, dáta sú dosť zašumené. Tipoval by som, že je to lietadlo. Ak sa pozriete na nerozpoznané, vo väčšine prípadov ide len o šum. Niekto sa dokonca pokúsil napísať „lietadlo“, ale zjavne vo francúzštine.

Väčšina účastníkov jednoducho vzala mriežky, nakreslila údaje z tejto postupnosti čiar ako obrázky RGB a hodila ich do siete. Kreslil som približne rovnakým spôsobom: zobral som paletu farieb, nakreslil som prvú čiaru jednou farbou, ktorá bola na začiatku tejto palety, poslednú čiaru druhou, ktorá bola na konci palety a medzi nimi Všade som interpoloval pomocou tejto paletky. To mimochodom poskytlo lepší výsledok, ako keby ste kreslili ako na úplne prvej snímke – len čiernou farbou.

Iní členovia tímu, napríklad Ivan Sosin, skúšali trochu iné prístupy ku kresleniu. S jedným kanálom jednoducho nakreslil sivý obrázok, s iným kanálom nakreslil každý ťah s gradientom od začiatku do konca, od 32 do 255, a s tretím kanálom nakreslil gradient cez všetky ťahy od 32 do 255.

Ďalšou zaujímavosťou je, že Alex Parinov nahral informácie do siete pomocou kódu krajiny.

Klasifikácia ručne písaných kresieb. Správa v Yandex

Metrikou používanou v súťaži je stredná priemerná presnosť. Čo je podstatou tejto metriky pre konkurenciu? Môžete zadať tri predikcie a ak v týchto troch nie je správna predikcia, dostanete 0. Ak je správna, berie sa do úvahy jej poradie. A cieľový výsledok sa bude počítať ako 1 delené poradím vašej predpovede. Napríklad ste vytvorili tri prediktory a ten správny je prvý, potom vydelíte 1 1 a dostanete 1. Ak je prediktor správny a jeho poradie je 2, potom vydelte 1 2, dostanete 0,5. No atď.

Klasifikácia ručne písaných kresieb. Správa v Yandex

S predspracovaním dát - ako kresliť obrázky a podobne - sme sa trochu rozhodli. Aké architektúry sme použili? Snažili sme sa použiť tučné architektúry ako PNASNet, SENet a také už klasické architektúry ako SE-Res-NeXt, čoraz častejšie sa hlásia do nových súťaží. Nechýbali ani ResNet a DenseNet.

Klasifikácia ručne písaných kresieb. Správa v Yandex

Klasifikácia ručne písaných kresieb. Správa v Yandex

Klasifikácia ručne písaných kresieb. Správa v Yandex

Ako sme to učili? Všetky modely, ktoré sme nasnímali, boli vopred trénované na imagenet. Je tam síce veľa dát, 50 miliónov obrázkov, ale aj tak, ak zoberiete sieť vopred natrénovanú na imagenet, vykazovala lepšie výsledky, ako keby ste ju jednoducho trénovali od začiatku.

Aké vyučovacie techniky sme použili? Toto je Cosing Annealing with Warm Restarts, o ktorom budem hovoriť trochu neskôr. Toto je technika, ktorú používam takmer na všetkých mojich nedávnych súťažiach a ukazuje sa, že s nimi trénujem mriežky celkom dobre, aby som dosiahol dobré minimum.

Klasifikácia ručne písaných kresieb. Správa v Yandex

Ďalej Znížte mieru učenia na plošine. Začnete trénovať sieť, nastavíte si určitú mieru učenia, ďalej ju učíte a vaša strata sa postupne približuje k určitej hodnote. Skontrolujete to, napríklad desať epoch sa strata vôbec nezmenila. Znížite rýchlosť učenia o určitú hodnotu a pokračujete v učení. Znova to trochu klesne, konverguje na nejaké minimum a znova znížite rýchlosť učenia a tak ďalej, až kým sa vaša sieť konečne nezblíži.

Ďalej je zaujímavá technika: Neznížte rýchlosť učenia, zväčšite veľkosť dávky. Existuje článok s rovnakým názvom. Keď trénujete sieť, nemusíte znižovať rýchlosť učenia, môžete jednoducho zvýšiť veľkosť dávky.

Túto techniku, mimochodom, použil Alex Parinov. Začal s dávkou rovnajúcou sa 408, a keď jeho sieť dosiahla nejaké plató, jednoducho zdvojnásobil veľkosť dávky atď.

V skutočnosti si už nepamätám, akú hodnotu dosiahla jeho veľkosť dávky, ale zaujímavé je, že na Kaggle boli tímy, ktoré používali rovnakú techniku, ich veľkosť dávky bola asi 10000 XNUMX. Mimochodom, moderné frameworky pre hlboké učenie, ako napr. Veľmi jednoducho vám to umožňuje napríklad PyTorch. Vygenerujete svoju dávku a odošlete ju do siete nie takú, aká je, celú, ale rozdelíte ju na kúsky tak, aby sa zmestila do vašej grafickej karty, vypočítate gradienty a po vypočítaní gradientu pre celú dávku aktualizujte závažia.

Mimochodom, do tejto súťaže boli stále zahrnuté veľké veľkosti dávok, pretože údaje boli dosť hlučné a veľká veľkosť dávky vám pomohla presnejšie priblížiť gradient.

Používalo sa aj pseudooznačovanie, ktoré väčšinou používal Roman Soloviev. Vzorkoval približne polovicu údajov z testu v dávkach a trénoval mriežku na takýchto dávkach.

Na veľkosti obrázkov záležalo, faktom však je, že máte veľa dát, musíte dlho trénovať a ak je váš obrázok dosť veľký, tak budete trénovať veľmi dlho. To však nepridalo veľa na kvalite vášho konečného klasifikátora, takže sa oplatilo použiť nejaký kompromis. A to sme skúšali len obrázky, ktoré neboli veľmi veľké.

Ako sa to všetko naučilo? Najprv sa urobili malé obrázky, nabehlo sa na nich niekoľko epoch, čo zabralo dosť času. Potom sa dali veľké obrázky, trénovala sa sieť, potom ešte viac, ešte viac, aby sa necvičilo od nuly a nestrácalo sa veľa času.

O optimalizátoroch. Použili sme SGD a Adam. Týmto spôsobom bolo možné získať jeden model, ktorý dával rýchlosť 0,941-0,946 na verejnej tabuľke, čo je celkom dobré.

Ak modely nejakým spôsobom zoskupíte, dostanete sa niekde okolo 0,951. Ak použijete ešte jednu techniku, dostanete na verejnej tabuli konečné skóre 0,954, rovnako ako my. Ale o tom neskôr. Ďalej vám poviem, ako sme zostavili modely a ako sa nám podarilo dosiahnuť takú konečnú rýchlosť.

Ďalej by som chcel hovoriť o Cosing Annealing s teplými reštartmi alebo Stochastic Gradient Descent s teplými reštartmi. Zhruba povedané, v zásade môžete použiť akýkoľvek optimalizátor, ale ide o toto: ak len natrénujete jednu sieť a postupne sa zblíži na nejaké minimum, potom je všetko v poriadku, dostanete jednu sieť, ktorá robí určité chyby, ale dá sa to trénovať trochu inak. Nastavíte si počiatočnú rýchlosť učenia a postupne ju znížite podľa tohto vzorca. Znížiš to, tvoja sieť sa dostane na nejaké minimum, potom uložíš váhy a znova nastavíš rýchlosť učenia, ktorá bola na začiatku tréningu, čím pôjdeš niekam hore z tohto minima a opäť znížiš rýchlosť učenia.

Naraz tak môžete navštíviť niekoľko minim, v ktorých bude vaša strata plus mínus rovnaká. Faktom však je, že siete s týmito váhami vám na rande poskytnú rôzne chyby. Ich spriemerovaním získate určitú aproximáciu a vaša rýchlosť bude vyššia.

Klasifikácia ručne písaných kresieb. Správa v Yandex

O tom, ako sme skladali naše modely. Na začiatku prezentácie som povedal, aby som si dal pozor na množstvo údajov v teste a počet tried. Ak k počtu cieľov v testovacej sade pripočítate 1 a vydelíte počtom tried, dostanete číslo 330 a to bolo na fóre napísané - že triedy v teste sú vyrovnané. Toto by sa dalo použiť.

Na základe toho Roman Soloviev prišiel s metrikou, nazvali sme ju Proxy Score, ktorá celkom dobre korelovala s rebríčkom. Ide o to, že urobíte predpoveď, vezmete 1 z vašich prediktorov a spočítate počet objektov pre každú triedu. Ďalej odpočítajte 330 od každej hodnoty a spočítajte výsledné absolútne hodnoty.

Boli získané nasledujúce hodnoty. To nám pomohlo nevytvoriť rebríček prieskumu, ale lokálne overiť a vybrať koeficienty pre naše súbory.

So súborom by ste mohli dosiahnuť takú rýchlosť. Čo iné som mohol urobiť? Predpokladajme, že ste použili informáciu, že triedy vo vašom teste sú vyvážené.

Vyváženie bolo iné. Príklad jedného z nich — bilancovanie od chalanov, ktorí obsadili prvé miesto.

čo sme urobili? Naše vyváženie bolo celkom jednoduché, navrhol to Jevgenij Babakhnin. Najprv sme zoradili naše predpovede podľa top 1 a vybrali z nich kandidátov – tak, aby počet tried neprekročil 330. Ale pre niektoré triedy skončíte s menej ako 330 prediktormi. Dobre, poďme tiež zoradiť podľa top 2 a top 3 , a vyberieme aj kandidátov.

V čom sa naše bilancovanie líšilo od bilancovania prvého miesta? Použili iteratívny prístup, pričom vybrali najobľúbenejšiu triedu a znížili pravdepodobnosť pre túto triedu o nejaké malé číslo, až kým táto trieda už nebola najobľúbenejšou. Zúčastnili sme sa ďalšej najobľúbenejšej triedy. Pokračovali v ich znižovaní, až kým sa počet všetkých tried nezrovnal.

Všetci používali plus-mínus jeden prístup k vlakovým sieťam, ale nie všetci používali vyvažovanie. Pomocou vyvažovania ste mohli ísť do zlata a ak ste mali šťastie, tak do peňazí.

Ako predspracovať dátum? Každý predspracoval dátum plus-mínus rovnakým spôsobom - vyrábal ručne prvky, pokúšal sa zakódovať časovanie rôznymi farbami ťahov atď. O tom hovoril Alexey Nozdrin-Plotnitsky, ktorý obsadil 8. miesto.

Klasifikácia ručne písaných kresieb. Správa v Yandex

Urobil to inak. Povedal, že všetky tieto vaše ručne vyrobené funkcie nefungujú, to nemusíte robiť, vaša sieť by sa to všetko mala naučiť sama. A namiesto toho prišiel s učebnými modulmi, ktoré predspracovali vaše údaje. Nahodil do nich pôvodné dáta bez predspracovania – súradnice bodov a časovanie.

Potom zobral rozdiel na základe súradníc a všetko spriemeroval na základe časovania. A prišiel s pomerne dlhou matricou. Niekoľkokrát naň aplikoval 1D konvolúciu, aby získal maticu s veľkosťou 64xn, kde n je celkový počet bodov a 64 sa vytvorí, aby sa výsledná matica priviedla na vrstvu akejkoľvek konvolučnej siete, ktorá akceptuje počet kanálov. - 64. dostal maticu 64xn, potom z nej bolo potrebné vytvoriť tenzor nejakej veľkosti, aby počet kanálov bol rovný 64. Všetky body X, Y v rozsahu od 0 do 32 znormalizoval. tenzor s rozmermi 32x32. Neviem, prečo chcel 32x32, jednoducho sa to tak stalo. A na túto súradnicu umiestnil fragment tejto matrice veľkosti 64xn. Takže to skončilo s tenzorom 32x32x64, ktorý ste mohli vložiť ďalej do svojej konvolučnej neurónovej siete. To je všetko, čo som chcel povedať.

Zdroj: hab.com

Pridať komentár