Atacar una red neuronal con Python: Parte 2

En la primera entrega del articulo Atacar una red neuronal con Python, vimos cuales son los tipos de ataques adversarios, sus diferencias y métodos de ataque, en esta entrega veremos la explicación matemática y la implementación de un ataque FGSM con Python.

Explicación Matemática

Cuando se entrena un modelo hay que pasarle unas entradas, que normalmente se encuentran acotadas dentro de un dominio. Por ejemplo, los píxeles de las imágenes toman valores enteros entre 0 y 255. Por tanto, nuestra red se debería comportar de la misma forma si introducimos los píxeles con intensidades X = [11, 27, 250, 160] y Xs = [11.001, 27.001, 250.001, 160.001], pero la realidad es que no es así.

Para la explicación matemática se prescinde del término BIAS para simplificar los pasos. Una neurona se comportaría como:

Como se muestra, la entrada Xs es el resultado de sumar X + S, siendo S = [0.001, 0.001, 0.001, 0.001]. Por tanto, al introducir como entrada Xs la salida vendrá determinada por la siguiente ecuación:

Con esta ecuación se puede observar que si W es positivo y su dimensión es muy grande (en casos reales estamos hablando de millones de parámetros) se podría producir un cambio muy grande en la salida haciendo un cambio muy pequeño en la entrada. La amplificación de la salida viene dada por la fórmula ENM, siendo E = ||S||, N el número de dimensiones de W y M el valor medio de W. El ataque FSGM modifica la imagen de entrada siguiendo la fórmula siguiente:

Como se puede observar se está calculando el signo de los gradientes de la función de coste con respecto a la imagen de entrada, y después se multiplica por un valor E. El signo de los gradientes nos proporciona la dirección aproximada de maximización de la función de coste y con E regulamos la cantidad de pérdida. Por tanto, se está modificando la imagen de forma que se maximice la probabilidad de que la red falle.

Implementación de ataque FGSM en Python

Para la creación de la imagen adversaria se usará el método del Rápido Gradiente Descendente (FGSM).

Se procede a la creación de la imagen adversaria, para ello es necesario obtener el vector de etiquetas, es aquel que en formato “one-hot-encoding” marca a la clase que pertenece la predicción real de la imagen. En la figura 7 se puede observar las líneas de código que se ejecutan para obtener ese vector y posteriormente la posición marcada con un UNO, la cual nos da el número de la clase. En este ejemplo sería la posición 42.

Obtención de clase

  Fig 7 Obtención de clase

En el paso siguiente se debe declarar una función de coste o función de error. Para ello se usa la API de Keras y se accede a la función de perdida CategorcialCrossentropy() loss_function=tf.keras.losses.CategoricalCrossentropy()

Una vez que se tienen estos requisitos, se realiza una función para generar el signo del gradiente en cada píxel de la imagen, por la cual se podrá crear la perturbación de ruido que alterará la imagen original al sumarla.

Declarar función de coste y signo del gradiente

Fig 8 Declarar función de coste y signo del gradiente

Imagen de perturbación de ruido

Fig 9 Imagen de perturbación de ruido

Se obtiene esta imagen de ruido y se procede a sumar esas variaciones en cada uno de los pixeles de la imagen original, con el aumento de un pequeño parámetro. El cual en este caso concreto se usó 0.02. Esta suma da como resultado la imagen de prohibido adelantar exactamente igual que la original e inapreciable para el ojo humano. Pero al realiza una predicción sobre el modelo se puede observar que la clase por la cual fue clasificado es totalmente diferente a la primera predicción. Siendo en este caso una predicción de la señal Limitado a 70Km/h. Lo comentado en este último párrafo se puede observar en la figura 10.

Predicción de imagen adversaria

Fig 10 Predicción de imagen adversaria

Una vez realizada la generación de imagen adversaria sobre el modelo, se observa que efectivamente es vulnerable a este tipo de ataques, siendo un ataque categorizado en “caja gris”, ya que no se ha necesitado del conocimiento de la estructura total del modelo para generar una imagen adversaria efectiva.

Código completo en https://gist.github.com/jmcalvomartin/2896a9dfd643019e28e593ea407f4bd8

Sobre el autor

Jorge Calvo Martín  es Ingeniero Informático – Ciberseguridad & Criptografía,  Master Datascience & AI Education y Director de Innovación y Analítica en Colegio Europeo de Madrid; además es Profesor de Matemáticas en secundaria.

Puedes encontrarlo en:

Su blog https://www.europeanvalley.es/noticias

LinkedIn https://www.linkedin.com/in/jorgecalvomartin/

Y como @jorgemcalvo en las Redes Sociales.


You May Also Like