Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Fyrir nokkrum mánuðum síðan, samstarfsmenn okkar frá Google eytt á Kaggle keppni um að búa til flokkara fyrir myndir sem fengnar eru í tilkomumiklu leikinn "Fljótt, teiknaðu!" Liðið, sem innihélt Yandex verktaki Roman Vlasov, náði fjórða sæti í keppninni. Á vélanámsþjálfuninni í janúar deildi Roman hugmyndum liðsins síns, lokaútfærslu flokkarans og áhugaverðum aðferðum andstæðinga sinna.


- Hæ allir! Ég heiti Roma Vlasov, í dag mun ég segja þér frá Quick, Draw! Doodle Recognition Challenge.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Það voru fimm manns í liði okkar. Ég gekk til liðs rétt fyrir sameiningarfrestinn. Við vorum óheppnir, við vorum hristir aðeins, en við vorum hristir úr peningastöðunni, og þeir voru hristir úr gullstöðunni. Og við náðum sæmilega fjórða sæti.

(Á meðan á keppni stóð fylgdust liðin með sjálfum sér í einkunn, sem var mynduð út frá niðurstöðum sem sýndar voru á einum hluta fyrirhugaðs gagnasafns. Lokaeinkunn var aftur á móti mynduð á öðrum hluta gagnasafnsins. Þetta er gert þannig. að þátttakendur keppninnar aðlaga ekki reiknirit sín að tilteknum gögnum.Þess vegna, í úrslitum, þegar skipt er á milli einkunna, hristast stöðurnar aðeins (frá ensku shake up - to mix): á öðrum gögnum getur niðurstaðan orðið að vera öðruvísi. Lið Romans var fyrst í þremur efstu sætunum. Í þessu tilviki eru þrjú efstu sætin peningar, peningalegt einkunnasvæði, þar sem aðeins fyrstu þrjú sætin voru veitt peningaverðlaun. Eftir hristinguna var liðið þegar í fjórða sæti. Að sama skapi tapaði hitt liðið sigrinum, gullstöðunni. - Ritstj.)

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Keppnin var líka mikilvæg að því leyti að Evgeniy Babakhnin fékk stórmeistara, Ivan Sosin fékk meistara, Roman Soloviev var áfram stórmeistari, Alex Parinov fékk meistara, ég varð sérfræðingur og nú er ég nú þegar orðinn meistari.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Hvað er þetta Quick, Draw? Þetta er þjónusta frá Google. Google hafði það markmið að gera gervigreind vinsæl og vildi með þessari þjónustu sýna hvernig taugakerfi virka. Þú ferð þangað, smellir á Let's draw, og ný síða birtist þar sem þér er sagt: teiknaðu sikksakk, þú hefur 20 sekúndur til að gera þetta. Þú ert að reyna að teikna sikksakk á 20 sekúndum, eins og hér, til dæmis. Ef þér tekst það segir netið að þetta sé sikksakk og þú heldur áfram. Það eru aðeins sex slíkar myndir.

Ef netkerfi Google þekkti ekki það sem þú teiknaðir var kross settur á verkefnið. Seinna mun ég segja þér hvað það mun þýða í framtíðinni hvort teikning er viðurkennd af netinu eða ekki.

Þessi þjónusta safnaði tiltölulega miklum fjölda notenda og allar myndir sem notendur teiknuðu voru skráðar.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Við náðum að safna tæplega 50 milljónum mynda. Upp úr þessu myndaðist lestar- og prófdagurinn fyrir keppnina okkar. Við the vegur, magn gagna í prófinu og fjöldi flokka eru auðkenndar feitletruð af ástæðu. Ég segi þér frá þeim aðeins síðar.

Gagnasniðið var sem hér segir. Þetta eru ekki bara RGB myndir, heldur, í grófum dráttum, skrá yfir allt sem notandinn gerði. Orð er markmið okkar, landskóði er þaðan sem höfundur krúttunnar er, tímastimpill er tími. Viðurkenndi merkimiðinn sýnir bara hvort netið þekkti myndina frá Google eða ekki. Og teikningin sjálf er röð, nálgun á feril sem notandinn teiknar með punktum. Og tímasetningar. Þetta er tíminn frá því að byrjað er að teikna myndina.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Gögnin voru sett fram á tveimur sniðum. Þetta er fyrsta sniðið og annað er einfaldað. Þeir klipptu út tímasetningar þaðan og nálguðu þetta punktasett með minni punktasetti. Til þess notuðu þeir Douglas-Pecker reiknirit. Þú ert með stórt sett af punktum sem einfaldlega nálgast beina línu, en í raun er hægt að nálgast þessa línu með aðeins tveimur punktum. Þetta er hugmyndin að reikniritinu.

Gögnunum var dreift sem hér segir. Allt er einsleitt, en það eru nokkrar útlínur. Þegar við leystum vandamálið horfðum við ekki á það. Aðalatriðið er að það voru engir flokkar sem voru í raun fáir, við þurftum ekki að gera vegin sýnataka og ofstaka gagna.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Hvernig litu myndirnar út? Þetta er „flugvél“ flokkurinn og dæmi úr honum með merkingum viðurkennd og óþekkt. Hlutfall þeirra var einhvers staðar í kringum 1 til 9. Eins og þú sérð eru gögnin nokkuð hávær. Ég myndi giska á að þetta væri flugvél. Ef þú horfir á ekki þekkt, í flestum tilfellum er það bara hávaði. Einhver reyndi meira að segja að skrifa „flugvél“ en greinilega á frönsku.

Flestir þátttakendur tóku einfaldlega rist, drógu gögn úr þessari línuröð sem RGB myndir og hentu þeim inn á netið. Ég teiknaði á svipaðan hátt: Ég tók litatöflu, teiknaði fyrstu línuna með einum lit, sem var í upphafi þessarar litatöflu, síðustu línuna með öðrum, sem var í lok pallettunnar, og á milli þeirra Ég interpolated alls staðar með því að nota þessa litatöflu. Þetta gaf að vísu betri útkomu en ef þú teiknar eins og á fyrstu glærunni - bara í svörtu.

Aðrir liðsmenn, eins og Ivan Sosin, reyndu aðeins öðruvísi aðferðir við að teikna. Með einni rás teiknaði hann einfaldlega gráa mynd, með annarri rás teiknaði hann hvert högg með halla frá upphafi til enda, frá 32 til 255, og með þriðju rásinni teiknaði hann halla yfir öll högg frá 32 til 255.

Annað áhugavert er að Alex Parinov hlóð upp upplýsingum á netið með því að nota landskóða.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Mælingin sem notuð er í keppninni er meðalnákvæmni. Hver er kjarninn í þessum mælikvarða fyrir samkeppni? Þú getur gefið þrjár forspár, og ef það er engin rétt forspá í þessum þremur, þá færðu 0. Ef það er rétt, þá er tekið tillit til röð hennar. Og markniðurstaðan verður talin sem 1 deilt með röð spá þinnar. Til dæmis, þú gerðir þrjá spádóma og sá rétti er sá fyrsti, þá deilir þú 1 með 1 og færð 1. Ef spámaðurinn er réttur og röð hans er 2, þá deilirðu 1 með 2, færðu 0,5. Jæja, o.s.frv.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Með forvinnslu gagna - hvernig á að teikna myndir og svo framvegis - höfum við ákveðið smá. Hvaða arkitektúr notuðum við? Við reyndum að nota feitan arkitektúr eins og PNASNet, SENet og svona þegar klassískan arkitektúr eins og SE-Res-NeXt, þeir fara í auknum mæli inn í nýjar keppnir. Það voru líka ResNet og DenseNet.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Hvernig kenndum við þetta? Allar gerðir sem við tókum voru forþjálfaðar á imagenet. Þó að það sé mikið af gögnum, 50 milljónir mynda, en samt, ef þú tekur net sem er forþjálfað á imagenet, sýndi það betri árangur en ef þú einfaldlega þjálfaðir það frá grunni.

Hvaða kennsluaðferðum notuðum við? Þetta er Cosing Annealing með Warm Restarts, sem ég mun tala um aðeins síðar. Þetta er tækni sem ég nota í næstum öllum síðustu keppnum mínum og með þeim reynist hún þjálfa ristina nokkuð vel, til að ná góðu lágmarki.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Næsta Lækka námshlutfall á hálendi. Þú byrjar að þjálfa netið, setur ákveðinn námshraða, heldur áfram að kenna það og tapið þitt rennur smám saman saman í ákveðið gildi. Þú athugar þetta, til dæmis, fyrir tíu tímabil hefur tapið ekkert breyst. Þú lækkar námshlutfallið um eitthvað gildi og heldur áfram að læra. Það lækkar aðeins aftur, rennur saman í einhverju lágmarki og þú lækkar aftur námshraðann, og svo framvegis, þar til netið þitt loksins rennur saman.

Næst er áhugaverð tækni: Ekki minnka námshraðann, auka lotustærðina. Það er grein með sama nafni. Þegar þú þjálfar net þarftu ekki að draga úr námshraðanum, þú getur einfaldlega aukið lotustærðina.

Þessi tækni, við the vegur, var notuð af Alex Parinov. Hann byrjaði með lotu sem jafngildir 408 og þegar netið hans náði einhverri hásléttu tvöfaldaði hann einfaldlega lotustærðina o.s.frv.

Reyndar man ég ekki hvaða gildi lotustærð hans náði, en það sem er athyglisvert er að það voru lið á Kaggle sem notuðu sömu tækni, lotustærð þeirra var um 10000. Við the vegur, nútíma ramma fyrir djúpt nám, s.s. PyTorch, til dæmis, gerir þér kleift að gera þetta mjög auðveldlega. Þú býrð til lotuna þína og sendir hann inn á netið ekki eins og hann er í heild sinni, heldur skiptir honum í bita þannig að hann passi inn í skjákortið þitt, reiknar út halla og eftir að þú hefur reiknað hallann fyrir alla lotuna uppfærirðu lóðin.

Við the vegur, stórar lotu stærðir voru enn innifalinn í þessari keppni, vegna þess að gögnin voru nokkuð hávær, og stór lotustærð hjálpaði þér að ná nákvæmari áætlun um hallann.

Gervimerkingar voru einnig notaðar, aðallega notaðar af Roman Soloviev. Hann tók um helming gagna úr prófinu í lotum og þjálfaði ristina á slíkum lotum.

Stærðin á myndunum skipti máli en staðreyndin er sú að þú ert með mikið af gögnum, þú þarft að æfa í langan tíma og ef myndastærðin er frekar stór þá æfir þú mjög lengi. En þetta bætti ekki miklu við gæði lokaflokkarans þíns, svo það var þess virði að nota einhvers konar málamiðlun. Og við prófuðum bara myndir sem voru ekki mjög stórar.

Hvernig var þetta allt lært? Fyrst voru teknar litlar myndir, keyrðar voru nokkrar tímabil á þær, þetta tók töluverðan tíma. Síðan voru gefnar stórar myndir, netið var þjálfað, svo enn meira, jafnvel meira, til að þjálfa það ekki frá grunni og eyða ekki miklum tíma.

Um fínstillingu. Við notuðum SGD og Adam. Þannig var hægt að fá eitt líkan, sem gaf hraðann 0,941-0,946 á opinberu stigatöflunni, sem er nokkuð gott.

Ef þú sameinar módelin á einhvern hátt færðu einhvers staðar í kringum 0,951. Ef þú notar eina tækni í viðbót færðu lokaeinkunnina 0,954 á opinberu borði, alveg eins og við fengum. En meira um það síðar. Næst mun ég segja þér hvernig við settum saman módelin og hvernig okkur tókst að ná slíkum lokahraða.

Næst langar mig að tala um Cosing Annealing með Warm Restarts eða Stochastic Gradient Descent with Warm Restarts. Í grófum dráttum, í grundvallaratriðum, geturðu notað hvaða fínstillingu sem er, en málið er þetta: ef þú þjálfar bara eitt net og smám saman rennur það saman að einhverju lágmarki, þá er allt í lagi, þú færð eitt net, það gerir ákveðin mistök, en þú getur þjálfað það aðeins öðruvísi. Þú stillir upphafsnámshraða og lækkar það smám saman samkvæmt þessari formúlu. Þú lækkar það, netið þitt kemur í eitthvað lágmark, þá spararðu lóðin og stillir aftur námshlutfallið sem var í upphafi þjálfunar og fer þar með einhvers staðar upp úr þessu lágmarki og lækkar aftur námshlutfallið.

Þannig geturðu heimsótt nokkur lágmark í einu, þar sem tap þitt verður, plús eða mínus, það sama. En staðreyndin er sú að net með þessum lóðum munu gefa mismunandi villur á dagsetningunni þinni. Með því að taka meðaltal þeirra færðu einhvers konar nálgun og hraði þinn verður meiri.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Um hvernig við settum saman módelin okkar. Í upphafi kynningarinnar sagði ég að huga að gagnamagni í prófinu og fjölda bekkja. Ef þú bætir 1 við fjölda skotmarka í prófunarsettinu og deilir með fjölda bekkja þá færðu töluna 330 og þetta var skrifað á spjallborðið - að bekkirnir í prófinu séu í jafnvægi. Þetta væri hægt að nota.

Út frá þessu kom Roman Soloviev með mæligildi, við kölluðum það Proxy Score, sem samsvaraði nokkuð vel við stigatöfluna. Aðalatriðið er: þú spáir, tekur efstu 1 af spámunum þínum og telur fjölda hluta fyrir hvern flokk. Næst skaltu draga 330 frá hverju gildi og leggja saman heildargildin sem myndast.

Eftirfarandi gildi fengust. Þetta hjálpaði okkur að búa ekki til leitarlista, heldur að sannreyna staðbundið og velja stuðla fyrir hópa okkar.

Með ensemble væri hægt að ná slíkum hraða. Hvað gæti ég gert annað? Segjum að þú hafir notað upplýsingarnar um að bekkirnir í prófinu þínu séu í jafnvægi.

Jafnvægið var öðruvísi. Dæmi um einn þeirra — jafnvægi frá strákunum sem tóku fyrsta sætið.

Hvað gerðum við? Jafnvægi okkar var frekar einfalt, það var lagt til af Evgeny Babakhnin. Við flokkuðum spár okkar fyrst eftir efstu 1 og völdum frambjóðendur úr þeim - þannig að fjöldi flokka fór ekki yfir 330. En fyrir suma flokka endar þú með færri en 330 spámenn. Allt í lagi, við skulum líka flokka eftir efstu 2 og efstu 3 , og við munum einnig velja umsækjendur.

Hvernig var jafnvægi okkar frábrugðið því sem var í fyrsta sæti? Þeir notuðu endurtekna nálgun, tóku vinsælasta flokkinn og minnkuðu líkurnar fyrir þann flokk um einhvern lítinn fjölda þar til sá flokkur var ekki lengur vinsælasti. Við tókum næsta vinsælasta námskeiðið. Þeir héldu því áfram að lækka þær þar til fjöldi allra flokka varð jafn.

Allir notuðu plús eða mínus eina nálgun við lestarkerfi, en ekki allir notuðu jafnvægi. Með því að nota jafnvægi gætirðu farið í gull, og ef þú varst heppinn, þá í peninga.

Hvernig á að forvinna dagsetningu? Allir forunnu dagsetninguna, plús eða mínus, á sama hátt - gerðu handgerða eiginleika, reyndu að umrita tímasetningar með mismunandi högglitum osfrv. Alexey Nozdrin-Plotnitsky, sem náði 8. sæti, talaði um þetta.

Flokkun handskrifaðra teikninga. Skýrsla í Yandex

Hann gerði það öðruvísi. Hann sagði að allir þessir handsmíðaðir eiginleikar þínir virka ekki, þú þarft ekki að gera það, netið þitt ætti að læra allt þetta á eigin spýtur. Og í staðinn kom hann með námseiningar sem forunnu gögnin þín. Hann henti upprunalegu gögnunum inn í þau án forvinnslu - punktahnit og tímasetningar.

Svo tók hann mismuninn út frá hnitunum og tók meðaltalið allt út frá tímasetningum. Og hann kom með frekar langt fylki. Hann beitti 1D snúningi á það nokkrum sinnum til að fá fylki af stærðinni 64xn, þar sem n er heildarfjöldi punkta, og 64 er gerður til að fæða fylkið sem myndast í lag hvers falsnets sem tekur við fjölda rása - 64. hann fékk 64xn fylki, þá var nauðsynlegt að búa til tensor af einhverri stærð þannig að fjöldi rása væri jafn 64. Hann staðlaði alla punkta X, Y á bilinu frá 0 til 32 til að búa til a tensor af stærð 32x32. Ég veit ekki af hverju hann vildi 32x32, það gerðist bara þannig. Og við þetta hnit setti hann brot af þessu fylki af stærð 64xn. Svo það endaði bara með 32x32x64 tensor sem þú gætir sett lengra inn í snúningstauganetið þitt. Það var allt sem ég vildi segja.

Heimild: www.habr.com

Bæta við athugasemd