Clasificarea desenelor scrise de mână. Raportați în Yandex

Acum câteva luni, colegii noștri de la Google a petrecut pe Kaggle o competiție pentru crearea unui clasificator pentru imaginile obținute în senzațional jocul "Remiza rapida!" Echipa, care a inclus dezvoltatorul Yandex Roman Vlasov, a ocupat locul patru în competiție. La antrenamentul de învățare automată din ianuarie, Roman a împărtășit ideile echipei sale, implementarea finală a clasificatorului și practicile interesante ale adversarilor săi.


- Salutare tuturor! Ma numesc Roma Vlasov, astazi o sa va povestesc despre Quick, Draw! Provocare de recunoaștere a Doodle-ului.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Erau cinci oameni în echipa noastră. M-am alăturat chiar înainte de termenul limită de fuziune. Am avut ghinion, am fost zguduiți puțin, dar am fost zdruncinați din poziția banilor, iar ei au fost zdruncinați din poziția aur. Și am luat un loc al patrulea onorabil.

(În timpul competiției, echipele s-au observat într-un rating, care a fost format pe baza rezultatelor afișate pe o parte a setului de date propus. Evaluarea finală, la rândul său, a fost formată pe o altă parte a setului de date. Acest lucru se face astfel. că participanții la competiție nu își ajustează algoritmii la date specifice.De aceea, în finală, la comutarea între evaluări, pozițiile se zguduie puțin (din engleză shake up - to mix): pe alte date, rezultatul poate apărea sa fie diferit.Echipa lui Roman a fost prima in primii trei.In acest caz, primii trei sunt zona de rating monetar, intrucat doar primele trei locuri au primit un premiu in bani.Dupa zdruncinare, echipa era deja in locul patru. La fel, cealaltă echipă a pierdut victoria, poziția de aur. - Ed.)

Clasificarea desenelor scrise de mână. Raportați în Yandex

Competiția a fost, de asemenea, semnificativă prin faptul că Evgeniy Babahnin a primit un mare maestru, Ivan Sosin a primit un maestru, Roman Soloviev a rămas mare maestru, Alex Parinov a primit un maestru, am devenit expert și acum sunt deja maestru.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Ce este acest Quick, Draw? Acesta este un serviciu de la Google. Google a avut scopul de a populariza AI și cu acest serviciu a vrut să arate cum funcționează rețelele neuronale. Mergeți acolo, faceți clic pe Să desenăm și apare o pagină nouă unde vi se spune: desenați un zigzag, aveți 20 de secunde pentru a face acest lucru. Încercați să desenați un zig-zag în 20 de secunde, ca aici, de exemplu. Dacă reușești, rețeaua spune că este în zig-zag și mergi mai departe. Există doar șase astfel de imagini.

Dacă rețeaua Google nu a reușit să recunoască ceea ce ați desenat, a fost plasată o cruce pe sarcină. Mai târziu vă voi spune ce va însemna în viitor dacă un desen este recunoscut de rețea sau nu.

Acest serviciu a adunat un număr destul de mare de utilizatori, iar toate imaginile pe care utilizatorii le-au desenat au fost înregistrate.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Am reușit să colectăm aproape 50 de milioane de imagini. Din aceasta s-a format data trenului și a probei pentru competiția noastră. Apropo, cantitatea de date din test și numărul de clase sunt evidențiate cu caractere aldine dintr-un motiv. Vă voi povesti despre ele puțin mai târziu.

Formatul datelor a fost următorul. Acestea nu sunt doar imagini RGB, ci, aproximativ vorbind, un jurnal cu tot ceea ce a făcut utilizatorul. Cuvântul este ținta noastră, codul de țară este de unde provine autorul doodle-ului, marca temporală este timpul. Eticheta recunoscută arată doar dacă rețeaua a recunoscut sau nu imaginea de la Google. Și desenul în sine este o secvență, o aproximare a unei curbe pe care utilizatorul o desenează cu puncte. Și timpii. Acesta este timpul de la începutul desenului.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Datele au fost prezentate în două formate. Acesta este primul format, iar al doilea este simplificat. Au tăiat timpii de acolo și au aproximat acest set de puncte cu un set mai mic de puncte. Pentru aceasta au folosit Algoritmul Douglas-Pecker. Aveți un set mare de puncte care aproximează pur și simplu o linie dreaptă, dar de fapt puteți aproxima această linie cu doar două puncte. Aceasta este ideea algoritmului.

Datele au fost distribuite după cum urmează. Totul este uniform, dar există câteva valori aberante. Când am rezolvat problema, nu ne-am uitat la ea. Principalul lucru este că nu existau clase care să fie cu adevărat puține, nu trebuia să facem mostre ponderate și supraeșantionare a datelor.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Cum arătau pozele? Aceasta este clasa „avion” și exemple din ea cu etichetele recunoscute și nerecunoscute. Raportul lor a fost undeva în jur de 1 la 9. După cum puteți vedea, datele sunt destul de zgomotoase. Bănuiesc că este un avion. Dacă te uiți la nerecunoscut, în cele mai multe cazuri este doar zgomot. Cineva a încercat chiar să scrie „avion”, dar se pare că în franceză.

Majoritatea participanților pur și simplu au luat grile, au desenat date din această secvență de linii ca imagini RGB și le-au aruncat în rețea. Am desenat aproximativ în același mod: am luat o paletă de culori, am desenat prima linie cu o culoare, care era la începutul acestei palete, ultima linie cu alta, care era la sfârșitul paletei și între ele. Am interpolat peste tot folosind această paletă. Apropo, acest lucru a dat un rezultat mai bun decât dacă desenați ca pe primul diapozitiv - doar în negru.

Alți membri ai echipei, precum Ivan Sosin, au încercat abordări ușor diferite ale desenului. Cu un canal a desenat pur și simplu o imagine gri, cu un alt canal a desenat fiecare contur cu un gradient de la început până la sfârșit, de la 32 la 255, iar cu al treilea canal a desenat un gradient peste toate liniile de la 32 la 255.

Un alt lucru interesant este că Alex Parinov a încărcat informații în rețea folosind codul de țară.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Valoarea utilizată în competiție este Precizia medie medie. Care este esența acestei metrici pentru concurență? Puteți da trei predicții, iar dacă nu există nicio predicție corectă în aceste trei, atunci obțineți 0. Dacă există una corectă, atunci se ia în considerare ordinea acestuia. Și rezultatul țintă va fi numărat ca 1 împărțit la ordinea predicției dvs. De exemplu, ați făcut trei predictori, iar cel corect este primul, apoi împărțiți 1 la 1 și obțineți 1. Dacă predictorul este corect și ordinea lui este 2, atunci împărțiți 1 la 2, obțineți 0,5. Ei bine, etc.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Cu preprocesarea datelor - cum să desenăm imagini și așa mai departe - ne-am hotărât puțin. Ce arhitecturi am folosit? Am încercat să folosim arhitecturi grase precum PNASNet, SENet și arhitecturi deja clasice precum SE-Res-NeXt, care intră din ce în ce mai mult în competiții noi. Au existat și ResNet și DenseNet.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Clasificarea desenelor scrise de mână. Raportați în Yandex

Clasificarea desenelor scrise de mână. Raportați în Yandex

Cum am predat asta? Toate modelele pe care le-am luat au fost pre-instruite pe imagenet. Deși există o mulțime de date, 50 de milioane de imagini, dar totuși, dacă iei o rețea pre-antrenată pe imagenet, a dat rezultate mai bune decât dacă ai fi instruit-o pur și simplu de la zero.

Ce tehnici de predare am folosit? Acesta este Cosing Annealing with Warm Restarts, despre care voi vorbi puțin mai târziu. Aceasta este o tehnică pe care o folosesc în aproape toate competițiile mele recente și cu ele se dovedește a antrena destul de bine grilele, pentru a atinge un minim bun.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Următorul Reduceți rata de învățare pe Plateau. Începi să antrenezi rețeaua, stabilești o anumită rată de învățare, continui să o înveți, iar pierderea ta converge treptat către o anumită valoare. Verificați acest lucru, de exemplu, timp de zece epoci pierderea nu s-a schimbat deloc. Reduceți rata de învățare cu o anumită valoare și continuați să învățați. Scade din nou puțin, converge la un nivel minim și scazi din nou rata de învățare și așa mai departe, până când rețeaua ta converge în sfârșit.

Urmează o tehnică interesantă: nu reduce rata de învățare, crește dimensiunea lotului. Există un articol cu ​​același nume. Când antrenați o rețea, nu trebuie să reduceți rata de învățare, pur și simplu puteți crește dimensiunea lotului.

Această tehnică, de altfel, a fost folosită de Alex Parinov. A început cu un lot egal cu 408, iar când rețeaua sa a ajuns la un platou, a dublat pur și simplu dimensiunea lotului etc.

De fapt, nu-mi amintesc ce valoare a atins dimensiunea lotului său, dar ceea ce este interesant este că au existat echipe pe Kaggle care au folosit aceeași tehnică, dimensiunea lotului lor era de aproximativ 10000 XNUMX. Apropo, cadrele moderne pentru învățarea profundă, cum ar fi PyTorch, de exemplu, vă permite să faceți acest lucru foarte ușor. Vă generați lotul și îl trimiteți în rețea nu așa cum este, în întregime, ci îl împărțiți în bucăți astfel încât să se potrivească în placa dvs. video, calculați gradienții și, după ce ați calculat gradientul pentru întregul lot, actualizați greutățile.

Apropo, dimensiunile mari ale loturilor au fost încă incluse în această competiție, deoarece datele erau destul de zgomotoase, iar o dimensiune mare a lotului te-a ajutat să aproximezi mai precis gradientul.

A fost folosită și pseudoetichetarea, cea mai mare parte folosită de Roman Soloviev. El a prelevat aproximativ jumătate din datele testului în loturi și a antrenat grila pe astfel de loturi.

Dimensiunea pozelor a contat, dar adevărul este că ai o mulțime de date, trebuie să te antrenezi mult timp, iar dacă dimensiunea imaginii tale este destul de mare, atunci te vei antrena foarte mult timp. Dar acest lucru nu a adăugat prea mult la calitatea clasificatorului final, așa că a meritat să folosiți un fel de compromis. Și am încercat doar poze care nu erau foarte mari ca dimensiuni.

Cum s-a învățat totul? Mai întâi s-au făcut poze de dimensiuni mici, s-au rulat mai multe epoci pe ele, acest lucru a durat destul de mult. Apoi s-au dat poze de dimensiuni mari, s-a antrenat rețeaua, apoi și mai mult, chiar mai mult, pentru a nu o antrena de la zero și a nu pierde mult timp.

Despre optimizatori. Am folosit SGD și Adam. În acest fel s-a putut obține un singur model, care a dat o viteză de 0,941-0,946 pe clasamentul public, ceea ce este destul de bun.

Dacă asamblați modelele într-un fel, veți obține undeva în jurul valorii de 0,951. Dacă folosiți încă o tehnică, veți obține un scor final de 0,954 pe tabla publică, la fel ca și noi. Dar mai multe despre asta mai târziu. În continuare vă voi spune cum am asamblat modelele și cum am reușit să atingem o astfel de viteză finală.

În continuare, aș dori să vorbesc despre Cosing Annealing cu Warm Restarts sau Stochastic Gradient Descent cu Warm Restarts. Aproximativ vorbind, în principiu, puteți folosi orice optimizator, dar ideea este aceasta: dacă antrenați o singură rețea și treptat converge la un nivel minim, atunci totul este în regulă, veți obține o singură rețea, face anumite greșeli, dar dvs. îl pot antrena puțin diferit. Veți seta o rată de învățare inițială și o veți reduce treptat conform acestei formule. O cobori, rețeaua ta ajunge la un nivel minim, apoi salvezi greutățile și setezi din nou rata de învățare care era la începutul antrenamentului, mergând astfel undeva în sus de la acest minim și scăzând din nou rata de învățare.

Astfel, poți vizita mai multe minime deodată, în care pierderea ta va fi, în plus sau în minus, aceeași. Dar adevărul este că rețelele cu aceste ponderi vor da erori diferite la data ta. Făcând o medie a acestora, veți obține un fel de aproximare, iar viteza dvs. va fi mai mare.

Clasificarea desenelor scrise de mână. Raportați în Yandex

Despre cum ne-am asamblat modelele. La începutul prezentării, am spus să fim atenți la cantitatea de date din test și la numărul de clase. Dacă adăugați 1 la numărul de ținte din setul de test și împărțiți la numărul de clase, veți obține numărul 330, iar acest lucru a fost scris pe forum - că clasele din test sunt echilibrate. Acest lucru ar putea fi folosit.

Pe baza acestui lucru, Roman Soloviev a venit cu o metrică, noi am numit-o Proxy Score, care se corela destul de bine cu clasamentul. Ideea este: faceți o predicție, luați primul 1 dintre predictori și numărați numărul de obiecte pentru fiecare clasă. Apoi, scădeți 330 din fiecare valoare și adăugați valorile absolute rezultate.

Au fost obținute următoarele valori. Acest lucru ne-a ajutat să nu creăm un clasament de sondare, ci să validăm local și să selectăm coeficienți pentru ansamblurile noastre.

Cu un ansamblu ai putea obține o asemenea viteză. Ce altceva as putea face? Să presupunem că ați folosit informațiile conform cărora clasele din testul dvs. sunt echilibrate.

Echilibrarea a fost diferită. Un exemplu al unuia dintre ei — echilibru față de băieții care au ocupat primul loc.

Ce am facut? Echilibrarea noastră a fost destul de simplă, a fost sugerată de Evgeny Babahnin. Mai întâi ne-am sortat predicțiile în top 1 și am selectat candidați dintre aceștia - astfel încât numărul de clase să nu depășească 330. Dar pentru unele clase ajungi să aibă mai puțin de predictori 330. Bine, hai să sortăm și după primii 2 și primii 3 , și vom selecta și candidați.

Cum a diferit echilibrarea noastră de echilibrarea de pe primul loc? Ei au folosit o abordare iterativă, luând cea mai populară clasă și scăzând probabilitățile pentru acea clasă cu un număr mic până când nu a mai fost cea mai populară clasă. Am luat următoarea clasă cea mai populară. Așa că au continuat să le scadă până când numărul tuturor claselor a devenit egal.

Toată lumea a folosit o abordare în plus sau în minus pentru rețelele de trenuri, dar nu toată lumea a folosit echilibrarea. Folosind echilibrarea, ai putea intra în aur și, dacă ai avea noroc, atunci în bani.

Cum se preprocesează o dată? Toată lumea a preprocesat data, plus sau minus, în același mod - făcând caracteristici artizanale, încercând să codifice cronometraje cu diferite culori de contur etc. Alexey Nozdrin-Plotnitsky, care a ocupat locul 8, a vorbit despre asta.

Clasificarea desenelor scrise de mână. Raportați în Yandex

A făcut-o altfel. El a spus că toate aceste caracteristici ale tale artizanale nu funcționează, nu trebuie să faci asta, rețeaua ta ar trebui să învețe toate acestea de la sine. Și, în schimb, a venit cu module de învățare care preprocesează datele tale. El a aruncat datele originale în ele fără preprocesare - coordonatele punctului și timpii.

Apoi a luat diferența pe baza coordonatelor și a făcut o medie pe toate în funcție de timpi. Și a venit cu o matrice destul de lungă. I-a aplicat convoluția 1D de mai multe ori pentru a obține o matrice de dimensiunea 64xn, unde n este numărul total de puncte, iar 64 este făcut pentru a alimenta matricea rezultată la stratul oricărei rețele convoluționale, care acceptă numărul de canale. - 64. a obținut o matrice de 64xn, apoi din aceasta a fost necesar să se creeze un tensor de o anumită dimensiune, astfel încât numărul de canale să fie egal cu 64. A normalizat toate punctele X, Y în intervalul de la 0 la 32 pentru a crea un tensor de dimensiune 32x32. Nu știu de ce a vrut 32x32, pur și simplu s-a întâmplat așa. Și la această coordonată a plasat un fragment din această matrice de dimensiunea 64xn. Deci s-a terminat cu un tensor de 32x32x64 pe care l-ai putea pune mai departe în rețeaua ta neuronală convoluțională. Atât am vrut să spun.

Sursa: www.habr.com

Adauga un comentariu