Classificació dels dibuixos manuscrits. Informe a Yandex

Fa uns mesos, els nostres companys de Google gastat a Kaggle un concurs per crear un classificador d'imatges obtingudes en el sensacional el joc "Dibuix ràpid!" L'equip, que incloïa el desenvolupador Yandex Roman Vlasov, va ocupar el quart lloc de la competició. A la formació d'aprenentatge automàtic de gener, Roman va compartir les idees del seu equip, la implementació final del classificador i les pràctiques interessants dels seus oponents.


- Hola a tots! Em dic Roma Vlasov, avui us parlaré de Quick, Draw! Repte de reconeixement de doodle.

Classificació dels dibuixos manuscrits. Informe a Yandex

Hi havia cinc persones al nostre equip. Em vaig incorporar just abans de la data límit de fusió. Vam tenir mala sort, vam ser sacsejats una mica, però ens van sacsejar de la posició de diners, i ells van ser sacsejats de la posició d'or. I vam ocupar un honorable quart lloc.

(Durant la competició, els equips es van observar en una classificació, que es va formar a partir dels resultats mostrats en una part del conjunt de dades proposat. La qualificació final, al seu torn, es va formar en una altra part del conjunt de dades. Això es fa així. que els participants de la competició no ajustin els seus algorismes a dades específiques. Per tant, a la final, en canviar d'una classificació, les posicions es tremolen una mica (de l'anglès shake up - to mix): amb altres dades, el resultat pot resultar ser diferent. L'equip de Roman va ser el primer entre els tres primers. En aquest cas, els tres primers són els diners, zona de qualificació monetària, ja que només els tres primers llocs van rebre un premi en metàl·lic. Després de la sacsejada, l'equip ja estava en quart lloc. De la mateixa manera, l'altre equip va perdre la victòria, la posició d'or. - Ed.)

Classificació dels dibuixos manuscrits. Informe a Yandex

La competició també va ser important perquè Evgeniy Babakhnin va rebre un gran mestre, Ivan Sosin va rebre un mestre, Roman Soloviev va romandre com a gran mestre, Alex Parinov va rebre un mestre, em vaig convertir en un expert i ara ja sóc un mestre.

Classificació dels dibuixos manuscrits. Informe a Yandex

Què és això Quick, Draw? Aquest és un servei de Google. Google tenia l'objectiu de popularitzar la IA i amb aquest servei volia mostrar com funcionen les xarxes neuronals. Vas allà, fes clic a Dibuixem, i apareix una pàgina nova on se't diu: dibuixa una ziga-zaga, tens 20 segons per fer-ho. Estàs intentant dibuixar una ziga-zaga en 20 segons, com aquí, per exemple. Si ho aconsegueixes, la xarxa diu que és una ziga-zaga i segueixes endavant. Només hi ha sis imatges d'aquest tipus.

Si la xarxa de Google no va reconèixer el que vas dibuixar, es va col·locar una creu a la tasca. Més endavant us explicaré què significarà en el futur si un dibuix és reconegut per la xarxa o no.

Aquest servei va reunir un nombre bastant elevat d'usuaris i es van registrar totes les imatges que dibuixaven els usuaris.

Classificació dels dibuixos manuscrits. Informe a Yandex

Hem aconseguit recollir gairebé 50 milions d'imatges. A partir d'això, es va formar la data del tren i de la prova per a la nostra competició. Per cert, la quantitat de dades de la prova i el nombre de classes es destaquen en negreta per un motiu. Us explicaré una mica més endavant.

El format de les dades era el següent. Aquestes no són només imatges RGB, sinó, a grans trets, un registre de tot el que va fer l'usuari. La paraula és el nostre objectiu, el codi del país és d'on prové l'autor del doodle, la marca de temps és el temps. L'etiqueta reconeguda només mostra si la xarxa ha reconegut la imatge de Google o no. I el dibuix en si és una seqüència, una aproximació d'una corba que l'usuari dibuixa amb punts. I els horaris. Aquest és el temps des de l'inici del dibuix.

Classificació dels dibuixos manuscrits. Informe a Yandex

Les dades es van presentar en dos formats. Aquest és el primer format i el segon es simplifica. Van retallar els temps a partir d'aquí i van aproximar aquest conjunt de punts amb un conjunt de punts més petit. Per a això van utilitzar Algorisme de Douglas-Pecker. Teniu un gran conjunt de punts que simplement s'aproximen a una línia recta, però de fet podeu aproximar aquesta línia amb només dos punts. Aquesta és la idea de l'algorisme.

Les dades es van distribuir de la següent manera. Tot és uniforme, però hi ha alguns casos atípics. Quan vam resoldre el problema, no el vam mirar. El més important és que no hi havia classes que fossin realment poques, no havíem de fer mostrejos ponderats i sobremostreig de dades.

Classificació dels dibuixos manuscrits. Informe a Yandex

Com eren les imatges? Aquesta és la classe "avió" i exemples d'ella amb les etiquetes reconegudes i no reconegudes. La seva proporció era d'1 a 9. Com podeu veure, les dades són força sorolloses. Suposo que és un avió. Si mireu no reconegut, en la majoria dels casos només és soroll. Fins i tot algú va intentar escriure "avió", però pel que sembla en francès.

La majoria dels participants simplement van agafar quadrícules, van dibuixar dades d'aquesta seqüència de línies com a imatges RGB i les van llançar a la xarxa. Vaig dibuixar aproximadament de la mateixa manera: vaig agafar una paleta de colors, vaig dibuixar la primera línia amb un color, que estava al principi d'aquesta paleta, l'última línia amb una altra, que estava al final de la paleta, i entre ells. Vaig interpolar a tot arreu utilitzant aquesta paleta. Per cert, això va donar un millor resultat que si dibuixeu com a la primera diapositiva, només en negre.

Altres membres de l'equip, com Ivan Sosin, van provar enfocaments lleugerament diferents del dibuix. Amb un canal simplement va dibuixar una imatge grisa, amb un altre canal va dibuixar cada traç amb un gradient de principi a fi, del 32 al 255, i amb el tercer canal va dibuixar un gradient sobre tots els traços del 32 al 255.

Una altra cosa interessant és que Alex Parinov va penjar informació a la xarxa mitjançant el codi de país.

Classificació dels dibuixos manuscrits. Informe a Yandex

La mètrica utilitzada a la competència és Precisió mitjana mitjana. Quina és l'essència d'aquesta mètrica per a la competència? Podeu donar tres prediccions, i si no hi ha una predicció correcta en aquestes tres, obteniu 0. Si n'hi ha una de correcta, llavors es té en compte el seu ordre. I el resultat objectiu es comptarà com a 1 dividit per l'ordre de la vostra predicció. Per exemple, heu fet tres predictors, i el correcte és el primer, després dividiu 1 per 1 i obteniu 1. Si el predictor és correcte i el seu ordre és 2, dividiu 1 per 2, obteniu 0,5. Bé, etc.

Classificació dels dibuixos manuscrits. Informe a Yandex

Amb el preprocessament de dades -com dibuixar imatges i així successivament- ens hem decidit una mica. Quines arquitectures hem utilitzat? Hem intentat utilitzar arquitectures grans com PNASNet, SENet i arquitectures ja clàssiques com SE-Res-NeXt, cada cop entren més a nous concursos. També hi havia ResNet i DenseNet.

Classificació dels dibuixos manuscrits. Informe a Yandex

Classificació dels dibuixos manuscrits. Informe a Yandex

Classificació dels dibuixos manuscrits. Informe a Yandex

Com hem ensenyat això? Tots els models que vam agafar van ser entrenats prèviament a imagenet. Tot i que hi ha moltes dades, 50 milions d'imatges, però tot i així, si agafes una xarxa prèviament entrenada a imagenet, donava millors resultats que si simplement l'entrenes des de zero.

Quines tècniques d'ensenyament hem utilitzat? Es tracta de Cosing Annealing amb reinicis càlids, del qual parlaré una mica més endavant. Aquesta és una tècnica que faig servir en gairebé totes les meves competicions recents, i amb elles resulta entrenar força bé les graelles, per aconseguir un bon mínim.

Classificació dels dibuixos manuscrits. Informe a Yandex

Següent Redueix la taxa d'aprenentatge a Plateau. Comences a entrenar la xarxa, estableixes una taxa d'aprenentatge determinada, segueixes ensenyant-la i la teva pèrdua convergeix gradualment cap a un valor determinat. Comproveu això, per exemple, durant deu èpoques la pèrdua no ha canviat gens. Reduïu la vostra taxa d'aprenentatge en un cert valor i continueu aprenent. Torna a baixar una mica, convergeix com a mínim i torneu a reduir la taxa d'aprenentatge, i així successivament, fins que la vostra xarxa finalment convergeix.

A continuació, hi ha una tècnica interessant: no disminueixi la taxa d'aprenentatge, augmenta la mida del lot. Hi ha un article amb el mateix nom. Quan entreneu una xarxa, no cal que reduïu la taxa d'aprenentatge, simplement podeu augmentar la mida del lot.

Aquesta tècnica, per cert, va ser utilitzada per Alex Parinov. Va començar amb un lot igual a 408, i quan la seva xarxa va arribar a un altiplà, simplement va duplicar la mida del lot, etc.

De fet, no recordo quin valor va assolir la seva mida del lot, però el que és interessant és que hi havia equips a Kaggle que utilitzaven la mateixa tècnica, la seva mida del lot era d'uns 10000. Per cert, els marcs moderns per a l'aprenentatge profund, com ara PyTorch, per exemple, us permet fer-ho molt fàcilment. Genereu el vostre lot i l'envieu a la xarxa no tal com és, en la seva totalitat, sinó que el dividiu en trossos perquè encaixi a la vostra targeta de vídeo, calculeu els gradients i, després d'haver calculat el gradient per a tot el lot, actualitzeu els pesos.

Per cert, les mides de lots grans encara estaven incloses en aquesta competició, perquè les dades eren força sorolloses i una mida de lots gran us va ajudar a aproximar amb més precisió el gradient.

També es va utilitzar el pseudoetiquetatge, utilitzat sobretot per Roman Soloviev. Va mostrar aproximadament la meitat de les dades de la prova per lots i va entrenar la graella en aquests lots.

La mida de les imatges importava, però el fet és que tens moltes dades, has d'entrenar durant molt de temps i, si la mida de la teva imatge és bastant gran, t'entrenaràs durant molt de temps. Però això no va afegir gaire a la qualitat del vostre classificador final, de manera que valia la pena utilitzar algun tipus de compensació. I només vam provar imatges que no eren molt grans.

Com es va aprendre tot? Primer, es van fer fotografies de mida petita, es van executar diverses èpoques, això va ocupar força temps. Després es van donar imatges de gran mida, es va entrenar la xarxa, després encara més, encara més, per no entrenar-la des de zero i no perdre molt de temps.

Sobre els optimitzadors. Hem utilitzat SGD i Adam. D'aquesta manera es va poder aconseguir un únic model, que donava una velocitat de 0,941-0,946 a la classificació pública, la qual cosa és força bona.

Si agrupeu els models d'alguna manera, obtindreu al voltant de 0,951. Si utilitzeu una tècnica més, obtindreu una puntuació final de 0,954 al tauler públic, tal com hem aconseguit. Però sobre això més endavant. A continuació us explicaré com vam muntar els models i com vam aconseguir aquesta velocitat final.

A continuació, m'agradaria parlar de Cosing Annealing amb reinicis calents o descens de gradient estocàstic amb reinicis calents. A grans trets, en principi, podeu utilitzar qualsevol optimitzador, però la qüestió és la següent: si entreneu una xarxa i gradualment convergeix al mínim, aleshores tot està bé, obtindreu una xarxa, comet certs errors, però pot entrenar-lo una mica diferent. Establiràs un ritme d'aprenentatge inicial i el baixaràs gradualment segons aquesta fórmula. L'abaixeu, la vostra xarxa s'arriba a un mínim, després deseu els pesos i torneu a establir la taxa d'aprenentatge que hi havia al començament de l'entrenament, augmentant així en algun lloc des d'aquest mínim i baixant de nou la vostra taxa d'aprenentatge.

Així, pots visitar diversos mínims alhora, en els quals la teva pèrdua serà, més o menys, la mateixa. Però el fet és que les xarxes amb aquests pesos donaran diferents errors a la vostra data. Mitjançant-los, obtindreu algun tipus d'aproximació i la vostra velocitat serà més alta.

Classificació dels dibuixos manuscrits. Informe a Yandex

Sobre com vam muntar els nostres models. Al començament de la presentació, vaig dir que prestés atenció a la quantitat de dades de la prova i al nombre de classes. Si afegiu 1 al nombre d'objectius del conjunt de proves i dividiu pel nombre de classes, obtindreu el número 330, i això es va escriure al fòrum: que les classes de la prova estan equilibrades. Això es podria utilitzar.

A partir d'això, Roman Soloviev va idear una mètrica, la vam anomenar Proxy Score, que es correlacionava força bé amb la taula de classificació. La qüestió és: feu una predicció, agafeu el primer dels vostres predictors i compteu el nombre d'objectes per a cada classe. A continuació, resteu 1 de cada valor i sumeu els valors absoluts resultants.

S'han obtingut els valors següents. Això ens va ajudar no a crear una taula de classificació de sondeig, sinó a validar localment i seleccionar coeficients per als nostres conjunts.

Amb un conjunt podríeu aconseguir aquesta velocitat. Què més podria fer? Suposem que heu utilitzat la informació que les classes de la vostra prova estan equilibrades.

L'equilibri era diferent. Un exemple d'un d'ells — equilibri dels nois que van ocupar el primer lloc.

Què hem fet? El nostre equilibri era bastant senzill, va ser suggerit per Evgeny Babakhnin. Primer vam ordenar les nostres prediccions per primers 1 i vam seleccionar candidats entre ells, de manera que el nombre de classes no superava les 330. Però per a algunes classes acabeu amb menys de 330 predictors. D'acord, ordenem també per 2 principals i 3 primers. , i també seleccionarem candidats.

Com es va diferenciar el nostre equilibri de l'equilibri del primer lloc? Van utilitzar un enfocament iteratiu, agafant la classe més popular i disminuint les probabilitats d'aquesta classe en un nombre petit fins que aquesta classe ja no era la més popular. Hem fet la següent classe més popular. Així que els van continuar rebaixant fins que el nombre de totes les classes es va igualar.

Tothom va utilitzar més o menys un enfocament per entrenar les xarxes, però no tothom va utilitzar l'equilibri. Amb l'equilibri, podríeu anar a l'or i, si teníeu sort, a diners.

Com preprocessar una data? Tothom va processar prèviament la data, més o menys, de la mateixa manera: fent funcions artesanals, intentant codificar cronometratges amb diferents colors de traç, etc. Alexey Nozdrin-Plotnitsky, que va ocupar el vuitè lloc, va parlar d'això.

Classificació dels dibuixos manuscrits. Informe a Yandex

Ho va fer de manera diferent. Va dir que totes aquestes característiques fetes a mà no funcionen, no cal que ho feu, la vostra xarxa hauria d'aprendre tot això per si sola. I, en canvi, va crear mòduls d'aprenentatge que preprocessaren les vostres dades. Va llançar-hi les dades originals sense preprocessament: coordenades puntuals i temps.

Llavors va prendre la diferència en funció de les coordenades i va fer una mitjana de tot en funció dels temps. I se li va ocórrer una matriu força llarga. Li va aplicar la convolució 1D diverses vegades per obtenir una matriu de mida 64xn, on n és el nombre total de punts, i es fa 64 per alimentar la matriu resultant a la capa de qualsevol xarxa convolucional, que accepta el nombre de canals. - 64. va obtenir una matriu de 64xn, a partir d'aquesta va ser necessari crear un tensor d'alguna mida perquè el nombre de canals fos igual a 64. Va normalitzar tots els punts X, Y en el rang de 0 a 32 per crear un tensor de mida 32x32. No sé per què volia 32x32, va passar així. I en aquesta coordenada va col·locar un fragment d'aquesta matriu de mida 64xn. Així que va acabar amb un tensor de 32x32x64 que podríeu posar més a la vostra xarxa neuronal convolucional. Això és tot el que volia dir.

Font: www.habr.com

Afegeix comentari