Expériences d’apprentissage One Shot avec perte de quadruplet
Un de mes amis dit que, pour faire des progrès significatifs dans l’apprentissage automatique, il faut lire les documents de recherche sur le terrain. En parcourant les articles de recherche, j’ai trouvé celui-ci « Au-delà de la perte de triplets: un réseau quadruplet profond pour la ré-identification des personnes»Qui semblait être une source d’amélioration par rapport à mon travail précédent et j’ai décidé d’essayer de recréer ce qu’ils ont fait sauf pour mon cas particulier.
Cet article concerne l’exploration du document et la mise en œuvre de certains des concepts du document de recherche avec Keras.
Une façon de traiter ce type de problème est d’utiliser le même concept que Facenet: utiliser des réseaux siamois pour encoder deux images puis comparer le résultat pour déterminer si elles sont similaires ou non. Il s’agit toujours d’un comparateur de similarité, vous devez donc former votre système pour être en mesure de «coder» la personne avec des fonctionnalités pertinentes qui sont indépendantes de la pose, de l’angle et de l’éclairage. Quel cauchemard. Ce document a beaucoup de contenu mais pourrait être résumé en 4 parties:
- Amélioration de la fonction de perte de triplet d’origine
- Métrique apprise
- Stratégie minière
- Étude approfondie des fonctions de perte
Amélioration de la perte du triplet
Il contient la différence entre la distance Anchor-Positive et la distance Anchor-Negative, plus a un hyper-paramètre alpha de «marge».
Remarque: Dans le document, ils n’utilisent pas le mot «ancre» mais «référence» ou «réf» à la place.
L’amélioration proposée ressemble à ceci:
Il contient la même différence entre la distance ancre-positive et la distance ancre-négatif, mais ils ont ajouté un autre terme: la différence entre la distance ancre-positive et la distance négative-autre négative. De plus, il a un autre hyper-paramètre «marge» alpha2. Ils introduisent ici un autre membre négatif, qui est un échantillon d’une classe différente de l’ancre, mais également différente du premier négatif. Pour calculer cela, nous avons maintenant besoin d’un quadruplet (Anchor, Positive, Negative, Negative2) au lieu d’un triplet comme auparavant (Anchor, Positive, Negative). D’où le nom de «perte quadruplet» au lieu de «perte triplet».
Utilisons quelques notations: Anchor = A, Positive = P, Negative = N, Negative2 = N2. Distance entre A et P = AP, etc. avec distance entre N et N2 = NN
Avec nos notations et en ignorant le terme max, nous avons:
Perte de triplet = AP-AN + alpha1
Perte quadruplet = AP-AN + alpha1 + AP-NN + alpha2
Dans le journal, ils ont nommé:
- le premier terme “AP-AN + alpha1« la poussée » forte « (alpha1 = 1)
- le deuxième terme “AP-NN + alpha2« La poussée » faible « (alpha2 doit être inférieur = 0,5)
Selon leurs recherches, cette amélioration permet d’avoir une meilleure distance entre les classes, la faible poussée aidant à «pousser les classes négatives les unes des autres» (mon explication, pas la leur). Ce faisant, il améliore la généralisation du système qui fonctionnera mieux avec des données du monde réel invisibles.
Métrique apprise
L2dist (a, b) = (a-b) ²
L’amélioration proposée consiste à utiliser une métrique apprise au lieu de la fonction L2. Cela signifie que nous remplacerons la fonction L2 par un réseau de neurones, qui doit être formé dans le cadre de la solution globale. Il existe une tonne de documentation sur les mesures apprises, mais je vais essayer de rester bref.
L’idée derrière cela est la suivante: si vous comparez, disons, deux vecteurs, la fonction L2 calculera la différence valeur par valeur, les mettra au carré et résumera tout. Si vos vecteurs étaient des entités extraites de vos images d’entrée, la différence sera appliquée uniformément sur toutes les valeurs d’entités. Une petite différence sur la deuxième entité par exemple (deuxième valeur de votre vecteur) aura le même effet sur la distance finale que la même petite différence sur la troisième entité (troisième valeur de votre vecteur). Alors qu’avec une métrique apprise, chaque valeur de votre vecteur d’entité peut avoir un poids différent. Ainsi, une petite différence sur la deuxième caractéristique pourrait doubler l’effet sur la distance finale que la même petite différence sur la troisième caractéristique. Ou peut-être que cette deuxième fonctionnalité aura un poids de 3, donc une petite différence sur cette fonctionnalité aura un triple impact sur la distance totale. Ou il peut y avoir des effets non linéaires encore plus compliqués entre les valeurs de caractéristiques comme «si cette première valeur est élevée et cette deuxième valeur est faible, alors nous devons vraiment prêter attention à cette autre valeur». Après tout, les réseaux de neurones sont parfaits pour modéliser la non linéarité, non? Alors, que va calculer la métrique apprise? Souvenez-vous bien que ce réseau neuronal sera formé avec le reste du système, il convergera donc (espérons-le) vers une fonction métrique qui optimise notre objectif, nous donnant la meilleure formule pour comparer deux vecteurs.
Architecture de formation
L’architecture de formation de gauche à droite est en trois parties.
La première partie prend les quatre images d’entrée et les fait passer par le réseau de l’encodeur. Rappelez-vous, c’est une architecture siamoise, donc les quatre réseaux dessinés là-bas sont en fait les mêmes, mais utilisés quatre fois, une fois pour chaque image d’entrée.
Les sorties sont ensuite regroupées en trois paires: AP, AN et NN (Ref-Pos, Ref-Neg et Neg-Neg2 dans le dessin) et passent par ce que nous pourrions supposer être le réseau métrique appris. C’est aussi l’astuce siamoise, donc les trois réseaux dessinés sont en fait les mêmes. La métrique apprise se termine par un softmax binaire qui génère 2 valeurs. L’une est la probabilité que la paire contienne la même personne, la seconde est la probabilité que la paire contienne des personnes différentes. Seul le second sera sélectionné pour servir d’indicateur de distance ou d’indicateur de dissimilarité si vous le souhaitez.
La dernière partie à droite est le calcul de la fonction de perte qui est alimenté par les sorties d’arbre softmax.
Stratégie minière
- L’échantillon facile est celui qui génère une faible valeur de perte ou aucune perte. Par exemple un Positif qui est déjà très proche de l’Ancrage et / ou des images négatives qui sont déjà loin les unes des autres.
- Les échantillons durs sont ceux qui génèrent le plus de perte. Par exemple, une image positive qui a une distance significative par rapport à l’ancre et / ou des images négatives qui ont de petites distances entre elles.
- Au milieu, à la limite des marges alpha1 (et alpha2 pour le 4x), se trouvent des échantillons semi-durs
Des échantillons simples n’aident pas le système à en apprendre beaucoup. L’exploitation minière implique généralement la recherche d’échantillons durs ou semi-durs pour aider le système à apprendre plus rapidement. L’article décrit une stratégie minière agressive basée sur un seuil dynamique utilisé pour sélectionner le nombre d’échantillons «durs» que nous devons prélever dans un lot donné. Comme il manque encore des détails sur la façon dont ils ont procédé, nous ne le couvrirons pas dans cet article.
L’étude de la fonction de perte
Pour l’ensemble de données, nous pourrions utiliser MNIST comme nous l’avons fait dans notre article précédent ou Fashion MNIST. Mais ces ensembles de données ont un problème: MNIST et F-MNIST ont environ 6000 échantillons par classe, mais seulement 10 classes. Étant donné que l’article a mentionné certaines propriétés de généralisation, cette fois-ci, nous allons prendre un ensemble de données spécialement conçu pour une situation d’apprentissage à un coup: l’ensemble de données OMNIGLOT. L’ensemble de données OMNIGLOT contient 1623 caractères manuscrits différents provenant de 50 alphabets différents. Ainsi, au lieu d’avoir 10 classes avec 6000 échantillons par classe (MNIST), nous aurons 1623 classes avec seulement 20 échantillons par classe.
Fait intéressant, l’ensemble de données est divisé en un ensemble de trains composé de 964 classes et un ensemble de tests de 659 classes. Cela signifie que l’ensemble de test contient non seulement des échantillons, mais des classes entières avec lesquelles nous ne nous entraînerons jamais. Et nous nous attendons à ce que notre système soit en mesure de bien fonctionner avec ces classes qu’il n’a jamais vu auparavant. C’est une différence majeure par rapport au MNIST.
Nous allons faire fonctionner deux systèmes en même temps. L’un aura une architecture de perte de triplet normale, l’autre aura certaines des améliorations que nous avons vues ci-dessus et nous essaierons de les adapter à notre problème. Nous allons essayer de garder les deux systèmes aussi identiques que possible:
- S’entraîner en même temps, sur (presque) les mêmes données, avec le même nombre d’époques, avec la même stratégie de minage
- Utilisez la même architecture de réseau neuronal pour la partie encodeur. Les deux encodeurs commenceront avec exactement les mêmes paramètres et produiront tous les deux des plongements de la même taille (20 dans cet article)
Les améliorations que nous ajouterons au deuxième système sont les suivantes:
- Fonction de perte quadruplet en ajoutant le terme supplémentaire à la fonction de perte dist (A, P) -dist (N, N2)
- Utilisez une métrique apprise au lieu de la distance L2. Cela ajoutera un autre réseau de neurones à former dans le système
Donc, dans le coin gauche, nous aurons le système normal de perte de triplet, que nous appellerons «3x» et dans le coin droit le nouveau challenger, la perte de quadruplet + système métrique appris qui sera appelé «4x». Laissez le match commencer.
- télécharger l’ensemble de données, ce qui est facile car OMNIGLOT fait partie du référentiel tensorflow-dataset
- transformation en niveaux de gris
- normalisation des valeurs de pixels de 0–255 à 0-1
Nous organisons ensuite l’ensemble de données en deux versions:
- Une version «plate» typique avec X contenant toutes les images et Y contenant les vraies étiquettes (numéros de classe), utilisée principalement pour l’évaluation
- L’autre version est triée par classe. donc dataset_train[0] contient toutes les images de la classe 0 dans un tableau de forme (?, 105,105,1). Cette organisation est plus pratique pour sélectionner des échantillons d’une classe spécifique, par exemple pour construire des quadruplets de (A, P, N, N2)
La même stratégie de minage simple est utilisée comme article précédent, donc pour le système 4x:
- nous dessinons un lot de 100 quadruplés
- nous sélectionnons les 16 quadruplés les plus durs
- nous ajoutons 16 quadruplets aléatoires pour compléter ce lot de 32 échantillons
Le système 3x n’utilisant que des triplets, nous procédons comme suit:
- à partir du lot de 100 quadruplés ci-dessus, nous extrayons les 3 premières images pour APN, ce qui fait un lot de 100 triplets
- nous sélectionnons les 16 triplets les plus durs
- nous ajoutons 16 triplets aléatoires pour compléter ce lot de 32 échantillons
L’encodeur
La métrique apprise
Fonctions de perte
Remarque: j’ai eu quelques commentaires sur la dernière «somme», que ce devrait être une «moyenne» à la place. Ceci est un commentaire parfaitement valable, n’hésitez pas à utiliser la moyenne, il fonctionne de la même manière
Pour notre système 4x, nous adoptons la même approche mais les entrées ici sont les distances AP, AN et NN (elles sont déjà calculées ailleurs avec la métrique apprise). Nous les égalisons et appliquons la formule de perte quadruplée.
Assemblage de nos modèles Keras
Idem pour notre système 4x. Notez comment nous calculons les distances AP, AN et NN avec notre réseau métrique avant de les alimenter au QuadrupletLossLayer à la ligne 30
Courbe ROC
Si vous prenez un classificateur binaire normal qui prédit des scores entre 0% et 100% (si vous utilisez un softmax par exemple), plus le score est élevé, plus la probabilité de décision est «1». Plus le score est bas, plus la probabilité de décision est «0».
Ici, nous n’avons pas de classificateur normal. C’est un comparateur de similarité. Mais pour notre objectif d’évaluation, nous considérons notre système comme une sorte de classificateur binaire comme suit: Pour deux images d’entrée, notre système prédit si les deux entrées sont identiques (1) ou différentes (0) en fonction de la distance. Plus la distance est élevée, plus la probabilité que les entrées soient différentes (0) est élevée. Plus la distance est faible, plus la probabilité que les entrées soient les mêmes est élevée (1). Donc notre distance ici agit comme le score dans mon premier exemple mais inversé: dans mon premier exemple, le score augmente pour viser « 1 », alors que dans notre cas, la distance diminue pour viser « 1 ».
Donc, pour calculer ROC, créez deux listes y_target et y_true et utilisez la fonction sklearn roc_auc_score. Les listes sont créées de cette façon:
- prendre toutes les paires possibles de votre set de test,
- pour chaque paire, calculez la distance à l’aide de L2 (pour 3x) ou de metric_network (pour 4x)
- calculer un score cible en inversant la distance
- ajouter cette valeur dans y_score
- pour y_true, ajoutez 0 si la paire provient des différentes classes ou ajoutez 1 si elles appartiennent à la même classe
Distance interclasse
Remarque: J’ai eu quelques commentaires sur l’utilisation des centroïdes pour calculer la métrique d’inter-distance. Je n’aime pas la méthode centroïde pour deux raisons
- Un centroïde est un point moyen, représentant toute la classe avec un seul point. Bien que ce calcul soit nettement plus rapide, il masque la répartition réelle des distances que vous pouvez avoir entre tous les éléments. Je préfère voir à quel point les boîtes sont étirées dans la moyenne et où sont les pires cas
- Calculer un centroïde avec une distance L2 a (en quelque sorte) un sens. Le calcul d’un centroïde à l’aide d’une métrique apprise non linéaire me semble un peu louche. À moins que quelqu’un puisse faire le calcul pour vérifier que nous n’introduisons pas de distorsions dans notre indicateur, je vais essayer de l’éviter.
Présentation du score CMC de la caractéristique de correspondance cumulative
Et si le vrai match était le deuxième meilleur? Cet indicateur de précision ne se soucie pas, il est toujours considéré comme une mauvaise réponse, ce qui est un peu brutal. Vous ne voulez pas un indicateur qui puisse distinguer un système qui peut produire le deuxième meilleur de celui qui peut produire le 10e meilleur? C’est ce que fait le score CMC. Cet indicateur utilise des «rangs».
Prenons un exemple:
Nous avons un candidat (à gauche) qui est comparé à un catalogue de 400 classes. Nous ordonnons les distances entre le candidat et tous les éléments du catalogue du plus petit (à gauche) au plus grand (vers la droite, mais nous affichons uniquement le top 10).
Système A:
Système B:
Dans cet exemple, les systèmes A et B ne peuvent pas donner la bonne réponse car dans les deux cas, la réponse de rang 1 avec la plus petite distance n’est pas la véritable étiquette. Mais le système B donne un rang 3 tandis que A donne un rang 4. Donc, ici B fonctionne mieux que A.
Le score CMC est la «probabilité d’avoir la vraie correspondance dans le premier rang x».
Puisque nous voulons que notre système ait les meilleurs classements possibles pour les candidats, nous utiliserons également CMC pour analyser les performances de notre système 3x et 4x.
Remarque: La courbe ROC et le CMC sont en quelque sorte connectés. Une bonne courbe ROC vous donnera probablement une bonne courbe CMC. Mais pas toujours, alors soyez prudent. Une étude est disponible à ce sujet dans les références en bas de cette page. N’oubliez pas que CMC ignore tout concept de seuil que ROC a
Voici notre courbe ROC après l’entraînement:
Maintenant l’interdistance:
Et la courbe CMC:
Ce que nous pouvons voir ici, c’est que:
- les deux systèmes ont convergé vers quelque chose d’utile. Bien qu’ils ne soient pas parfaits, les deux systèmes peuvent reconnaître les symboles même si ces systèmes n’ont jamais vu ces symboles auparavant, ou du moins les classer
- Selon la courbe ROC et le CMC, le 3x semble être meilleur au travail dans ce contexte que le plus compliqué 4x
Jouons un peu et essayons-les sur quelques exemples de l’ensemble de test:
- Il n’y a eu aucun balayage d’hyperparamètres approprié pour aucun des systèmes. Peut-être que le système 4x fonctionne mieux avec un autre ensemble de paramètres?
- Peut-être que la stratégie minière a plus d’importance que nous ne le pensions au départ? Dans l’article, il semble qu’ils n’aient pris que les échantillons les plus durs, ce qui me semble une stratégie très agressive. J’ai essayé de prendre des échantillons plus durs du lot mais cela n’a rien changé. Sommes-nous coincés dans un optima local?
- Peut-être que l’architecture métrique du réseau n’est pas appropriée? Mon intuition a dit que 3 couches devraient suffire. Plus de couches semblaient exagérées et pourraient entraîner un ajustement excessif. Peut-être je me trompais?
- Peut-être que le réseau d’encodeur était trop simple et n’avait pas assez de capacité pour révéler le potentiel réel de la perte de quadruplet et / ou de la métrique apprise. Après tout, dans le journal, ils ont utilisé Resnet, qui est beaucoup plus grand que celui que nous avons choisi. Ou peut-être que 3x fonctionne au mieux avec une architecture de réseau A tandis que 4x fonctionne au mieux avec une autre architecture de réseau B, que A et B aient le même nombre de paramètres ou non.
- Peut-être que ce type de jeu de données n’est pas adapté à ce type d’amélioration?
- Peut-être que cet article est l’un de ces articles qui ont des défauts expérimentaux comme décrit dans cet autre article: Une vérification de la réalité de l’apprentissage métrique. Dans ce dernier article, les auteurs ont découvert que les résultats de certains des articles sur l’apprentissage métrique approfondi de ces dernières années (comme celui que nous étudions ici) sont au mieux surestimés et marginaux. Cela pourrait provenir de comparaisons injustes (au lieu de maintenir autant de paramètres constants que possible, ils ont augmenté leur architecture et non les méthodes concurrentes). Cela pourrait également provenir d’une formation avec des commentaires sur les ensembles de tests: les modèles sont hyper-réglés en fonction des résultats des ensembles de tests, ce qui les sur-ajuste. En d’autres termes, ils n’ont pas utilisé un ensemble de validation comme ils auraient dû le faire. L’autre source de tromperie est la faiblesse des mesures de précision couramment utilisées: Recall @ K F1 ou NMI, qui a été jugée non appropriée ou non informative.
À mon avis, au sein de ces questions se trouve la véritable nature des systèmes de machine learning d’ingénierie: contexte et détails. Il ne s’agit pas d’assembler des pièces comme LEGO. Je souhaite que ce soit.
Quoi qu’il en soit, n’hésitez pas à commenter dans les commentaires ci-dessous et si vous voulez l’essayer vous-même, tout mon code est fourni pour que vous puissiez jouer avec.
- Les auteurs de cet article n’ont pas prouvé de façon satisfaisante que 4x était mieux dans un sens général. Cela conduit à considérer que, lors de l’évaluation des articles, un grand degré de scepticisme sain est nécessaire.
- Note à moi-même: la prochaine fois, prenez un papier qui a du code disponible. L’implémentation du code à partir des idées est un processus intéressant qui vous oblige à creuser davantage pour comprendre comment il fonctionne. L’inconvénient est que si les explications du document ne sont pas suffisamment spécifiques, cela pourrait vous donner trop de liberté d’interprétation.
Merci de vous être rendu à la fin de ce voyage avec moi. C’était beaucoup de travail pour tout mettre ensemble, mais j’ai beaucoup appris. Et maintenant j’espère que vous en avez aussi appris un peu.
Tout le code utilisé se trouve sur mon github: https://github.com/CrimyTheBold/tripletloss
- La référence papier complète: « Au-delà de la perte de triplets: un réseau quadruplet profond pour la ré-identification des personnes » https://arxiv.org/pdf/1704.01719.pdf par Weihua Chen, Xiaotang Chen, Jianguo Zhang et Kaiqi Huang
Ce dernier article contient des tonnes de références. J’ai trouvé les éléments suivants les plus utiles:
Mon code CMC était basé sur le travail de
Si vous êtes intéressé à lire sur la façon dont ROC et CMC sont liés, vous devriez lire ceci par Brian DeCann & Arun Ross Relier les courbes ROC et CMC
En savoir plus sur l’ensemble de données OMNIGLOT: Le site Web y a-t-il et il est lié au papier Lake, B. M., Salakhutdinov, R., et Tenenbaum, J. B. (2015). Apprentissage du concept au niveau humain par l’induction probabiliste d’un programme. Science, 350 (6266), 1332–1338