Todas las respuestas aquí son geniales, pero, por alguna razón, hasta ahora no se ha dicho nada sobre por qué este efecto no debería sorprenderlo . Yo llenaré el espacio en blanco.
Permítanme comenzar con un requisito que es absolutamente esencial para que esto funcione: el atacante debe conocer la arquitectura de la red neuronal (número de capas, tamaño de cada capa, etc.). Además, en todos los casos que me examiné, el atacante conoce la instantánea del modelo que se utiliza en la producción, es decir, todos los pesos. En otras palabras, el "código fuente" de la red no es un secreto.
No puedes engañar a una red neuronal si la tratas como una caja negra. Y no puede reutilizar la misma imagen engañosa para diferentes redes. De hecho, usted tiene que "entrenar" a la red de destino usted mismo, y aquí, al entrenar, me refiero a correr hacia adelante y hacia atrás, pero especialmente diseñado para otro propósito.
¿Por qué está funcionando en absoluto?
Ahora, aquí está la intuición. Las imágenes tienen dimensiones muy altas: incluso el espacio de las imágenes pequeñas en color de 32x32 tiene 3 * 32 * 32 = 3072
dimensiones. Pero el conjunto de datos de entrenamiento es relativamente pequeño y contiene imágenes reales, todas las cuales tienen cierta estructura y buenas propiedades estadísticas (por ejemplo, suavidad de color). Entonces, el conjunto de datos de entrenamiento se encuentra en una pequeña variedad de este gran espacio de imágenes.
Las redes convolucionales funcionan extremadamente bien en esta variedad, pero básicamente, no saben nada sobre el resto del espacio. La clasificación de los puntos fuera del múltiple es solo una extrapolación lineal basada en los puntos dentro del múltiple. No es de extrañar que algunos puntos particulares se extrapolen incorrectamente. El atacante solo necesita una forma de navegar hasta el punto más cercano.
Ejemplo
Déjame darte un ejemplo concreto de cómo engañar a una red neuronal. Para hacerlo compacto, voy a usar una red de regresión logística muy simple con una no linealidad (sigmoide). Toma una entrada de 10 dimensiones x
, calcula un solo número p=sigmoid(W.dot(x))
, que es la probabilidad de la clase 1 (versus la clase 0).
Supongamos que sabe W=(-1, -1, 1, -1, 1, -1, 1, 1, -1, 1)
y comience con una entrada x=(2, -1, 3, -2, 2, 2, 1, -4, 5, 1)
. Un pase hacia adelante da un sigmoid(W.dot(x))=0.0474
95% de probabilidad de que x
sea un ejemplo de clase 0.
Nos gustaría encontrar otro ejemplo, y
que está muy cerca x
pero que la red clasifica como 1. Tenga en cuenta que x
es de 10 dimensiones, por lo que tenemos la libertad de empujar 10 valores, que es mucho.
Como W[0]=-1
es negativo, es mejor tener un pequeño y[0]
para hacer una contribución total de y[0]*W[0]
pequeño. Por lo tanto, hagamos y[0]=x[0]-0.5=1.5
. Del mismo modo, W[2]=1
es positivo, por lo que es mejor aumentar y[2]
para hacer y[2]*W[2]
más grande: y[2]=x[2]+0.5=3.5
. Y así.
El resultado es y=(1.5, -1.5, 3.5, -2.5, 2.5, 1.5, 1.5, -3.5, 4.5, 1.5)
, y sigmoid(W.dot(y))=0.88
. ¡Con este cambio, mejoramos la probabilidad de clase 1 de 5% a 88%!
Generalización
Si observa de cerca el ejemplo anterior, notará que sabía exactamente cómo ajustar x
para moverlo a la clase de destino, porque sabía el gradiente de la red. Lo que hice fue en realidad una propagación hacia atrás , pero con respecto a los datos, en lugar de los pesos.
En general, el atacante comienza con la distribución de destino (0, 0, ..., 1, 0, ..., 0)
(cero en todas partes, excepto la clase que quiere lograr), se propaga hacia atrás a los datos y realiza un pequeño movimiento en esa dirección. El estado de la red no se actualiza.
Ahora debe quedar claro que es una característica común de las redes de retroalimentación que se ocupan de una pequeña variedad de datos, sin importar cuán profunda sea o la naturaleza de los datos (imagen, audio, video o texto).
Protección
La forma más sencilla de evitar que se engañe el sistema es utilizar un conjunto de redes neuronales, es decir, un sistema que agregue los votos de varias redes en cada solicitud. Es mucho más difícil propagar hacia atrás con respecto a varias redes simultáneamente. El atacante podría intentar hacerlo secuencialmente, una red a la vez, pero la actualización para una red podría confundirse fácilmente con los resultados obtenidos para otra red. Cuantas más redes se usan, más complejo se vuelve un ataque.
Otra posibilidad es suavizar la entrada antes de pasarla a la red.
Uso positivo de la misma idea.
No debe pensar que la propagación hacia atrás a la imagen solo tiene aplicaciones negativas. Una técnica muy similar, llamada deconvolución , se utiliza para visualizar y comprender mejor lo que las neuronas han aprendido.
Esta técnica permite sintetizar una imagen que hace que una neurona en particular se active, básicamente ver visualmente "lo que está buscando la neurona", lo que en general hace que las redes neuronales convolucionales sean más interpretables.