
¿Qué tan simple es hacer que una red neuronal profunda clasifique erróneamente una imagen si solo se le permite a un atacante modificar el color de un píxel y solo ver la probabilidad de predicción? Resulta que es muy simple. En muchos casos, un atacante puede incluso hacer que la red devuelva cualquier respuesta que desee.
El siguiente proyecto es una reimplementación de Keras y un tutorial de "Ataque de un píxel para engañar a las redes neuronales profundas". El código oficial para el documento se puede encontrar aquí.
Para este ataque, usaremos el conjunto de datos CIFAR10. La tarea del conjunto de datos es clasificar correctamente una imagen de 32x32 píxeles en 1 de 10 categorías (por ejemplo, aves, ciervos, camiones). El ataque de la caja negra requiere solo las etiquetas de probabilidad (el valor de probabilidad para cada categoría) que la red neuronal generan. Generamos imágenes adversas seleccionando un píxel y modificándolo a cierto color.
Al usar un algoritmo evolutivo llamado evolución diferencial (DE), podemos generar iterativamente imágenes adversas para tratar de minimizar la confianza (probabilidad) de la clasificación de la red neuronal.

Crédito: blog de Pablo R. Mier
Primero, genere varias muestras adversas que modifiquen un píxel aleatorio y ejecuten las imágenes a través de la red neuronal. A continuación, combine las posiciones y colores de los píxeles anteriores, genere varias muestras más adversas a partir de ellas y ejecute las nuevas imágenes a través de la red neuronal. Si hubo píxeles que redujeron la confianza de la red desde el último paso, reemplácelos como las soluciones más conocidas actuales. Repita estos pasos para algunas iteraciones; Luego, en el último paso, devuelva la imagen adversa que más redujo la confianza de la red. Si tiene éxito, la confianza se reduciría tanto que una nueva categoría (incorrecta) ahora tiene la mayor confianza de clasificación.
Vea a continuación algunos ejemplos de ataques exitosos:

¿Necesita una GPU o simplemente quiere leer? Vea el primer cuaderno tutorial con Google Colab.
Para ejecutar el código en el tutorial localmente, se recomienda una GPU dedicada adecuada para ejecutar con keras ( tensorflow-gpu ). Python 3.5+ requerido.
git clone https://github.com/Hyperparticle/one-pixel-attack-keras
cd ./one-pixel-attack-keraspip install -r ./requirements.txtjupyter notebook ./one-pixel-attack.ipynb Para entrenar un modelo, ejecute train.py . El modelo se pondrá en cuenta (guardado) después de cada época en el directorio networks/models .
Por ejemplo, para entrenar un resnet con 200 épocas y un tamaño por lotes de 128:
python train.py --model resnet --epochs 200 --batch_size 128 Para realizar Attack, Run attack.py . Por defecto, esto ejecutará todos los modelos con parámetros predeterminados. Para especificar los tipos de modelos para probar, use --model .
python attack.py --model densenet capsnetLos modelos disponibles actualmente son:
lenet - Lenet, primer modelo CNNpure_cnn - un nn con solo capas convolucionalesnet_in_net - red en la redresnet - Aprendizaje residual profundo para el reconocimiento de imágenesdensenet : redes convolucionales densamente conectadaswide_resnet - redes residuales ampliascapsnet : enrutamiento dinámico entre cápsulas Resultados preliminares después de ejecutar varios experimentos en varios modelos. Cada experimento genera 100 imágenes adversas y calcula la tasa de éxito del ataque, es decir, la relación de las imágenes que causó que el modelo clasifique erróneamente una imagen sobre el número total de imágenes. Para un modelo dado, se ejecutan múltiples experimentos en función del número de píxeles que pueden modificarse en una imagen (1,3 o 5). El algoritmo diferencial se ejecutó con un tamaño de población de 400 y un recuento máximo de iteración de 75.
Ataque a perturbaciones de 1,3,5 píxeles (100 muestras)
| modelo | parámetros | precisión de la prueba | píxeles | El éxito del ataque (no se dirige) | El éxito del ataque (dirigido) |
|---|---|---|---|---|---|
| Lenet | 62k | 74.9% | 1 | 63.0% | 34.4% |
| 3 | 92.0% | 64.4% | |||
| 5 | 93.0% | 64.4% | |||
| CNN puro | 1.4m | 88.8% | 1 | 13.0% | 6.67% |
| 3 | 58.0% | 13.3% | |||
| 5 | 63.0% | 18.9% | |||
| Red en la red | 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% | |||
| Densenet | 850k | 94.7% | 1 | 31.0% | 4.44% |
| 3 | 71.0% | 23.3% | |||
| 5 | 69.0% | 28.9% | |||
| Amplio resnet | 11m | 95.3% | 1 | 19.0% | 1.11% |
| 3 | 58.0% | 18.9% | |||
| 5 | 65.0% | 22.2% | |||
| Cápsula | 12m | 79.8% | 1 | 19.0% | 0.00% |
| 3 | 39.0% | 4.44% | |||
| 5 | 36.0% | 4.44% |
Parece que el Capsule Network Capsnet, mientras que es más resistente al ataque de un píxel que todos los demás CNN, sigue siendo vulnerable.