Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Disa muaj më parë, kolegët tanë nga Google shpenzuar në Kaggle një konkurs për të krijuar një klasifikues për imazhet e marra në sensacion loja "Shpejt, vizatoni!" Ekipi, i cili përfshinte zhvilluesin Yandex Roman Vlasov, zuri vendin e katërt në konkurs. Në trajnimin e mësimit të makinerive të janarit, Roman ndau idetë e ekipit të tij, zbatimin përfundimtar të klasifikuesit dhe praktikat interesante të kundërshtarëve të tij.


- Pershendetje te gjitheve! Emri im është Roma Vlasov, sot do t'ju tregoj për Quick, Draw! Sfida e njohjes së Doodle.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Në ekipin tonë ishin pesë persona. Unë u bashkua menjëherë përpara afatit të bashkimit. Ne patëm fat, u tronditëm pak, por ne u tronditëm nga pozicioni i parave, dhe ata u tronditën nga pozicioni i artë. Dhe ne zura vendin e katërt të nderuar.

(Gjatë konkursit, ekipet vëzhguan veten në një vlerësim, i cili u formua në bazë të rezultateve të treguara në një pjesë të grupit të të dhënave të propozuar. Vlerësimi përfundimtar, nga ana tjetër, u formua në një pjesë tjetër të grupit të të dhënave. Kjo është bërë kështu që pjesëmarrësit e konkursit të mos i përshtatin algoritmet e tyre me të dhëna specifike. Prandaj, në finale, kur kaloni midis vlerësimeve, pozicionet lëkunden pak (nga anglishtja shake up - për përzierje): në të dhëna të tjera, rezultati mund të dalë Ekipi i Romanit ishte i pari në tre të parët. Në këtë rast, tre të parat janë zona e vlerësimit parash, pasi vetëm tre vendet e para u shpërblyen me një çmim në para. Pas ndryshimit, ekipi ishte tashmë në vendin e katërt. Në të njëjtën mënyrë, skuadra tjetër humbi fitoren, pozitën e artë. - Ed.)

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Konkurrenca ishte gjithashtu domethënëse në atë që Evgeniy Babakhnin mori një mjeshtër të madh, Ivan Sosin mori një mjeshtër, Roman Soloviev mbeti një mjeshtër i madh, Alex Parinov mori një mjeshtër, unë u bëra ekspert dhe tani jam tashmë mjeshtër.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Çfarë është kjo Quick, Draw? Ky është një shërbim nga Google. Google kishte për qëllim të popullarizonte AI dhe me këtë shërbim donte të tregonte se si funksionojnë rrjetet nervore. Shkoni atje, klikoni Le të vizatojmë dhe shfaqet një faqe e re ku ju thuhet: vizatoni një zigzag, keni 20 sekonda për ta bërë këtë. Ju po përpiqeni të vizatoni një zigzag në 20 sekonda, si këtu, për shembull. Nëse keni sukses, rrjeti thotë se është një zigzag dhe ju vazhdoni. Janë vetëm gjashtë fotografi të tilla.

Nëse rrjeti i Google nuk arriti të njohë atë që keni vizatuar, një kryq vendoset në detyrë. Më vonë do t'ju tregoj se çfarë do të thotë në të ardhmen nëse një vizatim njihet nga rrjeti apo jo.

Ky shërbim mblodhi një numër mjaft të madh përdoruesish dhe të gjitha fotografitë që përdoruesit vizatuan u regjistruan.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Ne arritëm të mbledhim pothuajse 50 milionë imazhe. Nga kjo u formua treni dhe data e testimit për konkursin tonë. Nga rruga, sasia e të dhënave në test dhe numri i klasave janë theksuar me shkronja të zeza për një arsye. Unë do t'ju tregoj për to pak më vonë.

Formati i të dhënave ishte si më poshtë. Këto nuk janë vetëm imazhe RGB, por, përafërsisht, një regjistër i gjithçkaje që ka bërë përdoruesi. Fjala është objektivi ynë, kodi i vendit është nga është autori i shkrepjes, vula kohore është koha. Etiketa e njohur thjesht tregon nëse rrjeti e ka njohur imazhin nga Google apo jo. Dhe vetë vizatimi është një sekuencë, një përafrim i një kurbë që përdoruesi vizaton me pika. Dhe oraret. Kjo është koha nga fillimi i vizatimit të figurës.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Të dhënat u prezantuan në dy formate. Ky është formati i parë, dhe i dyti është i thjeshtuar. Ata ndërprenë kohën nga atje dhe e përafruan këtë grup pikash me një grup më të vogël pikësh. Për këtë kanë përdorur Algoritmi Douglas-Pecker. Ju keni një grup të madh pikash që thjesht përafrojnë një vijë të drejtë, por në fakt ju mund ta përafroni këtë vijë me vetëm dy pika. Kjo është ideja e algoritmit.

Të dhënat u shpërndanë si më poshtë. Gjithçka është uniforme, por ka disa të jashtzakonshme. Kur e zgjidhëm problemin, nuk e shikuam. Gjëja kryesore është se nuk kishte klasa që ishin vërtet të pakta, nuk duhej të bënim kampionë të peshuar dhe mbikampionim të të dhënave.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Si dukeshin fotot? Kjo është klasa "aeroplan" dhe shembuj prej saj me etiketat e njohura dhe të panjohura. Raporti i tyre ishte diku rreth 1 me 9. Siç mund ta shihni, të dhënat janë mjaft të zhurmshme. Unë mendoj se është një aeroplan. Nëse shikoni nuk njihet, në shumicën e rasteve është vetëm zhurmë. Dikush madje u përpoq të shkruante "aeroplan", por me sa duket në frëngjisht.

Shumica e pjesëmarrësve thjesht morën rrjete, vizatuan të dhëna nga kjo sekuencë rreshtash si fotografi RGB dhe i hodhën ato në rrjet. Unë vizatova përafërsisht në të njëjtën mënyrë: mora një gamë ngjyrash, vizatova vijën e parë me një ngjyrë, e cila ishte në fillim të kësaj palete, rreshtin e fundit me një tjetër, që ishte në fund të paletës dhe midis tyre Kam ndërthurur kudo duke përdorur këtë paletë. Nga rruga, kjo dha një rezultat më të mirë sesa nëse vizatoni si në rrëshqitjen e parë - vetëm në të zezë.

Anëtarët e tjerë të ekipit, si Ivan Sosin, provuan qasje paksa të ndryshme në vizatim. Me një kanal ai thjesht vizatoi një figurë gri, me një kanal tjetër ai vizatoi çdo goditje me një gradient nga fillimi në fund, nga 32 në 255, dhe me kanalin e tretë ai vizatoi një gradient mbi të gjitha goditjet nga 32 në 255.

Një tjetër gjë interesante është se Alex Parinov ngarkoi informacion në rrjet duke përdorur kodin e vendit.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Metrika e përdorur në konkurs është Precisioni mesatar mesatar. Cili është thelbi i kësaj metrike për konkurrencën? Ju mund të jepni tre predika dhe nëse nuk ka një predik të saktë në këto tre, atëherë merrni 0. Nëse ka një të saktë, atëherë merret parasysh rendi i tij. Dhe rezultati i synuar do të llogaritet si 1 pjesëtuar me rendin e parashikimit tuaj. Për shembull, keni bërë tre parashikues, dhe i sakti është i pari, pastaj pjesëtoni 1 me 1 dhe merrni 1. Nëse parashikuesi është i saktë dhe rendi i tij është 2, atëherë pjesëtoni 1 me 2, merrni 0,5. Epo, etj.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Me parapërpunimin e të dhënave - si të vizatoni fotografi e kështu me radhë - kemi vendosur pak. Çfarë arkitekturash kemi përdorur? Ne u përpoqëm të përdorim arkitektura të majme si PNASNet, SENet dhe arkitektura të tilla tashmë klasike si SE-Res-NeXt, ato po hyjnë gjithnjë e më shumë në gara të reja. Kishte gjithashtu ResNet dhe DenseNet.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Si e mësuam këtë? Të gjitha modelet që morëm ishin të trajnuar paraprakisht në imagenet. Edhe pse ka shumë të dhëna, 50 milionë imazhe, por megjithatë, nëse merrni një rrjet të trajnuar paraprakisht në imagenet, ai tregoi rezultate më të mira sesa nëse thjesht e stërvite atë nga e para.

Çfarë teknikash mësimore kemi përdorur? Ky është Cosing Annealing with Warm Restarts, për të cilin do të flas pak më vonë. Kjo është një teknikë që e përdor pothuajse në të gjitha garat e mia të fundit dhe me to më rezulton të stërvitësh mjaft mirë rrjetat, për të arritur një minimum të mirë.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Tjetër Ulja e shkallës së mësimit në Plateau. Ju filloni të trajnoni rrjetin, vendosni një normë të caktuar mësimi, vazhdoni ta mësoni atë dhe humbja juaj gradualisht konvergon në një vlerë të caktuar. Ju kontrolloni këtë, për shembull, për dhjetë epoka humbja nuk ka ndryshuar fare. Ju ulni shkallën tuaj të të mësuarit me një vlerë dhe vazhdoni të mësoni. Ai bie pak përsëri, konvergon në një minimum, dhe ju përsëri ulni shkallën e të mësuarit, e kështu me radhë, derisa rrjeti juaj më në fund të konvergojë.

Tjetra është një teknikë interesante: Mos e prishni shkallën e të mësuarit, rrisni madhësinë e grupit. Ekziston një artikull me të njëjtin emër. Kur trajnoni një rrjet, nuk keni nevojë të zvogëloni shkallën e të mësuarit, thjesht mund të rrisni madhësinë e grupit.

Kjo teknikë, nga rruga, u përdor nga Alex Parinov. Ai filloi me një grup të barabartë me 408, dhe kur rrjeti i tij arriti në një pllajë, ai thjesht dyfishoi madhësinë e grupit, etj.

Në fakt, nuk më kujtohet se çfarë vlere arriti madhësia e grupit të tij, por ajo që është interesante është se kishte ekipe në Kaggle që përdorën të njëjtën teknikë, madhësia e grupit të tyre ishte rreth 10000. Meqë ra fjala, kornizat moderne për të mësuarit e thellë, si p.sh. PyTorch, për shembull, ju lejon ta bëni këtë shumë lehtë. Ju gjeneroni grupin tuaj dhe e dërgoni atë në rrjet jo siç është, në tërësinë e tij, por e ndani në copa në mënyrë që të përshtatet në kartën tuaj video, llogaritni gradientët dhe pasi të keni llogaritur gradientin për të gjithë grupin, përditësoni peshat.

Nga rruga, madhësitë e grupeve të mëdha ishin ende të përfshira në këtë konkurs, sepse të dhënat ishin mjaft të zhurmshme dhe një madhësi e madhe e grupit ju ndihmoi të përafroni më saktë gradientin.

Është përdorur edhe pseudo-etiketimi, i përdorur kryesisht nga Roman Soloviev. Ai mori rreth gjysmën e të dhënave nga testi në grupe dhe trajnoi rrjetin në grupe të tilla.

Madhësia e fotografive kishte rëndësi, por fakti është se keni shumë të dhëna, duhet të stërviteni për një kohë të gjatë, dhe nëse madhësia e fotografisë tuaj është mjaft e madhe, atëherë do të stërviteni për një kohë shumë të gjatë. Por kjo nuk shtoi shumë në cilësinë e klasifikuesit tuaj përfundimtar, kështu që ia vlente të përdorni një lloj kompensimi. Dhe ne provuam vetëm fotografi që nuk ishin shumë të mëdha në përmasa.

Si u mësua gjithçka? Së pari, u bënë fotografi me përmasa të vogla, u bënë disa epoka mbi to, kjo mori mjaft kohë. Më pas u dhanë foto me përmasa të mëdha, u trajnua rrjeti, pastaj edhe më shumë, edhe më shumë, për të mos e trajnuar nga e para dhe për të mos humbur shumë kohë.

Rreth optimizuesve. Ne përdorëm SGD dhe Adam. Në këtë mënyrë u bë e mundur të merrej një model i vetëm, i cili jepte një shpejtësi prej 0,941-0,946 në tabelën e drejtuesve të publikut, gjë që është mjaft e mirë.

Nëse i bashkoni modelet në një farë mënyre, do të arrini diku rreth 0,951. Nëse përdorni një teknikë më shumë, do të merrni një rezultat përfundimtar prej 0,954 në tabelën publike, ashtu siç morëm ne. Por më shumë për këtë më vonë. Më pas do t'ju tregoj se si i montuam modelet dhe si arritëm të arrinim një shpejtësi të tillë përfundimtare.

Më pas do të doja të flisja për Pjekjen Cosing me Rinisje të Ngrohta ose Zbritje Stochastic Gradient me Rinisje të Ngrohta. Duke folur përafërsisht, në parim, mund të përdorni çdo optimizues, por çështja është kjo: nëse thjesht trajnoni një rrjet dhe gradualisht ai konvergon në një minimum, atëherë gjithçka është në rregull, do të merrni një rrjet, ai bën gabime të caktuara, por ju mund ta stërvitni pak më ndryshe. Ju do të vendosni një normë fillestare të të mësuarit dhe gradualisht do ta ulni atë sipas kësaj formule. Ju e ulni atë, rrjeti juaj vjen në një minimum, pastaj kurseni peshat dhe vendosni përsëri shkallën e të mësuarit që ishte në fillim të trajnimit, duke shkuar kështu diku lart nga ky minimum dhe përsëri ulni shkallën tuaj të të mësuarit.

Kështu, ju mund të vizitoni disa minimume njëherësh, në të cilat humbja juaj do të jetë, plus ose minus, e njëjtë. Por fakti është se rrjetet me këto pesha do të japin gabime të ndryshme në datën tuaj. Duke i mesatarizuar ato, do të merrni një lloj përafrimi dhe shpejtësia juaj do të jetë më e lartë.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Rreth asaj se si i montuam modelet tona. Në fillim të prezantimit thashë t'i kushtoj vëmendje sasisë së të dhënave në test dhe numrit të klasave. Nëse shtoni 1 në numrin e objektivave në grupin e testit dhe ndani me numrin e klasave, do të merrni numrin 330, dhe kjo ishte shkruar në forum - që klasat në test janë të balancuara. Kjo mund të përdoret.

Bazuar në këtë, Roman Soloviev doli me një metrikë, ne e quajtëm atë Proxy Score, e cila lidhej mjaft mirë me tabelën e drejtuesve. Çështja është: ju bëni një parashikim, merrni 1-shin e parë të parashikuesve tuaj dhe numëroni numrin e objekteve për secilën klasë. Më pas, zbritni 330 nga secila vlerë dhe mblidhni vlerat absolute që rezultojnë.

Janë marrë vlerat e mëposhtme. Kjo na ndihmoi të mos krijonim një tabelë provuese, por të vërtetonim në nivel lokal dhe të zgjidhnim koeficientët për ansamblet tona.

Me një ansambël mund të arrije një shpejtësi të tillë. Çfarë tjetër mund të bëja? Supozoni se keni përdorur informacionin se klasat në testin tuaj janë të balancuara.

Balancimi ishte i ndryshëm. Një shembull i njërit prej tyre — balancimi nga djemtë që zunë vendin e parë.

çfarë bëmë? Balancimi ynë ishte mjaft i thjeshtë, u sugjerua nga Evgeny Babakhnin. Ne fillimisht i renditëm parashikimet tona sipas top 1-së dhe zgjodhëm kandidatët prej tyre - në mënyrë që numri i klasave të mos i kalonte 330. Por për disa klasa përfundoni me më pak se 330 parashikues. Mirë, le të renditim gjithashtu sipas 2 më të mirëve dhe 3 të parëve , dhe do të përzgjedhim edhe kandidatët.

Si ndryshonte balancimi ynë nga balancimi i vendit të parë? Ata përdorën një qasje përsëritëse, duke marrë klasën më të njohur dhe duke ulur probabilitetet për atë klasë me një numër të vogël derisa ajo klasë të mos ishte më më e popullarizuara. Ne morëm klasën tjetër më të njohur. Kështu ata vazhduan t'i ulnin derisa numri i të gjitha klasave u bë i barabartë.

Të gjithë përdorën qasje plus ose minus një për rrjetet e trenave, por jo të gjithë përdorën balancimin. Duke përdorur balancimin, mund të shkoni në ar, dhe nëse do të ishit me fat, atëherë në para.

Si të përpunoni paraprakisht një datë? Të gjithë e përpunuan paraprakisht datën, plus ose minus, në të njëjtën mënyrë - duke bërë veçori të punuara me dorë, duke u përpjekur të kodonin oraret me ngjyra të ndryshme goditjeje, etj. Alexey Nozdrin-Plotnitsky, i cili zuri vendin e 8-të, foli për këtë.

Klasifikimi i vizatimeve të shkruara me dorë. Raportoni në Yandex

Ai e bëri atë ndryshe. Ai tha që të gjitha këto veçori të tua të punuara me dorë nuk funksionojnë, nuk ke nevojë ta bësh këtë, rrjeti juaj duhet t'i mësojë të gjitha këto vetë. Dhe në vend të kësaj, ai doli me module mësimi që përpunonin paraprakisht të dhënat tuaja. Ai hodhi të dhënat origjinale në to pa u parapërpunuar - koordinatat e pikave dhe koha.

Më pas ai mori diferencën në bazë të koordinatave dhe mesatarizoi të gjitha në bazë të kohës. Dhe ai doli me një matricë mjaft të gjatë. Ai aplikoi konvolucionin 1D në të disa herë për të marrë një matricë me madhësi 64xn, ku n është numri i përgjithshëm i pikave dhe 64 është bërë për të ushqyer matricën që rezulton në shtresën e çdo rrjeti konvolucional, i cili pranon numrin e kanaleve - 64. ai mori një matricë 64xn, pastaj nga kjo ishte e nevojshme të krijohej një tensor i një madhësie në mënyrë që numri i kanaleve të ishte i barabartë me 64. Ai normalizoi të gjitha pikat X, Y në rangun nga 0 në 32 për të krijuar një tensor me përmasa 32x32. Nuk e di pse ai donte 32x32, thjesht ndodhi kështu. Dhe në këtë koordinatë ai vendosi një fragment të kësaj matrice me madhësi 64xn. Kështu që sapo përfundoi me një tensor 32x32x64 që mund ta vendosni më tej në rrjetin tuaj nervor konvolucionist. Kjo është gjithçka që doja të thoja.

Burimi: www.habr.com

Shto një koment