Clasificación dos debuxos manuscritos. Informe en Yandex

Hai uns meses, os nosos compañeiros de Google gastado en Kaggle un concurso para crear un clasificador de imaxes obtidas no sensacional o xogo "Rápido, debuxa!" O equipo, que incluía o desenvolvedor de Yandex Roman Vlasov, ocupou o cuarto lugar na competición. No adestramento de aprendizaxe automática de xaneiro, Roman compartiu as ideas do seu equipo, a implementación final do clasificador e prácticas interesantes dos seus opoñentes.


- Ola a todos! Chámome Roma Vlasov, hoxe falareivos de Quick, Draw! Desafío de recoñecemento de garabatos.

Clasificación dos debuxos manuscritos. Informe en Yandex

Había cinco persoas no noso equipo. Sumeime xusto antes do prazo de fusión. Non tivemos sorte, sacudíronnos un pouco, pero sacudíronnos desde a posición de diñeiro, e eles foron sacudidos da posición de ouro. E levamos un honorable cuarto posto.

(Durante a competición, os equipos observáronse a si mesmos nunha valoración, que se formou a partir dos resultados mostrados nunha parte do conxunto de datos proposto. A valoración final, pola súa banda, formouse noutra parte do conxunto de datos. Así se fai. que os participantes da competición non axusten os seus algoritmos a datos específicos. Polo tanto, nas finais, ao cambiar de clasificación, as posicións tremétense un pouco (do inglés shake up - to mix): noutros datos, o resultado pode resultar ser diferente.O equipo de Román quedou primeiro entre os tres primeiros.Neste caso, os tres primeiros son os cartos, zona de valoración monetaria, xa que só os tres primeiros postos recibiron un premio en metálico.Tras a sacudida, o equipo xa estaba en cuarto lugar. Do mesmo xeito, o outro equipo perdeu a vitoria, a posición de ouro. - Ed.)

Clasificación dos debuxos manuscritos. Informe en Yandex

A competición tamén foi significativa xa que Evgeniy Babakhnin recibiu un gran mestre, Ivan Sosin recibiu un mestre, Roman Soloviev seguiu sendo un gran mestre, Alex Parinov recibiu un mestre, convertínme nun experto e agora xa son un mestre.

Clasificación dos debuxos manuscritos. Informe en Yandex

Que é isto Quick, Draw? Este é un servizo de Google. Google tiña o obxectivo de popularizar a IA e con este servizo quería mostrar como funcionan as redes neuronais. Vai alí, fai clic en Imos debuxar, e aparece unha nova páxina onde che indican: debuxa un zigzag, tes 20 segundos para facelo. Estás tentando debuxar un zigzag en 20 segundos, como aquí, por exemplo. Se o logras, a rede di que é un zigzag e segues adiante. Só hai seis imaxes deste tipo.

Se a rede de Google non recoñeceu o que debuxou, colocouse unha cruz na tarefa. Máis adiante vouvos dicir o que significará no futuro se un debuxo é recoñecido pola rede ou non.

Este servizo reuniu un número bastante grande de usuarios e rexistráronse todas as imaxes que debuxaron os usuarios.

Clasificación dos debuxos manuscritos. Informe en Yandex

Conseguimos recoller case 50 millóns de imaxes. A partir deste, formáronse a data do tren e da proba para a nosa competición. Por certo, a cantidade de datos da proba e o número de clases destacan en negriña por un motivo. Xa vos contarei un pouco máis tarde.

O formato de datos era o seguinte. Non se trata só de imaxes RGB, senón, en liñas xerais, dun rexistro de todo o que fixo o usuario. A palabra é o noso obxectivo, o código do país é de onde é o autor do doodle, a marca de tempo é o tempo. A etiqueta recoñecida só mostra se a rede recoñeceu a imaxe de Google ou non. E o propio debuxo é unha secuencia, unha aproximación dunha curva que o usuario debuxa con puntos. E horarios. Este é o tempo desde o inicio do debuxo.

Clasificación dos debuxos manuscritos. Informe en Yandex

Os datos presentáronse en dous formatos. Este é o primeiro formato, e o segundo é simplificado. Recortaron os tempos a partir de aí e aproximaron este conxunto de puntos cun conxunto de puntos máis pequeno. Para iso empregaron Algoritmo de Douglas-Pecker. Tes un gran conxunto de puntos que simplemente se aproximan a unha liña recta, pero de feito podes aproximar esta liña con só dous puntos. Esta é a idea do algoritmo.

Os datos distribuíronse do seguinte xeito. Todo é uniforme, pero hai algúns valores atípicos. Cando resolvemos o problema, non o miramos. O principal é que non había clases que fosen moi poucas, non tiñamos que facer mostradores ponderados e sobremostraxe de datos.

Clasificación dos debuxos manuscritos. Informe en Yandex

Como eran as imaxes? Esta é a clase "avión" e exemplos dela coas etiquetas recoñecidas e non recoñecidas. A súa proporción era de 1 a 9. Como podes ver, os datos son bastante ruidosos. Supoño que é un avión. Se miras non recoñecido, na maioría dos casos é só ruído. Alguén mesmo intentou escribir "avión", pero ao parecer en francés.

A maioría dos participantes simplemente tomaron cuadrículas, debuxaron datos desta secuencia de liñas como imaxes RGB e lanzáronos á rede. Debuxen aproximadamente do mesmo xeito: collín unha paleta de cores, debuxei a primeira liña cunha cor, que estaba ao comezo desta paleta, a última liña con outra, que estaba ao final da paleta, e entre elas. Interpolei en todas partes usando esta paleta. Por certo, isto deu un resultado mellor que se debuxases como na primeira diapositiva, só en negro.

Outros membros do equipo, como Ivan Sosin, probaron enfoques lixeiramente diferentes para o debuxo. Cunha canle simplemente debuxou unha imaxe gris, con outra canle debuxou cada trazo cun gradiente de principio a fin, de 32 a 255, e coa terceira canle debuxou un gradiente sobre todos os trazos de 32 a 255.

Outra cousa interesante é que Alex Parinov subiu información á rede usando o código de país.

Clasificación dos debuxos manuscritos. Informe en Yandex

A métrica utilizada na competición é a precisión media media. Cal é a esencia desta métrica para a competencia? Podes dar tres prediccións, e se non hai ningunha predicción correcta nestes tres, entón obtén 0. Se hai unha correcta, entón terase en conta a súa orde. E o resultado obxectivo contarase como 1 dividido pola orde da túa predición. Por exemplo, fixeches tres predictores, e o correcto é o primeiro, despois divides 1 por 1 e obtén 1. Se o predictor é correcto e a súa orde é 2, divídese 1 por 2, obtén 0,5. Ben, etc.

Clasificación dos debuxos manuscritos. Informe en Yandex

Co preprocesamento de datos, como facer imaxes, etc., decidimos un pouco. Que arquitecturas utilizamos? Tentamos utilizar arquitecturas gordas como PNASNet, SENet e arquitecturas tan clásicas como SE-Res-NeXt, cada vez entran máis en novas competicións. Tamén houbo ResNet e DenseNet.

Clasificación dos debuxos manuscritos. Informe en Yandex

Clasificación dos debuxos manuscritos. Informe en Yandex

Clasificación dos debuxos manuscritos. Informe en Yandex

Como ensinamos isto? Todos os modelos que levamos foron adestrados previamente en imagenet. Aínda que hai moitos datos, 50 millóns de imaxes, pero aínda así, se tomas unha rede previamente adestrada en imagenet, mostrou mellores resultados que se simplemente a adestrases desde cero.

Que técnicas didácticas utilizamos? Trátase de Cosing Annealing con Warm Restarts, do que falarei un pouco máis tarde. Esta é unha técnica que utilizo en case todas as miñas competicións recentes, e con elas resulta adestrar bastante ben as grellas, para conseguir un bo mínimo.

Clasificación dos debuxos manuscritos. Informe en Yandex

Seguinte Reducir a taxa de aprendizaxe en Plateau. Comezas a adestrar a rede, estableces unha determinada taxa de aprendizaxe, continúas ensinándoa e a túa perda converxe gradualmente a un determinado valor. Comprobas isto, por exemplo, durante dez épocas a perda non cambiou nada. Reduces algo a túa taxa de aprendizaxe e continúas aprendendo. Volve a baixar un pouco, converxe como mínimo e volves baixar a taxa de aprendizaxe, e así sucesivamente, ata que finalmente converxe a túa rede.

A continuación é unha técnica interesante: non decaer a taxa de aprendizaxe, aumentar o tamaño do lote. Hai un artigo co mesmo nome. Cando adestras unha rede, non tes que reducir a taxa de aprendizaxe, simplemente podes aumentar o tamaño do lote.

Esta técnica, por certo, foi utilizada por Alex Parinov. Comezou cun lote igual a 408, e cando a súa rede alcanzou algunha meseta, simplemente duplicou o tamaño do lote, etc.

De feito, non recordo o valor que alcanzou o seu tamaño de lote, pero o interesante é que había equipos en Kaggle que usaban a mesma técnica, o seu tamaño de lote era duns 10000 XNUMX. Por certo, marcos modernos para a aprendizaxe profunda, como PyTorch, por exemplo, permíteche facelo moi facilmente. Xeras o teu lote e envíao á rede non como está, na súa totalidade, senón que divídeo en anacos para que encaixe na túa tarxeta de vídeo, calcula os gradientes e, despois de calcular o gradiente para todo o lote, actualiza os pesos.

Por certo, neste concurso aínda se incluían grandes lotes, porque os datos eran bastante ruidosos e un gran tamaño de lote axudouche a aproximar con máis precisión o gradiente.

Tamén se utilizou o seudoetiquetado, utilizado principalmente por Roman Soloviev. Mostrou preto da metade dos datos da proba en lotes e adestrou a grella en tales lotes.

O tamaño das imaxes importaba, pero o feito é que tes moitos datos, necesitas adestrar durante moito tempo e, se o tamaño da túa imaxe é bastante grande, adestrarás durante moito tempo. Pero isto non engadiu moito á calidade do teu clasificador final, polo que valeu a pena usar algún tipo de compensación. E só probamos imaxes de tamaño non moi grande.

Como se aprendeu todo? Primeiro tomáronse fotos de pequeno tamaño, realizáronse varias épocas con elas, isto levou moito tempo. Despois déronse imaxes de gran tamaño, adestrouse a rede, despois aínda máis, aínda máis, para non adestrala desde cero e non perder moito tempo.

Sobre os optimizadores. Usamos SGD e Adam. Deste xeito foi posible conseguir un único modelo, que daba unha velocidade de 0,941-0,946 na clasificación pública, o que é bastante bo.

Se combinas os modelos dalgún xeito, conseguirás uns 0,951. Se utilizas unha técnica máis, obterás unha puntuación final de 0,954 no taboleiro público, tal e como obtivemos nós. Pero máis diso máis tarde. A continuación vouvos contar como montamos os modelos, e como conseguimos conseguir esa velocidade final.

A continuación gustaríame falar de Cosing Annealing con Warm Restarts ou Stochastic Gradient Descent con Warm Restarts. En liñas xerais, en principio, podes usar calquera optimizador, pero a cuestión é esta: se só adestras unha rede e gradualmente converxe ao mínimo, entón todo está ben, obterás unha rede, comete certos erros, pero pode adestralo un pouco diferente. Establecerá unha taxa de aprendizaxe inicial e baixará gradualmente segundo esta fórmula. Báixao, a túa rede chega ao mínimo, despois gardas os pesos e volves establecer a taxa de aprendizaxe que estaba ao comezo do adestramento, subindo así a algún lugar a partir deste mínimo e baixando de novo a túa taxa de aprendizaxe.

Así, podes visitar varios mínimos á vez, nos que a túa perda será, máis ou menos, a mesma. Pero o caso é que as redes con estes pesos darán erros diferentes na túa data. Ao promedialos, obterás algún tipo de aproximación e a túa velocidade será maior.

Clasificación dos debuxos manuscritos. Informe en Yandex

Sobre como montamos os nosos modelos. Ao comezo da presentación, dixen que fixese atención na cantidade de datos da proba e no número de clases. Se engades 1 ao número de obxectivos do conxunto de probas e divides polo número de clases, obterás o número 330, e isto foi escrito no foro: que as clases da proba están equilibradas. Isto podería ser usado.

En base a isto, Roman Soloviev elaborou unha métrica, chamámola Proxy Score, que se correlacionou bastante coa táboa de clasificación. A cuestión é: fas unha predición, tomas o primeiro dos teus preditores e contas o número de obxectos para cada clase. A continuación, resta 1 de cada valor e suma os valores absolutos resultantes.

Obtivéronse os seguintes valores. Isto axudounos a non crear unha táboa de clasificación de sondaxe, senón a validar localmente e seleccionar coeficientes para os nosos conxuntos.

Cun conxunto poderías conseguir tal velocidade. Que máis podería facer? Supoña que utilizaches a información de que as clases da túa proba están equilibradas.

O equilibrio foi diferente. Un exemplo dun deles - Equilibrio dos mozos que ocuparon o primeiro lugar.

Que fixemos? O noso equilibrio foi bastante sinxelo, foi suxerido por Evgeny Babakhnin. Primeiro clasificamos as nosas predicións polo primeiro e seleccionamos candidatos entre eles, de xeito que o número de clases non superase as 1. Pero para algunhas clases acabas con menos de 330 predictores. Está ben, clasifiquemos tamén polos 330 principais e os 2 principais. , e tamén seleccionaremos candidatos.

En que se diferenciaba o noso equilibrio do primeiro lugar? Usaron un enfoque iterativo, tomando a clase máis popular e diminuíndo as probabilidades para esa clase nun número pequeno ata que esa clase xa non era a máis popular. Levamos a seguinte clase máis popular. Así que seguiron baixando ata que o número de todas as clases se igualou.

Todos utilizaron un enfoque de máis ou menos un para adestrar redes, pero non todos usaron o equilibrio. Usando o equilibrio, poderías ir ao ouro e, se tiveses sorte, ao diñeiro.

Como preprocesar unha data? Todos preprocesaron a data, máis ou menos, do mesmo xeito: facendo funcións artesanais, tentando codificar tempos con diferentes cores de trazo, etc. Isto é exactamente o que falou Alexey Nozdrin-Plotnitsky, que ocupou o oitavo lugar.

Clasificación dos debuxos manuscritos. Informe en Yandex

Fíxoo doutro xeito. Dixo que todas estas túas funcións artesanais non funcionan, non necesitas facelo, a túa rede debería aprender todo isto por si mesma. E no seu lugar, creou módulos de aprendizaxe que preprocesaban os teus datos. Botoulles os datos orixinais sen procesar previamente: coordenadas de puntos e temporizacións.

Despois tomou a diferenza en función das coordenadas e fixo unha media de todo en función dos tempos. E veu cunha matriz bastante longa. Aplicoulle a convolución 1D varias veces para obter unha matriz de tamaño 64xn, onde n é o número total de puntos, e 64 faise co fin de alimentar a matriz resultante á capa de calquera rede convolucional, que acepta o número de canles. - 64. obtivo unha matriz de 64xn, entón a partir desta foi necesario crear un tensor dalgún tamaño para que o número de canles fose igual a 64. Normalizou todos os puntos X, Y no intervalo de 0 a 32 para crear un tensor de tamaño 32x32. Non sei por que quería 32x32, pasou así. E nesta coordenada colocou un fragmento desta matriz de tamaño 64xn. Entón, acabou cun tensor de 32x32x64 que poderías poñer máis lonxe na túa rede neuronal convolucional. Iso é todo o que quería dicir.

Fonte: www.habr.com

Engadir un comentario