
À quel point est-il simple de faire en sorte qu'un réseau neuronal profond ne classe pas une image si un attaquant n'est autorisé à modifier la couleur d'un pixel et à voir la probabilité de prédiction? Il s'avère que c'est très simple. Dans de nombreux cas, un attaquant peut même amener le réseau à renvoyer toute réponse qu'il souhaite.
Le projet suivant est une réimplémentation et un tutoriel de Keras de "One Pixel Attack pour avoir trompé les réseaux de neurones profonds". Le code officiel du journal peut être trouvé ici.
Pour cette attaque, nous utiliserons l'ensemble de données CIFAR10. La tâche de l'ensemble de données est de classer correctement une image de 32x32 pixels dans 1 des 10 catégories (par exemple, oiseau, cerf, camion). L'attaque de la boîte noire ne nécessite que les étiquettes de probabilité (la valeur de probabilité pour chaque catégorie) qui sont sorties par le réseau neuronal. Nous générons des images contradictoires en sélectionnant un pixel et en la modifiant en une certaine couleur.
En utilisant un algorithme évolutif appelé évolution différentielle (DE), nous pouvons générer de manière itérative des images adversaires pour essayer de minimiser la confiance (probabilité) de la classification du réseau neuronal.

Crédit: le blog de Pablo R. Mier
Tout d'abord, générez plusieurs échantillons adversaires qui modifient un pixel aléatoire et exécutez les images via le réseau neuronal. Ensuite, combinez ensemble les positions et les couleurs des pixels précédents, générez plusieurs échantillons davantage contradictoires et exécutez les nouvelles images via le réseau neuronal. S'il y avait des pixels qui ont abaissé la confiance du réseau à partir de la dernière étape, remplacez-les comme solutions les plus connues actuelles. Répétez ces étapes pour quelques itérations; Ensuite, à la dernière étape, renvoyez l'image contradictoire qui a le plus réduit la confiance du réseau. En cas de succès, la confiance serait tellement réduite qu'une nouvelle catégorie (incorrecte) a désormais la confiance la plus élevée de classification.
Voir ci-dessous pour quelques exemples d'attaques réussies:

Besoin d'un GPU ou vous voulez simplement lire? Consultez le premier cahier de tutoriel avec Google Colab.
Pour exécuter le code dans le tutoriel localement, un GPU dédié adapté à l'exécution avec des keras ( tensorflow-gpu ) est recommandé. Python 3.5+ requis.
git clone https://github.com/Hyperparticle/one-pixel-attack-keras
cd ./one-pixel-attack-keraspip install -r ./requirements.txtjupyter notebook ./one-pixel-attack.ipynb Pour entraîner un modèle, exécutez train.py . Le modèle sera caché (enregistré) après chaque époque dans le répertoire networks/models .
Par exemple, pour entraîner un resnet avec 200 époques et une taille de lot de 128:
python train.py --model resnet --epochs 200 --batch_size 128 Pour effectuer Attack, exécutez attack.py . Par défaut, cela exécutera tous les modèles avec des paramètres par défaut. Pour spécifier les types de modèles à tester, utilisez --model .
python attack.py --model densenet capsnetLes modèles disponibles sont actuellement:
lenet - LENET, premier modèle CNNpure_cnn - un nn avec juste des couches convolutionnellesnet_in_net - réseau dans le réseauresnet - Apprentissage résiduel profond pour la reconnaissance d'imagedensenet - réseaux convolutionnels densément connectéswide_resnet - réseaux résiduels largescapsnet - routage dynamique entre les capsules Résultats préliminaires après avoir exécuté plusieurs expériences sur divers modèles. Chaque expérience génère 100 images contradictoires et calcule le taux de réussite de l'attaque, c'est-à-dire le rapport des images qui ont réussi à mal classer le modèle une image sur le nombre total d'images. Pour un modèle donné, plusieurs expériences sont exécutées en fonction du nombre de pixels qui peuvent être modifiés dans une image (1,3 ou 5). L'algorithme différentiel a été exécuté avec une taille de population de 400 et un nombre d'itération maximum de 75.
Attaque sur des perturbations de 1,3,5 pixels (100 échantillons)
| modèle | paramètres | précision de test | pixels | Attaquez le succès (non ciblé) | Attaquez le succès (ciblé) |
|---|---|---|---|---|---|
| Lenet | 62k | 74,9% | 1 | 63,0% | 34,4% |
| 3 | 92,0% | 64,4% | |||
| 5 | 93,0% | 64,4% | |||
| CNN pur | 1,4 m | 88,8% | 1 | 13,0% | 6,67% |
| 3 | 58,0% | 13,3% | |||
| 5 | 63,0% | 18,9% | |||
| Réseau de réseau | 970K | 90,8% | 1 | 34,0% | 10,0% |
| 3 | 73,0% | 24,4% | |||
| 5 | 73,0% | 31,1% | |||
| Resnet | 470k | 92,3% | 1 | 34,0% | 14,4% |
| 3 | 79,0% | 21,1% | |||
| 5 | 79,0% | 22,2% | |||
| Denset | 850k | 94,7% | 1 | 31,0% | 4,44% |
| 3 | 71,0% | 23,3% | |||
| 5 | 69,0% | 28,9% | |||
| Wide Resnet | 11m | 95,3% | 1 | 19,0% | 1,11% |
| 3 | 58,0% | 18,9% | |||
| 5 | 65,0% | 22,2% | |||
| Capsnet | 12m | 79,8% | 1 | 19,0% | 0,00% |
| 3 | 39,0% | 4,44% | |||
| 5 | 36,0% | 4,44% |
Il semble que le réseau Capsule Capsnet, bien que plus résilient à l'attaque d'un pixel que tous les autres CNNS, soit toujours vulnérable.