Classement des dessins manuscrits. Rapport dans Yandex

Il y a quelques mois, nos confrères de Google tenue sur Kaggle un concours pour créer un classificateur d'images obtenues dans le sensationnel le jeu "Dégainer rapidement!" L'équipe, qui comprenait le développeur Yandex Roman Vlasov, a pris la quatrième place du concours. Lors de la formation d'apprentissage automatique de janvier, Roman a partagé les idées de son équipe, la mise en œuvre finale du classificateur et les pratiques intéressantes de ses adversaires.


- Salut tout le monde! Je m'appelle Roma Vlasov, aujourd'hui je vais vous parler de Quick, Draw ! Défi de reconnaissance des griffonnages.

Classement des dessins manuscrits. Rapport dans Yandex

Il y avait cinq personnes dans notre équipe. J'ai rejoint juste avant la date limite de fusion. Nous n’avons pas eu de chance, nous avons été un peu ébranlés, mais nous avons été ébranlés par rapport à la position monétaire, et eux ont été ébranlés par rapport à la position or. Et nous avons pris une honorable quatrième place.

(Pendant la compétition, les équipes se sont observées dans une notation qui a été formée sur la base des résultats affichés sur une partie de l'ensemble de données proposé. La notation finale, à son tour, a été formée sur une autre partie de l'ensemble de données. Ceci est fait que les participants au concours n'ajustent pas leurs algorithmes à des données spécifiques. Ainsi, en finale, lors du basculement entre les notes, les positions sont un peu bouleversées (de l'anglais shake up - mélanger) : sur d'autres données, le résultat peut s'avérer être différent. L'équipe de Roman était première dans le top trois. Dans ce cas, le top trois est l'argent, la zone de notation monétaire, puisque seules les trois premières places ont reçu un prix en espèces. Après le remaniement, l'équipe était déjà dans quatrième place. De la même manière, l'autre équipe a perdu la victoire, la position en or. - NDLR.)

Classement des dessins manuscrits. Rapport dans Yandex

Le concours était également important dans la mesure où Evgeniy Babakhnin a reçu un grand maître, Ivan Sosin a reçu un maître, Roman Soloviev est resté grand maître, Alex Parinov a reçu un maître, je suis devenu un expert et maintenant je suis déjà un maître.

Classement des dessins manuscrits. Rapport dans Yandex

C'est quoi ce Rapide, Draw ? Il s'agit d'un service de Google. Google avait pour objectif de populariser l'IA et, avec ce service, voulait montrer comment fonctionnent les réseaux de neurones. Vous y allez, cliquez sur Dessinons, et une nouvelle page apparaît où on vous dit : dessinez un zigzag, vous avez 20 secondes pour le faire. Vous essayez de dessiner un zigzag en 20 secondes, comme ici par exemple. Si vous réussissez, le réseau dit que c'est un zigzag et vous passez à autre chose. Il n’existe que six images de ce type.

Si le réseau de Google ne reconnaissait pas ce que vous aviez dessiné, une croix était placée sur la tâche. Plus tard, je vous dirai ce que cela signifiera à l'avenir si un dessin est reconnu ou non par le réseau.

Ce service rassemblait un assez grand nombre d'utilisateurs et toutes les images dessinées par les utilisateurs étaient enregistrées.

Classement des dessins manuscrits. Rapport dans Yandex

Nous avons réussi à collecter près de 50 millions d'images. À partir de là, la date d’entraînement et de test de notre compétition a été déterminée. À propos, la quantité de données dans le test et le nombre de classes sont mis en évidence en gras pour une raison. Je vous en parlerai un peu plus tard.

Le format des données était le suivant. Ce ne sont pas seulement des images RVB, mais, en gros, un journal de tout ce que l'utilisateur a fait. Word est notre cible, le code du pays est celui d'où vient l'auteur du doodle, l'horodatage est l'heure. L'étiquette reconnue indique simplement si le réseau a reconnu ou non l'image de Google. Et le dessin lui-même est une séquence, une approximation d'une courbe que l'utilisateur dessine avec des points. Et les horaires. C'est l'heure à partir du début du dessin.

Classement des dessins manuscrits. Rapport dans Yandex

Les données ont été présentées sous deux formats. Il s'agit du premier format et le second est simplifié. Ils ont découpé les timings à partir de là et ont approximé cet ensemble de points avec un ensemble de points plus petit. Pour cela, ils ont utilisé Algorithme de Douglas-Pecker. Vous disposez d’un grand nombre de points qui se rapprochent simplement d’une ligne droite, mais en fait, vous pouvez approximer cette ligne avec seulement deux points. C'est l'idée de l'algorithme.

Les données ont été réparties comme suit. Tout est uniforme, mais il y a quelques valeurs aberrantes. Lorsque nous avons résolu le problème, nous ne l’avons pas examiné. L’essentiel est qu’il n’y avait pas de classes vraiment peu nombreuses, nous n’avions pas besoin de faire d’échantillonneurs pondérés ni de suréchantillonnage de données.

Classement des dessins manuscrits. Rapport dans Yandex

A quoi ressemblaient les images ? Il s'agit de la classe « avion » et de ses exemples avec les étiquettes reconnues et non reconnues. Leur rapport se situait autour de 1 à 9. Comme vous pouvez le constater, les données sont assez bruitées. Je suppose que c'est un avion. Si vous regardez non reconnu, dans la plupart des cas, ce n'est que du bruit. Quelqu’un a même essayé d’écrire « avion », mais apparemment en français.

La plupart des participants ont simplement pris des grilles, ont dessiné les données de cette séquence de lignes sous forme d'images RVB et les ont lancées dans le réseau. J'ai dessiné à peu près de la même manière : j'ai pris une palette de couleurs, j'ai dessiné la première ligne avec une couleur, qui était au début de cette palette, la dernière ligne avec une autre, qui était à la fin de la palette, et entre elles J'ai interpolé partout en utilisant cette palette. À propos, cela a donné un meilleur résultat que si vous dessiniez comme sur la toute première diapositive - uniquement en noir.

D’autres membres de l’équipe, comme Ivan Sosin, ont essayé des approches de dessin légèrement différentes. Avec un canal, il a simplement dessiné une image grise, avec un autre canal, il a dessiné chaque trait avec un dégradé du début à la fin, de 32 à 255, et avec le troisième canal, il a dessiné un dégradé sur tous les traits de 32 à 255.

Une autre chose intéressante est qu'Alex Parinov a téléchargé des informations sur le réseau en utilisant le code pays.

Classement des dessins manuscrits. Rapport dans Yandex

La métrique utilisée dans le concours est la précision moyenne moyenne. Quelle est l’essence de cette mesure de la concurrence ? Vous pouvez donner trois prédics, et s'il n'y a pas de prédic correct dans ces trois, alors vous obtenez 0. S'il y en a un correct, alors son ordre est pris en compte. Et le résultat cible sera compté pour 1 divisé par l'ordre de votre prédiction. Par exemple, vous avez créé trois prédicteurs et le bon est le premier, puis vous divisez 1 par 1 et obtenez 1. Si le prédicteur est correct et que son ordre est 2, divisez 1 par 2, vous obtenez 0,5. Eh bien, etc.

Classement des dessins manuscrits. Rapport dans Yandex

Avec le prétraitement des données - comment dessiner des images, etc. - nous avons un peu décidé. Quelles architectures avons-nous utilisées ? Nous avons essayé d'utiliser des architectures lourdes telles que PNASNet, SENet et des architectures déjà classiques comme SE-Res-NeXt, elles entrent de plus en plus dans de nouvelles compétitions. Il y avait aussi ResNet et DenseNet.

Classement des dessins manuscrits. Rapport dans Yandex

Classement des dessins manuscrits. Rapport dans Yandex

Classement des dessins manuscrits. Rapport dans Yandex

Comment avons-nous enseigné cela ? Tous les modèles que nous avons pris ont été pré-formés sur imagenet. Bien qu'il y ait beaucoup de données, 50 millions d'images, mais quand même, si vous prenez un réseau pré-entraîné sur imagenet, il a montré de meilleurs résultats que si vous l'aviez simplement formé à partir de zéro.

Quelles techniques pédagogiques avons-nous utilisées ? Il s'agit du recuit Cosing avec redémarrages à chaud, dont je parlerai un peu plus tard. C'est une technique que j'utilise dans presque toutes mes compétitions récentes, et avec elle il s'avère que j'entraîne assez bien les grilles, pour atteindre un bon minimum.

Classement des dessins manuscrits. Rapport dans Yandex

Suivant Réduisez le taux d’apprentissage sur le plateau. Vous commencez à entraîner le réseau, fixez un certain taux d'apprentissage, continuez à l'enseigner et votre perte converge progressivement vers une certaine valeur. Vous vérifiez cela, par exemple, pendant dix époques, la perte n'a pas changé du tout. Vous réduisez votre taux d’apprentissage d’une certaine valeur et continuez à apprendre. Il diminue encore un peu, converge à un minimum, et vous réduisez à nouveau le taux d'apprentissage, et ainsi de suite, jusqu'à ce que votre réseau converge enfin.

Voici ensuite une technique intéressante : ne diminuez pas le taux d’apprentissage, augmentez la taille du lot. Il existe un article du même nom. Lorsque vous entraînez un réseau, vous n'avez pas besoin de réduire le taux d'apprentissage, vous pouvez simplement augmenter la taille du lot.

Cette technique a d'ailleurs été utilisée par Alex Parinov. Il a commencé avec un lot égal à 408, et lorsque son réseau a atteint un certain plateau, il a simplement doublé la taille du lot, etc.

En fait, je ne me souviens pas quelle valeur a atteint la taille de son lot, mais ce qui est intéressant, c'est qu'il y avait des équipes sur Kaggle qui utilisaient la même technique, leur taille de lot était d'environ 10000 XNUMX. À propos, les frameworks modernes d'apprentissage en profondeur, tels que PyTorch, par exemple, vous permet de le faire très facilement. Vous générez votre lot et le soumettez au réseau non pas tel quel, dans son intégralité, mais vous le divisez en morceaux afin qu'il tienne dans votre carte vidéo, calculez les dégradés, et après avoir calculé le dégradé pour l'ensemble du lot, mettez à jour les poids.

À propos, des lots de grande taille étaient toujours inclus dans ce concours, car les données étaient assez bruyantes et une grande taille de lot vous aidait à approximer plus précisément le gradient.

Le pseudo-étiquetage a également été utilisé, principalement par Roman Soloviev. Il a échantillonné environ la moitié des données du test par lots et a entraîné la grille sur ces lots.

La taille des images comptait, mais le fait est que vous disposez de beaucoup de données, que vous devez vous entraîner pendant longtemps, et si la taille de votre image est assez grande, vous vous entraînerez pendant très longtemps. Mais cela n’ajoutait pas grand-chose à la qualité de votre classificateur final, cela valait donc la peine d’utiliser une sorte de compromis. Et nous n’avons essayé que des images qui n’étaient pas très grandes.

Comment tout cela a-t-il été appris ? Tout d'abord, des images de petite taille ont été prises, plusieurs époques ont été parcourues, ce qui a pris beaucoup de temps. Ensuite, des images de grande taille ont été données, le réseau a été entraîné, puis encore plus, encore plus, pour ne pas l'entraîner à partir de zéro et ne pas perdre beaucoup de temps.

À propos des optimiseurs. Nous avons utilisé SGD et Adam. De cette façon, il a été possible d'obtenir un seul modèle, qui donnait une vitesse de 0,941 à 0,946 dans le classement public, ce qui est plutôt bon.

Si vous regroupez les modèles d’une manière ou d’une autre, vous obtiendrez quelque part autour de 0,951. Si vous utilisez une technique supplémentaire, vous obtiendrez un score final de 0,954 sur le tableau public, tout comme nous. Mais plus là-dessus plus tard. Je vais ensuite vous expliquer comment nous avons assemblé les modèles et comment nous avons réussi à atteindre une telle vitesse finale.

Ensuite, j'aimerais parler du recuit Cosing avec des redémarrages à chaud ou de la descente de gradient stochastique avec des redémarrages à chaud. En gros, en principe, vous pouvez utiliser n'importe quel optimiseur, mais le fait est le suivant : si vous entraînez simplement un réseau et qu'il converge progressivement vers un minimum, alors tout va bien, vous obtiendrez un réseau, il fait certaines erreurs, mais vous peut l'entraîner un peu différemment. Vous fixerez un certain taux d’apprentissage initial et le diminuerez progressivement selon cette formule. Vous le réduisez, votre réseau atteint un minimum, puis vous enregistrez les poids et définissez à nouveau le taux d'apprentissage qui était au début de la formation, augmentant ainsi quelque part par rapport à ce minimum, et réduisant à nouveau votre taux d'apprentissage.

Ainsi, vous pouvez visiter plusieurs minimums à la fois, dans lesquels votre perte sera, plus ou moins, la même. Mais le fait est que les réseaux avec ces poids donneront des erreurs différentes à votre date. En faisant la moyenne, vous obtiendrez une sorte d'approximation et votre vitesse sera plus élevée.

Classement des dessins manuscrits. Rapport dans Yandex

À propos de la façon dont nous avons assemblé nos modèles. Au début de la présentation, j'ai dit de faire attention à la quantité de données dans le test et au nombre de classes. Si vous ajoutez 1 au nombre de cibles dans l'ensemble de test et divisez par le nombre de classes, vous obtiendrez le nombre 330, et cela a été écrit sur le forum - que les classes du test sont équilibrées. Cela pourrait être utilisé.

Sur cette base, Roman Soloviev a proposé une mesure, que nous avons appelée Proxy Score, qui correspondait assez bien au classement. Le fait est que vous faites une prédiction, prenez le premier de vos prédicteurs et comptez le nombre d'objets pour chaque classe. Ensuite, soustrayez 1 de chaque valeur et additionnez les valeurs absolues résultantes.

Les valeurs suivantes ont été obtenues. Cela nous a aidé non pas à créer un classement approfondi, mais à valider localement et à sélectionner des coefficients pour nos ensembles.

Avec un ensemble, vous pourriez obtenir une telle vitesse. Que pourrais-je faire d'autre ? Supposons que vous ayez utilisé l'information selon laquelle les classes de votre test sont équilibrées.

L'équilibrage était différent. Un exemple de l'un d'entre eux — en équilibre avec les gars qui ont pris la première place.

Qu'avons-nous fait? Notre équilibrage était assez simple, a-t-il été suggéré par Evgeny Babakhnin. Nous avons d'abord trié nos prédictions par top 1 et sélectionné les candidats parmi eux - de sorte que le nombre de classes ne dépasse pas 330. Mais pour certaines classes, vous vous retrouvez avec moins de 330 prédicteurs. Bon, trions également par top 2 et top 3. , et nous sélectionnerons également les candidats.

En quoi notre équilibrage diffère-t-il de celui du premier lieu ? Ils ont utilisé une approche itérative, en prenant la classe la plus populaire et en diminuant les probabilités pour cette classe d'un petit nombre jusqu'à ce que cette classe ne soit plus la plus populaire. Nous avons suivi le cours suivant le plus populaire. Ils continuèrent donc à les diminuer jusqu'à ce que le nombre de toutes les classes devienne égal.

Tout le monde a utilisé plus ou moins une approche pour les réseaux de trains, mais tout le monde n'a pas utilisé l'équilibrage. En utilisant l'équilibrage, vous pourriez vous tourner vers l'or, et si vous aviez de la chance, puis vers l'argent.

Comment prétraiter une date ? Tout le monde a prétraité la date, plus ou moins, de la même manière - en créant des fonctionnalités artisanales, en essayant d'encoder les timings avec différentes couleurs de trait, etc. Alexey Nozdrin-Plotnitsky, qui a pris la 8ème place, en a parlé.

Classement des dessins manuscrits. Rapport dans Yandex

Il l'a fait différemment. Il a dit que toutes vos fonctionnalités artisanales ne fonctionnent pas, vous n’avez pas besoin de le faire, votre réseau devrait apprendre tout cela par lui-même. Et à la place, il a proposé des modules d’apprentissage qui prétraitent vos données. Il y a jeté les données originales sans prétraitement - coordonnées des points et horaires.

Ensuite, il a pris la différence en fonction des coordonnées et a fait la moyenne du tout en fonction des horaires. Et il a proposé une matrice assez longue. Il lui a appliqué plusieurs fois une convolution 1D pour obtenir une matrice de taille 64xn, où n est le nombre total de points, et 64 est créé afin de transmettre la matrice résultante à la couche de tout réseau convolutif, qui accepte le nombre de canaux. - 64. il a obtenu une matrice 64xn, puis à partir de celle-ci il a fallu créer un tenseur d'une certaine taille pour que le nombre de canaux soit égal à 64. Il a normalisé tous les points X, Y dans la plage de 0 à 32 pour créer un tenseur de taille 32x32. Je ne sais pas pourquoi il voulait 32x32, c’est juste arrivé comme ça. Et à cette coordonnée il a placé un fragment de cette matrice de taille 64xn. Cela s'est donc terminé avec un tenseur 32x32x64 que vous pourriez insérer plus loin dans votre réseau neuronal convolutif. C'est tout ce que je voulais dire.

Source: habr.com

Ajouter un commentaire