Clasificación de dibujos manuscritos. Informe en Yandex

Hace unos meses, nuestros compañeros de Google sostenido en Kaggle un concurso para crear un clasificador de imágenes obtenidas en el sensacional el juego "¡Dibujo rapido!" El equipo, en el que estaba el desarrollador de Yandex, Roman Vlasov, obtuvo el cuarto puesto en la competición. En el entrenamiento de aprendizaje automático de enero, Roman compartió las ideas de su equipo, la implementación final del clasificador y prácticas interesantes de sus oponentes.


- ¡Hola a todos! Mi nombre es Roma Vlasov, hoy les hablaré sobre Quick, Draw! Desafío de reconocimiento de garabatos.

Clasificación de dibujos manuscritos. Informe en Yandex

Había cinco personas en nuestro equipo. Me uní justo antes de la fecha límite de fusión. Tuvimos mala suerte, nos sacudieron un poco, pero a nosotros nos sacaron de la posición de dinero y a ellos de la posición de oro. Y conseguimos un honorable cuarto puesto.

(Durante la competencia, los equipos se observaron en una calificación, que se formó en base a los resultados mostrados en una parte del conjunto de datos propuesto. La calificación final, a su vez, se formó en otra parte del conjunto de datos. Esto se hace así que los participantes de la competencia no ajustan sus algoritmos a datos específicos. Por lo tanto, en la final, al cambiar entre clasificaciones, las posiciones se sacuden un poco (del inglés shake up - mezclar): según otros datos, el resultado puede resultar ser diferente. El equipo de Roman quedó primero entre los tres primeros. En este caso, los tres primeros son dinero, zona de calificación monetaria, ya que solo los tres primeros lugares recibieron un premio en efectivo. Después de la reorganización, el equipo ya estaba en cuarto lugar. De la misma manera, el otro equipo perdió la victoria, la posición de oro. - Ed.)

Clasificación de dibujos manuscritos. Informe en Yandex

La competencia también fue significativa porque Evgeniy Babakhnin recibió el título de gran maestro, Ivan Sosin recibió el título de maestro, Roman Soloviev siguió siendo gran maestro, Alex Parinov recibió el título de maestro, yo me convertí en un experto y ahora ya soy un maestro.

Clasificación de dibujos manuscritos. Informe en Yandex

¿Qué es esto de Quick, Draw? Este es un servicio de Google. Google tenía el objetivo de popularizar la IA y con este servicio quería mostrar cómo funcionan las redes neuronales. Vas allí, haces clic en Vamos a dibujar y aparece una nueva página donde te dicen: dibuja un zigzag, tienes 20 segundos para hacerlo. Estás intentando dibujar un zigzag en 20 segundos, como aquí, por ejemplo. Si lo consigues, la red dice que es un zigzag y sigues adelante. Sólo hay seis imágenes de este tipo.

Si la red de Google no reconocía lo que dibujabas, se ponía una cruz en la tarea. Más adelante os contaré qué significará en el futuro si un dibujo es reconocido por la red o no.

Este servicio reunió a una cantidad bastante grande de usuarios y se registraron todas las imágenes que dibujaron los usuarios.

Clasificación de dibujos manuscritos. Informe en Yandex

Logramos recopilar casi 50 millones de imágenes. A partir de esto se formó la fecha de entrenamiento y prueba para nuestra competencia. Por cierto, la cantidad de datos de la prueba y el número de clases están resaltados en negrita por una razón. Te hablaré de ellos un poco más tarde.

El formato de los datos fue el siguiente. Estas no son solo imágenes RGB, sino, en términos generales, un registro de todo lo que hizo el usuario. Word es nuestro objetivo, el código de país es de donde es el autor del doodle y la marca de tiempo es la hora. La etiqueta reconocida simplemente muestra si la red reconoció la imagen de Google o no. Y el dibujo en sí es una secuencia, una aproximación de una curva que el usuario dibuja con puntos. Y horarios. Este es el tiempo desde el inicio del dibujo.

Clasificación de dibujos manuscritos. Informe en Yandex

Los datos se presentaron en dos formatos. Este es el primer formato y el segundo está simplificado. Cortaron los tiempos a partir de ahí y aproximaron este conjunto de puntos con un conjunto más pequeño de puntos. Para esto utilizaron Algoritmo de Douglas-Pecker. Tienes un gran conjunto de puntos que simplemente se aproxima a una línea recta, pero de hecho puedes aproximar esta línea con solo dos puntos. Ésta es la idea del algoritmo.

Los datos se distribuyeron de la siguiente manera. Todo es uniforme, pero hay algunos valores atípicos. Cuando resolvimos el problema, no lo miramos. Lo principal es que no hubo clases que fueran realmente pocas, no tuvimos que hacer muestreos ponderados ni sobremuestreo de datos.

Clasificación de dibujos manuscritos. Informe en Yandex

¿Cómo eran las fotos? Esta es la clase "avión" y ejemplos de ella con las etiquetas reconocidas y no reconocidas. Su proporción era de alrededor de 1 a 9. Como puede ver, los datos son bastante ruidosos. Supongo que es un avión. Si miras lo que no se reconoce, en la mayoría de los casos es solo ruido. Alguien incluso intentó escribir “avión”, pero aparentemente en francés.

La mayoría de los participantes simplemente tomaron cuadrículas, extrajeron datos de esta secuencia de líneas como imágenes RGB y las lanzaron a la red. Dibujé aproximadamente de la misma manera: tomé una paleta de colores, tracé la primera línea con un color, que estaba al comienzo de esta paleta, la última línea con otro, que estaba al final de la paleta, y entre ellos. Interpolé en todas partes usando esta paleta. Por cierto, esto dio un mejor resultado que si dibujas como en la primera diapositiva, solo en negro.

Otros miembros del equipo, como Ivan Sosin, probaron enfoques de dibujo ligeramente diferentes. Con un canal simplemente dibujó una imagen gris, con otro canal dibujó cada trazo con un gradiente de principio a fin, de 32 a 255, y con el tercer canal dibujó un gradiente sobre todos los trazos de 32 a 255.

Otra cosa interesante es que Alex Parinov subió información a la red utilizando el código de país.

Clasificación de dibujos manuscritos. Informe en Yandex

La métrica utilizada en la competencia es la precisión promedio promedio. ¿Cuál es la esencia de esta métrica de competencia? Puede dar tres predicciones, y si no hay una predicción correcta en estas tres, obtendrá 0. Si hay una correcta, entonces se tiene en cuenta su orden. Y el resultado objetivo se contará como 1 dividido por el orden de su predicción. Por ejemplo, hiciste tres predictores y el correcto es el primero, luego divides 1 entre 1 y obtienes 1. Si el predictor es correcto y su orden es 2, entonces divides 1 entre 2 y obtienes 0,5. Bueno, etc

Clasificación de dibujos manuscritos. Informe en Yandex

Con el preprocesamiento de datos (cómo hacer dibujos, etc.), hemos decidido un poco. ¿Qué arquitecturas utilizamos? Intentamos utilizar arquitecturas gordas como PNASNet, SENet y arquitecturas ya clásicas como SE-Res-NeXt, que cada vez entran en nuevas competencias. También estaban ResNet y DenseNet.

Clasificación de dibujos manuscritos. Informe en Yandex

Clasificación de dibujos manuscritos. Informe en Yandex

Clasificación de dibujos manuscritos. Informe en Yandex

¿Cómo enseñamos esto? Todos los modelos que tomamos fueron entrenados previamente en imagenet. Aunque hay muchos datos, 50 millones de imágenes, aún así, si toma una red previamente entrenada en imagenet, mostró mejores resultados que si simplemente la entrenó desde cero.

¿Qué técnicas de enseñanza utilizamos? Se trata de Cosing Annealing con reinicios en caliente, del que hablaré un poco más adelante. Esta es una técnica que utilizo en casi todas mis competiciones recientes, y con ellas resulta entrenar bastante bien las parrillas, para conseguir un buen mínimo.

Clasificación de dibujos manuscritos. Informe en Yandex

Siguiente Reducir la tasa de aprendizaje en Plateau. Comienza a entrenar la red, establece una cierta tasa de aprendizaje, continúa enseñándola y su pérdida converge gradualmente a un cierto valor. Verifica esto, por ejemplo, durante diez épocas la pérdida no ha cambiado en absoluto. Reduces tu tasa de aprendizaje en algún valor y continúas aprendiendo. Vuelve a caer un poco, converge a un mínimo y vuelve a reducir la tasa de aprendizaje, y así sucesivamente, hasta que su red finalmente converge.

La siguiente es una técnica interesante: no disminuya la tasa de aprendizaje, aumente el tamaño del lote. Hay un artículo con el mismo nombre. Cuando entrena una red, no es necesario reducir la tasa de aprendizaje, simplemente puede aumentar el tamaño del lote.

Esta técnica, por cierto, fue utilizada por Alex Parinov. Comenzó con un lote igual a 408, y cuando su red alcanzó cierto nivel, simplemente duplicó el tamaño del lote, etc.

De hecho, no recuerdo qué valor alcanzó el tamaño de su lote, pero lo interesante es que había equipos en Kaggle que usaban la misma técnica, su tamaño de lote era de aproximadamente 10000 XNUMX. Por cierto, los marcos modernos para el aprendizaje profundo, como PyTorch, por ejemplo, te permite hacer esto muy fácilmente. Usted genera su lote y lo envía a la red, no como está, en su totalidad, sino que lo divide en partes para que quepa en su tarjeta de video, calcula los gradientes y, después de haber calculado el gradiente para todo el lote, actualiza. los pesos.

Por cierto, en esta competencia todavía se incluyeron tamaños de lotes grandes, porque los datos eran bastante ruidosos y un tamaño de lote grande ayudó a aproximar el gradiente con mayor precisión.

También se utilizó el pseudoetiquetado, utilizado principalmente por Roman Soloviev. Tomó muestras de aproximadamente la mitad de los datos de la prueba en lotes y entrenó la cuadrícula en dichos lotes.

El tamaño de las imágenes importaba, pero el hecho es que tienes muchos datos, necesitas entrenar durante mucho tiempo y, si el tamaño de tu imagen es bastante grande, entrenarás durante mucho tiempo. Pero esto no añadió mucho a la calidad de su clasificador final, por lo que valió la pena utilizar algún tipo de compensación. Y solo probamos fotografías que no fueran de tamaño muy grande.

¿Cómo se aprendió todo? Primero, se tomaron fotografías de pequeño tamaño, se analizaron varias épocas, lo que llevó bastante tiempo. Luego se dieron imágenes de gran tamaño, se entrenó la red, luego aún más, aún más, para no entrenarla desde cero y no perder mucho tiempo.

Acerca de los optimizadores. Usamos SGD y Adam. De esta manera fue posible conseguir un único modelo, que dio una velocidad de 0,941-0,946 en la clasificación pública, lo cual es bastante bueno.

Si combinas los modelos de alguna manera, obtendrás alrededor de 0,951. Si utilizas una técnica más, obtendrás una puntuación final de 0,954 en el tablero público, tal como obtuvimos nosotros. Pero hablaremos de eso más adelante. A continuación os contaré cómo montamos los modelos, y cómo conseguimos alcanzar esa velocidad final.

A continuación, me gustaría hablar sobre Cosing Annealing con reinicios en caliente o descenso de gradiente estocástico con reinicios en caliente. En términos generales, en principio, puedes usar cualquier optimizador, pero el punto es el siguiente: si solo entrenas una red y gradualmente converge a un mínimo, entonces todo está bien, obtendrás una red, comete ciertos errores, pero tú Puedes entrenarlo de forma un poco diferente. Establecerás una tasa de aprendizaje inicial y la reducirás gradualmente de acuerdo con esta fórmula. Lo baja, su red llega a un mínimo, luego guarda los pesos y nuevamente establece la tasa de aprendizaje que estaba al comienzo del entrenamiento, subiendo así desde este mínimo y nuevamente reduciendo su tasa de aprendizaje.

Así, podrás visitar varios mínimos a la vez, en los que tu pérdida será, más o menos, la misma. Pero el caso es que las redes con estos pesos darán distintos errores en tu fecha. Al promediarlos, obtendrás algún tipo de aproximación y tu velocidad será mayor.

Clasificación de dibujos manuscritos. Informe en Yandex

Sobre cómo montamos nuestros modelos. Al comienzo de la presentación dije que prestaran atención a la cantidad de datos en la prueba y la cantidad de clases. Si suma 1 al número de objetivos en el conjunto de prueba y lo divide por el número de clases, obtendrá el número 330, y esto se escribió en el foro: que las clases en la prueba están equilibradas. Esto podría usarse.

Basándose en esto, a Roman Soloviev se le ocurrió una métrica, la llamamos Proxy Score, que se correlacionaba bastante bien con la tabla de clasificación. El punto es: usted hace una predicción, toma el primero de sus predictores y cuenta la cantidad de objetos para cada clase. Luego, resta 1 de cada valor y suma los valores absolutos resultantes.

Se obtuvieron los siguientes valores. Esto nos ayudó no a crear una tabla de clasificación de sondeo, sino a validar localmente y seleccionar coeficientes para nuestros conjuntos.

Con un conjunto se podría conseguir esa velocidad. ¿Qué más podría hacer? Suponga que utilizó la información de que las clases en su prueba están equilibradas.

El equilibrio fue diferente. Un ejemplo de uno de ellos. — equilibrio entre los muchachos que obtuvieron el primer lugar.

¿Qué hicimos? Nuestro equilibrio fue bastante sencillo, así lo sugirió Evgeny Babakhnin. Primero ordenamos nuestras predicciones por top 1 y seleccionamos candidatos entre ellas, de modo que el número de clases no supere los 330. Pero para algunas clases terminas con menos de 330 predictores. Bien, ordenemos también por top 2 y top 3 , y también seleccionaremos candidatos.

¿En qué se diferencia nuestro equilibrio del equilibrio del primer lugar? Utilizaron un enfoque iterativo, tomando la clase más popular y disminuyendo las probabilidades para esa clase en un pequeño número hasta que esa clase ya no fuera la más popular. Tomamos la siguiente clase más popular. Así que continuaron reduciéndolos hasta que el número de todas las clases se igualó.

Todos utilizaron un enfoque más o menos para entrenar redes, pero no todos utilizaron el equilibrio. Usando el equilibrio, podrías invertir en oro y, si tienes suerte, en dinero.

¿Cómo preprocesar una fecha? Todos preprocesaron la fecha, más o menos, de la misma manera: haciendo rasgos artesanales, tratando de codificar tiempos con diferentes colores de trazo, etc. Esto es exactamente de lo que habló Alexey Nozdrin-Plotnitsky, que ocupó el octavo lugar.

Clasificación de dibujos manuscritos. Informe en Yandex

Lo hizo diferente. Dijo que todas estas funciones suyas hechas a mano no funcionan, no es necesario que lo haga, su red debería aprender todo esto por sí sola. Y en lugar de eso, creó módulos de aprendizaje que preprocesaban sus datos. Les arrojó los datos originales sin preprocesamiento: coordenadas de puntos y tiempos.

Luego tomó la diferencia según las coordenadas y la promedió según los tiempos. Y se le ocurrió una matriz bastante larga. Le aplicó convolución 1D varias veces para obtener una matriz de tamaño 64xn, donde n es el número total de puntos, y se hace 64 para alimentar la matriz resultante a la capa de cualquier red convolucional, que acepta la cantidad de canales. - 64. obtuvo una matriz de 64xn, luego a partir de ella fue necesario crear un tensor de algún tamaño para que el número de canales fuera igual a 64. Normalizó todos los puntos X, Y en el rango de 0 a 32 para crear una tensor de tamaño 32x32. No sé por qué quería 32x32, simplemente sucedió así. Y en esta coordenada colocó un fragmento de esta matriz de tamaño 64xn. Así que terminó con un tensor de 32x32x64 que podría incluir más en su red neuronal convolucional. Eso es todo lo que quería decir.

Fuente: habr.com

Añadir un comentario