Hackers vs Neural networks: Game on! Part 2/3

Let’s make our first adversarial attack !

Mithuran Gajendran
Meetech - We Love Tech
5 min readAug 28, 2020

--

Introduction

Ah, enfin ! À l’attaque ! Après autant de théorie, un peu de pratique. Je vous propose de créer votre exemple ‘adversarial’ pour attaquer le modèle VGG16.

  • But : créer une perturbation invisible en maximisant la loss afin que VGG16 se trompe dans la classification
  • Outils : Python et Keras
  • Ressources : tout est disponible sur mon repository GitHub, clonez et amusez vous :)

Pour la petite histoire:

VGG16 est un CNN présenté par Karen Simnyam et Andrew Zisserman en 2014. Il a été classé premier et deuxième au ImageNet Large Scale Visual Recognition Challenge de 2014.

Il était une fois un Hacker voulant faire passer son chat pour une banane …

Quel joli chat ! Merci Yann Ouhib pour tant de mignonnerie

Ce chat, nous le voyons comme un chat ! Mais est-ce le cas de VGG ? Rien de plus simple à vérifier, il suffit d’importer le modèle depuis Keras et de lancer une prédiction :

La fonction summary permet d’afficher le détail des paramètres et de l’architecture. L’important est de noter la taille des images que nous pouvons donner à notre modèle [224,224]

C’est un tabby !

C’est belle et bien un chat avec une robe tabby !

… il utilise la maximisation du gradient ascendant …

Pour créer notre exemple ‘adversarial’, nous voulons modifier une image catégorisée comme Chat en maximisant la réponse de la catégorie Banane de notre modèle.

C’est plutôt facile ! Durant l’entrainement, je vais vouloir diminuer l’erreur en ajustant les paramètres de mon modèle. Ici, je vais vouloir augmenter/tendre mon erreur vers la catégorie Banane en ajustant l’image. Le meilleur moyen de le faire ? Le gradient :D (Ne vous inquiétez pas si vous ne connaissez pas ce terme, dites-vous que c’est une méthode d’optimisation qui permet de diminuer ou augmenter l’erreur)

Le hacker veut transformer son chat en banane, qui est la classe #954. Nous allons créer une fonction de coût (loss) qui va tendre vers la classe banane. Nous utilisons pour cela le Back-End de Keras qui permet de créer des fonctions sans besoin de gérer quoique ce soit !

Il a aussi fallu normaliser le gradient afin d’éviter une explosion/disparition du gradient.

Nous voilà enfin prêt à lancer notre algorithme:

En regardant de plus près, vous pouvez vous rendre compte que l’algorithme tient sur 3 lignes ! La seconde partie n’étant que l’enregistrement de l’image.

Iterative transformation

Petit à petit, l’image est transformée jusqu’à ce que le chat soit reconnu banane ! Voyons un peu à quoi ça ressemble :

Image original du chat vs une pseudo banane, bluffant !

La différence est minime, quasi imperceptible et elle peut être encore réduite. En inspectant l’image de la pseudo-banane, vous pouvez voir des “ondes”. C’est elles qui faussent le modèle. Le pire dans l’histoire : le modèle ne reconnait vraiment plus le chat ! Voici la liste des éléments qu’il pense reconnaître avec leur pourcentage de probabilité :

  • banana, 0.99999344
  • clog, 1.875803e-06
  • hornbill, 6.8254775e-07
  • pineapple, 3.291724e-07

Je vous encourage à changer la targeted class ainsi que le gradient step. En augmentant le step, les aberrations sont plus fortes, et artistiques ?

Ça ressemble à du van Gogh psychédélique !

Regardez en bas à gauche ! La couverture est transformée en banane !

… et il arrive à passer sous les radars.

Une image ‘dégradée’ d’un exemple ‘adversarial’ reste ‘adversarial’ !

J’ai pris une photo de la pseudo-banane, je l’ai rogné puis compressé via WhatsApp.

Photo de la pseudo-banane avec un smartphone

En lançant à nouveau une prédiction de mon modèle, il m’affiche toujours banane ! La photo d’un exemple ‘adversarial’ est un exemple ‘adversarial’ !

Quelles leçons en tirer ?

Je trouve ça incroyable ! Nous avons fais passer un chat pour une banane. De la même manière, vous pouvez faire passer un fusil pour un stylo …

Imaginez les scénarios catastrophes : une voiture autonome qui voit un panneau stop et l’interprète comme 130, …

Brrr ! Elles sont bien belles tes attaques, mais je fais comment pour me défendre ?

C’est ce que nous allons voir ensemble dans la partie 3 !

Trivial ?

Cet article est écrit en collaboration avec Mickael Gadoud sur la base des travaux d’Alexandre Araujo, doctorant chez Wavestone. Mon but est de simplifier l’aspect technique pour partager les concepts et les enjeux des attaques ‘adversarial’.

Si les concepts vous sont triviaux, allez jeter un oeil sur les travaux d’Alexandre sur son site. Ils sont géniaux, voici mes favoris :

🌱 Merci !

Merci d’avoir suivi cette partie 2 jusqu’à la fin. J’ai fais en sorte que le tutoriel soit amusant et accessible ! Au final, les attaques ne sont vraiment pas difficile à mettre en place, alors ne tardez pas à lire la partie 3 !

  • Commentez ! Clappez ! Donnez-moi vos retours :)
  • Contactez-moi sur mon Linkedin ou mon Github !

Bonne journée 🔥

--

--

Mithuran Gajendran
Meetech - We Love Tech

Data Scientist with financial engineering background | Enjoy cookies & milk | Currently working on a self driving car | Wanting to make an impact