Toutes les réponses ici sont excellentes, mais pour une raison quelconque, rien n’a été dit jusqu’à présent sur les raisons pour lesquelles cet effet ne devrait pas vous surprendre . Je vais combler le vide.
Permettez-moi de commencer par une condition absolument essentielle pour que cela fonctionne: l'attaquant doit connaître l'architecture de réseau neuronal (nombre de couches, taille de chaque couche, etc.). De plus, dans tous les cas que j'ai moi-même examinés, l'attaquant connaît l'instantané du modèle utilisé en production, c'est-à-dire tous les poids. En d'autres termes, le "code source" du réseau n'est pas un secret.
Vous ne pouvez pas tromper un réseau de neurones si vous le traitez comme une boîte noire. Et vous ne pouvez pas réutiliser la même image trompeuse pour différents réseaux. En fait, vous devez "former" le réseau cible vous-même, et ici, par formation, je veux dire courir les passes en avant et en arrière, mais spécialement conçues pour un autre but.
Pourquoi ça marche du tout?
Maintenant, voici l'intuition. Les images sont de très haute dimension: même l’espace des petites images couleur 32x32 a des 3 * 32 * 32 = 3072
dimensions. Mais le jeu de données d'apprentissage est relativement petit et contient de vraies images, qui ont toutes une structure et de bonnes propriétés statistiques (par exemple, le lissage des couleurs). Donc, le jeu de données de formation est situé sur une petite variété de cet immense espace d'images.
Les réseaux convolutifs fonctionnent extrêmement bien sur cette variété, mais ne connaissent fondamentalement rien du reste de l’espace. La classification des points à l'extérieur du collecteur est simplement une extrapolation linéaire basée sur les points à l'intérieur du collecteur. Pas étonnant que certains points particuliers soient extrapolés de manière incorrecte. L'attaquant n'a besoin que d'un moyen de naviguer au plus proche de ces points.
Exemple
Laissez-moi vous donner un exemple concret pour tromper un réseau de neurones. Pour le rendre compact, je vais utiliser un réseau de régression logistique très simple avec une non-linéarité (sigmoïde). Il prend une entrée à 10 dimensions x
, calcule un nombre unique p=sigmoid(W.dot(x))
, qui est la probabilité de la classe 1 (par rapport à la classe 0).
Supposons que vous sachiez W=(-1, -1, 1, -1, 1, -1, 1, 1, -1, 1)
et que vous commenciez avec une entrée x=(2, -1, 3, -2, 2, 2, 1, -4, 5, 1)
. Un passage en avant donne une sigmoid(W.dot(x))=0.0474
probabilité de 95% comme x
exemple de la classe 0 ou de 95% .
Nous aimerions trouver un autre exemple, y
qui est très proche de x
mais qui est classé par le réseau en tant que 1. Notez qu’il x
s’agit de 10 dimensions, nous avons donc la liberté de déplacer 10 valeurs, ce qui est beaucoup.
Depuis W[0]=-1
est négatif, il est préférable d'avoir un petit y[0]
pour faire une contribution totale de y[0]*W[0]
petit. Par conséquent, faisons y[0]=x[0]-0.5=1.5
. De même, W[2]=1
est positif, il est donc préférable d'augmenter y[2]
pour faire y[2]*W[2]
plus: y[2]=x[2]+0.5=3.5
. Etc.
Le résultat est y=(1.5, -1.5, 3.5, -2.5, 2.5, 1.5, 1.5, -3.5, 4.5, 1.5)
, et sigmoid(W.dot(y))=0.88
. Avec ce seul changement, nous avons amélioré la probabilité de classe 1 de 5% à 88%!
Généralisation
Si vous regardez attentivement l'exemple précédent, vous remarquerez que je savais exactement comment ajuster x
afin de le déplacer vers la classe cible, car je connaissais le gradient de réseau. Ce que j'ai fait était en fait une rétropropagation , mais en ce qui concerne les données, au lieu des poids.
En général, l'attaquant commence par une distribution cible (0, 0, ..., 1, 0, ..., 0)
(zéro partout, sauf pour la classe qu'il veut atteindre), se propage en arrière sur les données et fait un petit mouvement dans cette direction. L'état du réseau n'est pas mis à jour.
Il devrait maintenant être clair que c'est une caractéristique commune des réseaux à feed-forward qui traitent une petite variété de données, quelle que soit leur profondeur ou la nature des données (image, audio, vidéo ou texte).
Potection
Le moyen le plus simple d'éviter que le système ne soit dupé consiste à utiliser un ensemble de réseaux de neurones, c'est-à-dire un système qui agrège les votes de plusieurs réseaux sur chaque requête. Il est beaucoup plus difficile de faire une contre-propagation simultanément sur plusieurs réseaux. L’attaquant peut essayer de le faire de manière séquentielle, un réseau à la fois, mais la mise à jour d’un réseau peut facilement gâcher les résultats obtenus pour un autre réseau. Plus le nombre de réseaux utilisés est élevé, plus l'attaque devient complexe.
Une autre possibilité consiste à lisser l'entrée avant de la transmettre au réseau.
Utilisation positive de la même idée
Vous ne devriez pas penser que la rétropropagation sur l'image n'a que des applications négatives. Une technique très similaire, appelée déconvolution , est utilisée pour la visualisation et pour mieux comprendre ce que les neurones ont appris.
Cette technique permet de synthétiser une image qui déclenche le déclenchement d’un neurone, ce qui permet de voir visuellement «ce que le neurone recherche», ce qui rend en général les réseaux de neurones convolutionnels plus interprétables.