Kézírásos rajzok osztályozása. Jelentés a Yandexben

Néhány hónappal ezelőtt kollégáink a Google-tól költött a Kaggle-n egy versenyt a szenzáció során nyert képek osztályozójának létrehozására a játék "Skicc!" A csapat, amelyben a Yandex fejlesztője, Roman Vlasov is szerepelt, a versenyen a negyedik helyet szerezte meg. A januári gépi tanulási tréningen Roman megosztotta csapata ötleteit, az osztályozó végleges megvalósítását és ellenfelei érdekes gyakorlatait.


- Sziasztok! A nevem Roma Vlasov, ma a Quick, Draw-ről fogok mesélni! Doodle Recognition Challenge.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Öten voltak a csapatunkban. Közvetlenül az összevonási határidő előtt csatlakoztam. Nekünk nem volt szerencsénk, kicsit megrendültünk, de mi a pénzhelyzetből, ők pedig az aranypozícióból. És megtisztelő negyedik helyezést értünk el.

(A verseny során a csapatok egy értékelésben figyelték meg magukat, amelyet a javasolt adatsor egyik részén látható eredmények alapján alakítottak ki. A végső értékelés pedig az adatsor másik részén alakult ki. Ez így történik hogy a verseny résztvevői ne igazítsák az algoritmusaikat konkrét adatokhoz Ezért a döntőben az értékelések közötti váltáskor a pozíciók kissé megremegnek (az angol shake up - to mix): más adatokon az eredmény kiderülhet hogy más legyen.Roman csapata első volt az első háromban Ebben az esetben az első három a pénzes, monetáris besorolási zóna, mivel csak az első három helyezett kapott pénzjutalmat.A felrázást követően a csapat már negyedik hely. Ugyanígy a másik csapat elvesztette a győzelmet, az aranypozíciót. - A szerk.)

Kézírásos rajzok osztályozása. Jelentés a Yandexben

A verseny abból a szempontból is jelentős volt, hogy Jevgenyij Babakhnin nagymestert kapott, Ivan Szosin mestert kapott, Roman Szolovjov nagymester maradt, Alex Parinov mestert kapott, én szakértő lettem, és most már mester vagyok.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Mi ez a Quick, Draw? Ez a Google szolgáltatása. A Google célja az AI népszerűsítése volt, és ezzel a szolgáltatással meg akarta mutatni a neurális hálózatok működését. Odamész, kattints a Rajzoljunk gombra, és felugrik egy új oldal, ahol azt mondják: rajzolj cikkcakkot, erre 20 másodperced van. Megpróbál 20 másodperc alatt cikkcakkot rajzolni, mint például itt. Ha sikerül, a hálózat azt mondja, hogy cikcakk, és továbblépsz. Csak hat ilyen kép van.

Ha a Google hálózata nem ismerte fel, amit rajzolt, akkor a feladaton egy kereszt került. Később elmondom, mit jelent a jövőben, hogy egy rajzot felismer-e a hálózat vagy sem.

Ez a szolgáltatás meglehetősen nagy számú felhasználót gyűjtött össze, és a felhasználók által készített összes kép naplózásra került.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Közel 50 millió képet sikerült összegyűjtenünk. Ebből alakult ki versenyünk vonat- és tesztidőpontja. A teszt adatmennyisége és az osztályok száma egyébként nem ok nélkül van félkövérrel kiemelve. Kicsit később mesélek róluk.

Az adatformátum a következő volt. Ezek nem csak RGB-képek, hanem durván szólva a felhasználó által végzett tevékenységek naplója. A Word a célpontunk, az országkód az, ahonnan az embléma szerzője származik, az időbélyeg pedig az idő. A felismert címke csak azt mutatja, hogy a hálózat felismerte-e a képet a Google-tól vagy sem. Maga a rajz pedig egy sorozat, egy görbe közelítése, amelyet a felhasználó pontokkal rajzol. És az időzítések. Ez az idő a kép rajzolásának kezdetétől számítva.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Az adatok két formátumban kerültek bemutatásra. Ez az első formátum, a második pedig egyszerűsített. Kivágták onnan az időzítéseket, és ezt a pontkészletet egy kisebb pontkészlettel közelítették. Erre használtak Douglas-Pecker algoritmus. Nagy számú pontja van, amelyek egyszerűen közelítenek egy egyenest, de valójában ezt az egyenest csak két ponttal közelítheti meg. Ez az algoritmus ötlete.

Az adatok elosztása a következőképpen történt. Minden egységes, de vannak kiugró tényezők. Amikor megoldottuk a problémát, nem néztük meg. A lényeg, hogy nem voltak igazán kevés osztályok, nem kellett súlyozott mintavételezést és adattúlmintavételezést végeznünk.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Hogy néztek ki a képek? Ez a „repülőgép” osztály és példák abból a felismert és nem felismert címkékkel. Az arányuk valahol 1:9 körül volt. Amint látja, az adatok elég zajosak. Azt hiszem, ez egy repülőgép. Ha azt nézi, hogy nem ismeri fel, a legtöbb esetben ez csak zaj. Valaki még azt is megpróbálta írni, hogy „repülőgép”, de látszólag franciául.

A legtöbb résztvevő egyszerűen rácsokat vett fel, adatokat rajzolt ebből a sorsorozatból RGB-képként, és bedobta a hálózatba. Körülbelül ugyanígy rajzoltam: vettem egy színpalettát, meghúztam az első sort az egyik színnel, ami ennek a palettának az elején volt, az utolsó sort egy másikkal, ami a paletta végén volt, és közéjük. Mindenhol interpoláltam ezzel a palettával. Ez egyébként jobb eredményt adott, mintha úgy rajzolna, mint a legelső dián – csak feketével.

Más csapattagok, például Ivan Sosin, kissé eltérő megközelítéseket próbáltak ki a rajzolásban. Az egyik csatornával egyszerűen egy szürke képet rajzolt, a másik csatornával minden vonást gradienssel rajzolt az elejétől a végéig, 32-től 255-ig, a harmadik csatornával pedig gradienst rajzolt az összes vonásra 32-től 255-ig.

Egy másik érdekesség, hogy Alex Parinov országkóddal töltött fel információkat a hálózatra.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

A versenyben használt mérőszám az átlagos pontosság. Mi ennek a mérőszámnak a lényege a verseny szempontjából? Megadhatsz három predikumot, és ha ebben a háromban nincs helyes predik, akkor 0-t kapsz. Ha van helyes, akkor annak sorrendjét veszi figyelembe a rendszer. A megcélzott eredményt a rendszer 1-gyel osztva az előrejelzés sorrendjével. Például elkészített három prediktort, és a helyes az első, majd elosztod 1-et 1-gyel, és 1-et kapsz. Ha a prediktor helyes és a sorrendje 2, akkor 1-et 2-vel osztasz, akkor 0,5-öt kapsz. Hát stb.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Az adatok előfeldolgozásával - hogyan rajzoljunk képeket és így tovább - döntöttünk egy kicsit. Milyen architektúrákat használtunk? Igyekeztünk olyan vastag architektúrákat használni, mint a PNASNet, SENet, és olyan, már klasszikusnak számító architektúrákat, mint az SE-Res-NeXt, ezek egyre gyakrabban indulnak új versenyeken. Volt még ResNet és DenseNet.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Hogyan tanítottuk ezt? Az általunk készített modellek mindegyike előzetesen képzett volt az imagenet-en. Bár rengeteg adat van, 50 millió kép, de mégis, ha egy imagenetre előre betanított hálózatot veszünk, az jobb eredményt mutatott, mintha egyszerűen a semmiből betanította volna.

Milyen tanítási technikákat alkalmaztunk? Ez a Cosing Annealing with Warm Restarts, amiről kicsit később lesz szó. Ezt a technikát szinte az összes közelmúltbeli versenyemen használom, és ezekkel elég jól edzem a rácsokat, jó minimumot elérni.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Következő Csökkentse a tanulási arányt a fennsíkon. Elkezdi a hálózat képzését, beállít egy bizonyos tanulási sebességet, folytatja a tanítást, és vesztesége fokozatosan konvergál egy bizonyos értékhez. Ellenőrizd ezt, például tíz korszakon keresztül a veszteség egyáltalán nem változott. Valamilyen értékkel csökkenti a tanulási arányt, és folytatja a tanulást. Ismét leesik egy kicsit, konvergál egy bizonyos minimumra, és ismét csökkenti a tanulási sebességet, és így tovább, amíg a hálózat végül konvergál.

A következő egy érdekes technika: Ne csökkentse a tanulási sebességet, növelje a köteg méretét. Van egy cikk ugyanezzel a névvel. Amikor egy hálózatot betanít, nem kell csökkentenie a tanulási sebességet, egyszerűen növelheti a köteg méretét.

Ezt a technikát egyébként Alex Parinov használta. Egy 408-as tétellel kezdte, és amikor a hálózat elérte a platót, egyszerűen megduplázta a köteg méretét stb.

Valójában nem emlékszem, hogy mekkora értéket ért el a kötegmérete, de az az érdekes, hogy a Kaggle-n voltak csapatok, akik ugyanazt a technikát alkalmazták, a kötegszámuk körülbelül 10000 XNUMX. Egyébként a mélytanulás modern keretrendszerei, mint pl. A PyTorch például lehetővé teszi ezt nagyon egyszerűen. Létrehozod a kötegedet, és nem úgy, ahogy van, egészében beküldöd a hálózatba, hanem darabokra osztod, hogy beleférjen a videokártyádba, kiszámolod a gradienseket, majd miután kiszámoltad a gradienst a teljes kötegre, frissíted. a súlyokat.

Ebben a versenyben egyébként a nagy tételméretek továbbra is szerepeltek, mert elég zajosak voltak az adatok, és a nagy tételszám segített a gradiens pontosabb közelítésében.

Az álcímkézést is alkalmazták, többnyire Roman Szolovjov. A teszt adatainak körülbelül felét csoportosan mintavételezte, és az ilyen kötegekre betanította a rácsot.

A képek mérete számított, de tény, hogy rengeteg adatod van, sokáig kell edzened, és ha elég nagy a képméreted, akkor nagyon sokáig fogsz edzeni. De ez nem sokat tett hozzá a végső osztályozó minőségéhez, így érdemes volt valamilyen kompromisszumot alkalmazni. Mi pedig csak a nem túl nagy méretű képeket próbáltuk ki.

Hogyan tanulták meg mindezt? Először kis méretű képek készültek, több korszakot lefuttattak rajtuk, ez elég sok időt vett igénybe. Aztán nagy méretű képeket adtak, betanították a hálózatot, aztán még többet, még többet, hogy ne a semmiből ne képezzék, és ne veszítsenek sok időt.

Az optimalizálókról. SGD-t és Ádámot használtuk. Így sikerült egyetlen modellt kapni, ami 0,941-0,946 sebességet adott a nyilvános ranglistán, ami elég jó.

Ha valamilyen módon összeállítod a modelleket, valahol 0,951 körül fogsz kapni. Ha még egy technikát használsz, 0,954-es végeredményt kapsz a nyilvános táblán, akárcsak mi. De erről majd később. A következőkben elmondom, hogyan szereltük össze a modelleket, és hogyan sikerült ilyen végsebességet elérni.

Következőben a Cosing Heating meleg újraindítással vagy a Sztochasztikus Gradiens Descent meleg újraindítással című részről szeretnék beszélni. Nagyjából elvileg bármilyen optimalizálót használhatsz, de a lényeg a következő: ha csak egy hálózatot betanítasz, és fokozatosan konvergál valami minimumra, akkor minden rendben van, kapsz egy hálózatot, bizonyos hibákat követ el, de kicsit másképp edzheti. Beállít egy kezdeti tanulási sebességet, és fokozatosan csökkenti ezt a képlet szerint. Csökkenti, a hálózat eléri a minimumot, majd menti a súlyokat, és ismét beállítja azt a tanulási sebességet, amely az edzés elején volt, ezáltal valahol feljebb lép ettől a minimumtól, és ismét csökkenti a tanulási arányt.

Így egyszerre több minimumot is meglátogathat, amelyben a vesztesége plusz-mínusz ugyanannyi lesz. De tény, hogy az ilyen súlyokkal rendelkező hálózatok különböző hibákat adnak a dátumon. Átlagolásukkal valamilyen közelítést kap, és nagyobb lesz a sebessége.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Arról, hogyan állítottuk össze modelljeinket. Az előadás elején azt mondtam, hogy figyeljünk a teszt adatmennyiségére és az óraszámra. Ha hozzáadsz 1-et a teszthalmazban szereplő célokhoz, és elosztod az osztályok számával, akkor a 330-as számot kapod, és ezt írták a fórumon - hogy a tesztben az osztályok kiegyensúlyozottak. Ezt lehetne használni.

Ez alapján Roman Soloviev egy mérőszámmal állt elő, mi Proxy Score-nak neveztük el, ami elég jól korrelált a ranglistával. A lényeg: csinálsz egy jóslatot, vedd fel az első 1-et az előrejelződből, és megszámolod az egyes osztályokhoz tartozó objektumok számát. Ezután vonjon ki 330-at minden értékből, és adja össze a kapott abszolút értékeket.

A következő értékeket kaptuk. Ez segített abban, hogy ne szondázó ranglistát hozzunk létre, hanem lokálisan érvényesítsük, és az együtteseinkhez együtthatókat válasszunk.

Egy együttessel ekkora sebességet lehetne elérni. Mi mást tehetnék? Tegyük fel, hogy felhasználta azt az információt, hogy a tesztben szereplő osztályok kiegyensúlyozottak.

Az egyensúlyozás más volt. Példa az egyikre — egyensúlyozva az első helyezést elért srácoktól.

Mit csináltunk? Az egyensúlyozásunk meglehetősen egyszerű volt, Jevgenyij Babakhnin javasolta. Előrejelzéseinket először a legjobb 1 szerint rendeztük, és belőlük választottuk ki a jelölteket – úgy, hogy az osztályok száma ne haladja meg a 330-at. Egyes osztályok esetében azonban 330-nál kevesebb előrejelzőt kapunk. Rendben, rendezzünk a legjobb 2 és a legjobb 3 szerint is. , és mi is kiválasztjuk a jelölteket.

Miben különbözött a mérlegünk az első hely mérlegétől? Iteratív megközelítést alkalmaztak, a legnépszerűbb osztályt választották, és ennek az osztálynak a valószínűségét kis számmal csökkentették, amíg az osztály már nem lett a legnépszerűbb. A következő legnépszerűbb osztályba kerültünk. Így tovább csökkentették őket, amíg az összes osztály száma egyenlővé nem vált.

Mindenki plusz-mínusz egy megközelítést alkalmazott a vonathálózatokhoz, de nem mindenki használta a kiegyensúlyozást. Egyensúlyozással mehetsz aranyba, ha szerencséd volt, akkor pénzbe.

Hogyan készítsünk elő egy dátumot? Mindenki ugyanúgy elődolgozta a dátumot, pluszt vagy mínuszt – kézműves funkciókat készítve, különböző körvonalszínekkel próbált időzítést kódolni stb. Erről Alekszej Nozdrin-Plotnitsky beszélt, aki a 8. helyet szerezte meg.

Kézírásos rajzok osztályozása. Jelentés a Yandexben

Ő másképp csinálta. Azt mondta, hogy ezek a kézműves funkcióid nem működnek, nem kell ezt megtenned, a hálózatodnak mindezt meg kell tanulnia magától. Ehelyett olyan tanulási modulokat dolgozott ki, amelyek előre feldolgozták az Ön adatait. Előfeldolgozás nélkül dobta beléjük az eredeti adatokat – pontkoordinátákat és időzítéseket.

Aztán a koordináták alapján vette a különbséget, és az időzítések alapján átlagolta az egészet. És előállt egy meglehetősen hosszú mátrixszal. Többször alkalmazott 1D konvolúciót, hogy egy 64xn méretű mátrixot kapjon, ahol n az összes pont száma, és 64-et készít annak érdekében, hogy a kapott mátrixot bármely konvolúciós hálózat rétegébe táplálja, amely elfogadja a csatornák számát. - 64. kapott egy 64xn-es mátrixot, majd ebből kellett létrehozni egy bizonyos méretű tenzort, hogy a csatornák száma 64 legyen. Minden X, Y pontot normalizált a 0 és 32 közötti tartományban, hogy létrehozzon egy 32x32 méretű tenzor. Nem tudom, miért akart 32x32-t, egyszerűen így történt. És ezen a koordinátán elhelyezte ennek a mátrixnak a 64xn méretű töredékét. Így végül egy 32x32x64-es tenzor lett, amelyet tovább helyezhetett a konvolúciós neurális hálózatába. Csak ennyit akartam mondani.

Forrás: will.com

Hozzászólás